@arbidocs/blocks 0.5.18 → 0.5.19

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 (189) hide show
  1. package/dist/{ConnectedCallDock-2NBGBWY5.js → ConnectedCallDock-6MDI332N.js} +10 -10
  2. package/dist/{ConnectedCallDock-2NBGBWY5.js.map → ConnectedCallDock-6MDI332N.js.map} +1 -1
  3. package/dist/{ConnectedCallDock-W5WIPP3F.cjs → ConnectedCallDock-YAVZ7I4F.cjs} +19 -19
  4. package/dist/{ConnectedCallDock-W5WIPP3F.cjs.map → ConnectedCallDock-YAVZ7I4F.cjs.map} +1 -1
  5. package/dist/{ConnectedCallRoom-5AZH33AJ.js → ConnectedCallRoom-NEA43KCW.js} +10 -10
  6. package/dist/{ConnectedCallRoom-5AZH33AJ.js.map → ConnectedCallRoom-NEA43KCW.js.map} +1 -1
  7. package/dist/{ConnectedCallRoom-XR25N6PN.cjs → ConnectedCallRoom-XVWYL3AG.cjs} +11 -11
  8. package/dist/{ConnectedCallRoom-XR25N6PN.cjs.map → ConnectedCallRoom-XVWYL3AG.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-KEDY65GN.cjs → ConnectedNativeDocxComparison-2QTK3EW2.cjs} +12 -12
  10. package/dist/{ConnectedNativeDocxComparison-KEDY65GN.cjs.map → ConnectedNativeDocxComparison-2QTK3EW2.cjs.map} +1 -1
  11. package/dist/{ConnectedNativeDocxComparison-FZNRXKCH.js → ConnectedNativeDocxComparison-7F4TH5UT.js} +11 -11
  12. package/dist/{ConnectedNativeDocxComparison-FZNRXKCH.js.map → ConnectedNativeDocxComparison-7F4TH5UT.js.map} +1 -1
  13. package/dist/{ConnectedNativeDocxEditor-WDIX32SH.cjs → ConnectedNativeDocxEditor-XE7PDYAW.cjs} +12 -12
  14. package/dist/{ConnectedNativeDocxEditor-WDIX32SH.cjs.map → ConnectedNativeDocxEditor-XE7PDYAW.cjs.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-E3ZGVJZJ.js → ConnectedNativeDocxEditor-YHNJ2F46.js} +10 -10
  16. package/dist/{ConnectedNativeDocxEditor-E3ZGVJZJ.js.map → ConnectedNativeDocxEditor-YHNJ2F46.js.map} +1 -1
  17. package/dist/{ConnectedStreamedWordArtifact-HTUZ2KK2.js → ConnectedStreamedWordArtifact-BJHHIRJK.js} +11 -11
  18. package/dist/ConnectedStreamedWordArtifact-BJHHIRJK.js.map +1 -0
  19. package/dist/{ConnectedStreamedWordArtifact-AALQYJ5H.cjs → ConnectedStreamedWordArtifact-R5JJJKT4.cjs} +12 -12
  20. package/dist/ConnectedStreamedWordArtifact-R5JJJKT4.cjs.map +1 -0
  21. package/dist/NativeDocxEditor-6O7UMP7Y.cjs +1 -1
  22. package/dist/NativeDocxEditor-MHO7LF4E.js +1 -1
  23. package/dist/{WorkspaceTableView-4VMLQOQ5.js → WorkspaceTableView-3T2PTHYO.js} +8 -8
  24. package/dist/{WorkspaceTableView-4VMLQOQ5.js.map → WorkspaceTableView-3T2PTHYO.js.map} +1 -1
  25. package/dist/{WorkspaceTableView-S2ZHZ64L.cjs → WorkspaceTableView-7OYHVR4M.cjs} +11 -11
  26. package/dist/{WorkspaceTableView-S2ZHZ64L.cjs.map → WorkspaceTableView-7OYHVR4M.cjs.map} +1 -1
  27. package/dist/agents/index.cjs +331 -331
  28. package/dist/agents/index.js +9 -9
  29. package/dist/calls/index.cjs +132 -133
  30. package/dist/calls/index.cjs.map +1 -1
  31. package/dist/calls/index.js +9 -10
  32. package/dist/calls/index.js.map +1 -1
  33. package/dist/chat/index.cjs +81 -81
  34. package/dist/chat/index.js +3 -3
  35. package/dist/{chunk-LFVD3CS5.cjs → chunk-2PQ5NGDP.cjs} +5 -5
  36. package/dist/{chunk-LFVD3CS5.cjs.map → chunk-2PQ5NGDP.cjs.map} +1 -1
  37. package/dist/{chunk-APZFUKR4.cjs → chunk-32EJMTAV.cjs} +50 -50
  38. package/dist/{chunk-APZFUKR4.cjs.map → chunk-32EJMTAV.cjs.map} +1 -1
  39. package/dist/{chunk-UR6DWL4L.cjs → chunk-3SC3AV5H.cjs} +15 -15
  40. package/dist/{chunk-UR6DWL4L.cjs.map → chunk-3SC3AV5H.cjs.map} +1 -1
  41. package/dist/{chunk-DAL6B556.cjs → chunk-4YRMKA65.cjs} +7 -7
  42. package/dist/chunk-4YRMKA65.cjs.map +1 -0
  43. package/dist/{chunk-OXF2IFXG.js → chunk-5VYJP6XD.js} +3 -28
  44. package/dist/chunk-5VYJP6XD.js.map +1 -0
  45. package/dist/{chunk-GNSGAXJQ.js → chunk-6XW3CMU4.js} +3 -3
  46. package/dist/{chunk-GNSGAXJQ.js.map → chunk-6XW3CMU4.js.map} +1 -1
  47. package/dist/{chunk-M36FYCOE.cjs → chunk-7E4WCS3R.cjs} +7 -7
  48. package/dist/{chunk-M36FYCOE.cjs.map → chunk-7E4WCS3R.cjs.map} +1 -1
  49. package/dist/{chunk-KHBVITVI.js → chunk-7L2YYE7N.js} +3 -3
  50. package/dist/{chunk-KHBVITVI.js.map → chunk-7L2YYE7N.js.map} +1 -1
  51. package/dist/{chunk-ZNLTEZEF.js → chunk-7O3HHX6E.js} +3 -3
  52. package/dist/{chunk-ZNLTEZEF.js.map → chunk-7O3HHX6E.js.map} +1 -1
  53. package/dist/{chunk-C7PTF6BQ.cjs → chunk-7OVC6S2W.cjs} +4 -4
  54. package/dist/{chunk-C7PTF6BQ.cjs.map → chunk-7OVC6S2W.cjs.map} +1 -1
  55. package/dist/{chunk-E3H7Q3ZO.js → chunk-AU5HJTL4.js} +3 -3
  56. package/dist/{chunk-E3H7Q3ZO.js.map → chunk-AU5HJTL4.js.map} +1 -1
  57. package/dist/{chunk-MYJJ3RPH.js → chunk-B4BU2C77.js} +3 -3
  58. package/dist/{chunk-MYJJ3RPH.js.map → chunk-B4BU2C77.js.map} +1 -1
  59. package/dist/{chunk-7IQDS246.cjs → chunk-BDOVPWXB.cjs} +9 -9
  60. package/dist/{chunk-7IQDS246.cjs.map → chunk-BDOVPWXB.cjs.map} +1 -1
  61. package/dist/{chunk-XAJIKT6Y.cjs → chunk-C2ECYOPP.cjs} +4 -4
  62. package/dist/{chunk-XAJIKT6Y.cjs.map → chunk-C2ECYOPP.cjs.map} +1 -1
  63. package/dist/{chunk-PEB2KGN3.cjs → chunk-C6HPAOAO.cjs} +5 -5
  64. package/dist/{chunk-PEB2KGN3.cjs.map → chunk-C6HPAOAO.cjs.map} +1 -1
  65. package/dist/{chunk-VNWWK44S.js → chunk-D2BBT66K.js} +5 -5
  66. package/dist/{chunk-VNWWK44S.js.map → chunk-D2BBT66K.js.map} +1 -1
  67. package/dist/{chunk-B5BJH76B.js → chunk-DFXK3IYH.js} +5 -5
  68. package/dist/{chunk-B5BJH76B.js.map → chunk-DFXK3IYH.js.map} +1 -1
  69. package/dist/{chunk-QVMQMPBZ.cjs → chunk-EGSSLWNZ.cjs} +5 -6
  70. package/dist/chunk-EGSSLWNZ.cjs.map +1 -0
  71. package/dist/{chunk-Z3IB6UMJ.cjs → chunk-ES7US6PH.cjs} +20 -20
  72. package/dist/{chunk-Z3IB6UMJ.cjs.map → chunk-ES7US6PH.cjs.map} +1 -1
  73. package/dist/{chunk-G5TUHVII.cjs → chunk-EUN6L7N6.cjs} +4 -4
  74. package/dist/{chunk-G5TUHVII.cjs.map → chunk-EUN6L7N6.cjs.map} +1 -1
  75. package/dist/{chunk-XNOASBGW.js → chunk-FUPAGAZB.js} +3 -3
  76. package/dist/{chunk-XNOASBGW.js.map → chunk-FUPAGAZB.js.map} +1 -1
  77. package/dist/{chunk-YFLARXLW.js → chunk-GZIB3G3Y.js} +4 -4
  78. package/dist/{chunk-YFLARXLW.js.map → chunk-GZIB3G3Y.js.map} +1 -1
  79. package/dist/{chunk-F4UYC2M2.cjs → chunk-HBDVRSID.cjs} +4 -4
  80. package/dist/{chunk-F4UYC2M2.cjs.map → chunk-HBDVRSID.cjs.map} +1 -1
  81. package/dist/{chunk-SHRNXL2Q.cjs → chunk-J6X4Y63J.cjs} +75 -75
  82. package/dist/{chunk-SHRNXL2Q.cjs.map → chunk-J6X4Y63J.cjs.map} +1 -1
  83. package/dist/{chunk-75Z5AUMM.js → chunk-KTC6OVQD.js} +3 -3
  84. package/dist/{chunk-75Z5AUMM.js.map → chunk-KTC6OVQD.js.map} +1 -1
  85. package/dist/{chunk-G6GUMZOZ.cjs → chunk-LC4RVOT6.cjs} +11 -11
  86. package/dist/{chunk-G6GUMZOZ.cjs.map → chunk-LC4RVOT6.cjs.map} +1 -1
  87. package/dist/{chunk-T5ZFFHC6.js → chunk-NO6YTXHW.js} +4 -4
  88. package/dist/{chunk-T5ZFFHC6.js.map → chunk-NO6YTXHW.js.map} +1 -1
  89. package/dist/{chunk-KFW36UKE.js → chunk-NW2FWRXR.js} +3 -3
  90. package/dist/{chunk-KFW36UKE.js.map → chunk-NW2FWRXR.js.map} +1 -1
  91. package/dist/{chunk-HSMCAFAV.cjs → chunk-O4EQYPLO.cjs} +27 -27
  92. package/dist/{chunk-HSMCAFAV.cjs.map → chunk-O4EQYPLO.cjs.map} +1 -1
  93. package/dist/{chunk-LNLAD7XW.cjs → chunk-OBVPOZQS.cjs} +4 -4
  94. package/dist/{chunk-LNLAD7XW.cjs.map → chunk-OBVPOZQS.cjs.map} +1 -1
  95. package/dist/{chunk-SZGUU2TS.cjs → chunk-P5OCVZ2Q.cjs} +4 -4
  96. package/dist/{chunk-SZGUU2TS.cjs.map → chunk-P5OCVZ2Q.cjs.map} +1 -1
  97. package/dist/{chunk-6MHGFCIW.cjs → chunk-PK7VTZ3Q.cjs} +4 -4
  98. package/dist/{chunk-6MHGFCIW.cjs.map → chunk-PK7VTZ3Q.cjs.map} +1 -1
  99. package/dist/{chunk-RZ3EBN7G.cjs → chunk-R6EQEJZI.cjs} +11 -11
  100. package/dist/{chunk-RZ3EBN7G.cjs.map → chunk-R6EQEJZI.cjs.map} +1 -1
  101. package/dist/{chunk-D3OGQ5ZW.js → chunk-RDQHQ5GJ.js} +3 -3
  102. package/dist/{chunk-D3OGQ5ZW.js.map → chunk-RDQHQ5GJ.js.map} +1 -1
  103. package/dist/{chunk-HVEDOBLY.cjs → chunk-RFAXEQFG.cjs} +4 -4
  104. package/dist/{chunk-HVEDOBLY.cjs.map → chunk-RFAXEQFG.cjs.map} +1 -1
  105. package/dist/{chunk-5S424MAG.js → chunk-RMLJNJ67.js} +3 -3
  106. package/dist/{chunk-5S424MAG.js.map → chunk-RMLJNJ67.js.map} +1 -1
  107. package/dist/{chunk-NUHWRBSL.js → chunk-S3YRRD54.js} +6 -7
  108. package/dist/chunk-S3YRRD54.js.map +1 -0
  109. package/dist/{chunk-PUQO4QPF.js → chunk-SAO6YVSL.js} +4 -4
  110. package/dist/{chunk-PUQO4QPF.js.map → chunk-SAO6YVSL.js.map} +1 -1
  111. package/dist/{chunk-CTCF4I22.js → chunk-SAPEOYLE.js} +3 -3
  112. package/dist/{chunk-CTCF4I22.js.map → chunk-SAPEOYLE.js.map} +1 -1
  113. package/dist/{chunk-GTO65EQQ.js → chunk-SB7XLAD6.js} +3 -3
  114. package/dist/{chunk-GTO65EQQ.js.map → chunk-SB7XLAD6.js.map} +1 -1
  115. package/dist/{chunk-UAKOYCSQ.js → chunk-SKVVOEMX.js} +3 -3
  116. package/dist/{chunk-UAKOYCSQ.js.map → chunk-SKVVOEMX.js.map} +1 -1
  117. package/dist/{chunk-HXYYH4OB.js → chunk-SKWVDEEA.js} +6 -6
  118. package/dist/chunk-SKWVDEEA.js.map +1 -0
  119. package/dist/{chunk-YNMWM44G.js → chunk-SNASQ4A2.js} +3 -3
  120. package/dist/{chunk-YNMWM44G.js.map → chunk-SNASQ4A2.js.map} +1 -1
  121. package/dist/{chunk-LNPG2PUC.cjs → chunk-TB55FZHM.cjs} +5 -5
  122. package/dist/{chunk-LNPG2PUC.cjs.map → chunk-TB55FZHM.cjs.map} +1 -1
  123. package/dist/{chunk-PJYE6AJS.js → chunk-TYGAHK2K.js} +5 -5
  124. package/dist/{chunk-PJYE6AJS.js.map → chunk-TYGAHK2K.js.map} +1 -1
  125. package/dist/{chunk-KDG6FER6.cjs → chunk-UFEXJIEY.cjs} +2 -28
  126. package/dist/chunk-UFEXJIEY.cjs.map +1 -0
  127. package/dist/{chunk-YD3RN2FY.cjs → chunk-UZCHVJ6L.cjs} +3 -3
  128. package/dist/{chunk-YD3RN2FY.cjs.map → chunk-UZCHVJ6L.cjs.map} +1 -1
  129. package/dist/{chunk-HVXNEOOU.js → chunk-VU2ETMSQ.js} +4 -4
  130. package/dist/{chunk-HVXNEOOU.js.map → chunk-VU2ETMSQ.js.map} +1 -1
  131. package/dist/{chunk-P4NS4LV7.cjs → chunk-WA6HMDTV.cjs} +7 -7
  132. package/dist/{chunk-P4NS4LV7.cjs.map → chunk-WA6HMDTV.cjs.map} +1 -1
  133. package/dist/{chunk-TXLMCQOH.js → chunk-Y4PH3TPN.js} +5 -5
  134. package/dist/{chunk-TXLMCQOH.js.map → chunk-Y4PH3TPN.js.map} +1 -1
  135. package/dist/{chunk-M3AADQ4Y.js → chunk-ZN6WPQH3.js} +6 -6
  136. package/dist/{chunk-M3AADQ4Y.js.map → chunk-ZN6WPQH3.js.map} +1 -1
  137. package/dist/{chunk-2GJVZ5UN.cjs → chunk-ZX663X3X.cjs} +8 -8
  138. package/dist/{chunk-2GJVZ5UN.cjs.map → chunk-ZX663X3X.cjs.map} +1 -1
  139. package/dist/citations/index.cjs +3 -3
  140. package/dist/citations/index.js +2 -2
  141. package/dist/collaboration/index.cjs +1 -1
  142. package/dist/collaboration/index.js +1 -1
  143. package/dist/connect/docx.cjs +14 -14
  144. package/dist/connect/docx.js +10 -10
  145. package/dist/connect/index.cjs +931 -945
  146. package/dist/connect/index.cjs.map +1 -1
  147. package/dist/connect/index.js +35 -48
  148. package/dist/connect/index.js.map +1 -1
  149. package/dist/connect/viewer.cjs +63 -63
  150. package/dist/connect/viewer.js +14 -14
  151. package/dist/connection/connectors/index.d.ts +1 -1
  152. package/dist/connection/connectors/sync-labels.d.ts +0 -2
  153. package/dist/docx/index.cjs +1 -1
  154. package/dist/docx/index.js +1 -1
  155. package/dist/facts/index.cjs +59 -59
  156. package/dist/facts/index.js +6 -6
  157. package/dist/files/index.cjs +225 -225
  158. package/dist/files/index.js +5 -5
  159. package/dist/home/index.cjs +30 -30
  160. package/dist/home/index.js +5 -5
  161. package/dist/index.cjs +594 -598
  162. package/dist/index.d.ts +1 -1
  163. package/dist/index.js +18 -18
  164. package/dist/lib/format.d.ts +0 -2
  165. package/dist/settings/index.cjs +158 -158
  166. package/dist/settings/index.js +5 -5
  167. package/dist/shell/index.cjs +3 -3
  168. package/dist/shell/index.js +3 -3
  169. package/dist/site/index.cjs +65 -69
  170. package/dist/site/index.d.ts +1 -1
  171. package/dist/site/index.js +3 -3
  172. package/dist/studio/index.cjs +60 -72
  173. package/dist/studio/index.cjs.map +1 -1
  174. package/dist/studio/index.js +10 -22
  175. package/dist/studio/index.js.map +1 -1
  176. package/dist/workflow-canvas/index.cjs +22 -22
  177. package/dist/workflow-canvas/index.js +9 -9
  178. package/dist/workspaces/index.cjs +20 -20
  179. package/dist/workspaces/index.js +4 -4
  180. package/node_modules/@arbidocs/coedit/package.json +1 -1
  181. package/package.json +5 -5
  182. package/dist/ConnectedStreamedWordArtifact-AALQYJ5H.cjs.map +0 -1
  183. package/dist/ConnectedStreamedWordArtifact-HTUZ2KK2.js.map +0 -1
  184. package/dist/chunk-DAL6B556.cjs.map +0 -1
  185. package/dist/chunk-HXYYH4OB.js.map +0 -1
  186. package/dist/chunk-KDG6FER6.cjs.map +0 -1
  187. package/dist/chunk-NUHWRBSL.js.map +0 -1
  188. package/dist/chunk-OXF2IFXG.js.map +0 -1
  189. package/dist/chunk-QVMQMPBZ.cjs.map +0 -1
