@arbidocs/blocks 0.5.112 → 0.5.114

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 (179) hide show
  1. package/dist/{ConnectedCallDock-KUF6RX76.cjs → ConnectedCallDock-2KXEQENS.cjs} +26 -26
  2. package/dist/{ConnectedCallDock-KUF6RX76.cjs.map → ConnectedCallDock-2KXEQENS.cjs.map} +1 -1
  3. package/dist/{ConnectedCallRoom-ZKIYB2JG.cjs → ConnectedCallRoom-MU3NPNXF.cjs} +18 -18
  4. package/dist/{ConnectedCallRoom-ZKIYB2JG.cjs.map → ConnectedCallRoom-MU3NPNXF.cjs.map} +1 -1
  5. package/dist/{ConnectedMailInviteCard-P65MQM6J.cjs → ConnectedMailInviteCard-EINB3THA.cjs} +5 -5
  6. package/dist/{ConnectedMailInviteCard-P65MQM6J.cjs.map → ConnectedMailInviteCard-EINB3THA.cjs.map} +1 -1
  7. package/dist/{ConnectedNativeDocxComparison-S4RKDH2A.cjs → ConnectedNativeDocxComparison-VH3I65H6.cjs} +21 -21
  8. package/dist/{ConnectedNativeDocxComparison-S4RKDH2A.cjs.map → ConnectedNativeDocxComparison-VH3I65H6.cjs.map} +1 -1
  9. package/dist/{ConnectedProductionSetDialog-HX4HTQ3Z.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +8 -8
  10. package/dist/{ConnectedProductionSetDialog-HX4HTQ3Z.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
  11. package/dist/{ConnectedStreamedWordArtifact-A2A7Z3TT.cjs → ConnectedStreamedWordArtifact-KQSHCA75.cjs} +21 -21
  12. package/dist/{ConnectedStreamedWordArtifact-A2A7Z3TT.cjs.map → ConnectedStreamedWordArtifact-KQSHCA75.cjs.map} +1 -1
  13. package/dist/{DocumentReviewCard-4A7NF474.cjs → DocumentReviewCard-OCPFVMLD.cjs} +22 -22
  14. package/dist/{DocumentReviewCard-4A7NF474.cjs.map → DocumentReviewCard-OCPFVMLD.cjs.map} +1 -1
  15. package/dist/{FilesViewerDialog-PKCBZXDG.cjs → FilesViewerDialog-BAGOEMXW.cjs} +54 -54
  16. package/dist/{FilesViewerDialog-PKCBZXDG.cjs.map → FilesViewerDialog-BAGOEMXW.cjs.map} +1 -1
  17. package/dist/{WorkspaceTableView-J3C6VH4T.cjs → WorkspaceTableView-IMAZICIZ.cjs} +9 -9
  18. package/dist/{WorkspaceTableView-J3C6VH4T.cjs.map → WorkspaceTableView-IMAZICIZ.cjs.map} +1 -1
  19. package/dist/agents/index.cjs +298 -298
  20. package/dist/{ai-OYTFPMXI.cjs → ai-7U4B4CVF.cjs} +27 -27
  21. package/dist/ai-7U4B4CVF.cjs.map +1 -0
  22. package/dist/calls/index.cjs +147 -147
  23. package/dist/chat/index.cjs +29 -29
  24. package/dist/{chunk-37JPFCCU.cjs → chunk-2W5E62EY.cjs} +6 -6
  25. package/dist/{chunk-37JPFCCU.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
  26. package/dist/{chunk-N6AZYEYL.cjs → chunk-3ODEWSRO.cjs} +4 -4
  27. package/dist/{chunk-N6AZYEYL.cjs.map → chunk-3ODEWSRO.cjs.map} +1 -1
  28. package/dist/{chunk-VDFYMVMP.cjs → chunk-3R6YHJ3G.cjs} +4 -4
  29. package/dist/{chunk-VDFYMVMP.cjs.map → chunk-3R6YHJ3G.cjs.map} +1 -1
  30. package/dist/{chunk-5RCCZYAE.cjs → chunk-3U36VYMD.cjs} +36 -36
  31. package/dist/{chunk-5RCCZYAE.cjs.map → chunk-3U36VYMD.cjs.map} +1 -1
  32. package/dist/{chunk-A4FGU6YC.cjs → chunk-436I7PQL.cjs} +7 -7
  33. package/dist/{chunk-A4FGU6YC.cjs.map → chunk-436I7PQL.cjs.map} +1 -1
  34. package/dist/{chunk-J2RXQVVF.cjs → chunk-4EK7TAP7.cjs} +5 -5
  35. package/dist/{chunk-J2RXQVVF.cjs.map → chunk-4EK7TAP7.cjs.map} +1 -1
  36. package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
  37. package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
  38. package/dist/{chunk-ZQLRWA3Y.cjs → chunk-4NPCDS2X.cjs} +4 -4
  39. package/dist/{chunk-ZQLRWA3Y.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
  40. package/dist/{chunk-ZEQEIFZJ.cjs → chunk-57EE6CMW.cjs} +24 -24
  41. package/dist/{chunk-ZEQEIFZJ.cjs.map → chunk-57EE6CMW.cjs.map} +1 -1
  42. package/dist/{chunk-NMT4UZQM.cjs → chunk-57NHXEU2.cjs} +5 -5
  43. package/dist/{chunk-NMT4UZQM.cjs.map → chunk-57NHXEU2.cjs.map} +1 -1
  44. package/dist/{chunk-4QTQS4LS.cjs → chunk-5QUL5BZO.cjs} +5 -5
  45. package/dist/{chunk-4QTQS4LS.cjs.map → chunk-5QUL5BZO.cjs.map} +1 -1
  46. package/dist/{chunk-MUA5PJGX.cjs → chunk-5SKHK3BG.cjs} +4 -4
  47. package/dist/{chunk-MUA5PJGX.cjs.map → chunk-5SKHK3BG.cjs.map} +1 -1
  48. package/dist/{chunk-AFXDLDPU.cjs → chunk-5UYFLFNR.cjs} +4 -4
  49. package/dist/{chunk-AFXDLDPU.cjs.map → chunk-5UYFLFNR.cjs.map} +1 -1
  50. package/dist/{chunk-FJXJ43JO.cjs → chunk-6DCIZA3X.cjs} +101 -101
  51. package/dist/{chunk-FJXJ43JO.cjs.map → chunk-6DCIZA3X.cjs.map} +1 -1
  52. package/dist/{chunk-G5TRBLKF.cjs → chunk-7TEUGFIL.cjs} +4 -4
  53. package/dist/{chunk-G5TRBLKF.cjs.map → chunk-7TEUGFIL.cjs.map} +1 -1
  54. package/dist/{chunk-ZNZGYSVB.cjs → chunk-7X3FS5HQ.cjs} +39 -39
  55. package/dist/{chunk-ZNZGYSVB.cjs.map → chunk-7X3FS5HQ.cjs.map} +1 -1
  56. package/dist/{chunk-DZDARC3V.cjs → chunk-7XT5B2DZ.cjs} +70 -70
  57. package/dist/{chunk-DZDARC3V.cjs.map → chunk-7XT5B2DZ.cjs.map} +1 -1
  58. package/dist/{chunk-5UMKMUB5.cjs → chunk-AHT6DQNI.cjs} +68 -68
  59. package/dist/{chunk-5UMKMUB5.cjs.map → chunk-AHT6DQNI.cjs.map} +1 -1
  60. package/dist/{chunk-SRET7LYT.cjs → chunk-BW5MF464.cjs} +4 -4
  61. package/dist/{chunk-SRET7LYT.cjs.map → chunk-BW5MF464.cjs.map} +1 -1
  62. package/dist/{chunk-NP4EWPIP.cjs → chunk-CJYWHUZR.cjs} +6 -6
  63. package/dist/{chunk-NP4EWPIP.cjs.map → chunk-CJYWHUZR.cjs.map} +1 -1
  64. package/dist/{chunk-NTD7VSHO.cjs → chunk-CMGNRMPA.cjs} +4 -4
  65. package/dist/{chunk-NTD7VSHO.cjs.map → chunk-CMGNRMPA.cjs.map} +1 -1
  66. package/dist/{chunk-Z3VNKPPH.cjs → chunk-E3Y7RI3J.cjs} +4 -4
  67. package/dist/{chunk-Z3VNKPPH.cjs.map → chunk-E3Y7RI3J.cjs.map} +1 -1
  68. package/dist/{chunk-TDO5UWXF.cjs → chunk-E4BLRF2L.cjs} +5 -5
  69. package/dist/{chunk-TDO5UWXF.cjs.map → chunk-E4BLRF2L.cjs.map} +1 -1
  70. package/dist/{chunk-WT7CCCIN.cjs → chunk-GNX3FBBX.cjs} +4 -4
  71. package/dist/{chunk-WT7CCCIN.cjs.map → chunk-GNX3FBBX.cjs.map} +1 -1
  72. package/dist/{chunk-3NEI27QQ.cjs → chunk-GQXPNIRE.cjs} +14 -14
  73. package/dist/{chunk-3NEI27QQ.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
  74. package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
  75. package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
  76. package/dist/{chunk-IIWJQEBC.cjs → chunk-H7PHOTX2.cjs} +10 -10
  77. package/dist/{chunk-IIWJQEBC.cjs.map → chunk-H7PHOTX2.cjs.map} +1 -1
  78. package/dist/{chunk-LQHXUSWZ.cjs → chunk-HQDR43JC.cjs} +6 -6
  79. package/dist/{chunk-LQHXUSWZ.cjs.map → chunk-HQDR43JC.cjs.map} +1 -1
  80. package/dist/{chunk-6LQN4BMX.cjs → chunk-IDCD5TEZ.cjs} +5 -5
  81. package/dist/{chunk-6LQN4BMX.cjs.map → chunk-IDCD5TEZ.cjs.map} +1 -1
  82. package/dist/{chunk-6YOZKXV6.cjs → chunk-JR2YSBD5.cjs} +4 -4
  83. package/dist/{chunk-6YOZKXV6.cjs.map → chunk-JR2YSBD5.cjs.map} +1 -1
  84. package/dist/{chunk-3GYOWDNM.cjs → chunk-JSQQV23D.cjs} +5 -5
  85. package/dist/{chunk-3GYOWDNM.cjs.map → chunk-JSQQV23D.cjs.map} +1 -1
  86. package/dist/{chunk-ZFKWCGA5.cjs → chunk-JV5TVUOU.cjs} +4 -4
  87. package/dist/{chunk-ZFKWCGA5.cjs.map → chunk-JV5TVUOU.cjs.map} +1 -1
  88. package/dist/{chunk-TXFZAA3R.cjs → chunk-LFRNBT2I.cjs} +23 -23
  89. package/dist/{chunk-TXFZAA3R.cjs.map → chunk-LFRNBT2I.cjs.map} +1 -1
  90. package/dist/{chunk-R7CJEIA5.cjs → chunk-LYTIQQQ2.cjs} +3 -3
  91. package/dist/{chunk-R7CJEIA5.cjs.map → chunk-LYTIQQQ2.cjs.map} +1 -1
  92. package/dist/{chunk-6UYTG2YG.cjs → chunk-MC4F2URI.cjs} +28 -28
  93. package/dist/{chunk-6UYTG2YG.cjs.map → chunk-MC4F2URI.cjs.map} +1 -1
  94. package/dist/{chunk-NNG34ONS.cjs → chunk-MGQSLMTC.cjs} +78 -78
  95. package/dist/{chunk-NNG34ONS.cjs.map → chunk-MGQSLMTC.cjs.map} +1 -1
  96. package/dist/{chunk-3Q5L7XVI.cjs → chunk-MZ2KZXNU.cjs} +9 -9
  97. package/dist/{chunk-3Q5L7XVI.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
  98. package/dist/{chunk-PJ762EO2.cjs → chunk-NHHEMBXQ.cjs} +24 -24
  99. package/dist/{chunk-PJ762EO2.cjs.map → chunk-NHHEMBXQ.cjs.map} +1 -1
  100. package/dist/{chunk-ENUZ35NR.cjs → chunk-P5AQYC4D.cjs} +4 -4
  101. package/dist/{chunk-ENUZ35NR.cjs.map → chunk-P5AQYC4D.cjs.map} +1 -1
  102. package/dist/{chunk-5I2VUNZR.cjs → chunk-PGJYD67F.cjs} +6 -6
  103. package/dist/{chunk-5I2VUNZR.cjs.map → chunk-PGJYD67F.cjs.map} +1 -1
  104. package/dist/{chunk-BYN7UMC5.cjs → chunk-PL7HUTM3.cjs} +8 -8
  105. package/dist/{chunk-BYN7UMC5.cjs.map → chunk-PL7HUTM3.cjs.map} +1 -1
  106. package/dist/{chunk-NOYQ23I7.cjs → chunk-Q6DQGGP4.cjs} +6 -6
  107. package/dist/{chunk-NOYQ23I7.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
  108. package/dist/{chunk-T7J352JD.cjs → chunk-QMIHLJMH.cjs} +6 -6
  109. package/dist/{chunk-T7J352JD.cjs.map → chunk-QMIHLJMH.cjs.map} +1 -1
  110. package/dist/{chunk-LTEXVRCH.cjs → chunk-SBWIA4PL.cjs} +21 -21
  111. package/dist/{chunk-LTEXVRCH.cjs.map → chunk-SBWIA4PL.cjs.map} +1 -1
  112. package/dist/{chunk-ZH7LDZJX.cjs → chunk-TDN33HSK.cjs} +14 -14
  113. package/dist/{chunk-ZH7LDZJX.cjs.map → chunk-TDN33HSK.cjs.map} +1 -1
  114. package/dist/{chunk-U5T46QCS.cjs → chunk-TKHCIHE2.cjs} +3 -3
  115. package/dist/chunk-TKHCIHE2.cjs.map +1 -0
  116. package/dist/{chunk-WIAWHETB.cjs → chunk-ULPTSXXO.cjs} +4 -4
  117. package/dist/{chunk-WIAWHETB.cjs.map → chunk-ULPTSXXO.cjs.map} +1 -1
  118. package/dist/{chunk-GTWEWDIZ.cjs → chunk-UNDQYTRF.cjs} +8 -8
  119. package/dist/{chunk-GTWEWDIZ.cjs.map → chunk-UNDQYTRF.cjs.map} +1 -1
  120. package/dist/{chunk-OKHKJ5ML.cjs → chunk-UUENH4BJ.cjs} +11 -11
  121. package/dist/{chunk-OKHKJ5ML.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
  122. package/dist/{chunk-K5MYEWD5.cjs → chunk-UZHWXKS6.cjs} +7 -7
  123. package/dist/{chunk-K5MYEWD5.cjs.map → chunk-UZHWXKS6.cjs.map} +1 -1
  124. package/dist/{chunk-QVHP4R7T.cjs → chunk-V5IMYLYK.cjs} +29 -29
  125. package/dist/{chunk-QVHP4R7T.cjs.map → chunk-V5IMYLYK.cjs.map} +1 -1
  126. package/dist/{chunk-XW524KUX.cjs → chunk-VJCSEMXT.cjs} +4 -4
  127. package/dist/{chunk-XW524KUX.cjs.map → chunk-VJCSEMXT.cjs.map} +1 -1
  128. package/dist/{chunk-B5442TKX.cjs → chunk-VRK3IQAP.cjs} +4 -4
  129. package/dist/{chunk-B5442TKX.cjs.map → chunk-VRK3IQAP.cjs.map} +1 -1
  130. package/dist/{chunk-MYRKL3JO.cjs → chunk-VWTOIGX4.cjs} +4 -4
  131. package/dist/{chunk-MYRKL3JO.cjs.map → chunk-VWTOIGX4.cjs.map} +1 -1
  132. package/dist/{chunk-Q7DB5S7N.cjs → chunk-WW6LXQY6.cjs} +12 -12
  133. package/dist/{chunk-Q7DB5S7N.cjs.map → chunk-WW6LXQY6.cjs.map} +1 -1
  134. package/dist/{chunk-NJCK6V6U.cjs → chunk-XKDUPU7B.cjs} +4 -4
  135. package/dist/{chunk-NJCK6V6U.cjs.map → chunk-XKDUPU7B.cjs.map} +1 -1
  136. package/dist/{chunk-YAPXIANR.cjs → chunk-YVCOQHCE.cjs} +5 -5
  137. package/dist/{chunk-YAPXIANR.cjs.map → chunk-YVCOQHCE.cjs.map} +1 -1
  138. package/dist/{chunk-TOM2P3MA.cjs → chunk-ZZA756I4.cjs} +4 -4
  139. package/dist/{chunk-TOM2P3MA.cjs.map → chunk-ZZA756I4.cjs.map} +1 -1
  140. package/dist/citations/index.cjs +8 -8
  141. package/dist/connect/docx.cjs +24 -24
  142. package/dist/connect/index.cjs +1489 -1433
  143. package/dist/connect/index.cjs.map +1 -1
  144. package/dist/connect/viewer.cjs +40 -40
  145. package/dist/connection/ConnectedWorkflowBuilder.d.ts +11 -0
  146. package/dist/connection/ConnectedWorkflowBuilder.js +42 -3
  147. package/dist/connection/ConnectedWorkflowBuilder.js.map +2 -2
  148. package/dist/connection/conversation/ConnectedConversationPage.js +36 -2
  149. package/dist/connection/conversation/ConnectedConversationPage.js.map +2 -2
  150. package/dist/connection/report-problem/ReportProblemDialog.d.ts +2 -2
  151. package/dist/connection/report-problem/ReportProblemDialog.js +51 -19
  152. package/dist/connection/report-problem/ReportProblemDialog.js.map +2 -2
  153. package/dist/connection/workflows/ConnectedWorkflowsPage.js +10 -3
  154. package/dist/connection/workflows/ConnectedWorkflowsPage.js.map +2 -2
  155. package/dist/connection/workflows/useWorkflowsPageState.d.ts +1 -0
  156. package/dist/connection/workflows/useWorkflowsPageState.js.map +2 -2
  157. package/dist/dashboards/index.cjs +23 -23
  158. package/dist/embed/index.cjs +49 -49
  159. package/dist/facts/index.cjs +45 -45
  160. package/dist/files/index.cjs +225 -225
  161. package/dist/home/index.cjs +32 -32
  162. package/dist/index.cjs +1750 -1750
  163. package/dist/provider/environment.d.ts +5 -0
  164. package/dist/provider/environment.js +1 -1
  165. package/dist/provider/environment.js.map +2 -2
  166. package/dist/provider/requests.d.ts +2 -0
  167. package/dist/provider/requests.js.map +2 -2
  168. package/dist/retrieval/index.cjs +4 -4
  169. package/dist/settings/index.cjs +148 -148
  170. package/dist/shell/index.cjs +91 -91
  171. package/dist/site/index.cjs +5 -5
  172. package/dist/studio/index.cjs +43 -43
  173. package/dist/workflow-canvas/index.cjs +114 -72
  174. package/dist/workflow-canvas/index.cjs.map +1 -1
  175. package/dist/workspaces/index.cjs +18 -18
  176. package/node_modules/@arbidocs/coedit/package.json +1 -1
  177. package/package.json +5 -5
  178. package/dist/ai-OYTFPMXI.cjs.map +0 -1
  179. package/dist/chunk-U5T46QCS.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dashboards/DashboardGrid.tsx","../src/dashboards/ChartRenderer.tsx","../src/dashboards/PanelView.tsx","../src/connection/storage/storage-labels.ts","../src/connection/dashboards/DashboardPanel.tsx"],"names":["jsx","cn","lazy","jsxs","sliceColors","useState","useId","Suspense","formatterOf","fmtDate","DataTable","AlertTriangle","ChartNoAxesColumn","MetricCard","Card","formatFileSize","DEFAULT_UNIT_FORMATTERS","formatGbp","useBlocksEnvironment","usePanelDataset","useMemo","metricValueOf","chartModelOf","Button","useDataSources","useArbiSessionState"],"mappings":"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","file":"chunk-K5MYEWD5.cjs","sourcesContent":["/**\n * `DashboardGrid`: a responsive 12-column grid of panels. Each child spans `width` columns on a wide\n * screen and the full width on a phone, where panels stack in order.\n */\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Literal classes (the stylesheet is generated from the source): `md:col-span-1…12`. */\nconst SPANS = [\n 'md:col-span-1',\n 'md:col-span-2',\n 'md:col-span-3',\n 'md:col-span-4',\n 'md:col-span-5',\n 'md:col-span-6',\n 'md:col-span-7',\n 'md:col-span-8',\n 'md:col-span-9',\n 'md:col-span-10',\n 'md:col-span-11',\n 'md:col-span-12',\n] as const\n\n/** A width in grid columns, kept within 1…12 (default 6, half the row). */\nexport function clampPanelWidth(width: number | undefined): number {\n return Math.min(12, Math.max(1, Math.round(width ?? 6)))\n}\n\nexport interface DashboardGridProps {\n children?: ReactNode\n className?: string\n testId?: string\n}\n\n/** The grid. Wrap each panel in a `DashboardCell`. */\nexport function DashboardGrid({ children, className, testId }: DashboardGridProps) {\n return (\n <div\n className={cn('grid grid-cols-1 gap-4 md:grid-cols-12', className)}\n data-slot=\"dashboard\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\n/** One cell of the grid, `width` columns wide on a wide screen. */\nexport function DashboardCell({\n width,\n children,\n className,\n}: {\n width?: number\n children?: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn('col-span-1 min-w-0', SPANS[clampPanelWidth(width) - 1], className)}\n data-slot=\"dashboard-cell\"\n >\n {children}\n </div>\n )\n}\n","/**\n * `ChartRenderer`: draws a `ChartModel`. The drawing library is loaded on demand (a skeleton shows\n * meanwhile), so a page fetches it only when a chart is on screen. Beside the drawing: a legend in\n * the theme's text colours, and a table of the same values one click away (for screen readers,\n * copying, or when colours are hard to tell apart).\n */\nimport { lazy, Suspense, useId, useState } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { sliceColors, type ChartModel } from './chartModel'\n\nconst RechartsRenderer = lazy(() => import('./RechartsRenderer'))\n\nexport interface ChartRendererLabels {\n showTable: string\n showChart: string\n other: string\n}\n\nexport const DEFAULT_CHART_RENDERER_LABELS: ChartRendererLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n}\n\nexport interface ChartRendererProps {\n model: ChartModel\n ariaLabel: string\n /** The plot's height in px. Default 240. */\n height?: number\n /** Start on the table. */\n defaultView?: 'chart' | 'table'\n labels?: Partial<ChartRendererLabels>\n className?: string\n testId?: string\n}\n\n/** The values as a table: a row per category, a column per series. */\nexport function ChartTable({\n model,\n caption,\n id,\n}: {\n model: ChartModel\n caption: string\n id?: string\n}) {\n return (\n <div className=\"max-h-72 overflow-auto\">\n <table id={id} className=\"w-full text-left text-xs\" data-slot=\"chart-table\">\n <caption className=\"sr-only\">{caption}</caption>\n <thead>\n <tr className=\"border-b border-border text-muted-foreground\">\n <th scope=\"col\" className=\"py-1.5 pr-3 font-medium\">\n {model.xLabel}\n </th>\n {model.series.map((s) => (\n <th key={s.id} scope=\"col\" className=\"py-1.5 pr-3 text-right font-medium\">\n {s.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {model.categories.map((category, i) => (\n <tr key={`${category}-${i}`} className=\"border-b border-border/60 last:border-0\">\n <th scope=\"row\" className=\"py-1.5 pr-3 font-normal text-foreground\">\n {category}\n </th>\n {model.series.map((s) => (\n <td key={s.id} className=\"py-1.5 pr-3 text-right tabular-nums text-foreground\">\n {s.values[i] === null ? '–' : model.format(s.values[i] as number)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction Legend({ model, other }: { model: ChartModel; other: string }) {\n const pie = model.type === 'pie' || model.type === 'donut'\n const items = pie\n ? model.categories.map((label, i) => ({ label, color: sliceColors(model, other)[i] }))\n : model.series.map((s) => ({ label: s.label, color: s.color }))\n if (!pie && items.length < 2) return null\n return (\n <ul className=\"flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n {items.map((item, i) => (\n <li key={`${item.label}-${i}`} className=\"inline-flex items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"inline-block size-2 rounded-full\"\n style={{ background: item.color }}\n />\n {item.label}\n </li>\n ))}\n </ul>\n )\n}\n\nexport function ChartRenderer({\n model,\n ariaLabel,\n height = 240,\n defaultView = 'chart',\n labels,\n className,\n testId,\n}: ChartRendererProps) {\n const l = { ...DEFAULT_CHART_RENDERER_LABELS, ...labels }\n const [view, setView] = useState(defaultView)\n const tableId = useId()\n return (\n <figure\n className={cn('flex min-w-0 max-w-full flex-col gap-2', className)}\n data-slot=\"dashboard-chart\"\n data-type={model.type}\n data-testid={testId}\n >\n {view === 'table' ? (\n <ChartTable model={model} caption={ariaLabel} id={tableId} />\n ) : (\n <div className=\"min-w-0\" style={{ height }} role=\"figure\" aria-label={ariaLabel}>\n <Suspense\n fallback={\n <div\n className=\"size-full animate-pulse rounded-md bg-muted\"\n data-slot=\"chart-loading\"\n />\n }\n >\n <RechartsRenderer\n model={model}\n ariaLabel={ariaLabel}\n height={height}\n otherLabel={l.other}\n />\n </Suspense>\n </div>\n )}\n <figcaption className=\"flex flex-wrap items-center justify-between gap-2\">\n <Legend model={model} other={l.other} />\n <button\n type=\"button\"\n className=\"ml-auto rounded-sm text-xs text-muted-foreground underline-offset-2 hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring print:hidden\"\n aria-controls={view === 'table' ? tableId : undefined}\n aria-pressed={view === 'table'}\n onClick={() => setView(view === 'table' ? 'chart' : 'table')}\n >\n {view === 'table' ? l.showChart : l.showTable}\n </button>\n </figcaption>\n </figure>\n )\n}\n","/**\n * `PanelView`: one dashboard panel as it looks, from data already in hand: a metric tile, a chart\n * or a table, each with its loading, empty and error state. Presentational: `DashboardPanel` reads\n * the data and renders this.\n */\nimport type { ReactNode } from 'react'\nimport { AlertTriangle, ChartNoAxesColumn } from 'lucide-react'\nimport type { DatasetField, DatasetRow, DatasetValue } from '@arbidocs/react'\nimport { Card, cn } from '@arbidocs/react/ui'\nimport { DataTable, type Column } from '../components/DataTable'\nimport { MetricCard } from '../components/MetricCard'\nimport { fmtDate } from '../lib/format'\nimport { ChartRenderer, ChartTable, type ChartRendererLabels } from './ChartRenderer'\nimport { formatterOf, type ChartModel, type UnitFormatters } from './chartModel'\n\nexport type PanelState = 'loading' | 'empty' | 'error' | 'ready'\n\nexport interface PanelViewLabels extends ChartRendererLabels {\n empty: string\n error: string\n /** Under a table cut short: \"Showing 50 of 1,200 rows\". */\n showingRows: (shown: number, total: number) => string\n yes: string\n no: string\n}\n\nexport const DEFAULT_PANEL_VIEW_LABELS: PanelViewLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n empty: 'Nothing to show yet.',\n error: 'This panel could not be loaded.',\n showingRows: (shown, total) =>\n `Showing ${shown.toLocaleString('en-GB')} of ${total.toLocaleString('en-GB')} rows`,\n yes: 'Yes',\n no: 'No',\n}\n\n/** What a panel shows when ready. */\nexport type PanelBody =\n | { kind: 'metric'; value: number | null; format: (value: number) => string }\n | { kind: 'chart'; model: ChartModel }\n /** A table of groups (a chart model shown as a table). */\n | { kind: 'groups'; model: ChartModel }\n /** A table of records. */\n | { kind: 'records'; fields: readonly DatasetField[]; rows: readonly DatasetRow[] }\n\nexport interface PanelViewProps {\n /** What the panel is (it shows as one before its data is in). */\n kind: 'metric' | 'chart' | 'table'\n title: string\n description?: string\n state: PanelState\n body?: PanelBody\n /** The error's own words, shown under the panel's. */\n errorDetail?: string\n /** Shown in the empty state (a link to where data comes from). */\n emptyAction?: ReactNode\n /** Buttons in the panel's corner (edit, remove), for a dashboard being edited. */\n actions?: ReactNode\n /** A metric's tile, with the theme accent token of its icon. */\n metricAccent?: string\n /** `card` (default): a card with the title; `plain`: no card (a chart placed in a page). */\n variant?: 'card' | 'plain'\n /** Most records a table shows. Default 50. */\n maxRows?: number\n formatters?: UnitFormatters\n labels?: Partial<PanelViewLabels>\n className?: string\n testId?: string\n}\n\nfunction cellText(\n value: DatasetValue | undefined,\n field: DatasetField,\n l: PanelViewLabels,\n formatters?: UnitFormatters\n): string {\n if (value === null || value === undefined || value === '') return '–'\n if (Array.isArray(value)) return value.join(', ')\n if (typeof value === 'boolean') return value ? l.yes : l.no\n if (field.type === 'number' && typeof value === 'number')\n return formatterOf(field, formatters)(value)\n if (field.type === 'date' && typeof value === 'string') return fmtDate(value)\n return String(value)\n}\n\nfunction RecordsTable({\n fields,\n rows,\n maxRows,\n l,\n formatters,\n testId,\n}: {\n fields: readonly DatasetField[]\n rows: readonly DatasetRow[]\n maxRows: number\n l: PanelViewLabels\n formatters?: UnitFormatters\n testId?: string\n}) {\n const shown = rows.slice(0, maxRows).map((row, i) => ({ row, i }))\n const columns: Column<{ row: DatasetRow; i: number }>[] = fields.map((field) => ({\n key: field.id,\n header: field.label,\n align: field.type === 'number' ? 'right' : 'left',\n render: ({ row }) => cellText(row[field.id], field, l, formatters),\n className: field.type === 'number' ? 'tabular-nums' : undefined,\n }))\n return (\n <div className=\"space-y-1\">\n <div className=\"max-h-80 overflow-auto\">\n <DataTable\n columns={columns}\n rows={shown}\n getRowId={({ i }) => String(i)}\n area={testId ?? 'dashboard-panel'}\n emptyTitle={l.empty}\n className=\"border-0\"\n />\n </div>\n {rows.length > maxRows && (\n <p className=\"text-xs text-muted-foreground\">{l.showingRows(maxRows, rows.length)}</p>\n )}\n </div>\n )\n}\n\nfunction Message({\n tone,\n text,\n detail,\n action,\n testId,\n}: {\n tone: 'empty' | 'error'\n text: string\n detail?: string\n action?: ReactNode\n testId?: string\n}) {\n const Icon = tone === 'error' ? AlertTriangle : ChartNoAxesColumn\n return (\n <div\n className=\"flex min-h-40 flex-col items-center justify-center gap-2 py-6 text-center\"\n role={tone === 'error' ? 'alert' : undefined}\n data-testid={testId}\n >\n <Icon\n className={cn('size-6', tone === 'error' ? 'text-destructive' : 'text-muted-foreground/50')}\n />\n <p className={cn('text-sm', tone === 'error' ? 'text-destructive' : 'text-muted-foreground')}>\n {text}\n </p>\n {detail && <p className=\"max-w-sm text-xs text-muted-foreground\">{detail}</p>}\n {action}\n </div>\n )\n}\n\nexport function PanelView({\n kind,\n title,\n description,\n state,\n body,\n errorDetail,\n emptyAction,\n actions,\n metricAccent,\n variant = 'card',\n maxRows = 50,\n formatters,\n labels,\n className,\n testId,\n}: PanelViewProps) {\n const l = { ...DEFAULT_PANEL_VIEW_LABELS, ...labels }\n\n // A metric is the KPI tile itself.\n if (kind === 'metric') {\n const metric = body?.kind === 'metric' ? body : undefined\n const hint =\n state === 'error' ? (\n <span className=\"text-destructive\">\n {l.error}\n {errorDetail && ` ${errorDetail}`}\n </span>\n ) : state === 'empty' ? (\n l.empty\n ) : (\n description\n )\n return (\n <div className={cn('relative h-full', className)} data-slot=\"dashboard-panel\">\n <MetricCard\n label={title}\n value={\n metric && metric.value !== null && state === 'ready' ? metric.format(metric.value) : '—'\n }\n hint={hint}\n isLoading={state === 'loading'}\n accent={metricAccent}\n // The edit buttons sit in the corner: the label starts below them.\n className={cn('h-full', actions && 'pt-11')}\n testId={testId}\n />\n {actions && <div className=\"absolute right-2 top-2 flex gap-1\">{actions}</div>}\n </div>\n )\n }\n\n let content: ReactNode\n if (state === 'loading') {\n content = (\n <div className=\"h-60 animate-pulse rounded-md bg-muted\" data-slot=\"panel-loading\" aria-busy />\n )\n } else if (state === 'error') {\n content = (\n <Message\n tone=\"error\"\n text={l.error}\n detail={errorDetail}\n testId={testId && `${testId}-error`}\n />\n )\n } else if (state === 'empty' || !body || body.kind === 'metric') {\n content = (\n <Message\n tone=\"empty\"\n text={l.empty}\n action={emptyAction}\n testId={testId && `${testId}-empty`}\n />\n )\n } else if (body.kind === 'chart') {\n content = (\n <ChartRenderer\n model={body.model}\n ariaLabel={title}\n labels={l}\n testId={testId && `${testId}-chart`}\n />\n )\n } else if (body.kind === 'groups') {\n content = <ChartTable model={body.model} caption={title} />\n } else {\n content = (\n <RecordsTable\n fields={body.fields}\n rows={body.rows}\n maxRows={maxRows}\n l={l}\n formatters={formatters}\n testId={testId}\n />\n )\n }\n\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">{title}</h3>\n {description && <p className=\"mt-0.5 text-xs text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 gap-1\">{actions}</div>}\n </div>\n )\n if (variant === 'plain') {\n return (\n <section\n className={cn('flex min-w-0 flex-col gap-3', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0\">{content}</div>\n </section>\n )\n }\n return (\n <Card\n variant=\"elevated\"\n className={cn('flex h-full min-w-0 flex-col gap-3 rounded-xl p-5', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0 flex-1\">{content}</div>\n </Card>\n )\n}\n","/**\n * How storage kinds read to people. A document's objects come as `document` (its current file), `version`\n * (earlier versions' files) and `derived` (previews, thumbnails, search index files), plus `coedit` (live\n * editing state); everything a person stores outside a project's workspaces is billed to their personal project.\n */\n\nimport { formatFileSize } from '@arbidocs/sdk/browser'\nimport type { StorageItem, StorageKindUsage } from '@arbidocs/react'\n\nexport const KIND_LABELS: Record<string, string> = {\n document: 'Documents',\n version: 'Earlier versions',\n derived: 'Previews & processing',\n coedit: 'Editing state',\n mail: 'Mail',\n mail_draft: 'Mail drafts',\n chat_attachment: 'Chat attachments',\n recording: 'Call recordings',\n other: 'Other',\n}\n\n/** One item's kind, singular (\"Document\", \"Email\", …). */\nexport const ITEM_LABELS: Record<string, string> = {\n document: 'Document',\n mail: 'Email',\n mail_draft: 'Mail draft',\n chat_attachment: 'Chat attachment',\n recording: 'Call recording',\n other: 'Other file',\n}\n\nexport const MAIL_FOLDER_LABELS: Record<string, string> = {\n inbox: 'Inbox',\n sent: 'Sent',\n outbox: 'Outbox',\n drafts: 'Drafts',\n archive: 'Archive',\n trash: 'Trash',\n}\n\nexport const formatBytes = (bytes: number | null | undefined) => formatFileSize(bytes ?? 0)\n\n/** \"1.2 GB of 5.0 GB\" — or just the used part when there is no limit. */\nexport function usedOfLimit(bytes: number, limit: number | null | undefined): string {\n return limit ? `${formatBytes(bytes)} of ${formatBytes(limit)}` : `${formatBytes(bytes)} used`\n}\n\nexport function usedPct(bytes: number, limit: number | null | undefined): number {\n return limit ? (bytes / limit) * 100 : 0\n}\n\nexport interface KindRow {\n kind: string\n label: string\n bytes: number\n trashBytes: number\n}\n\n/** A project's kinds, largest first, each labelled. */\nexport function kindRows(kinds: StorageKindUsage[]): KindRow[] {\n return [...kinds]\n .filter((k) => k.bytes > 0)\n .sort((a, b) => b.bytes - a.bytes)\n .map((k) => ({\n kind: k.kind,\n label: KIND_LABELS[k.kind] ?? k.kind,\n bytes: k.bytes,\n trashBytes: k.trash_bytes,\n }))\n}\n\n/** Deletion keeps things in Recently deleted (in archive storage, counted at 10%) until the monthly purge. */\nexport const RECENTLY_DELETED_NOTE =\n 'Deleted items stay in Recently deleted, counted at 10% of their size, until they are removed for good 30–60 days later.'\n\n/** \"Archived and Recently deleted count at 10% of their size.\" — the server's reduced rate. */\nexport function reducedRateNote(rate: number): string {\n return `Archived workspaces and Recently deleted count at ${Math.round(rate * 100)}% of their size.`\n}\n\nexport interface StorageItemRow {\n item: StorageItem\n /** A document's decrypted name (when its workspace's key is available), else undefined. */\n name?: string\n}\n\n/** What an item is called: its name when known, else what it is and where. */\nexport function itemTitle({ item, name }: StorageItemRow): string {\n if (name) return name\n if (item.kind === 'mail') {\n return `Email in ${MAIL_FOLDER_LABELS[item.folder ?? ''] ?? item.folder ?? 'Mail'}`\n }\n return ITEM_LABELS[item.kind] ?? item.kind\n}\n","/**\n * `DashboardPanel`: one panel of a dashboard, from its `PanelSpec`. It looks its source up in the\n * host's registry (`useDataSources`), reads the dataset the spec asks for (`usePanelDataset`:\n * grouped and measured by the source) and shows it through `PanelView`.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport {\n formatGbp,\n useArbiSessionState,\n useDataSources,\n usePanelDataset,\n type DataSource,\n type PanelSpec,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { formatBytes } from '../storage/storage-labels'\nimport {\n chartModelOf,\n DEFAULT_UNIT_FORMATTERS,\n formatterOf,\n metricValueOf,\n type DrawnChartType,\n type UnitFormatters,\n} from '../../dashboards/chartModel'\nimport { PanelView, type PanelBody, type PanelViewLabels } from '../../dashboards/PanelView'\n\n/** The package's formatters: the one £ formatter for AI usage, and file sizes. */\nexport const PANEL_FORMATTERS: UnitFormatters = {\n ...DEFAULT_UNIT_FORMATTERS,\n gbp: (v) => formatGbp(v),\n bytes: (v) => formatBytes(v),\n}\n\nexport interface DashboardPanelLabels extends PanelViewLabels {\n /** A panel whose source the host does not offer. */\n unknownSource: (id: string) => string\n /** The empty state's link to the databases (where data is created or imported). */\n openDatabases: string\n /** A panel over workspace data (documents, threads…) while no workspace is open. */\n noWorkspace: string\n}\n\nexport const DEFAULT_DASHBOARD_PANEL_LABELS: Partial<DashboardPanelLabels> = {\n unknownSource: (id) => `This panel reads “${id}”, which is not available here.`,\n openDatabases: 'Open databases',\n noWorkspace: 'Open a workspace to see this.',\n}\n\nexport interface DashboardPanelProps {\n panel: PanelSpec\n /** Buttons in the panel's corner (a dashboard being edited). */\n actions?: ReactNode\n /** Don't read data (an editor showing the panel's frame only). */\n enabled?: boolean\n /** `plain`: no card around it (a chart placed in a page). */\n variant?: 'card' | 'plain'\n formatters?: UnitFormatters\n labels?: Partial<DashboardPanelLabels>\n className?: string\n testId?: string\n}\n\nconst DRAWN = new Set(['bar', 'line', 'area', 'pie', 'donut'])\n\nfunction kindOf(panel: PanelSpec): 'metric' | 'chart' | 'table' {\n return panel.chart.type === 'metric' ? 'metric' : panel.chart.type === 'table' ? 'table' : 'chart'\n}\n\nfunction SourcePanel({\n source,\n panel,\n actions,\n enabled,\n variant,\n formatters,\n labels,\n className,\n testId,\n}: DashboardPanelProps & { source: DataSource; labels: Partial<DashboardPanelLabels> }) {\n const environment = useBlocksEnvironment()\n const { chart } = panel\n const { dataset, fields, isLoading, error } = usePanelDataset(\n source,\n panel.source.params,\n chart,\n { enabled }\n )\n const body = useMemo((): PanelBody | undefined => {\n if (!dataset) return undefined\n const other = labels.other\n if (chart.type === 'metric') {\n const valueField = dataset.fields.find((f) => f.id === 'value')\n // Nothing matched: a count or a sum of nothing is 0; an average of nothing has no value.\n const op = chart.aggregate ?? 'count'\n return {\n kind: 'metric',\n value: metricValueOf(dataset) ?? (op === 'count' || op === 'sum' ? 0 : null),\n format: formatterOf(valueField, formatters),\n }\n }\n if (DRAWN.has(chart.type)) {\n return {\n kind: 'chart',\n model: chartModelOf({ ...chart, type: chart.type as DrawnChartType }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n if (chart.x) {\n return {\n kind: 'groups',\n model: chartModelOf({ ...chart, type: 'bar' }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n const shown = chart.columns?.length\n ? chart.columns.flatMap((id) => dataset.fields.filter((f) => f.id === id))\n : dataset.fields\n return { kind: 'records', fields: shown, rows: dataset.rows }\n }, [dataset, chart, fields, formatters, labels.other])\n\n const state = error\n ? 'error'\n : !dataset\n ? isLoading\n ? 'loading'\n : 'empty'\n : chart.type !== 'metric' && dataset.rows.length === 0\n ? 'empty'\n : 'ready'\n\n const emptyAction =\n source.id === 'database' && environment.openDatabases ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => environment.openDatabases?.()}>\n {labels.openDatabases}\n </Button>\n ) : undefined\n\n return (\n <PanelView\n kind={kindOf(panel)}\n title={panel.title}\n description={panel.description}\n state={state}\n body={body}\n errorDetail={error instanceof Error ? error.message : undefined}\n emptyAction={emptyAction}\n actions={actions}\n variant={variant}\n formatters={formatters}\n labels={labels}\n className={className}\n testId={testId}\n />\n )\n}\n\nexport function DashboardPanel({\n formatters = PANEL_FORMATTERS,\n labels,\n ...props\n}: DashboardPanelProps) {\n const registry = useDataSources()\n const l = { ...DEFAULT_DASHBOARD_PANEL_LABELS, ...labels }\n const source = registry.get(props.panel.source.id)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const scope =\n typeof source?.scope === 'function'\n ? source.scope(props.panel.source.params ?? {})\n : source?.scope\n if (scope === 'workspace' && !workspaceId) {\n return (\n <PanelView\n kind={kindOf(props.panel)}\n title={props.panel.title}\n state=\"empty\"\n actions={props.actions}\n labels={{ ...l, empty: l.noWorkspace ?? l.empty }}\n variant={props.variant}\n className={props.className}\n testId={props.testId}\n />\n )\n }\n if (!source) {\n return (\n <PanelView\n kind={kindOf(props.panel)}\n title={props.panel.title}\n state=\"error\"\n errorDetail={l.unknownSource?.(props.panel.source.id)}\n actions={props.actions}\n labels={l}\n className={props.className}\n testId={props.testId}\n />\n )\n }\n // Keyed by source: a source's hooks differ from another's, so a new source mounts afresh.\n return (\n <SourcePanel key={source.id} source={source} formatters={formatters} labels={l} {...props} />\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/dashboards/DashboardGrid.tsx","../src/dashboards/ChartRenderer.tsx","../src/dashboards/PanelView.tsx","../src/connection/storage/storage-labels.ts","../src/connection/dashboards/DashboardPanel.tsx"],"names":["jsx","cn","lazy","jsxs","sliceColors","useState","useId","Suspense","formatterOf","fmtDate","DataTable","AlertTriangle","ChartNoAxesColumn","MetricCard","Card","formatFileSize","DEFAULT_UNIT_FORMATTERS","formatGbp","useBlocksEnvironment","usePanelDataset","useMemo","metricValueOf","chartModelOf","Button","useDataSources","useArbiSessionState"],"mappings":"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","file":"chunk-UZHWXKS6.cjs","sourcesContent":["/**\n * `DashboardGrid`: a responsive 12-column grid of panels. Each child spans `width` columns on a wide\n * screen and the full width on a phone, where panels stack in order.\n */\nimport type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Literal classes (the stylesheet is generated from the source): `md:col-span-1…12`. */\nconst SPANS = [\n 'md:col-span-1',\n 'md:col-span-2',\n 'md:col-span-3',\n 'md:col-span-4',\n 'md:col-span-5',\n 'md:col-span-6',\n 'md:col-span-7',\n 'md:col-span-8',\n 'md:col-span-9',\n 'md:col-span-10',\n 'md:col-span-11',\n 'md:col-span-12',\n] as const\n\n/** A width in grid columns, kept within 1…12 (default 6, half the row). */\nexport function clampPanelWidth(width: number | undefined): number {\n return Math.min(12, Math.max(1, Math.round(width ?? 6)))\n}\n\nexport interface DashboardGridProps {\n children?: ReactNode\n className?: string\n testId?: string\n}\n\n/** The grid. Wrap each panel in a `DashboardCell`. */\nexport function DashboardGrid({ children, className, testId }: DashboardGridProps) {\n return (\n <div\n className={cn('grid grid-cols-1 gap-4 md:grid-cols-12', className)}\n data-slot=\"dashboard\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\n/** One cell of the grid, `width` columns wide on a wide screen. */\nexport function DashboardCell({\n width,\n children,\n className,\n}: {\n width?: number\n children?: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn('col-span-1 min-w-0', SPANS[clampPanelWidth(width) - 1], className)}\n data-slot=\"dashboard-cell\"\n >\n {children}\n </div>\n )\n}\n","/**\n * `ChartRenderer`: draws a `ChartModel`. The drawing library is loaded on demand (a skeleton shows\n * meanwhile), so a page fetches it only when a chart is on screen. Beside the drawing: a legend in\n * the theme's text colours, and a table of the same values one click away (for screen readers,\n * copying, or when colours are hard to tell apart).\n */\nimport { lazy, Suspense, useId, useState } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { sliceColors, type ChartModel } from './chartModel'\n\nconst RechartsRenderer = lazy(() => import('./RechartsRenderer'))\n\nexport interface ChartRendererLabels {\n showTable: string\n showChart: string\n other: string\n}\n\nexport const DEFAULT_CHART_RENDERER_LABELS: ChartRendererLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n}\n\nexport interface ChartRendererProps {\n model: ChartModel\n ariaLabel: string\n /** The plot's height in px. Default 240. */\n height?: number\n /** Start on the table. */\n defaultView?: 'chart' | 'table'\n labels?: Partial<ChartRendererLabels>\n className?: string\n testId?: string\n}\n\n/** The values as a table: a row per category, a column per series. */\nexport function ChartTable({\n model,\n caption,\n id,\n}: {\n model: ChartModel\n caption: string\n id?: string\n}) {\n return (\n <div className=\"max-h-72 overflow-auto\">\n <table id={id} className=\"w-full text-left text-xs\" data-slot=\"chart-table\">\n <caption className=\"sr-only\">{caption}</caption>\n <thead>\n <tr className=\"border-b border-border text-muted-foreground\">\n <th scope=\"col\" className=\"py-1.5 pr-3 font-medium\">\n {model.xLabel}\n </th>\n {model.series.map((s) => (\n <th key={s.id} scope=\"col\" className=\"py-1.5 pr-3 text-right font-medium\">\n {s.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {model.categories.map((category, i) => (\n <tr key={`${category}-${i}`} className=\"border-b border-border/60 last:border-0\">\n <th scope=\"row\" className=\"py-1.5 pr-3 font-normal text-foreground\">\n {category}\n </th>\n {model.series.map((s) => (\n <td key={s.id} className=\"py-1.5 pr-3 text-right tabular-nums text-foreground\">\n {s.values[i] === null ? '–' : model.format(s.values[i] as number)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\nfunction Legend({ model, other }: { model: ChartModel; other: string }) {\n const pie = model.type === 'pie' || model.type === 'donut'\n const items = pie\n ? model.categories.map((label, i) => ({ label, color: sliceColors(model, other)[i] }))\n : model.series.map((s) => ({ label: s.label, color: s.color }))\n if (!pie && items.length < 2) return null\n return (\n <ul className=\"flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n {items.map((item, i) => (\n <li key={`${item.label}-${i}`} className=\"inline-flex items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"inline-block size-2 rounded-full\"\n style={{ background: item.color }}\n />\n {item.label}\n </li>\n ))}\n </ul>\n )\n}\n\nexport function ChartRenderer({\n model,\n ariaLabel,\n height = 240,\n defaultView = 'chart',\n labels,\n className,\n testId,\n}: ChartRendererProps) {\n const l = { ...DEFAULT_CHART_RENDERER_LABELS, ...labels }\n const [view, setView] = useState(defaultView)\n const tableId = useId()\n return (\n <figure\n className={cn('flex min-w-0 max-w-full flex-col gap-2', className)}\n data-slot=\"dashboard-chart\"\n data-type={model.type}\n data-testid={testId}\n >\n {view === 'table' ? (\n <ChartTable model={model} caption={ariaLabel} id={tableId} />\n ) : (\n <div className=\"min-w-0\" style={{ height }} role=\"figure\" aria-label={ariaLabel}>\n <Suspense\n fallback={\n <div\n className=\"size-full animate-pulse rounded-md bg-muted\"\n data-slot=\"chart-loading\"\n />\n }\n >\n <RechartsRenderer\n model={model}\n ariaLabel={ariaLabel}\n height={height}\n otherLabel={l.other}\n />\n </Suspense>\n </div>\n )}\n <figcaption className=\"flex flex-wrap items-center justify-between gap-2\">\n <Legend model={model} other={l.other} />\n <button\n type=\"button\"\n className=\"ml-auto rounded-sm text-xs text-muted-foreground underline-offset-2 hover:text-foreground hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring print:hidden\"\n aria-controls={view === 'table' ? tableId : undefined}\n aria-pressed={view === 'table'}\n onClick={() => setView(view === 'table' ? 'chart' : 'table')}\n >\n {view === 'table' ? l.showChart : l.showTable}\n </button>\n </figcaption>\n </figure>\n )\n}\n","/**\n * `PanelView`: one dashboard panel as it looks, from data already in hand: a metric tile, a chart\n * or a table, each with its loading, empty and error state. Presentational: `DashboardPanel` reads\n * the data and renders this.\n */\nimport type { ReactNode } from 'react'\nimport { AlertTriangle, ChartNoAxesColumn } from 'lucide-react'\nimport type { DatasetField, DatasetRow, DatasetValue } from '@arbidocs/react'\nimport { Card, cn } from '@arbidocs/react/ui'\nimport { DataTable, type Column } from '../components/DataTable'\nimport { MetricCard } from '../components/MetricCard'\nimport { fmtDate } from '../lib/format'\nimport { ChartRenderer, ChartTable, type ChartRendererLabels } from './ChartRenderer'\nimport { formatterOf, type ChartModel, type UnitFormatters } from './chartModel'\n\nexport type PanelState = 'loading' | 'empty' | 'error' | 'ready'\n\nexport interface PanelViewLabels extends ChartRendererLabels {\n empty: string\n error: string\n /** Under a table cut short: \"Showing 50 of 1,200 rows\". */\n showingRows: (shown: number, total: number) => string\n yes: string\n no: string\n}\n\nexport const DEFAULT_PANEL_VIEW_LABELS: PanelViewLabels = {\n showTable: 'Show table',\n showChart: 'Show chart',\n other: 'Other',\n empty: 'Nothing to show yet.',\n error: 'This panel could not be loaded.',\n showingRows: (shown, total) =>\n `Showing ${shown.toLocaleString('en-GB')} of ${total.toLocaleString('en-GB')} rows`,\n yes: 'Yes',\n no: 'No',\n}\n\n/** What a panel shows when ready. */\nexport type PanelBody =\n | { kind: 'metric'; value: number | null; format: (value: number) => string }\n | { kind: 'chart'; model: ChartModel }\n /** A table of groups (a chart model shown as a table). */\n | { kind: 'groups'; model: ChartModel }\n /** A table of records. */\n | { kind: 'records'; fields: readonly DatasetField[]; rows: readonly DatasetRow[] }\n\nexport interface PanelViewProps {\n /** What the panel is (it shows as one before its data is in). */\n kind: 'metric' | 'chart' | 'table'\n title: string\n description?: string\n state: PanelState\n body?: PanelBody\n /** The error's own words, shown under the panel's. */\n errorDetail?: string\n /** Shown in the empty state (a link to where data comes from). */\n emptyAction?: ReactNode\n /** Buttons in the panel's corner (edit, remove), for a dashboard being edited. */\n actions?: ReactNode\n /** A metric's tile, with the theme accent token of its icon. */\n metricAccent?: string\n /** `card` (default): a card with the title; `plain`: no card (a chart placed in a page). */\n variant?: 'card' | 'plain'\n /** Most records a table shows. Default 50. */\n maxRows?: number\n formatters?: UnitFormatters\n labels?: Partial<PanelViewLabels>\n className?: string\n testId?: string\n}\n\nfunction cellText(\n value: DatasetValue | undefined,\n field: DatasetField,\n l: PanelViewLabels,\n formatters?: UnitFormatters\n): string {\n if (value === null || value === undefined || value === '') return '–'\n if (Array.isArray(value)) return value.join(', ')\n if (typeof value === 'boolean') return value ? l.yes : l.no\n if (field.type === 'number' && typeof value === 'number')\n return formatterOf(field, formatters)(value)\n if (field.type === 'date' && typeof value === 'string') return fmtDate(value)\n return String(value)\n}\n\nfunction RecordsTable({\n fields,\n rows,\n maxRows,\n l,\n formatters,\n testId,\n}: {\n fields: readonly DatasetField[]\n rows: readonly DatasetRow[]\n maxRows: number\n l: PanelViewLabels\n formatters?: UnitFormatters\n testId?: string\n}) {\n const shown = rows.slice(0, maxRows).map((row, i) => ({ row, i }))\n const columns: Column<{ row: DatasetRow; i: number }>[] = fields.map((field) => ({\n key: field.id,\n header: field.label,\n align: field.type === 'number' ? 'right' : 'left',\n render: ({ row }) => cellText(row[field.id], field, l, formatters),\n className: field.type === 'number' ? 'tabular-nums' : undefined,\n }))\n return (\n <div className=\"space-y-1\">\n <div className=\"max-h-80 overflow-auto\">\n <DataTable\n columns={columns}\n rows={shown}\n getRowId={({ i }) => String(i)}\n area={testId ?? 'dashboard-panel'}\n emptyTitle={l.empty}\n className=\"border-0\"\n />\n </div>\n {rows.length > maxRows && (\n <p className=\"text-xs text-muted-foreground\">{l.showingRows(maxRows, rows.length)}</p>\n )}\n </div>\n )\n}\n\nfunction Message({\n tone,\n text,\n detail,\n action,\n testId,\n}: {\n tone: 'empty' | 'error'\n text: string\n detail?: string\n action?: ReactNode\n testId?: string\n}) {\n const Icon = tone === 'error' ? AlertTriangle : ChartNoAxesColumn\n return (\n <div\n className=\"flex min-h-40 flex-col items-center justify-center gap-2 py-6 text-center\"\n role={tone === 'error' ? 'alert' : undefined}\n data-testid={testId}\n >\n <Icon\n className={cn('size-6', tone === 'error' ? 'text-destructive' : 'text-muted-foreground/50')}\n />\n <p className={cn('text-sm', tone === 'error' ? 'text-destructive' : 'text-muted-foreground')}>\n {text}\n </p>\n {detail && <p className=\"max-w-sm text-xs text-muted-foreground\">{detail}</p>}\n {action}\n </div>\n )\n}\n\nexport function PanelView({\n kind,\n title,\n description,\n state,\n body,\n errorDetail,\n emptyAction,\n actions,\n metricAccent,\n variant = 'card',\n maxRows = 50,\n formatters,\n labels,\n className,\n testId,\n}: PanelViewProps) {\n const l = { ...DEFAULT_PANEL_VIEW_LABELS, ...labels }\n\n // A metric is the KPI tile itself.\n if (kind === 'metric') {\n const metric = body?.kind === 'metric' ? body : undefined\n const hint =\n state === 'error' ? (\n <span className=\"text-destructive\">\n {l.error}\n {errorDetail && ` ${errorDetail}`}\n </span>\n ) : state === 'empty' ? (\n l.empty\n ) : (\n description\n )\n return (\n <div className={cn('relative h-full', className)} data-slot=\"dashboard-panel\">\n <MetricCard\n label={title}\n value={\n metric && metric.value !== null && state === 'ready' ? metric.format(metric.value) : '—'\n }\n hint={hint}\n isLoading={state === 'loading'}\n accent={metricAccent}\n // The edit buttons sit in the corner: the label starts below them.\n className={cn('h-full', actions && 'pt-11')}\n testId={testId}\n />\n {actions && <div className=\"absolute right-2 top-2 flex gap-1\">{actions}</div>}\n </div>\n )\n }\n\n let content: ReactNode\n if (state === 'loading') {\n content = (\n <div className=\"h-60 animate-pulse rounded-md bg-muted\" data-slot=\"panel-loading\" aria-busy />\n )\n } else if (state === 'error') {\n content = (\n <Message\n tone=\"error\"\n text={l.error}\n detail={errorDetail}\n testId={testId && `${testId}-error`}\n />\n )\n } else if (state === 'empty' || !body || body.kind === 'metric') {\n content = (\n <Message\n tone=\"empty\"\n text={l.empty}\n action={emptyAction}\n testId={testId && `${testId}-empty`}\n />\n )\n } else if (body.kind === 'chart') {\n content = (\n <ChartRenderer\n model={body.model}\n ariaLabel={title}\n labels={l}\n testId={testId && `${testId}-chart`}\n />\n )\n } else if (body.kind === 'groups') {\n content = <ChartTable model={body.model} caption={title} />\n } else {\n content = (\n <RecordsTable\n fields={body.fields}\n rows={body.rows}\n maxRows={maxRows}\n l={l}\n formatters={formatters}\n testId={testId}\n />\n )\n }\n\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate text-sm font-semibold text-foreground\">{title}</h3>\n {description && <p className=\"mt-0.5 text-xs text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 gap-1\">{actions}</div>}\n </div>\n )\n if (variant === 'plain') {\n return (\n <section\n className={cn('flex min-w-0 flex-col gap-3', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0\">{content}</div>\n </section>\n )\n }\n return (\n <Card\n variant=\"elevated\"\n className={cn('flex h-full min-w-0 flex-col gap-3 rounded-xl p-5', className)}\n data-slot=\"dashboard-panel\"\n data-testid={testId}\n aria-busy={state === 'loading' || undefined}\n >\n {header}\n <div className=\"min-w-0 flex-1\">{content}</div>\n </Card>\n )\n}\n","/**\n * How storage kinds read to people. A document's objects come as `document` (its current file), `version`\n * (earlier versions' files) and `derived` (previews, thumbnails, search index files), plus `coedit` (live\n * editing state); everything a person stores outside a project's workspaces is billed to their personal project.\n */\n\nimport { formatFileSize } from '@arbidocs/sdk/browser'\nimport type { StorageItem, StorageKindUsage } from '@arbidocs/react'\n\nexport const KIND_LABELS: Record<string, string> = {\n document: 'Documents',\n version: 'Earlier versions',\n derived: 'Previews & processing',\n coedit: 'Editing state',\n mail: 'Mail',\n mail_draft: 'Mail drafts',\n chat_attachment: 'Chat attachments',\n recording: 'Call recordings',\n other: 'Other',\n}\n\n/** One item's kind, singular (\"Document\", \"Email\", …). */\nexport const ITEM_LABELS: Record<string, string> = {\n document: 'Document',\n mail: 'Email',\n mail_draft: 'Mail draft',\n chat_attachment: 'Chat attachment',\n recording: 'Call recording',\n other: 'Other file',\n}\n\nexport const MAIL_FOLDER_LABELS: Record<string, string> = {\n inbox: 'Inbox',\n sent: 'Sent',\n outbox: 'Outbox',\n drafts: 'Drafts',\n archive: 'Archive',\n trash: 'Trash',\n}\n\nexport const formatBytes = (bytes: number | null | undefined) => formatFileSize(bytes ?? 0)\n\n/** \"1.2 GB of 5.0 GB\" — or just the used part when there is no limit. */\nexport function usedOfLimit(bytes: number, limit: number | null | undefined): string {\n return limit ? `${formatBytes(bytes)} of ${formatBytes(limit)}` : `${formatBytes(bytes)} used`\n}\n\nexport function usedPct(bytes: number, limit: number | null | undefined): number {\n return limit ? (bytes / limit) * 100 : 0\n}\n\nexport interface KindRow {\n kind: string\n label: string\n bytes: number\n trashBytes: number\n}\n\n/** A project's kinds, largest first, each labelled. */\nexport function kindRows(kinds: StorageKindUsage[]): KindRow[] {\n return [...kinds]\n .filter((k) => k.bytes > 0)\n .sort((a, b) => b.bytes - a.bytes)\n .map((k) => ({\n kind: k.kind,\n label: KIND_LABELS[k.kind] ?? k.kind,\n bytes: k.bytes,\n trashBytes: k.trash_bytes,\n }))\n}\n\n/** Deletion keeps things in Recently deleted (in archive storage, counted at 10%) until the monthly purge. */\nexport const RECENTLY_DELETED_NOTE =\n 'Deleted items stay in Recently deleted, counted at 10% of their size, until they are removed for good 30–60 days later.'\n\n/** \"Archived and Recently deleted count at 10% of their size.\" — the server's reduced rate. */\nexport function reducedRateNote(rate: number): string {\n return `Archived workspaces and Recently deleted count at ${Math.round(rate * 100)}% of their size.`\n}\n\nexport interface StorageItemRow {\n item: StorageItem\n /** A document's decrypted name (when its workspace's key is available), else undefined. */\n name?: string\n}\n\n/** What an item is called: its name when known, else what it is and where. */\nexport function itemTitle({ item, name }: StorageItemRow): string {\n if (name) return name\n if (item.kind === 'mail') {\n return `Email in ${MAIL_FOLDER_LABELS[item.folder ?? ''] ?? item.folder ?? 'Mail'}`\n }\n return ITEM_LABELS[item.kind] ?? item.kind\n}\n","/**\n * `DashboardPanel`: one panel of a dashboard, from its `PanelSpec`. It looks its source up in the\n * host's registry (`useDataSources`), reads the dataset the spec asks for (`usePanelDataset`:\n * grouped and measured by the source) and shows it through `PanelView`.\n */\nimport { useMemo, type ReactNode } from 'react'\nimport {\n formatGbp,\n useArbiSessionState,\n useDataSources,\n usePanelDataset,\n type DataSource,\n type PanelSpec,\n} from '@arbidocs/react'\nimport { Button } from '@arbidocs/react/ui'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { formatBytes } from '../storage/storage-labels'\nimport {\n chartModelOf,\n DEFAULT_UNIT_FORMATTERS,\n formatterOf,\n metricValueOf,\n type DrawnChartType,\n type UnitFormatters,\n} from '../../dashboards/chartModel'\nimport { PanelView, type PanelBody, type PanelViewLabels } from '../../dashboards/PanelView'\n\n/** The package's formatters: the one £ formatter for AI usage, and file sizes. */\nexport const PANEL_FORMATTERS: UnitFormatters = {\n ...DEFAULT_UNIT_FORMATTERS,\n gbp: (v) => formatGbp(v),\n bytes: (v) => formatBytes(v),\n}\n\nexport interface DashboardPanelLabels extends PanelViewLabels {\n /** A panel whose source the host does not offer. */\n unknownSource: (id: string) => string\n /** The empty state's link to the databases (where data is created or imported). */\n openDatabases: string\n /** A panel over workspace data (documents, threads…) while no workspace is open. */\n noWorkspace: string\n}\n\nexport const DEFAULT_DASHBOARD_PANEL_LABELS: Partial<DashboardPanelLabels> = {\n unknownSource: (id) => `This panel reads “${id}”, which is not available here.`,\n openDatabases: 'Open databases',\n noWorkspace: 'Open a workspace to see this.',\n}\n\nexport interface DashboardPanelProps {\n panel: PanelSpec\n /** Buttons in the panel's corner (a dashboard being edited). */\n actions?: ReactNode\n /** Don't read data (an editor showing the panel's frame only). */\n enabled?: boolean\n /** `plain`: no card around it (a chart placed in a page). */\n variant?: 'card' | 'plain'\n formatters?: UnitFormatters\n labels?: Partial<DashboardPanelLabels>\n className?: string\n testId?: string\n}\n\nconst DRAWN = new Set(['bar', 'line', 'area', 'pie', 'donut'])\n\nfunction kindOf(panel: PanelSpec): 'metric' | 'chart' | 'table' {\n return panel.chart.type === 'metric' ? 'metric' : panel.chart.type === 'table' ? 'table' : 'chart'\n}\n\nfunction SourcePanel({\n source,\n panel,\n actions,\n enabled,\n variant,\n formatters,\n labels,\n className,\n testId,\n}: DashboardPanelProps & { source: DataSource; labels: Partial<DashboardPanelLabels> }) {\n const environment = useBlocksEnvironment()\n const { chart } = panel\n const { dataset, fields, isLoading, error } = usePanelDataset(\n source,\n panel.source.params,\n chart,\n { enabled }\n )\n const body = useMemo((): PanelBody | undefined => {\n if (!dataset) return undefined\n const other = labels.other\n if (chart.type === 'metric') {\n const valueField = dataset.fields.find((f) => f.id === 'value')\n // Nothing matched: a count or a sum of nothing is 0; an average of nothing has no value.\n const op = chart.aggregate ?? 'count'\n return {\n kind: 'metric',\n value: metricValueOf(dataset) ?? (op === 'count' || op === 'sum' ? 0 : null),\n format: formatterOf(valueField, formatters),\n }\n }\n if (DRAWN.has(chart.type)) {\n return {\n kind: 'chart',\n model: chartModelOf({ ...chart, type: chart.type as DrawnChartType }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n if (chart.x) {\n return {\n kind: 'groups',\n model: chartModelOf({ ...chart, type: 'bar' }, dataset, {\n fields,\n formatters,\n otherLabel: other,\n }),\n }\n }\n const shown = chart.columns?.length\n ? chart.columns.flatMap((id) => dataset.fields.filter((f) => f.id === id))\n : dataset.fields\n return { kind: 'records', fields: shown, rows: dataset.rows }\n }, [dataset, chart, fields, formatters, labels.other])\n\n const state = error\n ? 'error'\n : !dataset\n ? isLoading\n ? 'loading'\n : 'empty'\n : chart.type !== 'metric' && dataset.rows.length === 0\n ? 'empty'\n : 'ready'\n\n const emptyAction =\n source.id === 'database' && environment.openDatabases ? (\n <Button variant=\"outline\" size=\"sm\" onClick={() => environment.openDatabases?.()}>\n {labels.openDatabases}\n </Button>\n ) : undefined\n\n return (\n <PanelView\n kind={kindOf(panel)}\n title={panel.title}\n description={panel.description}\n state={state}\n body={body}\n errorDetail={error instanceof Error ? error.message : undefined}\n emptyAction={emptyAction}\n actions={actions}\n variant={variant}\n formatters={formatters}\n labels={labels}\n className={className}\n testId={testId}\n />\n )\n}\n\nexport function DashboardPanel({\n formatters = PANEL_FORMATTERS,\n labels,\n ...props\n}: DashboardPanelProps) {\n const registry = useDataSources()\n const l = { ...DEFAULT_DASHBOARD_PANEL_LABELS, ...labels }\n const source = registry.get(props.panel.source.id)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const scope =\n typeof source?.scope === 'function'\n ? source.scope(props.panel.source.params ?? {})\n : source?.scope\n if (scope === 'workspace' && !workspaceId) {\n return (\n <PanelView\n kind={kindOf(props.panel)}\n title={props.panel.title}\n state=\"empty\"\n actions={props.actions}\n labels={{ ...l, empty: l.noWorkspace ?? l.empty }}\n variant={props.variant}\n className={props.className}\n testId={props.testId}\n />\n )\n }\n if (!source) {\n return (\n <PanelView\n kind={kindOf(props.panel)}\n title={props.panel.title}\n state=\"error\"\n errorDetail={l.unknownSource?.(props.panel.source.id)}\n actions={props.actions}\n labels={l}\n className={props.className}\n testId={props.testId}\n />\n )\n }\n // Keyed by source: a source's hooks differ from another's, so a new source mounts afresh.\n return (\n <SourcePanel key={source.id} source={source} formatters={formatters} labels={l} {...props} />\n )\n}\n"]}
@@ -2,16 +2,16 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkOAIOOVFN_cjs = require('./chunk-OAIOOVFN.cjs');
5
- var chunkXW524KUX_cjs = require('./chunk-XW524KUX.cjs');
6
- var chunkLTEXVRCH_cjs = require('./chunk-LTEXVRCH.cjs');
7
- var chunkT7J352JD_cjs = require('./chunk-T7J352JD.cjs');
8
- var chunkLQHXUSWZ_cjs = require('./chunk-LQHXUSWZ.cjs');
9
- var chunk6YOZKXV6_cjs = require('./chunk-6YOZKXV6.cjs');
5
+ var chunkVJCSEMXT_cjs = require('./chunk-VJCSEMXT.cjs');
6
+ var chunkSBWIA4PL_cjs = require('./chunk-SBWIA4PL.cjs');
7
+ var chunkQMIHLJMH_cjs = require('./chunk-QMIHLJMH.cjs');
8
+ var chunkHQDR43JC_cjs = require('./chunk-HQDR43JC.cjs');
9
+ var chunkJR2YSBD5_cjs = require('./chunk-JR2YSBD5.cjs');
10
+ var chunkZBP4ZSAJ_cjs = require('./chunk-ZBP4ZSAJ.cjs');
10
11
  var chunkMOIZ2R5X_cjs = require('./chunk-MOIZ2R5X.cjs');
11
12
  var chunkZW6FPIFC_cjs = require('./chunk-ZW6FPIFC.cjs');
12
13
  var chunkZT5MIFLC_cjs = require('./chunk-ZT5MIFLC.cjs');
13
- var chunkZBP4ZSAJ_cjs = require('./chunk-ZBP4ZSAJ.cjs');
14
- var chunkU5T46QCS_cjs = require('./chunk-U5T46QCS.cjs');
14
+ var chunkTKHCIHE2_cjs = require('./chunk-TKHCIHE2.cjs');
15
15
  var react = require('@arbidocs/react');
16
16
  var react$1 = require('react');
17
17
  var lucideReact = require('lucide-react');
@@ -222,7 +222,7 @@ function CandidateRow({
222
222
  ] });
223
223
  }
224
224
  function InviteLinks({ callExtId }) {
225
- const { notify } = chunkU5T46QCS_cjs.useBlocksEnvironment();
225
+ const { notify } = chunkTKHCIHE2_cjs.useBlocksEnvironment();
226
226
  const revokeLink = react.useRevokeCallInviteLink(callExtId);
227
227
  const { data: invites = [] } = react.useCallInviteLinks(callExtId);
228
228
  const live = invites.filter((i) => !i.revoked_at);
@@ -270,9 +270,9 @@ function CallPeoplePicker({
270
270
  callExtId,
271
271
  onSubmit
272
272
  }) {
273
- const { notify } = chunkU5T46QCS_cjs.useBlocksEnvironment();
273
+ const { notify } = chunkTKHCIHE2_cjs.useBlocksEnvironment();
274
274
  const createContact = react.useCreateContact();
275
- const { userId: me, workspaceId: selectedWorkspaceId } = chunk6YOZKXV6_cjs.useConnectedWorkspace();
275
+ const { userId: me, workspaceId: selectedWorkspaceId } = chunkJR2YSBD5_cjs.useConnectedWorkspace();
276
276
  const { data: workspaces = [] } = react.useWorkspaces({ enabled: scope !== "chat" });
277
277
  const [picked, setPicked] = react$1.useState(() => new Set(preselected));
278
278
  const [query, setQuery] = react$1.useState("");
@@ -486,8 +486,8 @@ function ThreadCallButton({
486
486
  conversationId
487
487
  }) {
488
488
  const arbi = react.useArbi();
489
- const { data: conversations } = chunkLQHXUSWZ_cjs.useConnectedConversations();
490
- const { workspaceId: workspaceExtId } = chunk6YOZKXV6_cjs.useConnectedWorkspace();
489
+ const { data: conversations } = chunkHQDR43JC_cjs.useConnectedConversations();
490
+ const { workspaceId: workspaceExtId } = chunkJR2YSBD5_cjs.useConnectedWorkspace();
491
491
  const liveCallId = react.useCallSession((s) => react.threadLiveCallId(s, conversationId));
492
492
  const isLive = liveCallId !== null;
493
493
  const canHost = react.useCanHostCalls();
@@ -530,7 +530,7 @@ function GroupCallButton({
530
530
  members
531
531
  }) {
532
532
  const arbi = react.useArbi();
533
- const { userId: me } = chunk6YOZKXV6_cjs.useConnectedWorkspace();
533
+ const { userId: me } = chunkJR2YSBD5_cjs.useConnectedWorkspace();
534
534
  const liveCallId = react.useCallSession((s) => react.chatLiveCallId(s, chatExtId));
535
535
  const isLive = liveCallId !== null;
536
536
  const canHost = react.useCanHostCalls();
@@ -607,7 +607,7 @@ function EnabledNewCallChip() {
607
607
  scope: "contacts",
608
608
  onSubmit: async ({ ring, invites }) => {
609
609
  await react.startContactsCall(arbi, {
610
- title: chunkT7J352JD_cjs.contactsCallTitle([
610
+ title: chunkQMIHLJMH_cjs.contactsCallTitle([
611
611
  ...ring.map((u) => ui.getUserDisplayName(u)),
612
612
  ...invites.map((g) => g.name)
613
613
  ]),
@@ -628,8 +628,8 @@ function ScheduleCallButton({
628
628
  const callsEnabled = react.useCanHostCalls();
629
629
  const { conversations } = react.useConversationItems();
630
630
  const { data: workspaces = [] } = react.useWorkspaces();
631
- const { workspaceId: selectedWorkspaceId, userId: me } = chunk6YOZKXV6_cjs.useConnectedWorkspace();
632
- const { openCalendar } = chunkU5T46QCS_cjs.useBlocksEnvironment();
631
+ const { workspaceId: selectedWorkspaceId, userId: me } = chunkJR2YSBD5_cjs.useConnectedWorkspace();
632
+ const { openCalendar } = chunkTKHCIHE2_cjs.useBlocksEnvironment();
633
633
  if (!callsEnabled) return null;
634
634
  const open = () => {
635
635
  const conversation = conversationId ? conversations?.find((c) => c.external_id === conversationId) : void 0;
@@ -639,7 +639,7 @@ function ScheduleCallButton({
639
639
  const workspace = workspaces.find((w) => w.external_id === selectedWorkspaceId);
640
640
  people = (workspace?.users ?? []).map((wu) => wu.user);
641
641
  }
642
- chunkU5T46QCS_cjs.requestCalendarComposer({
642
+ chunkTKHCIHE2_cjs.requestCalendarComposer({
643
643
  title: peer ? `Call with ${ui.getUserDisplayName(peer) || peer.email}` : conversation?.title ?? "",
644
644
  conversationId: conversationId ?? null,
645
645
  attendees: people.filter((u) => !ui.isAgent(u) && u.external_id !== me).map((u) => ({
@@ -697,7 +697,7 @@ function MeetingThreadTranscriptAction({
697
697
  );
698
698
  if (!meetingCallExtId || !call?.is_creator) return null;
699
699
  return /* @__PURE__ */ jsxRuntime.jsx(
700
- chunkLTEXVRCH_cjs.SaveTranscriptToThread,
700
+ chunkSBWIA4PL_cjs.SaveTranscriptToThread,
701
701
  {
702
702
  title,
703
703
  lines,
@@ -717,7 +717,7 @@ function MeetingThreadRecordingsAction({
717
717
  }, [pending]);
718
718
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
719
719
  /* @__PURE__ */ jsxRuntime.jsx(
720
- chunkT7J352JD_cjs.HeaderAction,
720
+ chunkQMIHLJMH_cjs.HeaderAction,
721
721
  {
722
722
  label: "Recordings",
723
723
  icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Disc, { className: "size-3.5", "aria-hidden": true }),
@@ -732,7 +732,7 @@ function MeetingThreadRecordingsAction({
732
732
  /* @__PURE__ */ jsxRuntime.jsx(ui.DialogDescription, { children: "Recordings of this meeting, encrypted under the workspace key. Playing or downloading one decrypts it in this browser." })
733
733
  ] }),
734
734
  /* @__PURE__ */ jsxRuntime.jsx(
735
- chunkLTEXVRCH_cjs.RecordingsList,
735
+ chunkSBWIA4PL_cjs.RecordingsList,
736
736
  {
737
737
  callExtId: meetingCallExtId,
738
738
  title,
@@ -792,7 +792,7 @@ function ChatCallCard({
792
792
  const inThisCall = react.useCallSession((s) => s.active?.callExtId === callExtId);
793
793
  const inAnotherCall = react.useCallSession((s) => !!s.active && s.active.callExtId !== callExtId);
794
794
  const [busy, setBusy] = react$1.useState(false);
795
- const live = latest && chunkT7J352JD_cjs.isCallLive(call, liveNow);
795
+ const live = latest && chunkQMIHLJMH_cjs.isCallLive(call, liveNow);
796
796
  let summary;
797
797
  if (live) summary = senderName ? `${senderName} started a call` : "Call in progress";
798
798
  else if (latest && call?.started_at && call.ended_at) {
@@ -800,7 +800,7 @@ function ChatCallCard({
800
800
  const joined = (call.last_participants ?? []).map(name);
801
801
  summary = [
802
802
  "Call",
803
- chunkT7J352JD_cjs.formatCallDuration(seconds),
803
+ chunkQMIHLJMH_cjs.formatCallDuration(seconds),
804
804
  joined.length ? `joined ${joined.join(", ")}` : null
805
805
  ].filter(Boolean).join(" \xB7 ");
806
806
  } else summary = senderName ? `Call started by ${senderName}` : "Call";
@@ -880,7 +880,7 @@ function ProvisionalRow({ identity }) {
880
880
  {
881
881
  speakerId: identity,
882
882
  speakerName: name,
883
- speaker: /* @__PURE__ */ jsxRuntime.jsx(chunkT7J352JD_cjs.CallUserPill, { identity })
883
+ speaker: /* @__PURE__ */ jsxRuntime.jsx(chunkQMIHLJMH_cjs.CallUserPill, { identity })
884
884
  }
885
885
  );
886
886
  }
@@ -1007,7 +1007,7 @@ function ConnectedCallChatHistory({
1007
1007
  const transcriptEntry = (msg) => {
1008
1008
  const { parsed, speakerId } = transcriptSpeaker(msg);
1009
1009
  return /* @__PURE__ */ jsxRuntime.jsx(
1010
- chunkXW524KUX_cjs.TranscriptEntry,
1010
+ chunkVJCSEMXT_cjs.TranscriptEntry,
1011
1011
  {
1012
1012
  speakerId,
1013
1013
  speakerName: speakerId === myExtId ? "Me" : parsed?.speaker_name || (memberById(speakerId) ? senderName(speakerId) : senderName(msg.sender_ext_id)),
@@ -1047,11 +1047,11 @@ function ConnectedCallChatHistory({
1047
1047
  onChange: setView
1048
1048
  }
1049
1049
  ) }),
1050
- view === "recordings" && recordingsCallExtId && /* @__PURE__ */ jsxRuntime.jsx(chunkLTEXVRCH_cjs.RecordingsList, { callExtId: recordingsCallExtId, title: meetingTitle, className: "py-1" }),
1050
+ view === "recordings" && recordingsCallExtId && /* @__PURE__ */ jsxRuntime.jsx(chunkSBWIA4PL_cjs.RecordingsList, { callExtId: recordingsCallExtId, title: meetingTitle, className: "py-1" }),
1051
1051
  loadOlder,
1052
1052
  view === "transcript" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col py-1", "data-testid": "transcript-view", children: [
1053
1053
  isHost && /* @__PURE__ */ jsxRuntime.jsx(
1054
- chunkLTEXVRCH_cjs.SaveTranscriptToThread,
1054
+ chunkSBWIA4PL_cjs.SaveTranscriptToThread,
1055
1055
  {
1056
1056
  title: meetingTitle,
1057
1057
  lines: transcriptExport,
@@ -1079,7 +1079,7 @@ function ConnectedCallChatHistory({
1079
1079
  return /* @__PURE__ */ jsxRuntime.jsxs(react$1.Fragment, { children: [
1080
1080
  separator,
1081
1081
  /* @__PURE__ */ jsxRuntime.jsx(
1082
- chunkLTEXVRCH_cjs.RecordingCard,
1082
+ chunkSBWIA4PL_cjs.RecordingCard,
1083
1083
  {
1084
1084
  callExtId: msg.call_ext_id,
1085
1085
  recordingExtId: msg.recording_ext_id ?? null,
@@ -1131,5 +1131,5 @@ exports.matchesQuery = matchesQuery;
1131
1131
  exports.useCallPersonName = useCallPersonName;
1132
1132
  exports.useMeetingThreadMessages = useMeetingThreadMessages;
1133
1133
  exports.useProvisionalSpeakers = useProvisionalSpeakers;
1134
- //# sourceMappingURL=chunk-QVHP4R7T.cjs.map
1135
- //# sourceMappingURL=chunk-QVHP4R7T.cjs.map
1134
+ //# sourceMappingURL=chunk-V5IMYLYK.cjs.map
1135
+ //# sourceMappingURL=chunk-V5IMYLYK.cjs.map