@arbidocs/blocks 0.4.109 → 0.4.111

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 (167) hide show
  1. package/dist/{NativeDocxEditor-WODZAURG.cjs → NativeDocxEditor-AQKRZBIU.cjs} +7 -7
  2. package/dist/{NativeDocxEditor-WODZAURG.cjs.map → NativeDocxEditor-AQKRZBIU.cjs.map} +1 -1
  3. package/dist/{NativeDocxEditor-4PY4YZYC.js → NativeDocxEditor-IN2HEO5I.js} +3 -3
  4. package/dist/{NativeDocxEditor-4PY4YZYC.js.map → NativeDocxEditor-IN2HEO5I.js.map} +1 -1
  5. package/dist/agents/index.cjs +286 -286
  6. package/dist/agents/index.js +10 -10
  7. package/dist/agents/tasks/ConversationListView.d.ts +5 -1
  8. package/dist/agents/tasks/TaskActivityTimeline.d.ts +5 -1
  9. package/dist/calendar/EventDetails.d.ts +1 -1
  10. package/dist/calendar/EventEditor.d.ts +1 -1
  11. package/dist/calendar/draft.d.ts +7 -1
  12. package/dist/calendar/index.cjs +71 -10
  13. package/dist/calendar/index.cjs.map +1 -1
  14. package/dist/calendar/index.d.ts +1 -1
  15. package/dist/calendar/index.js +69 -11
  16. package/dist/calendar/index.js.map +1 -1
  17. package/dist/calendar/types.d.ts +23 -0
  18. package/dist/calls/CallSidePanel.d.ts +32 -0
  19. package/dist/calls/CallStage.d.ts +57 -0
  20. package/dist/calls/ControlBar.d.ts +113 -0
  21. package/dist/calls/ControlButton.d.ts +44 -0
  22. package/dist/calls/PreJoin.d.ts +35 -0
  23. package/dist/calls/cards.d.ts +58 -0
  24. package/dist/calls/hooks.d.ts +20 -0
  25. package/dist/calls/index.cjs +2884 -0
  26. package/dist/calls/index.cjs.map +1 -0
  27. package/dist/calls/index.d.ts +21 -0
  28. package/dist/calls/index.js +2753 -0
  29. package/dist/calls/index.js.map +1 -0
  30. package/dist/calls/join-choices.d.ts +11 -0
  31. package/dist/calls/layout.d.ts +106 -0
  32. package/dist/calls/panels.d.ts +66 -0
  33. package/dist/calls/status.d.ts +69 -0
  34. package/dist/calls/tiles.d.ts +59 -0
  35. package/dist/calls/webinar/ChatPermissionSetting.d.ts +18 -0
  36. package/dist/calls/webinar/OnStageCheck.d.ts +23 -0
  37. package/dist/calls/webinar/QAPanel.d.ts +56 -0
  38. package/dist/calls/webinar/RaiseHandButton.d.ts +14 -0
  39. package/dist/calls/webinar/WebinarAudiencePanel.d.ts +23 -0
  40. package/dist/calls/webinar/WebinarViewer.d.ts +39 -0
  41. package/dist/calls/webinar/WebinarWaiting.d.ts +19 -0
  42. package/dist/calls/webinar/hooks.d.ts +13 -0
  43. package/dist/calls/webinar/index.d.ts +14 -0
  44. package/dist/calls/webinar/live.d.ts +43 -0
  45. package/dist/calls/webinar/types.d.ts +49 -0
  46. package/dist/chat/Message.d.ts +17 -2
  47. package/dist/chat/TranscriptLine.d.ts +50 -0
  48. package/dist/chat/index.cjs +147 -126
  49. package/dist/chat/index.d.ts +3 -1
  50. package/dist/chat/index.js +5 -4
  51. package/dist/chat/transcript-runs.d.ts +6 -0
  52. package/dist/{chunk-GKDWQLVU.js → chunk-2C7TCVQZ.js} +172 -121
  53. package/dist/chunk-2C7TCVQZ.js.map +1 -0
  54. package/dist/{chunk-QKWQMOHN.cjs → chunk-2UAJVK3C.cjs} +4 -4
  55. package/dist/{chunk-QKWQMOHN.cjs.map → chunk-2UAJVK3C.cjs.map} +1 -1
  56. package/dist/{chunk-54WBIVHV.cjs → chunk-2WO5L7YT.cjs} +5 -5
  57. package/dist/{chunk-54WBIVHV.cjs.map → chunk-2WO5L7YT.cjs.map} +1 -1
  58. package/dist/{chunk-7C35WXYB.js → chunk-5HFPRI3W.js} +5 -5
  59. package/dist/chunk-5HFPRI3W.js.map +1 -0
  60. package/dist/{chunk-ZSV2NQQP.js → chunk-6RHHMBZ5.js} +158 -5
  61. package/dist/chunk-6RHHMBZ5.js.map +1 -0
  62. package/dist/{chunk-FQX6N5G6.js → chunk-6Z7DLJU2.js} +35 -18
  63. package/dist/chunk-6Z7DLJU2.js.map +1 -0
  64. package/dist/{chunk-PGDL26TQ.js → chunk-AY32GGKU.js} +10 -4
  65. package/dist/{chunk-PGDL26TQ.js.map → chunk-AY32GGKU.js.map} +1 -1
  66. package/dist/{chunk-S55VDTX3.js → chunk-CECWAIHL.js} +3 -3
  67. package/dist/{chunk-S55VDTX3.js.map → chunk-CECWAIHL.js.map} +1 -1
  68. package/dist/{chunk-UABPHZWZ.js → chunk-CXZ7FPTQ.js} +3 -3
  69. package/dist/{chunk-UABPHZWZ.js.map → chunk-CXZ7FPTQ.js.map} +1 -1
  70. package/dist/{chunk-C2HRZSAT.cjs → chunk-DJM7DLCT.cjs} +5 -5
  71. package/dist/chunk-DJM7DLCT.cjs.map +1 -0
  72. package/dist/{chunk-GBYY3PIC.cjs → chunk-FXUQZFAN.cjs} +79 -62
  73. package/dist/chunk-FXUQZFAN.cjs.map +1 -0
  74. package/dist/{chunk-W7NZRZ54.js → chunk-GFYGYME3.js} +3 -3
  75. package/dist/{chunk-W7NZRZ54.js.map → chunk-GFYGYME3.js.map} +1 -1
  76. package/dist/chunk-GICUGQNN.cjs +76 -0
  77. package/dist/chunk-GICUGQNN.cjs.map +1 -0
  78. package/dist/{chunk-I4XQCE6U.cjs → chunk-HBBJYRGI.cjs} +162 -5
  79. package/dist/{chunk-ZSV2NQQP.js.map → chunk-HBBJYRGI.cjs.map} +1 -1
  80. package/dist/chunk-JJLMCV3T.js +73 -0
  81. package/dist/chunk-JJLMCV3T.js.map +1 -0
  82. package/dist/chunk-MWDW5UBW.cjs +199 -0
  83. package/dist/chunk-MWDW5UBW.cjs.map +1 -0
  84. package/dist/{chunk-NUTLXVPX.js → chunk-NRUPUDWB.js} +16 -7
  85. package/dist/chunk-NRUPUDWB.js.map +1 -0
  86. package/dist/{chunk-5YXG342J.cjs → chunk-OR4CO743.cjs} +3 -3
  87. package/dist/{chunk-5YXG342J.cjs.map → chunk-OR4CO743.cjs.map} +1 -1
  88. package/dist/{chunk-DDF5GPIJ.js → chunk-P5ST47VY.js} +3 -3
  89. package/dist/{chunk-DDF5GPIJ.js.map → chunk-P5ST47VY.js.map} +1 -1
  90. package/dist/{chunk-PEHLUB52.js → chunk-Q6B77ZWZ.js} +3 -3
  91. package/dist/{chunk-PEHLUB52.js.map → chunk-Q6B77ZWZ.js.map} +1 -1
  92. package/dist/{chunk-ELDUWTRR.cjs → chunk-TF47ATYS.cjs} +4 -4
  93. package/dist/{chunk-ELDUWTRR.cjs.map → chunk-TF47ATYS.cjs.map} +1 -1
  94. package/dist/{chunk-PDRYGPZB.cjs → chunk-VP4KJ4LK.cjs} +16 -6
  95. package/dist/chunk-VP4KJ4LK.cjs.map +1 -0
  96. package/dist/{chunk-SKSE4OT6.cjs → chunk-WPVIOGDG.cjs} +5 -5
  97. package/dist/{chunk-SKSE4OT6.cjs.map → chunk-WPVIOGDG.cjs.map} +1 -1
  98. package/dist/{chunk-JB32KYAH.js → chunk-WTM65ZNG.js} +3 -3
  99. package/dist/{chunk-JB32KYAH.js.map → chunk-WTM65ZNG.js.map} +1 -1
  100. package/dist/{chunk-2NIL2ASF.cjs → chunk-XIGWUDOD.cjs} +170 -119
  101. package/dist/chunk-XIGWUDOD.cjs.map +1 -0
  102. package/dist/{chunk-3US5OIDQ.cjs → chunk-XSUOEJB3.cjs} +9 -3
  103. package/dist/chunk-XSUOEJB3.cjs.map +1 -0
  104. package/dist/chunk-Z3AZ7Q5X.js +177 -0
  105. package/dist/chunk-Z3AZ7Q5X.js.map +1 -0
  106. package/dist/{chunk-Z5VUZ6YD.cjs → chunk-ZV3BKLFY.cjs} +3 -3
  107. package/dist/{chunk-Z5VUZ6YD.cjs.map → chunk-ZV3BKLFY.cjs.map} +1 -1
  108. package/dist/collaboration/index.cjs +42 -42
  109. package/dist/collaboration/index.js +2 -2
  110. package/dist/connect/docx.cjs +6 -6
  111. package/dist/connect/docx.js +4 -4
  112. package/dist/connect/index.cjs +72 -72
  113. package/dist/connect/index.js +18 -18
  114. package/dist/docx/AgentUndo.d.ts +4 -0
  115. package/dist/docx/index.cjs +46 -46
  116. package/dist/docx/index.js +3 -3
  117. package/dist/facts/index.cjs +4 -4
  118. package/dist/facts/index.js +4 -4
  119. package/dist/files/index.cjs +6 -6
  120. package/dist/files/index.js +6 -6
  121. package/dist/home/index.cjs +17 -17
  122. package/dist/home/index.js +3 -3
  123. package/dist/index.cjs +958 -937
  124. package/dist/index.cjs.map +1 -1
  125. package/dist/index.js +24 -23
  126. package/dist/index.js.map +1 -1
  127. package/dist/retrieval/index.cjs +1 -1
  128. package/dist/retrieval/index.js +1 -1
  129. package/dist/settings/index.cjs +50 -104
  130. package/dist/settings/index.cjs.map +1 -1
  131. package/dist/settings/index.js +12 -72
  132. package/dist/settings/index.js.map +1 -1
  133. package/dist/shell/index.cjs +12 -12
  134. package/dist/shell/index.js +4 -4
  135. package/dist/site/index.cjs +5 -5
  136. package/dist/site/index.js +1 -1
  137. package/dist/studio/index.cjs +5 -5
  138. package/dist/studio/index.js +4 -4
  139. package/dist/workflow-canvas/index.cjs +53 -53
  140. package/dist/workflow-canvas/index.js +10 -10
  141. package/dist/workspaces/index.cjs +2 -2
  142. package/dist/workspaces/index.js +2 -2
  143. package/node_modules/@arbidocs/coedit/dist/commands.cjs +179 -9
  144. package/node_modules/@arbidocs/coedit/dist/commands.cjs.map +1 -1
  145. package/node_modules/@arbidocs/coedit/dist/commands.d.cts +81 -1
  146. package/node_modules/@arbidocs/coedit/dist/commands.d.ts +81 -1
  147. package/node_modules/@arbidocs/coedit/dist/commands.js +173 -11
  148. package/node_modules/@arbidocs/coedit/dist/commands.js.map +1 -1
  149. package/node_modules/@arbidocs/coedit/dist/server.cjs +58 -2
  150. package/node_modules/@arbidocs/coedit/dist/server.cjs.map +1 -1
  151. package/node_modules/@arbidocs/coedit/dist/server.d.cts +29 -1
  152. package/node_modules/@arbidocs/coedit/dist/server.d.ts +29 -1
  153. package/node_modules/@arbidocs/coedit/dist/server.js +58 -3
  154. package/node_modules/@arbidocs/coedit/dist/server.js.map +1 -1
  155. package/node_modules/@arbidocs/coedit/package.json +1 -1
  156. package/package.json +15 -5
  157. package/src/calls/calls.css +157 -0
  158. package/dist/chunk-2NIL2ASF.cjs.map +0 -1
  159. package/dist/chunk-3US5OIDQ.cjs.map +0 -1
  160. package/dist/chunk-7C35WXYB.js.map +0 -1
  161. package/dist/chunk-C2HRZSAT.cjs.map +0 -1
  162. package/dist/chunk-FQX6N5G6.js.map +0 -1
  163. package/dist/chunk-GBYY3PIC.cjs.map +0 -1
  164. package/dist/chunk-GKDWQLVU.js.map +0 -1
  165. package/dist/chunk-I4XQCE6U.cjs.map +0 -1
  166. package/dist/chunk-NUTLXVPX.js.map +0 -1
  167. package/dist/chunk-PDRYGPZB.cjs.map +0 -1