@@ -1,12 +1,13 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkAPZFUKR4_cjs = require('../chunk-APZFUKR4.cjs');
5
- var chunkUR6DWL4L_cjs = require('../chunk-UR6DWL4L.cjs');
4
+ var chunk32EJMTAV_cjs = require('../chunk-32EJMTAV.cjs');
5
+ var chunk3SC3AV5H_cjs = require('../chunk-3SC3AV5H.cjs');
6
6
  require('../chunk-RFIBUWLF.cjs');
7
- var chunkG6GUMZOZ_cjs = require('../chunk-G6GUMZOZ.cjs');
8
- require('../chunk-F4UYC2M2.cjs');
7
+ var chunkLC4RVOT6_cjs = require('../chunk-LC4RVOT6.cjs');
8
+ require('../chunk-HBDVRSID.cjs');
9
9
  require('../chunk-AQPZ4QMV.cjs');
10
+ require('../chunk-VZOOGA47.cjs');
10
11
  require('../chunk-SIB6C7P7.cjs');
11
12
  require('../chunk-DVUZTGVL.cjs');
12
13
  require('../chunk-V4ISCZJ7.cjs');
@@ -14,23 +15,22 @@ require('../chunk-AHDJXIUB.cjs');
14
15
  require('../chunk-2EI7NCUA.cjs');
15
16
  require('../chunk-3L5MXUBZ.cjs');
16
17
  require('../chunk-LKK52DEY.cjs');
17
- require('../chunk-VZOOGA47.cjs');
18
18
  var chunkTCT2VS72_cjs = require('../chunk-TCT2VS72.cjs');
19
19
  var chunkT55BHIB7_cjs = require('../chunk-T55BHIB7.cjs');
20
20
  require('../chunk-MB3S2ETI.cjs');
21
21
  require('../chunk-MEMWZ72Y.cjs');
22
22
  require('../chunk-ZW6FPIFC.cjs');
23
- var chunkZLSMS6OK_cjs = require('../chunk-ZLSMS6OK.cjs');
24
- require('../chunk-SI222Z3A.cjs');
25
- require('../chunk-ULWRNGGE.cjs');
26
23
  var chunkEZLZ3MDU_cjs = require('../chunk-EZLZ3MDU.cjs');
27
24
  var chunk76L6LOP3_cjs = require('../chunk-76L6LOP3.cjs');
28
25
  var chunk32HW2Q33_cjs = require('../chunk-32HW2Q33.cjs');
29
26
  require('../chunk-FX3K6LNZ.cjs');
30
27
  require('../chunk-CQ2YSHIF.cjs');
31
28
  require('../chunk-PPCATBOY.cjs');
29
+ var chunkZLSMS6OK_cjs = require('../chunk-ZLSMS6OK.cjs');
30
+ require('../chunk-SI222Z3A.cjs');
31
+ require('../chunk-ULWRNGGE.cjs');
32
+ require('../chunk-UFEXJIEY.cjs');
32
33
  require('../chunk-QSZCU3II.cjs');
33
- require('../chunk-KDG6FER6.cjs');
34
34
  require('../chunk-MHVNT4J3.cjs');
35
35
  require('../chunk-DES3K4SD.cjs');
36
36
  var react = require('react');