@@ -0,0 +1,73 @@
1
+ "use client";
2
+ import { ModalScaffold } from './chunk-TX2ZICS7.js';
3
+ import { testIdOr } from './chunk-7F6CBP3Z.js';
4
+ import { useMemo, useRef } from 'react';
5
+ import { AlertTriangle } from 'lucide-react';
6
+ import { Button } from '@arbidocs/react/ui';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var DEFAULT_CONFIRM_DIALOG_LABELS = {
10
+ confirm: "Confirm",
11
+ cancel: "Cancel",
12
+ pleaseWait: "Please wait..."
13
+ };
14
+ function ConfirmDialog({
15
+ isOpen,
16
+ onClose,
17
+ onConfirm,
18
+ title,
19
+ description,
20
+ confirmText,
21
+ cancelText,
22
+ variant = "destructive",
23
+ isLoading = false,
24
+ labels,
25
+ testId,
26
+ testIds
27
+ }) {
28
+ const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels]);
29
+ const cancelRef = useRef(null);
30
+ return /* @__PURE__ */ jsx(
31
+ ModalScaffold,
32
+ {
33
+ open: isOpen,
34
+ onOpenChange: (next) => {
35
+ if (!next) onClose();
36
+ },
37
+ role: "alertdialog",
38
+ initialFocusRef: cancelRef,
39
+ title,
40
+ description,
41
+ showDescription: true,
42
+ icon: variant === "destructive" ? /* @__PURE__ */ jsx(AlertTriangle, { className: "h-5 w-5 text-red-text", "aria-hidden": "true" }) : null,
43
+ testId: testIdOr(testId, { testId: "confirmation-modal" }),
44
+ children: /* @__PURE__ */ jsxs(ModalScaffold.Footer, { children: [
45
+ /* @__PURE__ */ jsx(
46
+ Button,
47
+ {
48
+ ref: cancelRef,
49
+ variant: "outline",
50
+ onClick: () => onClose(),
51
+ disabled: isLoading,
52
+ "data-testid": testIdOr(testIds?.cancel, { testId: "confirmation-modal-cancel-button" }),
53
+ children: cancelText ?? l.cancel
54
+ }
55
+ ),
56
+ /* @__PURE__ */ jsx(
57
+ Button,
58
+ {
59
+ variant,
60
+ onClick: onConfirm,
61
+ disabled: isLoading,
62
+ "data-testid": testIdOr(testIds?.confirm, { testId: "confirmation-modal-confirm-button" }),
63
+ children: isLoading ? l.pleaseWait : confirmText ?? l.confirm
64
+ }
65
+ )
66
+ ] })
67
+ }
68
+ );
69
+ }
70
+
71
+ export { ConfirmDialog, DEFAULT_CONFIRM_DIALOG_LABELS };
72
+ //# sourceMappingURL=chunk-JJLMCV3T.js.map
73
+ //# sourceMappingURL=chunk-JJLMCV3T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/settings/ConfirmDialog.tsx"],"names":[],"mappings":";;;;;;;AAaO,IAAM,6BAAA,GAAqD;AAAA,EAChE,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY;AACd;AAuBO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,aAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,OAAO,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAChD,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,MAAA;AAAA,MACN,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,QAAA,IAAI,CAAC,MAAM,OAAA,EAAQ;AAAA,MACrB,CAAA;AAAA,MACA,IAAA,EAAK,aAAA;AAAA,MACL,eAAA,EAAiB,SAAA;AAAA,MACjB,KAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA,EAAe,IAAA;AAAA,MACf,IAAA,EACE,YAAY,aAAA,mBACV,GAAA,CAAC,iBAAc,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAY,MAAA,EAAO,CAAA,GAClE,IAAA;AAAA,MAEN,QAAQ,QAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,MAEzD,QAAA,kBAAA,IAAA,CAAC,aAAA,CAAc,MAAA,EAAd,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,SAAA;AAAA,YACL,OAAA,EAAQ,SAAA;AAAA,YACR,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,YACvB,QAAA,EAAU,SAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,oCAAoC,CAAA;AAAA,YAEpF,wBAAc,CAAA,CAAE;AAAA;AAAA,SACnB;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,OAAA,EAAS,SAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,qCAAqC,CAAA;AAAA,YAEtF,QAAA,EAAA,SAAA,GAAY,CAAA,CAAE,UAAA,GAAc,WAAA,IAAe,CAAA,CAAE;AAAA;AAAA;AAChD,OAAA,EACF;AAAA;AAAA,GACF;AAEJ","file":"chunk-JJLMCV3T.js","sourcesContent":["import { useMemo, useRef } from 'react'\nimport { AlertTriangle } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ModalScaffold } from './ModalScaffold'\n\n/** Every fixed string of the confirm dialog. `confirmText` / `cancelText` props win. */\nexport interface ConfirmDialogLabels {\n confirm: string\n cancel: string\n pleaseWait: string\n}\n\nexport const DEFAULT_CONFIRM_DIALOG_LABELS: ConfirmDialogLabels = {\n confirm: 'Confirm',\n cancel: 'Cancel',\n pleaseWait: 'Please wait...',\n}\n\nexport interface ConfirmDialogProps {\n labels?: Partial<ConfirmDialogLabels>\n isOpen: boolean\n onClose: () => void\n onConfirm: () => void\n title: string\n description: string\n confirmText?: string\n cancelText?: string\n variant?: 'destructive' | 'default'\n isLoading?: boolean\n /** Dialog test id (default `confirmation-modal`). */\n testId?: string\n /** Button ids; defaults are the current ids. */\n testIds?: Partial<Record<'cancel' | 'confirm', string>>\n}\n\n/**\n * Declarative yes/no confirmation with a loading state. An `alertdialog`: initial focus is on\n * Cancel (the safe action) and clicking outside does not dismiss it; Escape and Cancel do.\n */\nexport function ConfirmDialog({\n isOpen,\n onClose,\n onConfirm,\n title,\n description,\n confirmText,\n cancelText,\n variant = 'destructive',\n isLoading = false,\n labels,\n testId,\n testIds,\n}: ConfirmDialogProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONFIRM_DIALOG_LABELS, ...labels }), [labels])\n const cancelRef = useRef<HTMLButtonElement>(null)\n return (\n <ModalScaffold\n open={isOpen}\n onOpenChange={(next) => {\n if (!next) onClose()\n }}\n role=\"alertdialog\"\n initialFocusRef={cancelRef}\n title={title}\n description={description}\n showDescription\n icon={\n variant === 'destructive' ? (\n <AlertTriangle className=\"h-5 w-5 text-red-text\" aria-hidden=\"true\" />\n ) : null\n }\n testId={testIdOr(testId, { testId: 'confirmation-modal' })}\n >\n <ModalScaffold.Footer>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n onClick={() => onClose()}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.cancel, { testId: 'confirmation-modal-cancel-button' })}\n >\n {cancelText ?? l.cancel}\n </Button>\n <Button\n variant={variant}\n onClick={onConfirm}\n disabled={isLoading}\n data-testid={testIdOr(testIds?.confirm, { testId: 'confirmation-modal-confirm-button' })}\n >\n {isLoading ? l.pleaseWait : (confirmText ?? l.confirm)}\n </Button>\n </ModalScaffold.Footer>\n </ModalScaffold>\n )\n}\n"]}
@@ -0,0 +1,199 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ // src/calls/layout.ts
5
+ var TILE_ASPECT = 16 / 9;
6
+ var NOTICE_MS = 6e3;
7
+ var CAPTION_TTL_MS = 8e3;
8
+ var CAPTION_LINES = 2;
9
+ var MAX_GRID_TILES = 9;
10
+ var MIN_CELL_ASPECT = 0.6;
11
+ var MAX_CELL_ASPECT = 2.4;
12
+ var LANDSCAPE_SLACK = 0.85;
13
+ function gridLayout(count, width, height, gap = 8, aspect = TILE_ASPECT) {
14
+ const n = Math.max(0, Math.floor(count));
15
+ if (n === 0 || width <= 0 || height <= 0) {
16
+ return {
17
+ cols: 0,
18
+ rows: 0,
19
+ rowCounts: [],
20
+ tileWidth: 0,
21
+ tileHeight: 0,
22
+ cellWidth: 0,
23
+ cellHeight: 0
24
+ };
25
+ }
26
+ const options = [];
27
+ for (let cols2 = 1; cols2 <= n; cols2++) {
28
+ const rows2 = Math.ceil(n / cols2);
29
+ if (cols2 > 1 && Math.ceil(n / (cols2 - 1)) === rows2) continue;
30
+ const byWidth = (width - gap * (cols2 - 1)) / cols2;
31
+ const byHeight = (height - gap * (rows2 - 1)) / rows2 * aspect;
32
+ options.push({ cols: cols2, rows: rows2, tileWidth: Math.max(0, Math.min(byWidth, byHeight)) });
33
+ }
34
+ const cellAspect = (o) => (width - gap * (o.cols - 1)) / o.cols / ((height - gap * (o.rows - 1)) / o.rows);
35
+ const sane = options.filter((o) => {
36
+ const a = cellAspect(o);
37
+ return a >= MIN_CELL_ASPECT && a <= MAX_CELL_ASPECT;
38
+ });
39
+ const pool = sane.length ? sane : options;
40
+ const largest = pool.reduce((a, b) => b.tileWidth > a.tileWidth + 0.5 ? b : a);
41
+ const landscape = pool.filter((o) => o.cols >= o.rows && o.tileWidth >= largest.tileWidth * LANDSCAPE_SLACK).reduce((a, b) => !a || b.tileWidth > a.tileWidth ? b : a, null);
42
+ const best = landscape ?? largest;
43
+ const { cols, rows } = best;
44
+ const tileWidth = Math.floor(best.tileWidth);
45
+ return {
46
+ cols,
47
+ rows,
48
+ rowCounts: rowCounts(n, cols),
49
+ tileWidth,
50
+ tileHeight: Math.floor(tileWidth / aspect),
51
+ cellWidth: Math.floor((width - gap * (cols - 1)) / cols),
52
+ cellHeight: Math.floor((height - gap * (rows - 1)) / rows)
53
+ };
54
+ }
55
+ function rowCounts(count, cols) {
56
+ if (count <= 0 || cols <= 0) return [];
57
+ const rows = Math.ceil(count / cols);
58
+ const base = Math.floor(count / rows);
59
+ const extra = count % rows;
60
+ return Array.from({ length: rows }, (_, i) => base + (i < extra ? 1 : 0));
61
+ }
62
+ function gridSlots(items, max = MAX_GRID_TILES) {
63
+ if (items.length <= max) return { shown: items, hidden: 0 };
64
+ return { shown: items.slice(0, max - 1), hidden: items.length - (max - 1) };
65
+ }
66
+ var SPEAKER_ACCENTS = [
67
+ "text-blue-text-strong",
68
+ "text-purple-text-strong",
69
+ "text-green-text-strong",
70
+ "text-yellow-text-strong",
71
+ "text-red-text-strong"
72
+ ];
73
+ function speakerIndex(identity) {
74
+ let h = 0;
75
+ for (let i = 0; i < identity.length; i++) h = h * 31 + identity.charCodeAt(i) >>> 0;
76
+ return h % SPEAKER_ACCENTS.length;
77
+ }
78
+ function speakerAccent(identity) {
79
+ return SPEAKER_ACCENTS[speakerIndex(identity)];
80
+ }
81
+ var SPEAKER_BORDERS = [
82
+ "border-blue-text-strong",
83
+ "border-purple-text-strong",
84
+ "border-green-text-strong",
85
+ "border-yellow-text-strong",
86
+ "border-red-text-strong"
87
+ ];
88
+ function speakerBorder(identity) {
89
+ return SPEAKER_BORDERS[speakerIndex(identity)];
90
+ }
91
+ var SPEAKER_DOTS = [
92
+ "bg-blue-text-strong",
93
+ "bg-purple-text-strong",
94
+ "bg-green-text-strong",
95
+ "bg-yellow-text-strong",
96
+ "bg-red-text-strong"
97
+ ];
98
+ function speakerDot(identity) {
99
+ return SPEAKER_DOTS[speakerIndex(identity)];
100
+ }
101
+ function nearestCorner(x, y, width, height) {
102
+ const top = y < height / 2;
103
+ const left = x < width / 2;
104
+ return `${top ? "top" : "bottom"}-${left ? "left" : "right"}`;
105
+ }
106
+ function formatElapsed(ms) {
107
+ const total = Math.max(0, Math.floor(ms / 1e3));
108
+ const h = Math.floor(total / 3600);
109
+ const m = Math.floor(total % 3600 / 60);
110
+ const s = total % 60;
111
+ const ss = String(s).padStart(2, "0");
112
+ return h > 0 ? `${h}:${String(m).padStart(2, "0")}:${ss}` : `${m}:${ss}`;
113
+ }
114
+ function initialsOf(name) {
115
+ const words = name.trim().split(/\s+/).filter((w) => /[\p{L}\p{N}]/u.test(w));
116
+ if (!words.length) return "?";
117
+ const first = words[0].match(/[\p{L}\p{N}]/u)?.[0] ?? "";
118
+ const last = words.length > 1 ? words[words.length - 1].match(/[\p{L}\p{N}]/u)?.[0] ?? "" : "";
119
+ return (first + last).toUpperCase();
120
+ }
121
+ var INITIAL_SPOTLIGHT = { id: null, candidate: null, since: 0 };
122
+ var SPEAKING_LEVEL = 0.08;
123
+ function nextSpotlight(state, levels, now, { threshold = SPEAKING_LEVEL, holdMs = 800, margin = 1.5, exclude = [] } = {}) {
124
+ let loudest = null;
125
+ let max = threshold;
126
+ for (const [id, level] of Object.entries(levels)) {
127
+ if (exclude.includes(id)) continue;
128
+ if (level >= max) {
129
+ max = level;
130
+ loudest = id;
131
+ }
132
+ }
133
+ if (!loudest || loudest === state.id) {
134
+ return state.candidate ? { ...state, candidate: null } : state;
135
+ }
136
+ if (!state.id) return { id: loudest, candidate: null, since: now };
137
+ const current = levels[state.id] ?? 0;
138
+ if (max < current * margin) return state.candidate ? { ...state, candidate: null } : state;
139
+ if (state.candidate !== loudest) return { ...state, candidate: loudest, since: now };
140
+ return now - state.since >= holdMs ? { id: loudest, candidate: null, since: now } : state;
141
+ }
142
+ function pickSpotlight(people, spotlightId) {
143
+ const spot = people.find((p) => p.id === spotlightId && !p.local);
144
+ if (spot) return spot.id;
145
+ return (people.find((p) => !p.local) ?? people[0])?.id;
146
+ }
147
+ function spotlightBox(width, height, others, narrow, gap = 8, aspect = TILE_ASPECT) {
148
+ if (width <= 0 || height <= 0) return { width: 0, height: 0 };
149
+ let w;
150
+ if (narrow) {
151
+ const rows = Math.ceil(others / 3);
152
+ const stripPerWidth = rows > 0 ? rows / 3 / aspect : 0;
153
+ const fixed = rows > 0 ? gap + rows * gap - rows * 2 * gap / 3 / aspect : 0;
154
+ w = Math.min(width, (height - fixed) / (1 / aspect + stripPerWidth));
155
+ } else {
156
+ const avail = others > 0 ? width - 240 - gap : width;
157
+ w = Math.min(avail, height * aspect);
158
+ }
159
+ w = Math.max(0, Math.floor(w));
160
+ return { width: w, height: Math.floor(w / aspect) };
161
+ }
162
+ function stageContentHeight(view, width, maxHeight, count, gap = 8, aspect = TILE_ASPECT) {
163
+ if (width <= 0 || maxHeight <= 0) return 0;
164
+ if (view === "grid") {
165
+ const g = gridLayout(count, width, maxHeight, gap, aspect);
166
+ return Math.min(maxHeight, g.rows * g.tileHeight + Math.max(0, g.rows - 1) * gap);
167
+ }
168
+ const others = Math.max(0, count - 1);
169
+ const narrow = width < 640;
170
+ const box = spotlightBox(width, maxHeight, others, narrow, gap, aspect);
171
+ if (!narrow || others === 0) return box.height;
172
+ const rows = Math.ceil(others / 3);
173
+ const thumb = (box.width - 2 * gap) / 3 / aspect;
174
+ return Math.min(maxHeight, Math.ceil(box.height + gap + rows * thumb + (rows - 1) * gap));
175
+ }
176
+
177
+ exports.CAPTION_LINES = CAPTION_LINES;
178
+ exports.CAPTION_TTL_MS = CAPTION_TTL_MS;
179
+ exports.INITIAL_SPOTLIGHT = INITIAL_SPOTLIGHT;
180
+ exports.MAX_GRID_TILES = MAX_GRID_TILES;
181
+ exports.NOTICE_MS = NOTICE_MS;
182
+ exports.SPEAKER_ACCENTS = SPEAKER_ACCENTS;
183
+ exports.SPEAKING_LEVEL = SPEAKING_LEVEL;
184
+ exports.TILE_ASPECT = TILE_ASPECT;
185
+ exports.formatElapsed = formatElapsed;
186
+ exports.gridLayout = gridLayout;
187
+ exports.gridSlots = gridSlots;
188
+ exports.initialsOf = initialsOf;
189
+ exports.nearestCorner = nearestCorner;
190
+ exports.nextSpotlight = nextSpotlight;
191
+ exports.pickSpotlight = pickSpotlight;
192
+ exports.rowCounts = rowCounts;
193
+ exports.speakerAccent = speakerAccent;
194
+ exports.speakerBorder = speakerBorder;
195
+ exports.speakerDot = speakerDot;
196
+ exports.spotlightBox = spotlightBox;
197
+ exports.stageContentHeight = stageContentHeight;
198
+ //# sourceMappingURL=chunk-MWDW5UBW.cjs.map
199
+ //# sourceMappingURL=chunk-MWDW5UBW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/calls/layout.ts"],"names":["cols","rows"],"mappings":"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","file":"chunk-MWDW5UBW.cjs","sourcesContent":["/**\n * Pure layout helpers for the call stage: the adaptive tile grid, the per-speaker caption accent,\n * the picture-in-picture corner and the elapsed-time label. No React, no LiveKit: unit-tested on\n * their own.\n */\n\n/** Tiles are 16:9, like the cameras they show. */\nexport const TILE_ASPECT = 16 / 9\n/** How long a status notice (\"Recording — started by X\") stays spelled out before it folds. */\nexport const NOTICE_MS = 6000\n/** How long a caption stays on screen. */\nexport const CAPTION_TTL_MS = 8000\n/** Caption lines shown at once (two lines, the newest at the bottom). */\nexport const CAPTION_LINES = 2\n/** Tiles shown in the grid before the rest fold into a \"+N\" tile. */\nexport const MAX_GRID_TILES = 9\n\n/** Cell shapes (width / height) a filled tile may take before faces get cropped badly. */\nconst MIN_CELL_ASPECT = 0.6\nconst MAX_CELL_ASPECT = 2.4\n/** A row-first grid may be this much smaller than the largest and still win. */\nconst LANDSCAPE_SLACK = 0.85\n\nexport interface GridLayout {\n cols: number\n rows: number\n /** Tiles per row, top to bottom (a short last row is centred: 3 → [2, 1]). */\n rowCounts: number[]\n tileWidth: number\n tileHeight: number\n /** The cell a tile fills when the grid fills the whole stage (the layout's rows × columns). */\n cellWidth: number\n cellHeight: number\n}\n\n/**\n * The grid that gives `count` tiles of a fixed aspect the largest size inside `width × height`\n * with `gap` between them, preferring a row-first layout when it is nearly as large.\n */\nexport function gridLayout(\n count: number,\n width: number,\n height: number,\n gap = 8,\n aspect = TILE_ASPECT\n): GridLayout {\n const n = Math.max(0, Math.floor(count))\n if (n === 0 || width <= 0 || height <= 0) {\n return {\n cols: 0,\n rows: 0,\n rowCounts: [],\n tileWidth: 0,\n tileHeight: 0,\n cellWidth: 0,\n cellHeight: 0,\n }\n }\n const options: { cols: number; rows: number; tileWidth: number }[] = []\n for (let cols = 1; cols <= n; cols++) {\n const rows = Math.ceil(n / cols)\n // A column count that leaves a whole row empty is never better than one fewer column.\n if (cols > 1 && Math.ceil(n / (cols - 1)) === rows) continue\n const byWidth = (width - gap * (cols - 1)) / cols\n const byHeight = ((height - gap * (rows - 1)) / rows) * aspect\n options.push({ cols, rows, tileWidth: Math.max(0, Math.min(byWidth, byHeight)) })\n }\n // Tiles fill their cells, so a cell far from 16:9 crops faces (a 3:1 strip, a 1:2 column):\n // keep to cells within a sane shape when any layout allows it.\n const cellAspect = (o: { cols: number; rows: number }) =>\n (width - gap * (o.cols - 1)) / o.cols / ((height - gap * (o.rows - 1)) / o.rows)\n const sane = options.filter((o) => {\n const a = cellAspect(o)\n return a >= MIN_CELL_ASPECT && a <= MAX_CELL_ASPECT\n })\n const pool = sane.length ? sane : options\n const largest = pool.reduce((a, b) => (b.tileWidth > a.tileWidth + 0.5 ? b : a))\n // Calls read left to right: on a landscape stage a row-first layout (2 side by side, 3 × 2)\n // beats a slightly larger column-first one.\n const landscape = pool\n .filter((o) => o.cols >= o.rows && o.tileWidth >= largest.tileWidth * LANDSCAPE_SLACK)\n .reduce<typeof largest | null>((a, b) => (!a || b.tileWidth > a.tileWidth ? b : a), null)\n const best = landscape ?? largest\n const { cols, rows } = best\n const tileWidth = Math.floor(best.tileWidth)\n return {\n cols,\n rows,\n rowCounts: rowCounts(n, cols),\n tileWidth,\n tileHeight: Math.floor(tileWidth / aspect),\n cellWidth: Math.floor((width - gap * (cols - 1)) / cols),\n cellHeight: Math.floor((height - gap * (rows - 1)) / rows),\n }\n}\n\n/** Spread `count` tiles over rows of at most `cols`, the fuller rows first: 5 in 3 → [3, 2]. */\nexport function rowCounts(count: number, cols: number): number[] {\n if (count <= 0 || cols <= 0) return []\n const rows = Math.ceil(count / cols)\n // Balanced: 7 in 3 columns → [3, 2, 2], not [3, 3, 1].\n const base = Math.floor(count / rows)\n const extra = count % rows\n return Array.from({ length: rows }, (_, i) => base + (i < extra ? 1 : 0))\n}\n\n/** What the grid shows: up to {@link MAX_GRID_TILES}; past that, one slot becomes \"+N more\". */\nexport function gridSlots<T>(items: T[], max = MAX_GRID_TILES): { shown: T[]; hidden: number } {\n if (items.length <= max) return { shown: items, hidden: 0 }\n return { shown: items.slice(0, max - 1), hidden: items.length - (max - 1) }\n}\n\n/**\n * Speaker accents for captions: semantic text tokens that meet AA contrast on the muted surface\n * in both themes. The same identity always gets the same colour.\n */\nexport const SPEAKER_ACCENTS = [\n 'text-blue-text-strong',\n 'text-purple-text-strong',\n 'text-green-text-strong',\n 'text-yellow-text-strong',\n 'text-red-text-strong',\n] as const\n\nfunction speakerIndex(identity: string): number {\n let h = 0\n for (let i = 0; i < identity.length; i++) h = (h * 31 + identity.charCodeAt(i)) >>> 0\n return h % SPEAKER_ACCENTS.length\n}\n\nexport function speakerAccent(identity: string): (typeof SPEAKER_ACCENTS)[number] {\n return SPEAKER_ACCENTS[speakerIndex(identity)]\n}\n\n/** The same speaker's colour as a border (the live transcript line). */\nexport const SPEAKER_BORDERS = [\n 'border-blue-text-strong',\n 'border-purple-text-strong',\n 'border-green-text-strong',\n 'border-yellow-text-strong',\n 'border-red-text-strong',\n] as const\n\nexport function speakerBorder(identity: string): (typeof SPEAKER_BORDERS)[number] {\n return SPEAKER_BORDERS[speakerIndex(identity)]\n}\n\n/** The speaker's colour as an inset ring (the line being spoken). */\nexport const SPEAKER_RINGS = [\n 'ring-blue-text-strong/40',\n 'ring-purple-text-strong/40',\n 'ring-green-text-strong/40',\n 'ring-yellow-text-strong/40',\n 'ring-red-text-strong/40',\n] as const\n\nexport function speakerRing(identity: string): (typeof SPEAKER_RINGS)[number] {\n return SPEAKER_RINGS[speakerIndex(identity)]\n}\n\n/** The speaker's colour as a fill (the \"is speaking\" dots). */\nexport const SPEAKER_DOTS = [\n 'bg-blue-text-strong',\n 'bg-purple-text-strong',\n 'bg-green-text-strong',\n 'bg-yellow-text-strong',\n 'bg-red-text-strong',\n] as const\n\nexport function speakerDot(identity: string): (typeof SPEAKER_DOTS)[number] {\n return SPEAKER_DOTS[speakerIndex(identity)]\n}\n\nexport type PipCorner = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n\n/** The viewport corner nearest to a point (where a dragged picture-in-picture card settles). */\nexport function nearestCorner(x: number, y: number, width: number, height: number): PipCorner {\n const top = y < height / 2\n const left = x < width / 2\n return `${top ? 'top' : 'bottom'}-${left ? 'left' : 'right'}` as PipCorner\n}\n\n/** `m:ss`, or `h:mm:ss` past an hour. */\nexport function formatElapsed(ms: number): string {\n const total = Math.max(0, Math.floor(ms / 1000))\n const h = Math.floor(total / 3600)\n const m = Math.floor((total % 3600) / 60)\n const s = total % 60\n const ss = String(s).padStart(2, '0')\n return h > 0 ? `${h}:${String(m).padStart(2, '0')}:${ss}` : `${m}:${ss}`\n}\n\n/** Up to two initials for a camera-off tile: \"Alice Morgan\" → \"AM\", \"usr-1a2b\" → \"U\". */\nexport function initialsOf(name: string): string {\n const words = name\n .trim()\n .split(/\\s+/)\n .filter((w) => /[\\p{L}\\p{N}]/u.test(w))\n if (!words.length) return '?'\n const first = words[0].match(/[\\p{L}\\p{N}]/u)?.[0] ?? ''\n const last = words.length > 1 ? (words[words.length - 1].match(/[\\p{L}\\p{N}]/u)?.[0] ?? '') : ''\n return (first + last).toUpperCase()\n}\n\n/** Who has the spotlight (speaker view), and who is waiting to take it. */\nexport interface SpotlightState {\n id: string | null\n /** A louder voice that must stay dominant for `holdMs` before it takes over. */\n candidate: string | null\n since: number\n}\n\nexport const INITIAL_SPOTLIGHT: SpotlightState = { id: null, candidate: null, since: 0 }\n\n/** A voice at or above this level (0..1) counts as speaking. */\nexport const SPEAKING_LEVEL = 0.08\n\n/**\n * The speaker view's spotlight, with hysteresis: a new voice takes the spotlight only after it has\n * dominated (`margin` × louder than the current one, above `threshold`) for `holdMs`, so a cough\n * does not flick the view; while several talk at once and nobody dominates, it stays put. With\n * nobody in the spotlight yet, the first voice takes it at once. `exclude` (my own identity) never\n * takes the spotlight: nobody needs to watch themselves large (Meet / Zoom behaviour).\n */\nexport function nextSpotlight(\n state: SpotlightState,\n levels: Record<string, number>,\n now: number,\n { threshold = SPEAKING_LEVEL, holdMs = 800, margin = 1.5, exclude = [] as readonly string[] } = {}\n): SpotlightState {\n let loudest: string | null = null\n let max = threshold\n for (const [id, level] of Object.entries(levels)) {\n if (exclude.includes(id)) continue\n if (level >= max) {\n max = level\n loudest = id\n }\n }\n if (!loudest || loudest === state.id) {\n return state.candidate ? { ...state, candidate: null } : state\n }\n if (!state.id) return { id: loudest, candidate: null, since: now }\n const current = levels[state.id] ?? 0\n if (max < current * margin) return state.candidate ? { ...state, candidate: null } : state\n if (state.candidate !== loudest) return { ...state, candidate: loudest, since: now }\n return now - state.since >= holdMs ? { id: loudest, candidate: null, since: now } : state\n}\n\n/**\n * Who fills the speaker view's large slot: the spotlight if it is someone else in the call, else\n * the first other person, else me (alone in the call). Never me while anyone else is there.\n */\nexport function pickSpotlight(\n people: readonly { id: string; local: boolean }[],\n spotlightId: string | null\n): string | undefined {\n const spot = people.find((p) => p.id === spotlightId && !p.local)\n if (spot) return spot.id\n return (people.find((p) => !p.local) ?? people[0])?.id\n}\n\n/**\n * The speaker view's large tile: the biggest 16:9 box that fits, leaving room for the filmstrip\n * (below it on a narrow stage — a row of three 16:9 thumbnails per line — or a 15rem column beside\n * it). It never takes a portrait shape: spare height stays blank under the filmstrip.\n */\nexport function spotlightBox(\n width: number,\n height: number,\n others: number,\n narrow: boolean,\n gap = 8,\n aspect = TILE_ASPECT\n): { width: number; height: number } {\n if (width <= 0 || height <= 0) return { width: 0, height: 0 }\n let w: number\n if (narrow) {\n // Filmstrip rows of three under the tile: each row is (w - 2 gaps) / 3 wide at 16:9.\n const rows = Math.ceil(others / 3)\n const stripPerWidth = rows > 0 ? rows / 3 / aspect : 0\n const fixed = rows > 0 ? gap + rows * gap - (rows * 2 * gap) / 3 / aspect : 0\n // h = w / aspect + w * stripPerWidth + fixed ≤ height\n w = Math.min(width, (height - fixed) / (1 / aspect + stripPerWidth))\n } else {\n const avail = others > 0 ? width - 240 - gap : width\n w = Math.min(avail, height * aspect)\n }\n w = Math.max(0, Math.floor(w))\n return { width: w, height: Math.floor(w / aspect) }\n}\n\n/**\n * How tall the call stage's tiles are, for a stage `width` wide and at most `maxHeight` tall:\n * speaker view (`focus`: the large 16:9 tile, plus the filmstrip under it on a narrow stage) or\n * gallery (`grid`). The panel gives the rest of its height to the participant list.\n */\nexport function stageContentHeight(\n view: 'focus' | 'grid',\n width: number,\n maxHeight: number,\n count: number,\n gap = 8,\n aspect = TILE_ASPECT\n): number {\n if (width <= 0 || maxHeight <= 0) return 0\n if (view === 'grid') {\n const g = gridLayout(count, width, maxHeight, gap, aspect)\n return Math.min(maxHeight, g.rows * g.tileHeight + Math.max(0, g.rows - 1) * gap)\n }\n const others = Math.max(0, count - 1)\n const narrow = width < 640\n const box = spotlightBox(width, maxHeight, others, narrow, gap, aspect)\n if (!narrow || others === 0) return box.height\n const rows = Math.ceil(others / 3)\n const thumb = (box.width - 2 * gap) / 3 / aspect\n return Math.min(maxHeight, Math.ceil(box.height + gap + rows * thumb + (rows - 1) * gap))\n}\n"]}
@@ -3,8 +3,8 @@ import { useShellBottomInset, ToolButton, Shell } from './chunk-KZJAG7T3.js';
3
3
  import { useMentionAutocomplete, useElementSize, rootFontSizePx } from './chunk-HOXKR26S.js';
4
4
  import { MentionMenu, toMessageMentions, extractMentions } from './chunk-AA3PT6KR.js';
5
5
  import { observeResize } from './chunk-NPLYHR2E.js';
6
- import { formatCount } from './chunk-OXF2IFXG.js';
7
6
  import { testIdOr } from './chunk-7F6CBP3Z.js';
7
+ import { formatCount } from './chunk-OXF2IFXG.js';
8
8
  import { forwardRef, useState, useRef, useCallback, useEffect, useMemo, useSyncExternalStore, useLayoutEffect } from 'react';
9
9
  import { FileText, ChevronDown, Pencil, Workflow, ChevronRight, Sparkles, ChevronUp, MoreHorizontal, RotateCw, AlertCircle, ArrowLeft, Edit3, Send, Loader2, Square, Mic, ArrowDown, MessagesSquare, Bot, GanttChartSquare, ArrowUpRight, Upload, MessageSquarePlus, Trash2, PanelRight, MessageSquare, X, FileUp } from 'lucide-react';
10
10
  import { cn, Textarea, Button, PopoverTrigger, Popover, PopoverAnchor, PopoverContent, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuItem, Tooltip, TooltipTrigger, TooltipContent, MarkdownRenderer, closeOpenEmphasis, trimOpenCitation } from '@arbidocs/react/ui';