@@ -323,9 +323,9 @@ function SignalsEditor({
323
323
  {
324
324
  className: ui.cn(
325
325
  "space-y-1.5 rounded-md border p-2",
326
- chunkUR6DWL4L_cjs.isIncompleteSignal(signal) ? "border-destructive/50" : "border-border"
326
+ chunk3SC3AV5H_cjs.isIncompleteSignal(signal) ? "border-destructive/50" : "border-border"
327
327
  ),
328
- "data-incomplete": chunkUR6DWL4L_cjs.isIncompleteSignal(signal) || void 0,
328
+ "data-incomplete": chunk3SC3AV5H_cjs.isIncompleteSignal(signal) || void 0,
329
329
  "data-testid": `${testId}-${i}`,
330
330
  children: [
331
331
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
@@ -1611,7 +1611,7 @@ function triggerFields(trigger, clearOthers) {
1611
1611
  return {
1612
1612
  timezone: trigger.timezone,
1613
1613
  rrule: trigger.start === "repeat" ? trigger.rrule.trim() : none,
1614
- run_at: trigger.start === "once" ? chunkUR6DWL4L_cjs.localInputToIso(trigger.runAt) : none,
1614
+ run_at: trigger.start === "once" ? chunk3SC3AV5H_cjs.localInputToIso(trigger.runAt) : none,
1615
1615
  event_kind: trigger.start === "event" ? trigger.eventKind.trim() : none,
1616
1616
  // A step signal is `workflow_signal` narrowed to one signal name.
1617
1617
  event_filter: filter ?? none,
@@ -1627,7 +1627,7 @@ function plan(value, options) {
1627
1627
  criteria: [],
1628
1628
  max_passes: 3,
1629
1629
  documents: [],
1630
- steps: chunkUR6DWL4L_cjs.toPlanSteps(value.workflow, options)
1630
+ steps: chunk3SC3AV5H_cjs.toPlanSteps(value.workflow, options)
1631
1631
  };
1632
1632
  }
1633
1633
  function builderToWorkflowRequest(value, workspaceId, options = {}) {
@@ -1662,7 +1662,7 @@ function builderToWorkflowUpdate(value, options = {}) {
1662
1662
  }
1663
1663
  function workflowRecordToBuilder(record) {
1664
1664
  const planned = record.plan?.steps ?? [];
1665
- const steps = planned.length ? chunkUR6DWL4L_cjs.fromPlanSteps(planned) : record.prompt || record.skill_ref ? [
1665
+ const steps = planned.length ? chunk3SC3AV5H_cjs.fromPlanSteps(planned) : record.prompt || record.skill_ref ? [
1666
1666
  {
1667
1667
  id: "work",
1668
1668
  kind: "agent",
@@ -1670,7 +1670,7 @@ function workflowRecordToBuilder(record) {
1670
1670
  ...record.skill_ref ? { workflow: record.skill_ref } : { run: { kind: "prompt", promptTemplate: record.prompt } }
1671
1671
  }
1672
1672
  ] : [];
1673
- const when = chunkUR6DWL4L_cjs.workflowWhen(record);
1673
+ const when = chunk3SC3AV5H_cjs.workflowWhen(record);
1674
1674
  return {
1675
1675
  workflow: {
1676
1676
  id: record.external_id,
@@ -1679,12 +1679,12 @@ function workflowRecordToBuilder(record) {
1679
1679
  inputs: [],
1680
1680
  landing: "chat",
1681
1681
  schedulable: false,
1682
- run: { kind: "steps", steps, layout: chunkUR6DWL4L_cjs.layoutFromPlanSteps(planned ?? []) }
1682
+ run: { kind: "steps", steps, layout: chunk3SC3AV5H_cjs.layoutFromPlanSteps(planned ?? []) }
1683
1683
  },
1684
1684
  trigger: {
1685
1685
  ...DEFAULT_WORKFLOW_TRIGGER,
1686
1686
  start: when === "now" ? "manual" : when,
1687
- runAt: chunkUR6DWL4L_cjs.isoToLocalInput(record.run_at),
1687
+ runAt: chunk3SC3AV5H_cjs.isoToLocalInput(record.run_at),
1688
1688
  rrule: record.rrule ?? "",
1689
1689
  timezone: record.timezone || DEFAULT_WORKFLOW_TRIGGER.timezone,
1690
1690
  eventKind: record.event_kind ?? "",
@@ -1740,7 +1740,7 @@ function triggerSummary(trigger, options = {}) {
1740
1740
  case "once":
1741
1741
  return trigger.runAt ? new Date(trigger.runAt).toLocaleString() : l.starts.once;
1742
1742
  case "repeat":
1743
- return trigger.rrule ? chunkUR6DWL4L_cjs.describeRRule(trigger.rrule) : l.starts.repeat;
1743
+ return trigger.rrule ? chunk3SC3AV5H_cjs.describeRRule(trigger.rrule) : l.starts.repeat;
1744
1744
  case "event":
1745
1745
  if (isSignalTrigger(trigger))
1746
1746
  return trigger.signal ? l.signalSummary.replace("{signal}", trigger.signal) : l.stepSignals;
@@ -1799,7 +1799,7 @@ function TriggerInspector({
1799
1799
  }
1800
1800
  )
1801
1801
  ] }),
1802
- trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(chunkUR6DWL4L_cjs.RecurrenceBuilder, { rrule: trigger.rrule, onChange: (rrule) => set({ rrule }) }),
1802
+ trigger.start === "repeat" && /* @__PURE__ */ jsxRuntime.jsx(chunk3SC3AV5H_cjs.RecurrenceBuilder, { rrule: trigger.rrule, onChange: (rrule) => set({ rrule }) }),
1803
1803
  trigger.start === "event" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
1804
1804
  /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.event }),
1805
1805
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1851,7 +1851,7 @@ function TriggerInspector({
1851
1851
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
1852
1852
  /* @__PURE__ */ jsxRuntime.jsx(ui.Label, { className: "text-xs", children: l.agent }),
1853
1853
  /* @__PURE__ */ jsxRuntime.jsx(
1854
- chunkG6GUMZOZ_cjs.AgentSelect,
1854
+ chunkLC4RVOT6_cjs.AgentSelect,
1855
1855
  {
1856
1856
  agents,
1857
1857
  value: trigger.agentId,
@@ -2688,13 +2688,13 @@ function WorkflowPreview({
2688
2688
  renderIcon,
2689
2689
  testId
2690
2690
  }) {
2691
- const run = chunkAPZFUKR4_cjs.useWorkflowPreview(workflow, {
2691
+ const run = chunk32EJMTAV_cjs.useWorkflowPreview(workflow, {
2692
2692
  resolveWorkflow: (id) => workflows.find((w) => w.id === id),
2693
2693
  compose,
2694
2694
  answer
2695
2695
  });
2696
2696
  return /* @__PURE__ */ jsxRuntime.jsx(
2697
- chunkUR6DWL4L_cjs.WorkflowRunner,
2697
+ chunk3SC3AV5H_cjs.WorkflowRunner,
2698
2698
  {
2699
2699
  workflow,
2700
2700
  run,
@@ -1,10 +1,11 @@
1
1
  "use client";
2
- import { useWorkflowPreview } from '../chunk-PJYE6AJS.js';
3
- import { isIncompleteSignal, fromPlanSteps, workflowWhen, isoToLocalInput, layoutFromPlanSteps, describeRRule, RecurrenceBuilder, WorkflowRunner, toPlanSteps, localInputToIso } from '../chunk-M3AADQ4Y.js';
2
+ import { useWorkflowPreview } from '../chunk-TYGAHK2K.js';
3
+ import { isIncompleteSignal, fromPlanSteps, workflowWhen, isoToLocalInput, layoutFromPlanSteps, describeRRule, RecurrenceBuilder, WorkflowRunner, toPlanSteps, localInputToIso } from '../chunk-ZN6WPQH3.js';
4
4
  import '../chunk-CQCC7LE7.js';
5
- import { AgentSelect } from '../chunk-TXLMCQOH.js';
6
- import '../chunk-D3OGQ5ZW.js';
5
+ import { AgentSelect } from '../chunk-Y4PH3TPN.js';
6
+ import '../chunk-RDQHQ5GJ.js';
7
7
  import '../chunk-G4GLDQLY.js';
8
+ import '../chunk-WNDIVNPT.js';
8
9
  import '../chunk-M4S75AEJ.js';
9
10
  import '../chunk-5LXQPP2K.js';
10
11
  import '../chunk-NUNKSZKU.js';
@@ -12,23 +13,22 @@ import '../chunk-RLWIUUQ5.js';
12
13
  import '../chunk-YU2KUMGE.js';
13
14
  import '../chunk-SX2RX5DT.js';
14
15
  import '../chunk-7F5Z4K5W.js';
15
- import '../chunk-WNDIVNPT.js';
16
16
  import { useConnectedTags, useListedDocuments, useConnectedConversations } from '../chunk-G7PAZQHJ.js';
17
17
  import { useConnectedWorkspace } from '../chunk-BIZDGRNM.js';
18
18
  import '../chunk-T4P237N6.js';
19
19
  import '../chunk-ABEKUV6L.js';
20
20
  import '../chunk-P6GHJSLR.js';
21
- import { useBlocksEnvironment } from '../chunk-CH4FHZSR.js';
22
- import '../chunk-U4HWVCRN.js';
23
- import '../chunk-TX2ZICS7.js';
24
21
  import { DEFAULT_STEP_KIND_LABELS, workflowSteps, dependsOn, stepLevels, runFields, upstreamSteps, stepDependencies, canAssign, WORKFLOW_STEP_KINDS, STEP_KIND_ICONS, validateWorkflowGraph, stepConfigProblems, assigneeName, orderSteps, stepKindOf } from '../chunk-THNTNAYI.js';
25
22
  import { mergeSkillWorkflows } from '../chunk-TZGBRLPK.js';
26
23
  import { TONE_DOT, TONES, isTone } from '../chunk-AUS3KBHJ.js';
27
24
  import '../chunk-SLSBJRWW.js';
28
25
  import '../chunk-GAGYAHYO.js';
29
26
  import '../chunk-NPLYHR2E.js';
27
+ import { useBlocksEnvironment } from '../chunk-CH4FHZSR.js';
28
+ import '../chunk-U4HWVCRN.js';
29
+ import '../chunk-TX2ZICS7.js';
30
+ import '../chunk-5VYJP6XD.js';
30
31
  import '../chunk-EDZHEBMV.js';
31
- import '../chunk-OXF2IFXG.js';
32
32
  import '../chunk-7F6CBP3Z.js';
33
33
  import '../chunk-VUNV25KB.js';
34
34
  import { useState, useMemo, useEffect, useCallback, useRef } from 'react';
@@ -2,17 +2,17 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkH32DV7XS_cjs = require('../chunk-H32DV7XS.cjs');
5
- var chunkDAL6B556_cjs = require('../chunk-DAL6B556.cjs');
5
+ var chunk4YRMKA65_cjs = require('../chunk-4YRMKA65.cjs');
6
6
  var chunkJUUOJP7I_cjs = require('../chunk-JUUOJP7I.cjs');
7
7
  require('../chunk-REH7PX3N.cjs');
8
- require('../chunk-XAJIKT6Y.cjs');
8
+ require('../chunk-C2ECYOPP.cjs');
9
9
  var chunk7G2LJMUG_cjs = require('../chunk-7G2LJMUG.cjs');
10
10
  require('../chunk-3L5MXUBZ.cjs');
11
11
  require('../chunk-ZLSMS6OK.cjs');
12
12
  require('../chunk-SI222Z3A.cjs');
13
13
  var chunkULWRNGGE_cjs = require('../chunk-ULWRNGGE.cjs');
14
+ require('../chunk-UFEXJIEY.cjs');
14
15
  require('../chunk-QSZCU3II.cjs');
15
- require('../chunk-KDG6FER6.cjs');
16
16
  require('../chunk-MHVNT4J3.cjs');
17
17
  require('../chunk-DES3K4SD.cjs');
18
18
  var react = require('react');
@@ -65,7 +65,7 @@ function WorkspaceGallery({
65
65
  const opening = workspace.id === activeOpeningId;
66
66
  const state = { current, opening };
67
67
  return /* @__PURE__ */ jsxRuntime.jsx(
68
- chunkDAL6B556_cjs.WorkspaceCard,
68
+ chunk4YRMKA65_cjs.WorkspaceCard,
69
69
  {
70
70
  workspace,
71
71
  current,
@@ -346,67 +346,67 @@ function WorkspaceFieldsView({
346
346
 
347
347
  Object.defineProperty(exports, "CommonWorkspaceToggle", {
348
348
  enumerable: true,
349
- get: function () { return chunkDAL6B556_cjs.CommonWorkspaceToggle; }
349
+ get: function () { return chunk4YRMKA65_cjs.CommonWorkspaceToggle; }
350
350
  });
351
351
  Object.defineProperty(exports, "DEFAULT_WORKSPACE_CARD_LABELS", {
352
352
  enumerable: true,
353
- get: function () { return chunkDAL6B556_cjs.DEFAULT_WORKSPACE_CARD_LABELS; }
353
+ get: function () { return chunk4YRMKA65_cjs.DEFAULT_WORKSPACE_CARD_LABELS; }
354
354
  });
355
355
  Object.defineProperty(exports, "ExpandableSection", {
356
356
  enumerable: true,
357
- get: function () { return chunkDAL6B556_cjs.ExpandableSection; }
357
+ get: function () { return chunk4YRMKA65_cjs.ExpandableSection; }
358
358
  });
359
359
  Object.defineProperty(exports, "ItalicNone", {
360
360
  enumerable: true,
361
- get: function () { return chunkDAL6B556_cjs.ItalicNone; }
361
+ get: function () { return chunk4YRMKA65_cjs.ItalicNone; }
362
362
  });
363
363
  Object.defineProperty(exports, "LeaveFooter", {
364
364
  enumerable: true,
365
- get: function () { return chunkDAL6B556_cjs.LeaveFooter; }
365
+ get: function () { return chunk4YRMKA65_cjs.LeaveFooter; }
366
366
  });
367
367
  Object.defineProperty(exports, "PageLoading", {
368
368
  enumerable: true,
369
- get: function () { return chunkDAL6B556_cjs.PageLoading; }
369
+ get: function () { return chunk4YRMKA65_cjs.PageLoading; }
370
370
  });
371
371
  Object.defineProperty(exports, "WorkspaceAudienceLine", {
372
372
  enumerable: true,
373
- get: function () { return chunkDAL6B556_cjs.WorkspaceAudienceLine; }
373
+ get: function () { return chunk4YRMKA65_cjs.WorkspaceAudienceLine; }
374
374
  });
375
375
  Object.defineProperty(exports, "WorkspaceCard", {
376
376
  enumerable: true,
377
- get: function () { return chunkDAL6B556_cjs.WorkspaceCard; }
377
+ get: function () { return chunk4YRMKA65_cjs.WorkspaceCard; }
378
378
  });
379
379
  Object.defineProperty(exports, "WorkspaceGroup", {
380
380
  enumerable: true,
381
- get: function () { return chunkDAL6B556_cjs.WorkspaceGroup; }
381
+ get: function () { return chunk4YRMKA65_cjs.WorkspaceGroup; }
382
382
  });
383
383
  Object.defineProperty(exports, "WorkspaceIdentityPanel", {
384
384
  enumerable: true,
385
- get: function () { return chunkDAL6B556_cjs.WorkspaceIdentityPanel; }
385
+ get: function () { return chunk4YRMKA65_cjs.WorkspaceIdentityPanel; }
386
386
  });
387
387
  Object.defineProperty(exports, "WorkspaceList", {
388
388
  enumerable: true,
389
- get: function () { return chunkDAL6B556_cjs.WorkspaceList; }
389
+ get: function () { return chunk4YRMKA65_cjs.WorkspaceList; }
390
390
  });
391
391
  Object.defineProperty(exports, "WorkspacePageFrame", {
392
392
  enumerable: true,
393
- get: function () { return chunkDAL6B556_cjs.WorkspacePageFrame; }
393
+ get: function () { return chunk4YRMKA65_cjs.WorkspacePageFrame; }
394
394
  });
395
395
  Object.defineProperty(exports, "WorkspaceProjectSlot", {
396
396
  enumerable: true,
397
- get: function () { return chunkDAL6B556_cjs.WorkspaceProjectSlot; }
397
+ get: function () { return chunk4YRMKA65_cjs.WorkspaceProjectSlot; }
398
398
  });
399
399
  Object.defineProperty(exports, "formatRole", {
400
400
  enumerable: true,
401
- get: function () { return chunkDAL6B556_cjs.formatRole; }
401
+ get: function () { return chunk4YRMKA65_cjs.formatRole; }
402
402
  });
403
403
  Object.defineProperty(exports, "getRoleBadgeClass", {
404
404
  enumerable: true,
405
- get: function () { return chunkDAL6B556_cjs.getRoleBadgeClass; }
405
+ get: function () { return chunk4YRMKA65_cjs.getRoleBadgeClass; }
406
406
  });
407
407
  Object.defineProperty(exports, "getRoleDescription", {
408
408
  enumerable: true,
409
- get: function () { return chunkDAL6B556_cjs.getRoleDescription; }
409
+ get: function () { return chunk4YRMKA65_cjs.getRoleDescription; }
410
410
  });
411
411
  Object.defineProperty(exports, "NO_PROJECT_GROUP_KEY", {
412
412
  enumerable: true,
@@ -1,17 +1,17 @@
1
1
  "use client";
2
2
  import { KeyValueRow } from '../chunk-XRL4R2TT.js';
3
- import { WorkspaceCard } from '../chunk-HXYYH4OB.js';
4
- export { CommonWorkspaceToggle, DEFAULT_WORKSPACE_CARD_LABELS, ExpandableSection, ItalicNone, LeaveFooter, PageLoading, WorkspaceAudienceLine, WorkspaceCard, WorkspaceGroup, WorkspaceIdentityPanel, WorkspaceList, WorkspacePageFrame, WorkspaceProjectSlot, formatRole, getRoleBadgeClass, getRoleDescription } from '../chunk-HXYYH4OB.js';
3
+ import { WorkspaceCard } from '../chunk-SKWVDEEA.js';
4
+ export { CommonWorkspaceToggle, DEFAULT_WORKSPACE_CARD_LABELS, ExpandableSection, ItalicNone, LeaveFooter, PageLoading, WorkspaceAudienceLine, WorkspaceCard, WorkspaceGroup, WorkspaceIdentityPanel, WorkspaceList, WorkspacePageFrame, WorkspaceProjectSlot, formatRole, getRoleBadgeClass, getRoleDescription } from '../chunk-SKWVDEEA.js';
5
5
  export { NO_PROJECT_GROUP_KEY, WORKSPACE_CATEGORY_FILTERS, byRecentUpdate, getHumanUserCount, getVariantBgClass, getVariantBorderClass, getWorkspaceTypeInfo, groupWorkspacesByProject, isAgentAccount, isListedWorkspace, projectFilterId, workspaceConversationCount, workspaceDocumentCount, workspaceFilterAttributes, workspaceGroupStats } from '../chunk-BTF4AZMG.js';
6
6
  import '../chunk-5TDGVOR5.js';
7
- import '../chunk-XNOASBGW.js';
7
+ import '../chunk-FUPAGAZB.js';
8
8
  export { RoleBadge, WorkspaceTypeBadgeView } from '../chunk-NBV56SGU.js';
9
9
  import '../chunk-SX2RX5DT.js';
10
10
  import '../chunk-CH4FHZSR.js';
11
11
  import '../chunk-U4HWVCRN.js';
12
12
  import { ModalHeader } from '../chunk-TX2ZICS7.js';
13
+ import '../chunk-5VYJP6XD.js';
13
14
  import '../chunk-EDZHEBMV.js';
14
- import '../chunk-OXF2IFXG.js';
15
15
  import '../chunk-7F6CBP3Z.js';
16
16
  import '../chunk-VUNV25KB.js';
17
17
  import { useState, useCallback, useId } from 'react';
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbidocs/coedit",
3
- "version": "0.5.18",
3
+ "version": "0.5.19",
4
4
  "description": "Real-time collaboration for the ARBI native DOCX editor: a Yjs mirror of the canonical OOXML package, session, and server runtime",
5
5
  "type": "module",
6
6
  "sideEffects": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arbidocs/blocks",
3
- "version": "0.5.18",
3
+ "version": "0.5.19",
4
4
  "description": "Composable, domain-neutral UI blocks for ARBI apps, organised by capability (retrieval, facts, agents, workspaces, citations, collaboration) plus shell, theme and site primitives, on top of @arbidocs/react.",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -296,9 +296,9 @@
296
296
  "example:test:e2e": "playwright test -c examples/custom-ui/playwright.config.ts"
297
297
  },
298
298
  "dependencies": {
299
- "@arbidocs/client": "0.5.18",
300
- "@arbidocs/coedit": "0.5.18",
301
- "@arbidocs/sdk": "0.5.18",
299
+ "@arbidocs/client": "0.5.19",
300
+ "@arbidocs/coedit": "0.5.19",
301
+ "@arbidocs/sdk": "0.5.19",
302
302
  "@auth0/auth0-react": "^2.19.0",
303
303
  "@dnd-kit/core": "^6.3.1",
304
304
  "@dnd-kit/sortable": "^10.0.0",
@@ -345,7 +345,7 @@
345
345
  "y-protocols": "^1.0.6"
346
346
  },
347
347
  "peerDependencies": {
348
- "@arbidocs/react": "0.5.18",
348
+ "@arbidocs/react": "0.5.19",
349
349
  "@lexical/html": "0.35.0",
350
350
  "@lexical/link": "0.35.0",
351
351
  "@lexical/list": "0.35.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ConnectedStreamedWordArtifact-AALQYJ5H.cjs"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"ConnectedStreamedWordArtifact-HTUZ2KK2.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/workspaces/WorkspaceSettingsParts.tsx","../src/workspaces/CommonWorkspaceToggle.tsx","../src/workspaces/workspace-roles.ts","../src/workspaces/WorkspaceCard.tsx","../src/workspaces/WorkspaceGroup.tsx"],"names":["jsx","jsxs","Popover","PopoverTrigger","PopoverContent","Button","UserPlus","cn","LogOut","IconToggle","Globe","createContext","useMemo","ActionLink","useContext","Check","ChevronRight","FileText","MessagesSquare","Users","MemberAvatarStack","fmtDate","fromNow","CollapsibleSection"],"mappings":"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","file":"chunk-DAL6B556.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { LogOut, UserPlus } from 'lucide-react'\nimport { Button, cn, Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\n\n/**\n * Page frame of a workspace's home: a bounded column whose ONE scroll region spans the full\n * width (scrollbar on the outer edge), the inset living on the content inside it. A container,\n * so children can use `@2xl:` queries.\n */\nexport function WorkspacePageFrame({ testId, children }: { testId?: string; children: ReactNode }) {\n return (\n <div\n className=\"flex h-full flex-col @container\"\n data-slot=\"workspace-page\"\n data-testid={testId}\n >\n {/* scrollbar-gutter:stable keeps the content from jumping when a scrollbar appears. */}\n <div className=\"scrollbar-subtle min-h-0 flex-1 overflow-y-auto [scrollbar-gutter:stable]\">\n <div className=\"space-y-6 px-4 pb-6 sm:px-6 pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Tinted card holding the identity bar and the expandable member list. */\nexport function WorkspaceIdentityPanel({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"workspace-identity-panel\"\n className=\"group rounded-lg border border-border bg-card px-4 py-3 shadow-xs\"\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceProjectSlotProps {\n testId: string\n /** Screen-reader caption (\"Project:\"): the chip says what it is without a word in front. */\n caption: string\n children: ReactNode\n}\n\n/** The project control / chip pinned to the end of the name row. */\nexport function WorkspaceProjectSlot({ testId, caption, children }: WorkspaceProjectSlotProps) {\n return (\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\" data-testid={testId}>\n <span className=\"sr-only\">{caption}</span>\n {children}\n </div>\n </div>\n )\n}\n\n/** Stated absence (\"None\") rather than a blank gap. */\nexport function ItalicNone({ children }: { children: ReactNode }) {\n return <span className=\"text-sm italic text-muted-foreground\">{children}</span>\n}\n\nexport interface WorkspaceAudienceLineProps {\n visibility: {\n testId: string\n caption: string\n /** The owner's visibility switch (developers only). */\n toggle?: ReactNode\n /** The state named in words, so the switch is never a puzzle. */\n stateText: string\n /** What the state means for who can see the workspace; opened by tapping the state words. */\n stateHelp: string\n }\n /** Member avatar stack. */\n members: ReactNode\n /** \"Share\" button (owners). */\n share?: { label: string; onClick: () => void; testId: string }\n}\n\n/** Visibility and members end the description line together: who can see and use the workspace. */\nexport function WorkspaceAudienceLine({ visibility, members, share }: WorkspaceAudienceLineProps) {\n return (\n <span className=\"flex flex-wrap items-center gap-x-4 gap-y-2\" data-slot=\"workspace-audience\">\n <span className=\"flex items-center gap-2\" data-testid={visibility.testId}>\n <span className=\"sr-only\">{visibility.caption}</span>\n {visibility.toggle}\n {/* Tap-to-explain, not hover-only: the words must answer a click on touch screens too. */}\n <Popover>\n <PopoverTrigger className=\"touch-hit cursor-pointer rounded-sm text-sm text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n {visibility.stateText}\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64 text-sm\">\n {visibility.stateHelp}\n </PopoverContent>\n </Popover>\n </span>\n {/* Faces first, then Share: \"these people ... add more\". */}\n <span className=\"flex items-center gap-1\">\n {members}\n {share && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-1.5 px-3 text-sm pointer-coarse:h-11\"\n onClick={share.onClick}\n data-testid={share.testId}\n >\n <UserPlus className=\"size-4\" />\n {share.label}\n </Button>\n )}\n </span>\n </span>\n )\n}\n\n/**\n * Collapsible block under the identity bar. Stays mounted and animates its height (grid-rows\n * 0fr to 1fr), so opening and closing glides instead of snapping.\n */\nexport function ExpandableSection({\n expanded,\n testId,\n children,\n}: {\n expanded: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-300 ease-in-out',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n data-slot=\"expandable-section\"\n data-expanded={expanded}\n data-testid={testId}\n >\n <div className=\"overflow-hidden\">\n <div className=\"mt-4 border-t border-border pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Centered loading placeholder of a page body. */\nexport function PageLoading({ children }: { children: ReactNode }) {\n return <div className=\"flex h-64 items-center justify-center\">{children}</div>\n}\n\nexport interface LeaveFooterProps {\n testId?: string\n leave: { label: string; disabled?: boolean; onClick: () => void; testId?: string }\n}\n\n/** Leaving ENDS your part in the workspace, so it sits last and alone at the foot of the page. */\nexport function LeaveFooter({ testId, leave }: LeaveFooterProps) {\n return (\n <div className=\"flex justify-end\" data-slot=\"leave-footer\" data-testid={testId}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={leave.onClick}\n disabled={leave.disabled}\n className=\"h-7 px-2 text-sm text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11\"\n data-testid={leave.testId}\n >\n <LogOut className=\"mr-1 size-3.5\" />\n {leave.label}\n </Button>\n </div>\n )\n}\n","/**\n * CommonWorkspaceToggle Component\n *\n * Toggle for workspace common/members-only visibility.\n * Takes isCommon and onToggle as props for form integration.\n */\n\nimport { Globe } from 'lucide-react'\nimport { IconToggle } from '@arbidocs/react/ui'\n\nexport interface CommonWorkspaceToggleProps {\n isCommon: boolean\n onToggle: (isCommon: boolean) => void\n disabled?: boolean\n /** Tooltip to show when disabled */\n disabledTooltip?: string\n 'data-testid'?: string\n}\n\nconst COLORS = {\n text: 'text-muted-foreground',\n bg: 'bg-gray-600',\n}\n\nexport function CommonWorkspaceToggle({\n isCommon,\n onToggle,\n disabled = false,\n disabledTooltip,\n 'data-testid': dataTestId,\n}: CommonWorkspaceToggleProps) {\n return (\n <IconToggle\n icon={Globe}\n isActive={isCommon}\n onToggle={onToggle}\n colors={COLORS}\n disabled={disabled}\n disabledTooltip={disabledTooltip}\n tooltipActive=\"On: everyone on this deployment can see it. Turn off to limit it to members.\"\n tooltipInactive=\"Off: only members of this workspace can see it. Turn on to let everyone on this deployment see it.\"\n data-testid={dataTestId}\n />\n )\n}\n","/**\n * A workspace role ('owner' | 'collaborator' | 'guest') as people see it: its name, its badge\n * colours and what it lets a member do.\n */\n\nexport type WorkspaceRoleName = 'owner' | 'collaborator' | 'guest'\n\n/** \"Owner\", \"Collaborator\", \"Guest\". */\nexport function formatRole(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1)\n}\n\nconst ROLE_BADGE_CLASSES: Record<WorkspaceRoleName, string> = {\n owner: 'bg-primary text-white hover:bg-primary border border-primary',\n collaborator: 'bg-secondary text-white hover:bg-secondary border border-secondary',\n guest: 'bg-gray-600 text-white hover:bg-gray-600 border border-gray-600',\n}\n\n/** The badge classes of a role. */\nexport function getRoleBadgeClass(role: WorkspaceRoleName): string {\n return ROLE_BADGE_CLASSES[role]\n}\n\nconst ROLE_DESCRIPTIONS: Record<WorkspaceRoleName, string> = {\n owner:\n 'Owners have full control of the workspace, including adding and removing members, but cannot see private content created by other members.',\n collaborator:\n 'Collaborators can create and edit shared content, but cannot delete shared content created by others and cannot manage workspace settings or membership.',\n guest:\n 'Guests can create private content and view shared content, but cannot create or edit shared content.',\n}\n\n/** What a role lets a member do (a tooltip). */\nexport function getRoleDescription(role: WorkspaceRoleName): string {\n return ROLE_DESCRIPTIONS[role]\n}\n","import {\n createContext,\n useContext,\n type HTMLAttributes,\n useMemo,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { Check, ChevronRight, FileText, MessagesSquare, Users } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { fmtDate, fromNow } from '../lib/format'\nimport { ActionLink } from '../components/ActionLink'\nimport { MemberAvatarStack, type StackedMember } from '../components/MemberAvatarStack'\n\n/** Everything a workspace tile shows, source-agnostic (not the raw SDK shape). */\nexport interface WorkspaceSummary {\n id: string\n name: string\n description?: string | null\n /** Host-supplied line under the name (a reference, a client, a status...). Not interpreted. */\n subtitle?: ReactNode\n docCount: number\n /** Hidden when undefined, so a host without chats shows no empty counter. */\n chatCount?: number\n /** Number of visible members (agents excluded by the caller). */\n memberCount: number\n members: StackedMember[]\n /** The viewer may not see who is here (RLS): renders an em dash, not a `0`. */\n membersHidden?: boolean\n /** ISO timestamp: rendered as \"Updated {relative}\". */\n updatedAt?: string | null\n}\n\n/** Every fixed string of the workspace tile. Pass a partial `labels` to translate or reword. */\nexport interface WorkspaceCardLabels {\n /** The tile's accessible name. */\n openWorkspace: (name: string) => string\n currentWorkspace: string\n documents: string\n chats: string\n members: string\n /** `relative` is the formatted \"3 days ago\". */\n updated: (relative: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_CARD_LABELS: WorkspaceCardLabels = {\n openWorkspace: (name) => `Open workspace ${name}`,\n currentWorkspace: 'Current workspace',\n documents: 'Documents',\n chats: 'Tasks',\n members: 'Members',\n updated: (relative) => `Updated ${relative}`,\n}\n\ninterface CardContextValue {\n current: boolean\n testId?: string\n labels: WorkspaceCardLabels\n}\n\nconst CardContext = createContext<CardContextValue>({\n current: false,\n labels: DEFAULT_WORKSPACE_CARD_LABELS,\n})\n\ntype DivProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'>\n\n/* ------------------------------------------------------------------ */\n/* Parts */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardRootProps extends DivProps {\n /** This is the workspace you are in: accented surface, \"Current workspace\" cue. */\n current?: boolean\n onSelect: () => void\n /**\n * Real link target. The tile then renders as an anchor (ctrl-click / new tab, in-SPA through\n * the host environment's `linkComponent`); `onSelect` still fires on a plain click.\n */\n href?: string\n /** Accessible name; defaults to `labels.openWorkspace(name)` when composed via `WorkspaceCard`. */\n label: string\n testId?: string\n labels?: Partial<WorkspaceCardLabels>\n children: ReactNode\n}\n\n/**\n * The tile surface: one button that opens the workspace. A raised white card\n * (hairline border, soft shadow, hover lift); the current workspace takes the selection tint.\n */\nfunction WorkspaceCardRoot({\n current = false,\n onSelect,\n href,\n label,\n testId,\n labels,\n className,\n children,\n ...rest\n}: WorkspaceCardRootProps) {\n const mergedLabels = useMemo(() => ({ ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }), [labels])\n const surfaceClass = cn(\n '@container/ws-card flex min-h-40 w-full cursor-pointer flex-col gap-3 rounded-lg p-4 text-left transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n current\n ? 'bg-accent text-accent-foreground'\n : 'border border-border bg-card shadow-xs transition-colors hover:border-ring/50 hover:bg-accent/40',\n className\n )\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onSelect()\n }\n }\n return (\n <CardContext.Provider value={{ current, testId, labels: mergedLabels }}>\n {href ? (\n <ActionLink\n {...(rest as object)}\n href={href}\n onSelect={onSelect}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n className={surfaceClass}\n >\n {children}\n </ActionLink>\n ) : (\n <div\n {...rest}\n role=\"button\"\n tabIndex={0}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n onClick={onSelect}\n onKeyDown={handleKeyDown}\n className={surfaceClass}\n >\n {children}\n </div>\n )}\n </CardContext.Provider>\n )\n}\n\n/** Mark + name + open cue, on one row. Put the entity mark first. */\nfunction WorkspaceCardHeader({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('flex flex-wrap items-center gap-x-3 gap-y-2', className)}\n data-slot=\"workspace-card-header\"\n >\n {children}\n </div>\n )\n}\n\nfunction WorkspaceCardTitle({ children, className }: { children: ReactNode; className?: string }) {\n const { testId } = useContext(CardContext)\n return (\n <h3\n className={cn(\n 'line-clamp-2 min-w-24 flex-1 break-words text-base font-semibold leading-tight text-foreground',\n className\n )}\n data-slot=\"workspace-card-title\"\n data-testid={testId && `${testId}-title`}\n >\n {children}\n </h3>\n )\n}\n\n/**\n * The open cue is always on screen (never hover-only): a chevron, or the words\n * \"Current workspace\" on the one you are in.\n */\nfunction WorkspaceCardOpenCue({\n testId,\n currentLabel,\n}: {\n /** Deliberately separate from the card id: suites count cards by prefix. */\n testId?: string\n /** Overrides `labels.currentWorkspace`. */\n currentLabel?: string\n}) {\n const { current, labels } = useContext(CardContext)\n return (\n <span\n className=\"inline-flex max-w-full min-w-0 shrink-0 items-center text-sm text-muted-foreground\"\n data-slot=\"workspace-card-open-cue\"\n data-testid={testId}\n >\n {current ? (\n // Never wider than the card: the words truncate, and in a card narrower than 20rem\n // the pill shrinks to a check (the words stay as the accessible name).\n <span className=\"inline-flex max-w-full min-w-0 items-center gap-1 rounded-full bg-background px-2 py-0.5 text-xs font-medium text-foreground\">\n <Check className=\"hidden size-3 shrink-0 @max-xs/ws-card:block\" aria-hidden=\"true\" />\n <span className=\"min-w-0 truncate @max-xs/ws-card:sr-only\">\n {currentLabel ?? labels.currentWorkspace}\n </span>\n </span>\n ) : (\n <ChevronRight className=\"size-4\" aria-hidden=\"true\" />\n )}\n </span>\n )\n}\n\nfunction WorkspaceCardDescription({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <p\n className={cn('line-clamp-2 text-sm text-muted-foreground', className)}\n title={typeof children === 'string' ? children : undefined}\n data-slot=\"workspace-card-description\"\n >\n {children}\n </p>\n )\n}\n\n/** Host-supplied line under the title. */\nfunction WorkspaceCardSubtitle({\n className,\n children,\n ...rest\n}: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('truncate text-xs text-muted-foreground', className)}\n data-slot=\"workspace-card-subtitle\"\n >\n {children}\n </div>\n )\n}\n\n/** Footer block: stats row and meta line, pinned to the bottom of the tile. */\nfunction WorkspaceCardFooter({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div {...rest} className={cn('mt-auto flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceCardStatsProps {\n docCount: number\n /** Omit to hide the chats counter. */\n chatCount?: number\n memberCount: number\n members?: StackedMember[]\n membersHidden?: boolean\n /** Faces before the rest collapse into `+N`. */\n maxAvatars?: number\n className?: string\n}\n\n/** Documents / chats / members counts, with the member faces at the trailing edge. */\nfunction WorkspaceCardStats({\n docCount,\n chatCount,\n memberCount,\n members = [],\n membersHidden = false,\n maxAvatars = 3,\n className,\n}: WorkspaceCardStatsProps) {\n const { current, testId, labels } = useContext(CardContext)\n return (\n <div\n className={cn('flex w-full items-center gap-x-4 text-sm text-muted-foreground', className)}\n data-slot=\"workspace-card-stats\"\n >\n <span className=\"inline-flex items-center gap-1.5\" title={labels.documents}>\n <FileText className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{docCount.toLocaleString()}</span>\n </span>\n {chatCount !== undefined && (\n <span className=\"inline-flex items-center gap-1.5\" title={labels.chats}>\n <MessagesSquare className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{chatCount.toLocaleString()}</span>\n </span>\n )}\n <span className=\"inline-flex items-center gap-1.5\" title={labels.members}>\n <Users className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\" data-testid={testId && `${testId}-member-count`}>\n {membersHidden ? '—' : memberCount}\n </span>\n </span>\n <MemberAvatarStack\n members={members}\n total={memberCount}\n max={maxAvatars}\n hidden={membersHidden}\n ringClassName={current ? 'ring-accent' : 'ring-muted'}\n label={labels.members}\n className=\"ml-auto\"\n testId={testId && `${testId}-member-avatars`}\n />\n </div>\n )\n}\n\n/** \"Updated 3 days ago\", with the exact date on the title. */\nfunction WorkspaceCardMeta({ updatedAt }: { updatedAt: string }) {\n const { labels } = useContext(CardContext)\n return (\n <span\n className=\"min-w-0 max-w-full self-start truncate text-xs text-muted-foreground\"\n title={fmtDate(updatedAt)}\n data-slot=\"workspace-card-meta\"\n >\n {labels.updated(fromNow(updatedAt))}\n </span>\n )\n}\n\n/* ------------------------------------------------------------------ */\n/* Default composition */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardProps {\n workspace: WorkspaceSummary\n current?: boolean\n onSelect: () => void\n /** Real link target; see `WorkspaceCard.Root`. */\n href?: string\n /** The entity mark shown before the name (the host's own workspace glyph). */\n mark?: ReactNode\n /** Card id; derived ids: `-title`, `-member-count`, `-member-avatars`. */\n testId?: string\n /** Id for the open cue (kept apart from `testId`, see `WorkspaceCard.OpenCue`). */\n openCueTestId?: string\n maxAvatars?: number\n /**\n * The stats row: omit for the default counts + member faces, `false` to hide it, or any node to\n * replace it.\n */\n stats?: ReactNode | false\n /** Reword the tile's fixed strings. */\n labels?: Partial<WorkspaceCardLabels>\n className?: string\n}\n\n/**\n * The workspace tile: mark + name + open cue, description, stats and meta.\n * The whole tile opens the workspace; nothing on it is hover-only.\n *\n * Need a different layout? Compose the parts: `WorkspaceCard.Root`, `.Header`,\n * `.Title`, `.OpenCue`, `.Subtitle`, `.Description`, `.Footer`, `.Stats`, `.Meta`.\n */\nfunction WorkspaceCardBase({\n workspace,\n current = false,\n onSelect,\n href,\n mark,\n testId,\n openCueTestId,\n maxAvatars,\n stats,\n labels,\n className,\n}: WorkspaceCardProps) {\n const mergedLabels = { ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }\n return (\n <WorkspaceCardRoot\n current={current}\n onSelect={onSelect}\n href={href}\n label={mergedLabels.openWorkspace(workspace.name)}\n labels={labels}\n testId={testId}\n className={className}\n >\n <WorkspaceCardHeader>\n {mark}\n <WorkspaceCardTitle>{workspace.name}</WorkspaceCardTitle>\n <WorkspaceCardOpenCue testId={openCueTestId} />\n </WorkspaceCardHeader>\n {workspace.subtitle && <WorkspaceCardSubtitle>{workspace.subtitle}</WorkspaceCardSubtitle>}\n {workspace.description && (\n <WorkspaceCardDescription>{workspace.description}</WorkspaceCardDescription>\n )}\n <WorkspaceCardFooter>\n {stats === undefined ? (\n <WorkspaceCardStats\n docCount={workspace.docCount}\n chatCount={workspace.chatCount}\n memberCount={workspace.memberCount}\n members={workspace.members}\n membersHidden={workspace.membersHidden}\n maxAvatars={maxAvatars}\n />\n ) : (\n stats\n )}\n {workspace.updatedAt && <WorkspaceCardMeta updatedAt={workspace.updatedAt} />}\n </WorkspaceCardFooter>\n </WorkspaceCardRoot>\n )\n}\n\nexport const WorkspaceCard = Object.assign(WorkspaceCardBase, {\n Root: WorkspaceCardRoot,\n Header: WorkspaceCardHeader,\n Title: WorkspaceCardTitle,\n OpenCue: WorkspaceCardOpenCue,\n Subtitle: WorkspaceCardSubtitle,\n Description: WorkspaceCardDescription,\n Footer: WorkspaceCardFooter,\n Stats: WorkspaceCardStats,\n Meta: WorkspaceCardMeta,\n})\n","import type { ReactNode } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { CollapsibleSection } from '../home/CollapsibleSection'\n\nexport interface WorkspaceListProps {\n children: ReactNode\n className?: string\n testId?: string\n}\n\n/** The column that stacks workspace groups (padding follows the page gutter). */\nexport function WorkspaceList({ children, className, testId }: WorkspaceListProps) {\n return (\n <div\n className={cn('flex w-full flex-col gap-2 px-4 py-4 sm:px-8', className)}\n data-slot=\"workspace-list\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceGroupProps {\n /** Group heading: name, count, badges. Plain text on the canvas, no band. */\n title: ReactNode\n isExpanded: boolean\n onToggle: () => void\n /**\n * Makes the whole header one target (e.g. open the project panel); the\n * chevron stays a separate toggle. Adds a trailing `openLabel` affordance.\n */\n onOpen?: () => void\n /** Words beside the trailing chevron when `onOpen` is set, e.g. \"Plans & Usage\". */\n openLabel?: string\n /** Muted words on the right of a collapsed group without `onOpen`, e.g. \"Show 11 shared workspaces\". */\n collapsedHint?: string\n /** The cards, laid out in a responsive grid (1 / 2 / 3 columns). */\n children: ReactNode\n className?: string\n}\n\n/**\n * One collapsible band of workspace tiles under a slim header. The open\n * affordance is always visible, so nothing is reachable by hover alone.\n */\nexport function WorkspaceGroup({\n title,\n isExpanded,\n onToggle,\n onOpen,\n openLabel,\n collapsedHint,\n children,\n className,\n}: WorkspaceGroupProps) {\n return (\n <CollapsibleSection\n title={title}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onHeaderClick={onOpen}\n rightContent={\n onOpen && openLabel ? (\n <span className=\"flex shrink-0 items-center gap-1 text-sm font-medium text-muted-foreground\">\n {openLabel}\n <ChevronRight className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n </span>\n ) : collapsedHint && !isExpanded ? (\n <span className=\"shrink-0 text-sm text-muted-foreground\">{collapsedHint}</span>\n ) : undefined\n }\n className={cn('group', className)}\n headerClassName=\"mb-3 flex-wrap gap-y-2 rounded-md px-1 py-1 pointer-coarse:min-h-11\"\n childrenClassName=\"mb-8 grid gap-3 @xl:grid-cols-2 @5xl:grid-cols-3\"\n >\n {children}\n </CollapsibleSection>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/workspaces/WorkspaceSettingsParts.tsx","../src/workspaces/CommonWorkspaceToggle.tsx","../src/workspaces/workspace-roles.ts","../src/workspaces/WorkspaceCard.tsx","../src/workspaces/WorkspaceGroup.tsx"],"names":["jsx","cn","jsxs","ChevronRight"],"mappings":"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","file":"chunk-HXYYH4OB.js","sourcesContent":["import type { ReactNode } from 'react'\nimport { LogOut, UserPlus } from 'lucide-react'\nimport { Button, cn, Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\n\n/**\n * Page frame of a workspace's home: a bounded column whose ONE scroll region spans the full\n * width (scrollbar on the outer edge), the inset living on the content inside it. A container,\n * so children can use `@2xl:` queries.\n */\nexport function WorkspacePageFrame({ testId, children }: { testId?: string; children: ReactNode }) {\n return (\n <div\n className=\"flex h-full flex-col @container\"\n data-slot=\"workspace-page\"\n data-testid={testId}\n >\n {/* scrollbar-gutter:stable keeps the content from jumping when a scrollbar appears. */}\n <div className=\"scrollbar-subtle min-h-0 flex-1 overflow-y-auto [scrollbar-gutter:stable]\">\n <div className=\"space-y-6 px-4 pb-6 sm:px-6 pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Tinted card holding the identity bar and the expandable member list. */\nexport function WorkspaceIdentityPanel({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"workspace-identity-panel\"\n className=\"group rounded-lg border border-border bg-card px-4 py-3 shadow-xs\"\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceProjectSlotProps {\n testId: string\n /** Screen-reader caption (\"Project:\"): the chip says what it is without a word in front. */\n caption: string\n children: ReactNode\n}\n\n/** The project control / chip pinned to the end of the name row. */\nexport function WorkspaceProjectSlot({ testId, caption, children }: WorkspaceProjectSlotProps) {\n return (\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\" data-testid={testId}>\n <span className=\"sr-only\">{caption}</span>\n {children}\n </div>\n </div>\n )\n}\n\n/** Stated absence (\"None\") rather than a blank gap. */\nexport function ItalicNone({ children }: { children: ReactNode }) {\n return <span className=\"text-sm italic text-muted-foreground\">{children}</span>\n}\n\nexport interface WorkspaceAudienceLineProps {\n visibility: {\n testId: string\n caption: string\n /** The owner's visibility switch (developers only). */\n toggle?: ReactNode\n /** The state named in words, so the switch is never a puzzle. */\n stateText: string\n /** What the state means for who can see the workspace; opened by tapping the state words. */\n stateHelp: string\n }\n /** Member avatar stack. */\n members: ReactNode\n /** \"Share\" button (owners). */\n share?: { label: string; onClick: () => void; testId: string }\n}\n\n/** Visibility and members end the description line together: who can see and use the workspace. */\nexport function WorkspaceAudienceLine({ visibility, members, share }: WorkspaceAudienceLineProps) {\n return (\n <span className=\"flex flex-wrap items-center gap-x-4 gap-y-2\" data-slot=\"workspace-audience\">\n <span className=\"flex items-center gap-2\" data-testid={visibility.testId}>\n <span className=\"sr-only\">{visibility.caption}</span>\n {visibility.toggle}\n {/* Tap-to-explain, not hover-only: the words must answer a click on touch screens too. */}\n <Popover>\n <PopoverTrigger className=\"touch-hit cursor-pointer rounded-sm text-sm text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n {visibility.stateText}\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64 text-sm\">\n {visibility.stateHelp}\n </PopoverContent>\n </Popover>\n </span>\n {/* Faces first, then Share: \"these people ... add more\". */}\n <span className=\"flex items-center gap-1\">\n {members}\n {share && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-1.5 px-3 text-sm pointer-coarse:h-11\"\n onClick={share.onClick}\n data-testid={share.testId}\n >\n <UserPlus className=\"size-4\" />\n {share.label}\n </Button>\n )}\n </span>\n </span>\n )\n}\n\n/**\n * Collapsible block under the identity bar. Stays mounted and animates its height (grid-rows\n * 0fr to 1fr), so opening and closing glides instead of snapping.\n */\nexport function ExpandableSection({\n expanded,\n testId,\n children,\n}: {\n expanded: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-300 ease-in-out',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n data-slot=\"expandable-section\"\n data-expanded={expanded}\n data-testid={testId}\n >\n <div className=\"overflow-hidden\">\n <div className=\"mt-4 border-t border-border pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Centered loading placeholder of a page body. */\nexport function PageLoading({ children }: { children: ReactNode }) {\n return <div className=\"flex h-64 items-center justify-center\">{children}</div>\n}\n\nexport interface LeaveFooterProps {\n testId?: string\n leave: { label: string; disabled?: boolean; onClick: () => void; testId?: string }\n}\n\n/** Leaving ENDS your part in the workspace, so it sits last and alone at the foot of the page. */\nexport function LeaveFooter({ testId, leave }: LeaveFooterProps) {\n return (\n <div className=\"flex justify-end\" data-slot=\"leave-footer\" data-testid={testId}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={leave.onClick}\n disabled={leave.disabled}\n className=\"h-7 px-2 text-sm text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11\"\n data-testid={leave.testId}\n >\n <LogOut className=\"mr-1 size-3.5\" />\n {leave.label}\n </Button>\n </div>\n )\n}\n","/**\n * CommonWorkspaceToggle Component\n *\n * Toggle for workspace common/members-only visibility.\n * Takes isCommon and onToggle as props for form integration.\n */\n\nimport { Globe } from 'lucide-react'\nimport { IconToggle } from '@arbidocs/react/ui'\n\nexport interface CommonWorkspaceToggleProps {\n isCommon: boolean\n onToggle: (isCommon: boolean) => void\n disabled?: boolean\n /** Tooltip to show when disabled */\n disabledTooltip?: string\n 'data-testid'?: string\n}\n\nconst COLORS = {\n text: 'text-muted-foreground',\n bg: 'bg-gray-600',\n}\n\nexport function CommonWorkspaceToggle({\n isCommon,\n onToggle,\n disabled = false,\n disabledTooltip,\n 'data-testid': dataTestId,\n}: CommonWorkspaceToggleProps) {\n return (\n <IconToggle\n icon={Globe}\n isActive={isCommon}\n onToggle={onToggle}\n colors={COLORS}\n disabled={disabled}\n disabledTooltip={disabledTooltip}\n tooltipActive=\"On: everyone on this deployment can see it. Turn off to limit it to members.\"\n tooltipInactive=\"Off: only members of this workspace can see it. Turn on to let everyone on this deployment see it.\"\n data-testid={dataTestId}\n />\n )\n}\n","/**\n * A workspace role ('owner' | 'collaborator' | 'guest') as people see it: its name, its badge\n * colours and what it lets a member do.\n */\n\nexport type WorkspaceRoleName = 'owner' | 'collaborator' | 'guest'\n\n/** \"Owner\", \"Collaborator\", \"Guest\". */\nexport function formatRole(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1)\n}\n\nconst ROLE_BADGE_CLASSES: Record<WorkspaceRoleName, string> = {\n owner: 'bg-primary text-white hover:bg-primary border border-primary',\n collaborator: 'bg-secondary text-white hover:bg-secondary border border-secondary',\n guest: 'bg-gray-600 text-white hover:bg-gray-600 border border-gray-600',\n}\n\n/** The badge classes of a role. */\nexport function getRoleBadgeClass(role: WorkspaceRoleName): string {\n return ROLE_BADGE_CLASSES[role]\n}\n\nconst ROLE_DESCRIPTIONS: Record<WorkspaceRoleName, string> = {\n owner:\n 'Owners have full control of the workspace, including adding and removing members, but cannot see private content created by other members.',\n collaborator:\n 'Collaborators can create and edit shared content, but cannot delete shared content created by others and cannot manage workspace settings or membership.',\n guest:\n 'Guests can create private content and view shared content, but cannot create or edit shared content.',\n}\n\n/** What a role lets a member do (a tooltip). */\nexport function getRoleDescription(role: WorkspaceRoleName): string {\n return ROLE_DESCRIPTIONS[role]\n}\n","import {\n createContext,\n useContext,\n type HTMLAttributes,\n useMemo,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { Check, ChevronRight, FileText, MessagesSquare, Users } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { fmtDate, fromNow } from '../lib/format'\nimport { ActionLink } from '../components/ActionLink'\nimport { MemberAvatarStack, type StackedMember } from '../components/MemberAvatarStack'\n\n/** Everything a workspace tile shows, source-agnostic (not the raw SDK shape). */\nexport interface WorkspaceSummary {\n id: string\n name: string\n description?: string | null\n /** Host-supplied line under the name (a reference, a client, a status...). Not interpreted. */\n subtitle?: ReactNode\n docCount: number\n /** Hidden when undefined, so a host without chats shows no empty counter. */\n chatCount?: number\n /** Number of visible members (agents excluded by the caller). */\n memberCount: number\n members: StackedMember[]\n /** The viewer may not see who is here (RLS): renders an em dash, not a `0`. */\n membersHidden?: boolean\n /** ISO timestamp: rendered as \"Updated {relative}\". */\n updatedAt?: string | null\n}\n\n/** Every fixed string of the workspace tile. Pass a partial `labels` to translate or reword. */\nexport interface WorkspaceCardLabels {\n /** The tile's accessible name. */\n openWorkspace: (name: string) => string\n currentWorkspace: string\n documents: string\n chats: string\n members: string\n /** `relative` is the formatted \"3 days ago\". */\n updated: (relative: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_CARD_LABELS: WorkspaceCardLabels = {\n openWorkspace: (name) => `Open workspace ${name}`,\n currentWorkspace: 'Current workspace',\n documents: 'Documents',\n chats: 'Tasks',\n members: 'Members',\n updated: (relative) => `Updated ${relative}`,\n}\n\ninterface CardContextValue {\n current: boolean\n testId?: string\n labels: WorkspaceCardLabels\n}\n\nconst CardContext = createContext<CardContextValue>({\n current: false,\n labels: DEFAULT_WORKSPACE_CARD_LABELS,\n})\n\ntype DivProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'>\n\n/* ------------------------------------------------------------------ */\n/* Parts */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardRootProps extends DivProps {\n /** This is the workspace you are in: accented surface, \"Current workspace\" cue. */\n current?: boolean\n onSelect: () => void\n /**\n * Real link target. The tile then renders as an anchor (ctrl-click / new tab, in-SPA through\n * the host environment's `linkComponent`); `onSelect` still fires on a plain click.\n */\n href?: string\n /** Accessible name; defaults to `labels.openWorkspace(name)` when composed via `WorkspaceCard`. */\n label: string\n testId?: string\n labels?: Partial<WorkspaceCardLabels>\n children: ReactNode\n}\n\n/**\n * The tile surface: one button that opens the workspace. A raised white card\n * (hairline border, soft shadow, hover lift); the current workspace takes the selection tint.\n */\nfunction WorkspaceCardRoot({\n current = false,\n onSelect,\n href,\n label,\n testId,\n labels,\n className,\n children,\n ...rest\n}: WorkspaceCardRootProps) {\n const mergedLabels = useMemo(() => ({ ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }), [labels])\n const surfaceClass = cn(\n '@container/ws-card flex min-h-40 w-full cursor-pointer flex-col gap-3 rounded-lg p-4 text-left transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n current\n ? 'bg-accent text-accent-foreground'\n : 'border border-border bg-card shadow-xs transition-colors hover:border-ring/50 hover:bg-accent/40',\n className\n )\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onSelect()\n }\n }\n return (\n <CardContext.Provider value={{ current, testId, labels: mergedLabels }}>\n {href ? (\n <ActionLink\n {...(rest as object)}\n href={href}\n onSelect={onSelect}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n className={surfaceClass}\n >\n {children}\n </ActionLink>\n ) : (\n <div\n {...rest}\n role=\"button\"\n tabIndex={0}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n onClick={onSelect}\n onKeyDown={handleKeyDown}\n className={surfaceClass}\n >\n {children}\n </div>\n )}\n </CardContext.Provider>\n )\n}\n\n/** Mark + name + open cue, on one row. Put the entity mark first. */\nfunction WorkspaceCardHeader({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('flex flex-wrap items-center gap-x-3 gap-y-2', className)}\n data-slot=\"workspace-card-header\"\n >\n {children}\n </div>\n )\n}\n\nfunction WorkspaceCardTitle({ children, className }: { children: ReactNode; className?: string }) {\n const { testId } = useContext(CardContext)\n return (\n <h3\n className={cn(\n 'line-clamp-2 min-w-24 flex-1 break-words text-base font-semibold leading-tight text-foreground',\n className\n )}\n data-slot=\"workspace-card-title\"\n data-testid={testId && `${testId}-title`}\n >\n {children}\n </h3>\n )\n}\n\n/**\n * The open cue is always on screen (never hover-only): a chevron, or the words\n * \"Current workspace\" on the one you are in.\n */\nfunction WorkspaceCardOpenCue({\n testId,\n currentLabel,\n}: {\n /** Deliberately separate from the card id: suites count cards by prefix. */\n testId?: string\n /** Overrides `labels.currentWorkspace`. */\n currentLabel?: string\n}) {\n const { current, labels } = useContext(CardContext)\n return (\n <span\n className=\"inline-flex max-w-full min-w-0 shrink-0 items-center text-sm text-muted-foreground\"\n data-slot=\"workspace-card-open-cue\"\n data-testid={testId}\n >\n {current ? (\n // Never wider than the card: the words truncate, and in a card narrower than 20rem\n // the pill shrinks to a check (the words stay as the accessible name).\n <span className=\"inline-flex max-w-full min-w-0 items-center gap-1 rounded-full bg-background px-2 py-0.5 text-xs font-medium text-foreground\">\n <Check className=\"hidden size-3 shrink-0 @max-xs/ws-card:block\" aria-hidden=\"true\" />\n <span className=\"min-w-0 truncate @max-xs/ws-card:sr-only\">\n {currentLabel ?? labels.currentWorkspace}\n </span>\n </span>\n ) : (\n <ChevronRight className=\"size-4\" aria-hidden=\"true\" />\n )}\n </span>\n )\n}\n\nfunction WorkspaceCardDescription({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <p\n className={cn('line-clamp-2 text-sm text-muted-foreground', className)}\n title={typeof children === 'string' ? children : undefined}\n data-slot=\"workspace-card-description\"\n >\n {children}\n </p>\n )\n}\n\n/** Host-supplied line under the title. */\nfunction WorkspaceCardSubtitle({\n className,\n children,\n ...rest\n}: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('truncate text-xs text-muted-foreground', className)}\n data-slot=\"workspace-card-subtitle\"\n >\n {children}\n </div>\n )\n}\n\n/** Footer block: stats row and meta line, pinned to the bottom of the tile. */\nfunction WorkspaceCardFooter({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div {...rest} className={cn('mt-auto flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceCardStatsProps {\n docCount: number\n /** Omit to hide the chats counter. */\n chatCount?: number\n memberCount: number\n members?: StackedMember[]\n membersHidden?: boolean\n /** Faces before the rest collapse into `+N`. */\n maxAvatars?: number\n className?: string\n}\n\n/** Documents / chats / members counts, with the member faces at the trailing edge. */\nfunction WorkspaceCardStats({\n docCount,\n chatCount,\n memberCount,\n members = [],\n membersHidden = false,\n maxAvatars = 3,\n className,\n}: WorkspaceCardStatsProps) {\n const { current, testId, labels } = useContext(CardContext)\n return (\n <div\n className={cn('flex w-full items-center gap-x-4 text-sm text-muted-foreground', className)}\n data-slot=\"workspace-card-stats\"\n >\n <span className=\"inline-flex items-center gap-1.5\" title={labels.documents}>\n <FileText className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{docCount.toLocaleString()}</span>\n </span>\n {chatCount !== undefined && (\n <span className=\"inline-flex items-center gap-1.5\" title={labels.chats}>\n <MessagesSquare className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{chatCount.toLocaleString()}</span>\n </span>\n )}\n <span className=\"inline-flex items-center gap-1.5\" title={labels.members}>\n <Users className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\" data-testid={testId && `${testId}-member-count`}>\n {membersHidden ? '—' : memberCount}\n </span>\n </span>\n <MemberAvatarStack\n members={members}\n total={memberCount}\n max={maxAvatars}\n hidden={membersHidden}\n ringClassName={current ? 'ring-accent' : 'ring-muted'}\n label={labels.members}\n className=\"ml-auto\"\n testId={testId && `${testId}-member-avatars`}\n />\n </div>\n )\n}\n\n/** \"Updated 3 days ago\", with the exact date on the title. */\nfunction WorkspaceCardMeta({ updatedAt }: { updatedAt: string }) {\n const { labels } = useContext(CardContext)\n return (\n <span\n className=\"min-w-0 max-w-full self-start truncate text-xs text-muted-foreground\"\n title={fmtDate(updatedAt)}\n data-slot=\"workspace-card-meta\"\n >\n {labels.updated(fromNow(updatedAt))}\n </span>\n )\n}\n\n/* ------------------------------------------------------------------ */\n/* Default composition */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardProps {\n workspace: WorkspaceSummary\n current?: boolean\n onSelect: () => void\n /** Real link target; see `WorkspaceCard.Root`. */\n href?: string\n /** The entity mark shown before the name (the host's own workspace glyph). */\n mark?: ReactNode\n /** Card id; derived ids: `-title`, `-member-count`, `-member-avatars`. */\n testId?: string\n /** Id for the open cue (kept apart from `testId`, see `WorkspaceCard.OpenCue`). */\n openCueTestId?: string\n maxAvatars?: number\n /**\n * The stats row: omit for the default counts + member faces, `false` to hide it, or any node to\n * replace it.\n */\n stats?: ReactNode | false\n /** Reword the tile's fixed strings. */\n labels?: Partial<WorkspaceCardLabels>\n className?: string\n}\n\n/**\n * The workspace tile: mark + name + open cue, description, stats and meta.\n * The whole tile opens the workspace; nothing on it is hover-only.\n *\n * Need a different layout? Compose the parts: `WorkspaceCard.Root`, `.Header`,\n * `.Title`, `.OpenCue`, `.Subtitle`, `.Description`, `.Footer`, `.Stats`, `.Meta`.\n */\nfunction WorkspaceCardBase({\n workspace,\n current = false,\n onSelect,\n href,\n mark,\n testId,\n openCueTestId,\n maxAvatars,\n stats,\n labels,\n className,\n}: WorkspaceCardProps) {\n const mergedLabels = { ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }\n return (\n <WorkspaceCardRoot\n current={current}\n onSelect={onSelect}\n href={href}\n label={mergedLabels.openWorkspace(workspace.name)}\n labels={labels}\n testId={testId}\n className={className}\n >\n <WorkspaceCardHeader>\n {mark}\n <WorkspaceCardTitle>{workspace.name}</WorkspaceCardTitle>\n <WorkspaceCardOpenCue testId={openCueTestId} />\n </WorkspaceCardHeader>\n {workspace.subtitle && <WorkspaceCardSubtitle>{workspace.subtitle}</WorkspaceCardSubtitle>}\n {workspace.description && (\n <WorkspaceCardDescription>{workspace.description}</WorkspaceCardDescription>\n )}\n <WorkspaceCardFooter>\n {stats === undefined ? (\n <WorkspaceCardStats\n docCount={workspace.docCount}\n chatCount={workspace.chatCount}\n memberCount={workspace.memberCount}\n members={workspace.members}\n membersHidden={workspace.membersHidden}\n maxAvatars={maxAvatars}\n />\n ) : (\n stats\n )}\n {workspace.updatedAt && <WorkspaceCardMeta updatedAt={workspace.updatedAt} />}\n </WorkspaceCardFooter>\n </WorkspaceCardRoot>\n )\n}\n\nexport const WorkspaceCard = Object.assign(WorkspaceCardBase, {\n Root: WorkspaceCardRoot,\n Header: WorkspaceCardHeader,\n Title: WorkspaceCardTitle,\n OpenCue: WorkspaceCardOpenCue,\n Subtitle: WorkspaceCardSubtitle,\n Description: WorkspaceCardDescription,\n Footer: WorkspaceCardFooter,\n Stats: WorkspaceCardStats,\n Meta: WorkspaceCardMeta,\n})\n","import type { ReactNode } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { CollapsibleSection } from '../home/CollapsibleSection'\n\nexport interface WorkspaceListProps {\n children: ReactNode\n className?: string\n testId?: string\n}\n\n/** The column that stacks workspace groups (padding follows the page gutter). */\nexport function WorkspaceList({ children, className, testId }: WorkspaceListProps) {\n return (\n <div\n className={cn('flex w-full flex-col gap-2 px-4 py-4 sm:px-8', className)}\n data-slot=\"workspace-list\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceGroupProps {\n /** Group heading: name, count, badges. Plain text on the canvas, no band. */\n title: ReactNode\n isExpanded: boolean\n onToggle: () => void\n /**\n * Makes the whole header one target (e.g. open the project panel); the\n * chevron stays a separate toggle. Adds a trailing `openLabel` affordance.\n */\n onOpen?: () => void\n /** Words beside the trailing chevron when `onOpen` is set, e.g. \"Plans & Usage\". */\n openLabel?: string\n /** Muted words on the right of a collapsed group without `onOpen`, e.g. \"Show 11 shared workspaces\". */\n collapsedHint?: string\n /** The cards, laid out in a responsive grid (1 / 2 / 3 columns). */\n children: ReactNode\n className?: string\n}\n\n/**\n * One collapsible band of workspace tiles under a slim header. The open\n * affordance is always visible, so nothing is reachable by hover alone.\n */\nexport function WorkspaceGroup({\n title,\n isExpanded,\n onToggle,\n onOpen,\n openLabel,\n collapsedHint,\n children,\n className,\n}: WorkspaceGroupProps) {\n return (\n <CollapsibleSection\n title={title}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onHeaderClick={onOpen}\n rightContent={\n onOpen && openLabel ? (\n <span className=\"flex shrink-0 items-center gap-1 text-sm font-medium text-muted-foreground\">\n {openLabel}\n <ChevronRight className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n </span>\n ) : collapsedHint && !isExpanded ? (\n <span className=\"shrink-0 text-sm text-muted-foreground\">{collapsedHint}</span>\n ) : undefined\n }\n className={cn('group', className)}\n headerClassName=\"mb-3 flex-wrap gap-y-2 rounded-md px-1 py-1 pointer-coarse:min-h-11\"\n childrenClassName=\"mb-8 grid gap-3 @xl:grid-cols-2 @5xl:grid-cols-3\"\n >\n {children}\n </CollapsibleSection>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/format.ts"],"names":[],"mappings":"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","file":"chunk-KDG6FER6.cjs","sourcesContent":["/**\n * Host-app formatting helpers — currency, initials, dates, durations and\n * percentages. Dates default to en-GB (\"d MMM yyyy\"); currency takes an explicit ISO code. Nothing here is\n * brand-specific, so every host app shares them.\n *\n * Dependency-free on purpose (uses the platform `Intl` APIs) so the package\n * stays light and needs no date library.\n */\n\n/** Format an amount in an ISO 4217 currency, e.g. £1,240,000 or £12.4k when `compact`. */\nexport function formatCurrency(\n value: number,\n {\n currency,\n locale = 'en-GB',\n compact = false,\n }: { currency: string; locale?: string; compact?: boolean }\n): string {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n maximumFractionDigits: compact && Math.abs(value) >= 1000 ? 1 : 0,\n notation: compact ? 'compact' : 'standard',\n }).format(value)\n}\n\n/** Initials from a person's name, e.g. \"Amara N. Okafor\" -> \"AO\". */\nexport function initials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase()\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase()\n}\n\n/**\n * Parse an ISO string. Date-only strings (\"2026-03-12\") are read as LOCAL\n * midnight (matching date-fns `parseISO`), not UTC, so day-level maths and\n * formatting don't drift across time zones.\n */\nfunction parseIso(iso: string): Date {\n const dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(iso)\n const d = new Date(dateOnly ? `${iso}T00:00:00` : iso)\n if (Number.isNaN(d.getTime())) throw new Error(`Invalid ISO date: ${iso}`)\n return d\n}\n\n/** \"12 Mar 2026\" */\nexport function fmtDate(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\n/** \"12 Mar 2026, 14:30\" */\nexport function fmtDateTime(iso: string): string {\n try {\n return new Intl.DateTimeFormat('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n }).format(parseIso(iso))\n } catch {\n return iso\n }\n}\n\nconst RELATIVE_UNITS: Array<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31_536_000],\n ['month', 2_592_000],\n ['week', 604_800],\n ['day', 86_400],\n ['hour', 3_600],\n ['minute', 60],\n ['second', 1],\n]\n\n/** \"3 days ago\" / \"in 2 hours\" — largest whole unit, like date-fns strict. */\nexport function fromNow(iso: string, from: Date = new Date()): string {\n try {\n const diffSeconds = (parseIso(iso).getTime() - from.getTime()) / 1000\n const abs = Math.abs(diffSeconds)\n const rtf = new Intl.RelativeTimeFormat('en-GB', { numeric: 'always' })\n for (const [unit, secs] of RELATIVE_UNITS) {\n if (abs >= secs || unit === 'second') {\n const value = Math.round(diffSeconds / secs)\n return rtf.format(value, unit)\n }\n }\n return rtf.format(0, 'second')\n } catch {\n return iso\n }\n}\n\n/** Signed day count to a date from a reference day. Negative = overdue. */\nexport function daysUntil(iso: string, from: Date = new Date()): number {\n try {\n const target = parseIso(iso)\n // Compare calendar days at local midnight, ignoring time-of-day.\n const a = Date.UTC(target.getFullYear(), target.getMonth(), target.getDate())\n const b = Date.UTC(from.getFullYear(), from.getMonth(), from.getDate())\n return Math.round((a - b) / 86_400_000)\n } catch {\n return 0\n }\n}\n\n/** Compact hours, e.g. 12.5h */\nexport function hrs(n: number): string {\n return `${n.toFixed(1)}h`\n}\n\n/** Percentage with no decimals, e.g. 82% */\nexport function pct(n: number): string {\n return `${Math.round(n)}%`\n}\n\n/**\n * Page references for a set of cited pages: \"p 2\", \"pp 2, 5\", \"pp 2–4, 9\".\n *\n * Pages, not passage counts — the page is what a reader turns to; how many\n * passages sit inside it is detail they did not ask for. Consecutive pages\n * collapse into a range, the same way a contiguous run of passages collapses\n * into a single mark in the viewer.\n */\nexport function formatPageRefs(pages: number[]): string {\n const sorted = [...new Set(pages)].sort((a, b) => a - b)\n if (sorted.length === 0) return ''\n const parts: string[] = []\n let start = sorted[0]\n let end = sorted[0]\n for (const page of sorted.slice(1)) {\n if (page === end + 1) {\n end = page\n continue\n }\n parts.push(start === end ? `${start}` : `${start}–${end}`)\n start = end = page\n }\n parts.push(start === end ? `${start}` : `${start}–${end}`)\n return `${sorted.length === 1 ? 'p' : 'pp'} ${parts.join(', ')}`\n}\n\n/**\n * Noun forms for a count, keyed by CLDR plural category. `one` and `other` are required (English\n * needs nothing else); languages with more categories add `zero`, `two`, `few` or `many`.\n */\nexport type CountForms = {\n one: string\n other: string\n} & Partial<Record<'zero' | 'two' | 'few' | 'many', string>>\n\n/** The noun form for `n` (\"document\" for 1, \"documents\" otherwise), by `Intl.PluralRules`. */\nexport function pluralize(n: number, forms: CountForms, locale = 'en-GB'): string {\n const category = new Intl.PluralRules(locale).select(n)\n return forms[category] ?? forms.other\n}\n\n/**\n * A count with its noun in the right form: `formatCount(1, { one: 'document', other: 'documents' })`\n * is \"1 document\", `formatCount(1240, ...)` is \"1,240 documents\". Use it for every label that\n * prints a number next to a noun, so no screen says \"1 documents\".\n */\nexport function formatCount(n: number, forms: CountForms, locale = 'en-GB'): string {\n return `${new Intl.NumberFormat(locale).format(n)} ${pluralize(n, forms, locale)}`\n}\n\n/** The slice of a user `displayName` reads (an ARBI profile, an SSO profile, a host user). */\nexport interface DisplayNameUser {\n /** Profile name as the user entered it. */\n name?: string | null\n given_name?: string | null\n email?: string | null\n}\n\nconst EMAIL_LIKE = /^\\S+@\\S+$/\n\n/**\n * Turn an email into something that reads as a first name, or '' when it does not look like one.\n * \"jane.doe@x.io\" -> \"Jane Doe\". Plus-addressed (\"ci+run-123@x.io\"), digit-bearing or one-letter\n * locals are aliases and test accounts, not names, so they give ''.\n */\nfunction prettifyEmailLocalPart(email: string): string {\n const local = email.split('@')[0] ?? ''\n if (!local || local.includes('+') || /\\d/.test(local)) return ''\n const words = local\n .split(/[._-]+/)\n .filter(Boolean)\n .map((w) => w[0].toUpperCase() + w.slice(1).toLowerCase())\n const pretty = words.join(' ')\n return pretty.length < 2 ? '' : pretty\n}\n\n/**\n * The name to greet someone by (\"Good morning, {displayName(user)}\"): their profile name, else\n * their given name, else a prettified email local part when it reads as a name, else `fallback`\n * (default \"there\"). A raw email or its untouched local part is never returned.\n */\nexport function displayName(\n user: DisplayNameUser | null | undefined,\n { fallback = 'there' }: { fallback?: string } = {}\n): string {\n const pick = (value: string | null | undefined) => {\n const trimmed = value?.trim()\n return trimmed && !EMAIL_LIKE.test(trimmed) ? trimmed : ''\n }\n const email =\n user?.email?.trim() || (EMAIL_LIKE.test(user?.name?.trim() ?? '') ? user?.name?.trim() : '')\n return (\n pick(user?.name) ||\n pick(user?.given_name) ||\n (email ? prettifyEmailLocalPart(email) : '') ||\n fallback\n )\n}\n"]}