@@ -136,9 +136,16 @@ function MessageRoot({
136
136
  }
137
137
  );
138
138
  }
139
+ function MessageAuthor({
140
+ children,
141
+ className
142
+ }) {
143
+ return /* @__PURE__ */ jsx("div", { "data-slot": "message-author", className: cn("mb-1 mt-2 flex items-center", className), children });
144
+ }
139
145
  function MessageContent({
140
146
  role,
141
147
  messageId,
148
+ align = "end",
142
149
  testId = `message-content-${messageId}`,
143
150
  className,
144
151
  children,
@@ -151,7 +158,8 @@ function MessageContent({
151
158
  "data-testid": testId,
152
159
  className: cn(
153
160
  "w-full max-w-full overflow-hidden text-chat",
154
- role === "user" && "flex flex-col items-end",
161
+ role === "user" && "flex flex-col",
162
+ role === "user" && (align === "start" ? "items-start" : "items-end"),
155
163
  className
156
164
  ),
157
165
  ...rest,
@@ -377,7 +385,8 @@ function MessageFooter({
377
385
  steps,
378
386
  className,
379
387
  labels,
380
- stepsToggleTestId
388
+ stepsToggleTestId,
389
+ align = "end"
381
390
  }) {
382
391
  const l = { ...DEFAULT_MESSAGE_LABELS, ...labels };
383
392
  const isUser = role === "user";
@@ -397,7 +406,7 @@ function MessageFooter({
397
406
  ref: measureHeader,
398
407
  className: cn(
399
408
  "flex items-center text-sm",
400
- isUser ? "justify-end gap-2 text-xs" : "justify-between"
409
+ isUser ? cn("gap-2 text-xs", align === "start" ? "justify-start" : "justify-end") : "justify-between"
401
410
  ),
402
411
  children: [
403
412
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
@@ -2445,6 +2454,6 @@ function AssistantDock({
2445
2454
  );
2446
2455
  }
2447
2456
 
2448
- export { AssistantDock, AssistantDockToggle, AssistantModeToggle, ChatDocuments, ChatMessageContent, ChatPage, ChatThreadList, ChatThreadSelect, CitationMark, Composer, ComposerBranchingNotice, ComposerContainer, ComposerDock, ComposerFrame, ComposerInput, ComposerRoot, ComposerSend, ComposerToolbar, ComposerVoiceButton, ContextChip, ConversationEmpty, DEFAULT_ASSISTANT_MODE_TOGGLE_LABELS, DEFAULT_CHAT_PAGE_LABELS, DEFAULT_COMPOSER_LABELS, DEFAULT_CONVERSATION_EMPTY_LABELS, DEFAULT_MESSAGE_ALERT_LABELS, DEFAULT_MESSAGE_LABELS, DEFAULT_MESSAGE_LIST_LABELS, DEFAULT_WORKFLOW_STEP_CHIP_LABELS, Message, MessageActionButton, MessageActionMenu, MessageAlert, MessageBody, MessageBubble, MessageByline, MessageContent, MessageFooter, MessageList, MessageListBanner, MessageListEmpty, MessageListRoot, MessageListRow, MessageListRows, MessageListStatus, MessageListTail, MessageNarration, MessageRoot, MessageSources, MessageSubagentBadge, ScrollToBottom, SourceChip, WorkflowStepChip, toSpeakableText, useAssistantDock, useChatSurface, useRegisterEmbeddedChat, useStreamAnnouncement };
2449
- //# sourceMappingURL=chunk-NUTLXVPX.js.map
2450
- //# sourceMappingURL=chunk-NUTLXVPX.js.map
2457
+ export { AssistantDock, AssistantDockToggle, AssistantModeToggle, ChatDocuments, ChatMessageContent, ChatPage, ChatThreadList, ChatThreadSelect, CitationMark, Composer, ComposerBranchingNotice, ComposerContainer, ComposerDock, ComposerFrame, ComposerInput, ComposerRoot, ComposerSend, ComposerToolbar, ComposerVoiceButton, ContextChip, ConversationEmpty, DEFAULT_ASSISTANT_MODE_TOGGLE_LABELS, DEFAULT_CHAT_PAGE_LABELS, DEFAULT_COMPOSER_LABELS, DEFAULT_CONVERSATION_EMPTY_LABELS, DEFAULT_MESSAGE_ALERT_LABELS, DEFAULT_MESSAGE_LABELS, DEFAULT_MESSAGE_LIST_LABELS, DEFAULT_WORKFLOW_STEP_CHIP_LABELS, Message, MessageActionButton, MessageActionMenu, MessageAlert, MessageAuthor, MessageBody, MessageBubble, MessageByline, MessageContent, MessageFooter, MessageList, MessageListBanner, MessageListEmpty, MessageListRoot, MessageListRow, MessageListRows, MessageListStatus, MessageListTail, MessageNarration, MessageRoot, MessageSources, MessageSubagentBadge, ScrollToBottom, SourceChip, WorkflowStepChip, toSpeakableText, useAssistantDock, useChatSurface, useRegisterEmbeddedChat, useStreamAnnouncement };
2458
+ //# sourceMappingURL=chunk-NRUPUDWB.js.map
2459
+ //# sourceMappingURL=chunk-NRUPUDWB.js.map