@arbidocs/blocks 0.5.113 → 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 (167) hide show
  1. package/dist/{ConnectedCallDock-VCJ6Q7WE.cjs → ConnectedCallDock-2KXEQENS.cjs} +13 -13
  2. package/dist/{ConnectedCallDock-VCJ6Q7WE.cjs.map → ConnectedCallDock-2KXEQENS.cjs.map} +1 -1
  3. package/dist/{ConnectedCallRoom-BUI3ILJD.cjs → ConnectedCallRoom-MU3NPNXF.cjs} +12 -12
  4. package/dist/{ConnectedCallRoom-BUI3ILJD.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-JO2H4QIP.cjs → ConnectedNativeDocxComparison-VH3I65H6.cjs} +16 -16
  8. package/dist/{ConnectedNativeDocxComparison-JO2H4QIP.cjs.map → ConnectedNativeDocxComparison-VH3I65H6.cjs.map} +1 -1
  9. package/dist/{ConnectedProductionSetDialog-BSPM4NQC.cjs → ConnectedProductionSetDialog-4EAY6KAZ.cjs} +8 -8
  10. package/dist/{ConnectedProductionSetDialog-BSPM4NQC.cjs.map → ConnectedProductionSetDialog-4EAY6KAZ.cjs.map} +1 -1
  11. package/dist/{ConnectedStreamedWordArtifact-DMQEJFCA.cjs → ConnectedStreamedWordArtifact-KQSHCA75.cjs} +16 -16
  12. package/dist/{ConnectedStreamedWordArtifact-DMQEJFCA.cjs.map → ConnectedStreamedWordArtifact-KQSHCA75.cjs.map} +1 -1
  13. package/dist/{DocumentReviewCard-UBE2DVAC.cjs → DocumentReviewCard-OCPFVMLD.cjs} +20 -20
  14. package/dist/{DocumentReviewCard-UBE2DVAC.cjs.map → DocumentReviewCard-OCPFVMLD.cjs.map} +1 -1
  15. package/dist/{FilesViewerDialog-EBYRA3ZZ.cjs → FilesViewerDialog-BAGOEMXW.cjs} +38 -38
  16. package/dist/{FilesViewerDialog-EBYRA3ZZ.cjs.map → FilesViewerDialog-BAGOEMXW.cjs.map} +1 -1
  17. package/dist/{WorkspaceTableView-BO2OJO7A.cjs → WorkspaceTableView-IMAZICIZ.cjs} +3 -3
  18. package/dist/{WorkspaceTableView-BO2OJO7A.cjs.map → WorkspaceTableView-IMAZICIZ.cjs.map} +1 -1
  19. package/dist/agents/index.cjs +202 -202
  20. package/dist/{ai-EMNMGDAN.cjs → ai-7U4B4CVF.cjs} +22 -22
  21. package/dist/ai-7U4B4CVF.cjs.map +1 -0
  22. package/dist/calls/index.cjs +51 -51
  23. package/dist/chat/index.cjs +29 -29
  24. package/dist/{chunk-GVTKFVXH.cjs → chunk-2W5E62EY.cjs} +6 -6
  25. package/dist/{chunk-GVTKFVXH.cjs.map → chunk-2W5E62EY.cjs.map} +1 -1
  26. package/dist/{chunk-ZZZ6AZDR.cjs → chunk-3ODEWSRO.cjs} +4 -4
  27. package/dist/{chunk-ZZZ6AZDR.cjs.map → chunk-3ODEWSRO.cjs.map} +1 -1
  28. package/dist/{chunk-LCNKKSN3.cjs → chunk-3R6YHJ3G.cjs} +4 -4
  29. package/dist/{chunk-LCNKKSN3.cjs.map → chunk-3R6YHJ3G.cjs.map} +1 -1
  30. package/dist/{chunk-DZWIVRYP.cjs → chunk-3U36VYMD.cjs} +21 -21
  31. package/dist/{chunk-DZWIVRYP.cjs.map → chunk-3U36VYMD.cjs.map} +1 -1
  32. package/dist/{chunk-DMNX556N.cjs → chunk-436I7PQL.cjs} +8 -8
  33. package/dist/{chunk-DMNX556N.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-MJHIBCF7.cjs → chunk-4NPCDS2X.cjs} +4 -4
  37. package/dist/{chunk-MJHIBCF7.cjs.map → chunk-4NPCDS2X.cjs.map} +1 -1
  38. package/dist/{chunk-ONZOVO2B.cjs → chunk-57EE6CMW.cjs} +15 -15
  39. package/dist/{chunk-ONZOVO2B.cjs.map → chunk-57EE6CMW.cjs.map} +1 -1
  40. package/dist/{chunk-Y45VRNSZ.cjs → chunk-57NHXEU2.cjs} +4 -4
  41. package/dist/{chunk-Y45VRNSZ.cjs.map → chunk-57NHXEU2.cjs.map} +1 -1
  42. package/dist/{chunk-OVKJ7OVZ.cjs → chunk-5QUL5BZO.cjs} +5 -5
  43. package/dist/{chunk-OVKJ7OVZ.cjs.map → chunk-5QUL5BZO.cjs.map} +1 -1
  44. package/dist/{chunk-MUA5PJGX.cjs → chunk-5SKHK3BG.cjs} +4 -4
  45. package/dist/{chunk-MUA5PJGX.cjs.map → chunk-5SKHK3BG.cjs.map} +1 -1
  46. package/dist/{chunk-AFXDLDPU.cjs → chunk-5UYFLFNR.cjs} +4 -4
  47. package/dist/{chunk-AFXDLDPU.cjs.map → chunk-5UYFLFNR.cjs.map} +1 -1
  48. package/dist/{chunk-R4TP3VS3.cjs → chunk-6DCIZA3X.cjs} +55 -55
  49. package/dist/{chunk-R4TP3VS3.cjs.map → chunk-6DCIZA3X.cjs.map} +1 -1
  50. package/dist/{chunk-KGGSBJMU.cjs → chunk-7TEUGFIL.cjs} +4 -4
  51. package/dist/{chunk-KGGSBJMU.cjs.map → chunk-7TEUGFIL.cjs.map} +1 -1
  52. package/dist/{chunk-A4Z5CTLF.cjs → chunk-7X3FS5HQ.cjs} +39 -39
  53. package/dist/{chunk-A4Z5CTLF.cjs.map → chunk-7X3FS5HQ.cjs.map} +1 -1
  54. package/dist/{chunk-GGBNUDLK.cjs → chunk-7XT5B2DZ.cjs} +25 -25
  55. package/dist/{chunk-GGBNUDLK.cjs.map → chunk-7XT5B2DZ.cjs.map} +1 -1
  56. package/dist/{chunk-AJVZYRAJ.cjs → chunk-AHT6DQNI.cjs} +59 -59
  57. package/dist/{chunk-AJVZYRAJ.cjs.map → chunk-AHT6DQNI.cjs.map} +1 -1
  58. package/dist/{chunk-MY7Q3QE2.cjs → chunk-BW5MF464.cjs} +4 -4
  59. package/dist/{chunk-MY7Q3QE2.cjs.map → chunk-BW5MF464.cjs.map} +1 -1
  60. package/dist/{chunk-NP4EWPIP.cjs → chunk-CJYWHUZR.cjs} +6 -6
  61. package/dist/{chunk-NP4EWPIP.cjs.map → chunk-CJYWHUZR.cjs.map} +1 -1
  62. package/dist/{chunk-6W4X4EFI.cjs → chunk-CMGNRMPA.cjs} +5 -5
  63. package/dist/{chunk-6W4X4EFI.cjs.map → chunk-CMGNRMPA.cjs.map} +1 -1
  64. package/dist/{chunk-Z3VNKPPH.cjs → chunk-E3Y7RI3J.cjs} +4 -4
  65. package/dist/{chunk-Z3VNKPPH.cjs.map → chunk-E3Y7RI3J.cjs.map} +1 -1
  66. package/dist/{chunk-WT7CCCIN.cjs → chunk-GNX3FBBX.cjs} +4 -4
  67. package/dist/{chunk-WT7CCCIN.cjs.map → chunk-GNX3FBBX.cjs.map} +1 -1
  68. package/dist/{chunk-KZKGZ7IG.cjs → chunk-GQXPNIRE.cjs} +14 -14
  69. package/dist/{chunk-KZKGZ7IG.cjs.map → chunk-GQXPNIRE.cjs.map} +1 -1
  70. package/dist/{chunk-IIWJQEBC.cjs → chunk-H7PHOTX2.cjs} +10 -10
  71. package/dist/{chunk-IIWJQEBC.cjs.map → chunk-H7PHOTX2.cjs.map} +1 -1
  72. package/dist/{chunk-LQHXUSWZ.cjs → chunk-HQDR43JC.cjs} +6 -6
  73. package/dist/{chunk-LQHXUSWZ.cjs.map → chunk-HQDR43JC.cjs.map} +1 -1
  74. package/dist/{chunk-6LQN4BMX.cjs → chunk-IDCD5TEZ.cjs} +5 -5
  75. package/dist/{chunk-6LQN4BMX.cjs.map → chunk-IDCD5TEZ.cjs.map} +1 -1
  76. package/dist/{chunk-6YOZKXV6.cjs → chunk-JR2YSBD5.cjs} +4 -4
  77. package/dist/{chunk-6YOZKXV6.cjs.map → chunk-JR2YSBD5.cjs.map} +1 -1
  78. package/dist/{chunk-OTG5T5Z5.cjs → chunk-JSQQV23D.cjs} +4 -4
  79. package/dist/{chunk-OTG5T5Z5.cjs.map → chunk-JSQQV23D.cjs.map} +1 -1
  80. package/dist/{chunk-ZFKWCGA5.cjs → chunk-JV5TVUOU.cjs} +4 -4
  81. package/dist/{chunk-ZFKWCGA5.cjs.map → chunk-JV5TVUOU.cjs.map} +1 -1
  82. package/dist/{chunk-BHTEKYWJ.cjs → chunk-LFRNBT2I.cjs} +21 -21
  83. package/dist/{chunk-BHTEKYWJ.cjs.map → chunk-LFRNBT2I.cjs.map} +1 -1
  84. package/dist/{chunk-WJP6ICDM.cjs → chunk-LYTIQQQ2.cjs} +3 -3
  85. package/dist/{chunk-WJP6ICDM.cjs.map → chunk-LYTIQQQ2.cjs.map} +1 -1
  86. package/dist/{chunk-YONJRX6N.cjs → chunk-MC4F2URI.cjs} +28 -28
  87. package/dist/{chunk-YONJRX6N.cjs.map → chunk-MC4F2URI.cjs.map} +1 -1
  88. package/dist/{chunk-MQANCZOD.cjs → chunk-MGQSLMTC.cjs} +77 -77
  89. package/dist/{chunk-MQANCZOD.cjs.map → chunk-MGQSLMTC.cjs.map} +1 -1
  90. package/dist/{chunk-M2D4POJV.cjs → chunk-MZ2KZXNU.cjs} +8 -8
  91. package/dist/{chunk-M2D4POJV.cjs.map → chunk-MZ2KZXNU.cjs.map} +1 -1
  92. package/dist/{chunk-FGEBA3TL.cjs → chunk-NHHEMBXQ.cjs} +22 -22
  93. package/dist/{chunk-FGEBA3TL.cjs.map → chunk-NHHEMBXQ.cjs.map} +1 -1
  94. package/dist/{chunk-ENUZ35NR.cjs → chunk-P5AQYC4D.cjs} +4 -4
  95. package/dist/{chunk-ENUZ35NR.cjs.map → chunk-P5AQYC4D.cjs.map} +1 -1
  96. package/dist/{chunk-5I2VUNZR.cjs → chunk-PGJYD67F.cjs} +6 -6
  97. package/dist/{chunk-5I2VUNZR.cjs.map → chunk-PGJYD67F.cjs.map} +1 -1
  98. package/dist/{chunk-BYN7UMC5.cjs → chunk-PL7HUTM3.cjs} +8 -8
  99. package/dist/{chunk-BYN7UMC5.cjs.map → chunk-PL7HUTM3.cjs.map} +1 -1
  100. package/dist/{chunk-GTTDJMWX.cjs → chunk-Q6DQGGP4.cjs} +6 -6
  101. package/dist/{chunk-GTTDJMWX.cjs.map → chunk-Q6DQGGP4.cjs.map} +1 -1
  102. package/dist/{chunk-T7J352JD.cjs → chunk-QMIHLJMH.cjs} +6 -6
  103. package/dist/{chunk-T7J352JD.cjs.map → chunk-QMIHLJMH.cjs.map} +1 -1
  104. package/dist/{chunk-IE677C4I.cjs → chunk-SBWIA4PL.cjs} +21 -21
  105. package/dist/{chunk-IE677C4I.cjs.map → chunk-SBWIA4PL.cjs.map} +1 -1
  106. package/dist/{chunk-JDI7E4RI.cjs → chunk-TDN33HSK.cjs} +14 -14
  107. package/dist/{chunk-JDI7E4RI.cjs.map → chunk-TDN33HSK.cjs.map} +1 -1
  108. package/dist/{chunk-U5T46QCS.cjs → chunk-TKHCIHE2.cjs} +3 -3
  109. package/dist/chunk-TKHCIHE2.cjs.map +1 -0
  110. package/dist/{chunk-WIAWHETB.cjs → chunk-ULPTSXXO.cjs} +4 -4
  111. package/dist/{chunk-WIAWHETB.cjs.map → chunk-ULPTSXXO.cjs.map} +1 -1
  112. package/dist/{chunk-PIB7K7HI.cjs → chunk-UNDQYTRF.cjs} +7 -7
  113. package/dist/{chunk-PIB7K7HI.cjs.map → chunk-UNDQYTRF.cjs.map} +1 -1
  114. package/dist/{chunk-OKHKJ5ML.cjs → chunk-UUENH4BJ.cjs} +11 -11
  115. package/dist/{chunk-OKHKJ5ML.cjs.map → chunk-UUENH4BJ.cjs.map} +1 -1
  116. package/dist/{chunk-K5MYEWD5.cjs → chunk-UZHWXKS6.cjs} +7 -7
  117. package/dist/{chunk-K5MYEWD5.cjs.map → chunk-UZHWXKS6.cjs.map} +1 -1
  118. package/dist/{chunk-OZWYCRRK.cjs → chunk-V5IMYLYK.cjs} +29 -29
  119. package/dist/{chunk-OZWYCRRK.cjs.map → chunk-V5IMYLYK.cjs.map} +1 -1
  120. package/dist/{chunk-XW524KUX.cjs → chunk-VJCSEMXT.cjs} +4 -4
  121. package/dist/{chunk-XW524KUX.cjs.map → chunk-VJCSEMXT.cjs.map} +1 -1
  122. package/dist/{chunk-B5442TKX.cjs → chunk-VRK3IQAP.cjs} +4 -4
  123. package/dist/{chunk-B5442TKX.cjs.map → chunk-VRK3IQAP.cjs.map} +1 -1
  124. package/dist/{chunk-MYRKL3JO.cjs → chunk-VWTOIGX4.cjs} +4 -4
  125. package/dist/{chunk-MYRKL3JO.cjs.map → chunk-VWTOIGX4.cjs.map} +1 -1
  126. package/dist/{chunk-5VCID67B.cjs → chunk-WW6LXQY6.cjs} +10 -10
  127. package/dist/{chunk-5VCID67B.cjs.map → chunk-WW6LXQY6.cjs.map} +1 -1
  128. package/dist/{chunk-YAPXIANR.cjs → chunk-YVCOQHCE.cjs} +5 -5
  129. package/dist/{chunk-YAPXIANR.cjs.map → chunk-YVCOQHCE.cjs.map} +1 -1
  130. package/dist/{chunk-L52N2LVE.cjs → chunk-ZZA756I4.cjs} +4 -4
  131. package/dist/{chunk-L52N2LVE.cjs.map → chunk-ZZA756I4.cjs.map} +1 -1
  132. package/dist/citations/index.cjs +8 -8
  133. package/dist/connect/docx.cjs +19 -19
  134. package/dist/connect/index.cjs +1121 -1097
  135. package/dist/connect/index.cjs.map +1 -1
  136. package/dist/connect/viewer.cjs +26 -26
  137. package/dist/connection/ConnectedWorkflowBuilder.d.ts +11 -0
  138. package/dist/connection/ConnectedWorkflowBuilder.js +42 -3
  139. package/dist/connection/ConnectedWorkflowBuilder.js.map +2 -2
  140. package/dist/connection/conversation/ConnectedConversationPage.js +36 -2
  141. package/dist/connection/conversation/ConnectedConversationPage.js.map +2 -2
  142. package/dist/connection/workflows/ConnectedWorkflowsPage.js +10 -3
  143. package/dist/connection/workflows/ConnectedWorkflowsPage.js.map +2 -2
  144. package/dist/connection/workflows/useWorkflowsPageState.d.ts +1 -0
  145. package/dist/connection/workflows/useWorkflowsPageState.js.map +2 -2
  146. package/dist/dashboards/index.cjs +22 -22
  147. package/dist/embed/index.cjs +32 -32
  148. package/dist/facts/index.cjs +44 -44
  149. package/dist/files/index.cjs +226 -226
  150. package/dist/home/index.cjs +32 -32
  151. package/dist/index.cjs +907 -907
  152. package/dist/provider/environment.d.ts +5 -0
  153. package/dist/provider/environment.js +1 -1
  154. package/dist/provider/environment.js.map +2 -2
  155. package/dist/provider/requests.d.ts +2 -0
  156. package/dist/provider/requests.js.map +2 -2
  157. package/dist/retrieval/index.cjs +4 -4
  158. package/dist/shell/index.cjs +50 -50
  159. package/dist/site/index.cjs +5 -5
  160. package/dist/studio/index.cjs +31 -31
  161. package/dist/workflow-canvas/index.cjs +92 -50
  162. package/dist/workflow-canvas/index.cjs.map +1 -1
  163. package/dist/workspaces/index.cjs +27 -27
  164. package/node_modules/@arbidocs/coedit/package.json +1 -1
  165. package/package.json +5 -5
  166. package/dist/ai-EMNMGDAN.cjs.map +0 -1
  167. package/dist/chunk-U5T46QCS.cjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkK5MYEWD5_cjs = require('./chunk-K5MYEWD5.cjs');
4
+ var chunkUZHWXKS6_cjs = require('./chunk-UZHWXKS6.cjs');
5
5
  var react$1 = require('react');
6
6
  var lucideReact = require('lucide-react');
7
7
  var react = require('@arbidocs/react');
@@ -380,7 +380,7 @@ function ChartFields({
380
380
  EditorSelect,
381
381
  {
382
382
  label: l.width,
383
- value: String(chunkK5MYEWD5_cjs.clampPanelWidth(value.width)),
383
+ value: String(chunkUZHWXKS6_cjs.clampPanelWidth(value.width)),
384
384
  onChange: (w) => onChange({ ...value, width: Number(w ?? 6) }),
385
385
  options: WIDTHS.map((w) => ({ value: w, label: l.widths[w] })),
386
386
  testId: testId && `${testId}-width`
@@ -479,7 +479,7 @@ function PanelEditor({
479
479
  ] }),
480
480
  preview && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-2 self-start lg:sticky lg:top-0", children: [
481
481
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-medium text-muted-foreground", children: l.preview }),
482
- /* @__PURE__ */ jsxRuntime.jsx(chunkK5MYEWD5_cjs.DashboardPanel, { panel: value, testId: testId && `${testId}-preview` })
482
+ /* @__PURE__ */ jsxRuntime.jsx(chunkUZHWXKS6_cjs.DashboardPanel, { panel: value, testId: testId && `${testId}-preview` })
483
483
  ] })
484
484
  ]
485
485
  }
@@ -488,5 +488,5 @@ function PanelEditor({
488
488
 
489
489
  exports.DEFAULT_PANEL_EDITOR_LABELS = DEFAULT_PANEL_EDITOR_LABELS;
490
490
  exports.PanelEditor = PanelEditor;
491
- //# sourceMappingURL=chunk-J2RXQVVF.cjs.map
492
- //# sourceMappingURL=chunk-J2RXQVVF.cjs.map
491
+ //# sourceMappingURL=chunk-4EK7TAP7.cjs.map
492
+ //# sourceMappingURL=chunk-4EK7TAP7.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/connection/dashboards/PanelEditor.tsx"],"names":["jsxs","jsx","Label","useId","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","useMemo","Fragment","x","Switch","Input","Button","X","Plus","clampPanelWidth","useDataSources","cn","DashboardPanel"],"mappings":"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","file":"chunk-J2RXQVVF.cjs","sourcesContent":["/**\n * `PanelEditor`: build a panel without code. Pick a source (and its parameters: a database, one of\n * its saved views), how to show it, then what to group by, split by and measure, from the source's\n * own fields. Every choice is a field of the `PanelSpec`, previewed live underneath.\n */\nimport { useId, useMemo, type ReactNode } from 'react'\nimport { Plus, X } from 'lucide-react'\nimport {\n useDataSources,\n type AggregateOp,\n type ChartSpec,\n type ChartType,\n type DataSource,\n type DataSourceParam,\n type DataSourceParams,\n type DatasetField,\n type DatasetFilter,\n type DatasetSort,\n type FilterOp,\n type PanelSpec,\n type TimeBucket,\n} from '@arbidocs/react'\nimport {\n Button,\n cn,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Switch,\n} from '@arbidocs/react/ui'\nimport { clampPanelWidth } from '../../dashboards/DashboardGrid'\nimport { DashboardPanel } from './DashboardPanel'\n\nexport interface PanelEditorLabels {\n title: string\n description: string\n source: string\n showAs: string\n types: Record<ChartType, string>\n groupBy: string\n groupByNone: string\n /** A table without \"group by\" lists the records. */\n groupByRecords: string\n bucket: string\n buckets: Record<TimeBucket, string>\n splitBy: string\n splitByNone: string\n measure: string\n aggregates: Record<AggregateOp, string>\n ofField: string\n stacked: string\n sort: string\n sorts: Record<DatasetSort, string>\n limit: string\n /** A table of records: the fields shown. */\n columns: string\n orderBy: string\n orderNone: string\n directions: { asc: string; desc: string }\n width: string\n widths: Record<'3' | '4' | '6' | '8' | '12', string>\n filters: string\n addFilter: string\n removeFilter: string\n filterOps: Record<FilterOp, string>\n filterField: string\n filterOp: string\n filterValue: string\n noFields: string\n preview: string\n}\n\nexport const DEFAULT_PANEL_EDITOR_LABELS: PanelEditorLabels = {\n title: 'Title',\n description: 'Description',\n source: 'Data',\n showAs: 'Show as',\n types: {\n metric: 'Number',\n bar: 'Bar chart',\n line: 'Line chart',\n area: 'Area chart',\n pie: 'Pie chart',\n donut: 'Donut chart',\n table: 'Table',\n },\n groupBy: 'Group by',\n groupByNone: 'Choose a field',\n groupByRecords: 'Nothing: list the records',\n bucket: 'Per',\n buckets: { day: 'Day', week: 'Week', month: 'Month', quarter: 'Quarter', year: 'Year' },\n splitBy: 'Split by',\n splitByNone: 'Nothing',\n measure: 'Measure',\n aggregates: { count: 'Count', sum: 'Sum', avg: 'Average', min: 'Minimum', max: 'Maximum' },\n ofField: 'Of',\n stacked: 'Stack the series',\n sort: 'Order',\n sorts: { label: 'By name or date', 'value-desc': 'Largest first', 'value-asc': 'Smallest first' },\n limit: 'At most',\n columns: 'Columns',\n orderBy: 'Order by',\n orderNone: 'As read',\n directions: { asc: 'Ascending', desc: 'Descending' },\n width: 'Width',\n widths: { '3': 'Quarter', '4': 'Third', '6': 'Half', '8': 'Two thirds', '12': 'Full width' },\n filters: 'Only where',\n addFilter: 'Add a condition',\n removeFilter: 'Remove the condition',\n filterOps: {\n eq: 'is',\n neq: 'is not',\n contains: 'contains',\n gt: 'is above',\n gte: 'is at least',\n lt: 'is below',\n lte: 'is at most',\n empty: 'is empty',\n not_empty: 'is not empty',\n },\n filterField: 'Field',\n filterOp: 'Condition',\n filterValue: 'Value',\n noFields: 'Choose the data first.',\n preview: 'Preview',\n}\n\nexport interface PanelEditorProps {\n value: PanelSpec\n onChange: (panel: PanelSpec) => void\n /** Show the panel live under the form. Default true. */\n preview?: boolean\n /** Offer the width (a dashboard's grid). Default true. */\n showWidth?: boolean\n labels?: Partial<PanelEditorLabels>\n testId?: string\n}\n\n/** A select of the editor; `''` is \"nothing chosen\" (Radix items cannot take an empty value). */\nconst NONE = '__none'\n\nfunction Field({\n label,\n htmlFor,\n children,\n}: {\n label: string\n htmlFor?: string\n children: ReactNode\n}) {\n return (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <Label htmlFor={htmlFor} className=\"text-xs font-medium text-muted-foreground\">\n {label}\n </Label>\n {children}\n </div>\n )\n}\n\nfunction EditorSelect({\n label,\n value,\n onChange,\n options,\n placeholder,\n none,\n testId,\n}: {\n label: string\n value: string | undefined\n onChange: (value: string | undefined) => void\n options: readonly { value: string; label: string }[]\n placeholder?: string\n /** Offer \"nothing\" with these words. */\n none?: string\n testId?: string\n}) {\n const id = useId()\n return (\n <Field label={label} htmlFor={id}>\n <div data-testid={testId}>\n <Select\n value={value ?? (none ? NONE : '')}\n onValueChange={(v) => onChange(v === NONE ? undefined : v)}\n >\n <SelectTrigger id={id} className=\"bg-card text-sm\" aria-label={label}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {none && <SelectItem value={NONE}>{none}</SelectItem>}\n {options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </Field>\n )\n}\n\nfunction ParamField({\n param,\n params,\n onChange,\n testId,\n}: {\n param: DataSourceParam\n params: DataSourceParams\n /** The value chosen, with the other parameters its option sets (a database's workspace). */\n onChange: (value: string | undefined, with_?: DataSourceParams) => void\n testId?: string\n}) {\n const { options } = param.useOptions(params)\n const value = params[param.id]\n return (\n <EditorSelect\n label={param.label}\n value={typeof value === 'string' && value ? value : undefined}\n onChange={(v) => onChange(v, options.find((o) => o.value === v)?.params)}\n options={options}\n placeholder={param.placeholder}\n none={param.required ? undefined : (param.placeholder ?? '—')}\n testId={testId}\n />\n )\n}\n\nconst WIDTHS = ['3', '4', '6', '8', '12'] as const\nconst NEEDS_VALUE = (op: FilterOp) => op !== 'empty' && op !== 'not_empty'\n\nfunction ChartFields({\n source,\n value,\n onChange,\n showWidth,\n l,\n testId,\n}: {\n source: DataSource\n value: PanelSpec\n onChange: (panel: PanelSpec) => void\n showWidth: boolean\n l: PanelEditorLabels\n testId?: string\n}) {\n const params = value.source.params ?? {}\n const { fields } = source.useFields(params)\n const chart = value.chart\n const setChart = (patch: Partial<ChartSpec>) =>\n onChange({ ...value, chart: { ...chart, ...patch } })\n const byId = useMemo(() => new Map(fields.map((f) => [f.id, f])), [fields])\n const groupable = fields.filter((f) => f.type !== 'number')\n const numbers = fields.filter((f) => f.type === 'number')\n const opts = (list: readonly DatasetField[]) => list.map((f) => ({ value: f.id, label: f.label }))\n const x = chart.x ? byId.get(chart.x) : undefined\n const aggregate = chart.aggregate ?? 'count'\n const isMetric = chart.type === 'metric'\n const isRecords = chart.type === 'table' && !chart.x\n const canSplit = chart.type === 'bar' || chart.type === 'line' || chart.type === 'area'\n const filters = chart.filters ?? []\n const setFilter = (i: number, patch: Partial<DatasetFilter>) =>\n setChart({ filters: filters.map((f, j) => (j === i ? { ...f, ...patch } : f)) })\n\n return (\n <>\n <EditorSelect\n label={l.showAs}\n value={chart.type}\n onChange={(type) => setChart({ type: (type ?? 'bar') as ChartType })}\n options={(Object.keys(l.types) as ChartType[]).map((t) => ({\n value: t,\n label: l.types[t],\n }))}\n testId={testId && `${testId}-type`}\n />\n {!isMetric && (\n <EditorSelect\n label={l.groupBy}\n value={chart.x}\n onChange={(x) => setChart({ x })}\n options={opts(groupable)}\n placeholder={l.groupByNone}\n none={chart.type === 'table' ? l.groupByRecords : undefined}\n testId={testId && `${testId}-x`}\n />\n )}\n {!isMetric && x?.type === 'date' && (\n <EditorSelect\n label={l.bucket}\n value={chart.bucket ?? 'month'}\n onChange={(bucket) => setChart({ bucket: (bucket ?? 'month') as TimeBucket })}\n options={(Object.keys(l.buckets) as TimeBucket[]).map((b) => ({\n value: b,\n label: l.buckets[b],\n }))}\n testId={testId && `${testId}-bucket`}\n />\n )}\n {canSplit && (\n <EditorSelect\n label={l.splitBy}\n value={chart.series}\n onChange={(series) => setChart({ series })}\n options={opts(groupable.filter((f) => f.id !== chart.x))}\n none={l.splitByNone}\n testId={testId && `${testId}-series`}\n />\n )}\n {!isRecords && (\n <div className=\"grid grid-cols-2 gap-3\">\n <EditorSelect\n label={l.measure}\n value={aggregate}\n onChange={(op) => {\n const next = (op ?? 'count') as AggregateOp\n setChart({\n aggregate: next,\n y: next === 'count' ? undefined : (chart.y ?? numbers[0]?.id),\n })\n }}\n options={(Object.keys(l.aggregates) as AggregateOp[])\n .filter((op) => op === 'count' || numbers.length > 0)\n .map((op) => ({ value: op, label: l.aggregates[op] }))}\n testId={testId && `${testId}-aggregate`}\n />\n {aggregate !== 'count' && (\n <EditorSelect\n label={l.ofField}\n value={chart.y}\n onChange={(y) => setChart({ y })}\n options={opts(numbers)}\n testId={testId && `${testId}-y`}\n />\n )}\n </div>\n )}\n {canSplit && chart.series && chart.type !== 'line' && (\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={Boolean(chart.stacked)}\n onCheckedChange={(stacked) => setChart({ stacked })}\n data-testid={testId && `${testId}-stacked`}\n />\n {l.stacked}\n </label>\n )}\n {!isMetric && !isRecords && (\n <div className=\"grid grid-cols-2 gap-3\">\n <EditorSelect\n label={l.sort}\n value={chart.sort ?? (x?.type === 'date' ? 'label' : 'value-desc')}\n onChange={(sort) => setChart({ sort: sort as DatasetSort })}\n options={(Object.keys(l.sorts) as DatasetSort[]).map((s) => ({\n value: s,\n label: l.sorts[s],\n }))}\n testId={testId && `${testId}-sort`}\n />\n <Field label={l.limit}>\n <Input\n type=\"number\"\n min={1}\n max={500}\n value={chart.limit ?? ''}\n placeholder=\"50\"\n onChange={(e) =>\n setChart({\n limit: e.target.value ? Math.max(1, Number(e.target.value)) : undefined,\n })\n }\n data-testid={testId && `${testId}-limit`}\n />\n </Field>\n </div>\n )}\n {isRecords && (\n <fieldset className=\"flex flex-col gap-1.5\" data-testid={testId && `${testId}-columns`}>\n <legend className=\"mb-1.5 text-xs font-medium text-muted-foreground\">{l.columns}</legend>\n {fields.map((field) => {\n const shown = chart.columns ?? fields.map((f) => f.id)\n const checked = shown.includes(field.id)\n return (\n <label key={field.id} className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() =>\n setChart({\n columns: checked\n ? shown.filter((id) => id !== field.id)\n : fields\n .map((f) => f.id)\n .filter((id) => id === field.id || shown.includes(id)),\n })\n }\n />\n {field.label}\n </label>\n )\n })}\n </fieldset>\n )}\n {isRecords && (\n <div className=\"grid grid-cols-2 gap-3\">\n <EditorSelect\n label={l.orderBy}\n value={chart.orderBy?.field}\n onChange={(field) =>\n setChart({\n orderBy: field\n ? { field, direction: chart.orderBy?.direction ?? 'asc' }\n : undefined,\n })\n }\n options={opts(fields)}\n none={l.orderNone}\n testId={testId && `${testId}-order`}\n />\n {chart.orderBy && (\n <EditorSelect\n label={l.orderBy}\n value={chart.orderBy.direction ?? 'asc'}\n onChange={(direction) =>\n setChart({\n orderBy: {\n field: chart.orderBy?.field ?? '',\n direction: direction === 'desc' ? 'desc' : 'asc',\n },\n })\n }\n options={[\n { value: 'asc', label: l.directions.asc },\n { value: 'desc', label: l.directions.desc },\n ]}\n testId={testId && `${testId}-direction`}\n />\n )}\n </div>\n )}\n <div className=\"flex flex-col gap-2\" data-testid={testId && `${testId}-filters`}>\n <span className=\"text-xs font-medium text-muted-foreground\">{l.filters}</span>\n {filters.map((filter, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_1fr_1fr_auto] items-end gap-2\">\n <EditorSelect\n label={l.filterField}\n value={filter.field}\n onChange={(field) => setFilter(i, { field: field ?? '' })}\n options={opts(fields)}\n />\n <EditorSelect\n label={l.filterOp}\n value={filter.op}\n onChange={(op) => setFilter(i, { op: (op ?? 'eq') as FilterOp })}\n options={(Object.keys(l.filterOps) as FilterOp[]).map((op) => ({\n value: op,\n label: l.filterOps[op],\n }))}\n />\n {NEEDS_VALUE(filter.op) ? (\n <Field label={l.filterValue}>\n <Input\n value={\n filter.value === null || filter.value === undefined ? '' : String(filter.value)\n }\n type={byId.get(filter.field)?.type === 'number' ? 'number' : 'text'}\n onChange={(e) =>\n setFilter(i, {\n value:\n byId.get(filter.field)?.type === 'number' && e.target.value !== ''\n ? Number(e.target.value)\n : e.target.value,\n })\n }\n />\n </Field>\n ) : (\n <span />\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={l.removeFilter}\n onClick={() => setChart({ filters: filters.filter((_, j) => j !== i) })}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={!fields.length}\n onClick={() =>\n setChart({ filters: [...filters, { field: fields[0]?.id ?? '', op: 'eq', value: '' }] })\n }\n >\n <Plus className=\"size-3.5\" /> {l.addFilter}\n </Button>\n </div>\n {showWidth && (\n <EditorSelect\n label={l.width}\n value={String(clampPanelWidth(value.width))}\n onChange={(w) => onChange({ ...value, width: Number(w ?? 6) })}\n options={WIDTHS.map((w) => ({ value: w, label: l.widths[w] }))}\n testId={testId && `${testId}-width`}\n />\n )}\n {!fields.length && <p className=\"text-sm text-muted-foreground\">{l.noFields}</p>}\n </>\n )\n}\n\nexport function PanelEditor({\n value,\n onChange,\n preview = true,\n showWidth = true,\n labels,\n testId,\n}: PanelEditorProps) {\n const l = { ...DEFAULT_PANEL_EDITOR_LABELS, ...labels }\n const registry = useDataSources()\n const source = registry.get(value.source.id)\n const params = value.source.params ?? {}\n const titleId = useId()\n const descriptionId = useId()\n\n return (\n <div\n className={cn(\n 'grid min-w-0 gap-6',\n preview && 'lg:grid-cols-[minmax(0,22rem)_minmax(0,1fr)]'\n )}\n data-testid={testId}\n >\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Field label={l.title} htmlFor={titleId}>\n <Input\n id={titleId}\n value={value.title}\n onChange={(e) => onChange({ ...value, title: e.target.value })}\n data-testid={testId && `${testId}-title`}\n />\n </Field>\n <Field label={l.description} htmlFor={descriptionId}>\n <Input\n id={descriptionId}\n value={value.description ?? ''}\n onChange={(e) => onChange({ ...value, description: e.target.value || undefined })}\n />\n </Field>\n <EditorSelect\n label={l.source}\n value={value.source.id}\n onChange={(id) =>\n onChange({\n ...value,\n source: { id: id ?? value.source.id },\n // Another source has other fields: what was grouped and measured no longer applies.\n chart: { type: value.chart.type },\n })\n }\n options={registry.list.map((s) => ({ value: s.id, label: s.label }))}\n testId={testId && `${testId}-source`}\n />\n {source?.description && (\n <p className=\"-mt-2 text-xs text-muted-foreground\">{source.description}</p>\n )}\n {source?.params?.map((param) => (\n <ParamField\n key={`${source.id}-${param.id}`}\n param={param}\n params={params}\n testId={testId && `${testId}-param-${param.id}`}\n onChange={(v, extra) =>\n onChange({\n ...value,\n source: {\n ...value.source,\n params: { ...params, ...extra, [param.id]: v ?? null },\n },\n // A different database has other columns.\n ...(param.id === 'databaseId' || param.id === 'view'\n ? { chart: { type: value.chart.type } }\n : {}),\n })\n }\n />\n ))}\n {source && (\n <ChartFields\n key={source.id}\n source={source}\n value={value}\n onChange={onChange}\n showWidth={showWidth}\n l={l}\n testId={testId}\n />\n )}\n </div>\n {preview && (\n <div className=\"flex min-w-0 flex-col gap-2 self-start lg:sticky lg:top-0\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.preview}</span>\n <DashboardPanel panel={value} testId={testId && `${testId}-preview`} />\n </div>\n )}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/connection/dashboards/PanelEditor.tsx"],"names":["jsxs","jsx","Label","useId","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","useMemo","Fragment","x","Switch","Input","Button","X","Plus","clampPanelWidth","useDataSources","cn","DashboardPanel"],"mappings":"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","file":"chunk-4EK7TAP7.cjs","sourcesContent":["/**\n * `PanelEditor`: build a panel without code. Pick a source (and its parameters: a database, one of\n * its saved views), how to show it, then what to group by, split by and measure, from the source's\n * own fields. Every choice is a field of the `PanelSpec`, previewed live underneath.\n */\nimport { useId, useMemo, type ReactNode } from 'react'\nimport { Plus, X } from 'lucide-react'\nimport {\n useDataSources,\n type AggregateOp,\n type ChartSpec,\n type ChartType,\n type DataSource,\n type DataSourceParam,\n type DataSourceParams,\n type DatasetField,\n type DatasetFilter,\n type DatasetSort,\n type FilterOp,\n type PanelSpec,\n type TimeBucket,\n} from '@arbidocs/react'\nimport {\n Button,\n cn,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Switch,\n} from '@arbidocs/react/ui'\nimport { clampPanelWidth } from '../../dashboards/DashboardGrid'\nimport { DashboardPanel } from './DashboardPanel'\n\nexport interface PanelEditorLabels {\n title: string\n description: string\n source: string\n showAs: string\n types: Record<ChartType, string>\n groupBy: string\n groupByNone: string\n /** A table without \"group by\" lists the records. */\n groupByRecords: string\n bucket: string\n buckets: Record<TimeBucket, string>\n splitBy: string\n splitByNone: string\n measure: string\n aggregates: Record<AggregateOp, string>\n ofField: string\n stacked: string\n sort: string\n sorts: Record<DatasetSort, string>\n limit: string\n /** A table of records: the fields shown. */\n columns: string\n orderBy: string\n orderNone: string\n directions: { asc: string; desc: string }\n width: string\n widths: Record<'3' | '4' | '6' | '8' | '12', string>\n filters: string\n addFilter: string\n removeFilter: string\n filterOps: Record<FilterOp, string>\n filterField: string\n filterOp: string\n filterValue: string\n noFields: string\n preview: string\n}\n\nexport const DEFAULT_PANEL_EDITOR_LABELS: PanelEditorLabels = {\n title: 'Title',\n description: 'Description',\n source: 'Data',\n showAs: 'Show as',\n types: {\n metric: 'Number',\n bar: 'Bar chart',\n line: 'Line chart',\n area: 'Area chart',\n pie: 'Pie chart',\n donut: 'Donut chart',\n table: 'Table',\n },\n groupBy: 'Group by',\n groupByNone: 'Choose a field',\n groupByRecords: 'Nothing: list the records',\n bucket: 'Per',\n buckets: { day: 'Day', week: 'Week', month: 'Month', quarter: 'Quarter', year: 'Year' },\n splitBy: 'Split by',\n splitByNone: 'Nothing',\n measure: 'Measure',\n aggregates: { count: 'Count', sum: 'Sum', avg: 'Average', min: 'Minimum', max: 'Maximum' },\n ofField: 'Of',\n stacked: 'Stack the series',\n sort: 'Order',\n sorts: { label: 'By name or date', 'value-desc': 'Largest first', 'value-asc': 'Smallest first' },\n limit: 'At most',\n columns: 'Columns',\n orderBy: 'Order by',\n orderNone: 'As read',\n directions: { asc: 'Ascending', desc: 'Descending' },\n width: 'Width',\n widths: { '3': 'Quarter', '4': 'Third', '6': 'Half', '8': 'Two thirds', '12': 'Full width' },\n filters: 'Only where',\n addFilter: 'Add a condition',\n removeFilter: 'Remove the condition',\n filterOps: {\n eq: 'is',\n neq: 'is not',\n contains: 'contains',\n gt: 'is above',\n gte: 'is at least',\n lt: 'is below',\n lte: 'is at most',\n empty: 'is empty',\n not_empty: 'is not empty',\n },\n filterField: 'Field',\n filterOp: 'Condition',\n filterValue: 'Value',\n noFields: 'Choose the data first.',\n preview: 'Preview',\n}\n\nexport interface PanelEditorProps {\n value: PanelSpec\n onChange: (panel: PanelSpec) => void\n /** Show the panel live under the form. Default true. */\n preview?: boolean\n /** Offer the width (a dashboard's grid). Default true. */\n showWidth?: boolean\n labels?: Partial<PanelEditorLabels>\n testId?: string\n}\n\n/** A select of the editor; `''` is \"nothing chosen\" (Radix items cannot take an empty value). */\nconst NONE = '__none'\n\nfunction Field({\n label,\n htmlFor,\n children,\n}: {\n label: string\n htmlFor?: string\n children: ReactNode\n}) {\n return (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <Label htmlFor={htmlFor} className=\"text-xs font-medium text-muted-foreground\">\n {label}\n </Label>\n {children}\n </div>\n )\n}\n\nfunction EditorSelect({\n label,\n value,\n onChange,\n options,\n placeholder,\n none,\n testId,\n}: {\n label: string\n value: string | undefined\n onChange: (value: string | undefined) => void\n options: readonly { value: string; label: string }[]\n placeholder?: string\n /** Offer \"nothing\" with these words. */\n none?: string\n testId?: string\n}) {\n const id = useId()\n return (\n <Field label={label} htmlFor={id}>\n <div data-testid={testId}>\n <Select\n value={value ?? (none ? NONE : '')}\n onValueChange={(v) => onChange(v === NONE ? undefined : v)}\n >\n <SelectTrigger id={id} className=\"bg-card text-sm\" aria-label={label}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {none && <SelectItem value={NONE}>{none}</SelectItem>}\n {options.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </Field>\n )\n}\n\nfunction ParamField({\n param,\n params,\n onChange,\n testId,\n}: {\n param: DataSourceParam\n params: DataSourceParams\n /** The value chosen, with the other parameters its option sets (a database's workspace). */\n onChange: (value: string | undefined, with_?: DataSourceParams) => void\n testId?: string\n}) {\n const { options } = param.useOptions(params)\n const value = params[param.id]\n return (\n <EditorSelect\n label={param.label}\n value={typeof value === 'string' && value ? value : undefined}\n onChange={(v) => onChange(v, options.find((o) => o.value === v)?.params)}\n options={options}\n placeholder={param.placeholder}\n none={param.required ? undefined : (param.placeholder ?? '—')}\n testId={testId}\n />\n )\n}\n\nconst WIDTHS = ['3', '4', '6', '8', '12'] as const\nconst NEEDS_VALUE = (op: FilterOp) => op !== 'empty' && op !== 'not_empty'\n\nfunction ChartFields({\n source,\n value,\n onChange,\n showWidth,\n l,\n testId,\n}: {\n source: DataSource\n value: PanelSpec\n onChange: (panel: PanelSpec) => void\n showWidth: boolean\n l: PanelEditorLabels\n testId?: string\n}) {\n const params = value.source.params ?? {}\n const { fields } = source.useFields(params)\n const chart = value.chart\n const setChart = (patch: Partial<ChartSpec>) =>\n onChange({ ...value, chart: { ...chart, ...patch } })\n const byId = useMemo(() => new Map(fields.map((f) => [f.id, f])), [fields])\n const groupable = fields.filter((f) => f.type !== 'number')\n const numbers = fields.filter((f) => f.type === 'number')\n const opts = (list: readonly DatasetField[]) => list.map((f) => ({ value: f.id, label: f.label }))\n const x = chart.x ? byId.get(chart.x) : undefined\n const aggregate = chart.aggregate ?? 'count'\n const isMetric = chart.type === 'metric'\n const isRecords = chart.type === 'table' && !chart.x\n const canSplit = chart.type === 'bar' || chart.type === 'line' || chart.type === 'area'\n const filters = chart.filters ?? []\n const setFilter = (i: number, patch: Partial<DatasetFilter>) =>\n setChart({ filters: filters.map((f, j) => (j === i ? { ...f, ...patch } : f)) })\n\n return (\n <>\n <EditorSelect\n label={l.showAs}\n value={chart.type}\n onChange={(type) => setChart({ type: (type ?? 'bar') as ChartType })}\n options={(Object.keys(l.types) as ChartType[]).map((t) => ({\n value: t,\n label: l.types[t],\n }))}\n testId={testId && `${testId}-type`}\n />\n {!isMetric && (\n <EditorSelect\n label={l.groupBy}\n value={chart.x}\n onChange={(x) => setChart({ x })}\n options={opts(groupable)}\n placeholder={l.groupByNone}\n none={chart.type === 'table' ? l.groupByRecords : undefined}\n testId={testId && `${testId}-x`}\n />\n )}\n {!isMetric && x?.type === 'date' && (\n <EditorSelect\n label={l.bucket}\n value={chart.bucket ?? 'month'}\n onChange={(bucket) => setChart({ bucket: (bucket ?? 'month') as TimeBucket })}\n options={(Object.keys(l.buckets) as TimeBucket[]).map((b) => ({\n value: b,\n label: l.buckets[b],\n }))}\n testId={testId && `${testId}-bucket`}\n />\n )}\n {canSplit && (\n <EditorSelect\n label={l.splitBy}\n value={chart.series}\n onChange={(series) => setChart({ series })}\n options={opts(groupable.filter((f) => f.id !== chart.x))}\n none={l.splitByNone}\n testId={testId && `${testId}-series`}\n />\n )}\n {!isRecords && (\n <div className=\"grid grid-cols-2 gap-3\">\n <EditorSelect\n label={l.measure}\n value={aggregate}\n onChange={(op) => {\n const next = (op ?? 'count') as AggregateOp\n setChart({\n aggregate: next,\n y: next === 'count' ? undefined : (chart.y ?? numbers[0]?.id),\n })\n }}\n options={(Object.keys(l.aggregates) as AggregateOp[])\n .filter((op) => op === 'count' || numbers.length > 0)\n .map((op) => ({ value: op, label: l.aggregates[op] }))}\n testId={testId && `${testId}-aggregate`}\n />\n {aggregate !== 'count' && (\n <EditorSelect\n label={l.ofField}\n value={chart.y}\n onChange={(y) => setChart({ y })}\n options={opts(numbers)}\n testId={testId && `${testId}-y`}\n />\n )}\n </div>\n )}\n {canSplit && chart.series && chart.type !== 'line' && (\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch\n checked={Boolean(chart.stacked)}\n onCheckedChange={(stacked) => setChart({ stacked })}\n data-testid={testId && `${testId}-stacked`}\n />\n {l.stacked}\n </label>\n )}\n {!isMetric && !isRecords && (\n <div className=\"grid grid-cols-2 gap-3\">\n <EditorSelect\n label={l.sort}\n value={chart.sort ?? (x?.type === 'date' ? 'label' : 'value-desc')}\n onChange={(sort) => setChart({ sort: sort as DatasetSort })}\n options={(Object.keys(l.sorts) as DatasetSort[]).map((s) => ({\n value: s,\n label: l.sorts[s],\n }))}\n testId={testId && `${testId}-sort`}\n />\n <Field label={l.limit}>\n <Input\n type=\"number\"\n min={1}\n max={500}\n value={chart.limit ?? ''}\n placeholder=\"50\"\n onChange={(e) =>\n setChart({\n limit: e.target.value ? Math.max(1, Number(e.target.value)) : undefined,\n })\n }\n data-testid={testId && `${testId}-limit`}\n />\n </Field>\n </div>\n )}\n {isRecords && (\n <fieldset className=\"flex flex-col gap-1.5\" data-testid={testId && `${testId}-columns`}>\n <legend className=\"mb-1.5 text-xs font-medium text-muted-foreground\">{l.columns}</legend>\n {fields.map((field) => {\n const shown = chart.columns ?? fields.map((f) => f.id)\n const checked = shown.includes(field.id)\n return (\n <label key={field.id} className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() =>\n setChart({\n columns: checked\n ? shown.filter((id) => id !== field.id)\n : fields\n .map((f) => f.id)\n .filter((id) => id === field.id || shown.includes(id)),\n })\n }\n />\n {field.label}\n </label>\n )\n })}\n </fieldset>\n )}\n {isRecords && (\n <div className=\"grid grid-cols-2 gap-3\">\n <EditorSelect\n label={l.orderBy}\n value={chart.orderBy?.field}\n onChange={(field) =>\n setChart({\n orderBy: field\n ? { field, direction: chart.orderBy?.direction ?? 'asc' }\n : undefined,\n })\n }\n options={opts(fields)}\n none={l.orderNone}\n testId={testId && `${testId}-order`}\n />\n {chart.orderBy && (\n <EditorSelect\n label={l.orderBy}\n value={chart.orderBy.direction ?? 'asc'}\n onChange={(direction) =>\n setChart({\n orderBy: {\n field: chart.orderBy?.field ?? '',\n direction: direction === 'desc' ? 'desc' : 'asc',\n },\n })\n }\n options={[\n { value: 'asc', label: l.directions.asc },\n { value: 'desc', label: l.directions.desc },\n ]}\n testId={testId && `${testId}-direction`}\n />\n )}\n </div>\n )}\n <div className=\"flex flex-col gap-2\" data-testid={testId && `${testId}-filters`}>\n <span className=\"text-xs font-medium text-muted-foreground\">{l.filters}</span>\n {filters.map((filter, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_1fr_1fr_auto] items-end gap-2\">\n <EditorSelect\n label={l.filterField}\n value={filter.field}\n onChange={(field) => setFilter(i, { field: field ?? '' })}\n options={opts(fields)}\n />\n <EditorSelect\n label={l.filterOp}\n value={filter.op}\n onChange={(op) => setFilter(i, { op: (op ?? 'eq') as FilterOp })}\n options={(Object.keys(l.filterOps) as FilterOp[]).map((op) => ({\n value: op,\n label: l.filterOps[op],\n }))}\n />\n {NEEDS_VALUE(filter.op) ? (\n <Field label={l.filterValue}>\n <Input\n value={\n filter.value === null || filter.value === undefined ? '' : String(filter.value)\n }\n type={byId.get(filter.field)?.type === 'number' ? 'number' : 'text'}\n onChange={(e) =>\n setFilter(i, {\n value:\n byId.get(filter.field)?.type === 'number' && e.target.value !== ''\n ? Number(e.target.value)\n : e.target.value,\n })\n }\n />\n </Field>\n ) : (\n <span />\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label={l.removeFilter}\n onClick={() => setChart({ filters: filters.filter((_, j) => j !== i) })}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n disabled={!fields.length}\n onClick={() =>\n setChart({ filters: [...filters, { field: fields[0]?.id ?? '', op: 'eq', value: '' }] })\n }\n >\n <Plus className=\"size-3.5\" /> {l.addFilter}\n </Button>\n </div>\n {showWidth && (\n <EditorSelect\n label={l.width}\n value={String(clampPanelWidth(value.width))}\n onChange={(w) => onChange({ ...value, width: Number(w ?? 6) })}\n options={WIDTHS.map((w) => ({ value: w, label: l.widths[w] }))}\n testId={testId && `${testId}-width`}\n />\n )}\n {!fields.length && <p className=\"text-sm text-muted-foreground\">{l.noFields}</p>}\n </>\n )\n}\n\nexport function PanelEditor({\n value,\n onChange,\n preview = true,\n showWidth = true,\n labels,\n testId,\n}: PanelEditorProps) {\n const l = { ...DEFAULT_PANEL_EDITOR_LABELS, ...labels }\n const registry = useDataSources()\n const source = registry.get(value.source.id)\n const params = value.source.params ?? {}\n const titleId = useId()\n const descriptionId = useId()\n\n return (\n <div\n className={cn(\n 'grid min-w-0 gap-6',\n preview && 'lg:grid-cols-[minmax(0,22rem)_minmax(0,1fr)]'\n )}\n data-testid={testId}\n >\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Field label={l.title} htmlFor={titleId}>\n <Input\n id={titleId}\n value={value.title}\n onChange={(e) => onChange({ ...value, title: e.target.value })}\n data-testid={testId && `${testId}-title`}\n />\n </Field>\n <Field label={l.description} htmlFor={descriptionId}>\n <Input\n id={descriptionId}\n value={value.description ?? ''}\n onChange={(e) => onChange({ ...value, description: e.target.value || undefined })}\n />\n </Field>\n <EditorSelect\n label={l.source}\n value={value.source.id}\n onChange={(id) =>\n onChange({\n ...value,\n source: { id: id ?? value.source.id },\n // Another source has other fields: what was grouped and measured no longer applies.\n chart: { type: value.chart.type },\n })\n }\n options={registry.list.map((s) => ({ value: s.id, label: s.label }))}\n testId={testId && `${testId}-source`}\n />\n {source?.description && (\n <p className=\"-mt-2 text-xs text-muted-foreground\">{source.description}</p>\n )}\n {source?.params?.map((param) => (\n <ParamField\n key={`${source.id}-${param.id}`}\n param={param}\n params={params}\n testId={testId && `${testId}-param-${param.id}`}\n onChange={(v, extra) =>\n onChange({\n ...value,\n source: {\n ...value.source,\n params: { ...params, ...extra, [param.id]: v ?? null },\n },\n // A different database has other columns.\n ...(param.id === 'databaseId' || param.id === 'view'\n ? { chart: { type: value.chart.type } }\n : {}),\n })\n }\n />\n ))}\n {source && (\n <ChartFields\n key={source.id}\n source={source}\n value={value}\n onChange={onChange}\n showWidth={showWidth}\n l={l}\n testId={testId}\n />\n )}\n </div>\n {preview && (\n <div className=\"flex min-w-0 flex-col gap-2 self-start lg:sticky lg:top-0\">\n <span className=\"text-xs font-medium text-muted-foreground\">{l.preview}</span>\n <DashboardPanel panel={value} testId={testId && `${testId}-preview`} />\n </div>\n )}\n </div>\n )\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkKQF7POTG_cjs = require('./chunk-KQF7POTG.cjs');
5
- var chunkZFKWCGA5_cjs = require('./chunk-ZFKWCGA5.cjs');
5
+ var chunkJV5TVUOU_cjs = require('./chunk-JV5TVUOU.cjs');
6
6
  var chunkPLIF5CUV_cjs = require('./chunk-PLIF5CUV.cjs');
7
7
  var lucideReact = require('lucide-react');
8
8
  var ui = require('@arbidocs/react/ui');
@@ -319,7 +319,7 @@ function MobileTabBar({
319
319
  className
320
320
  ),
321
321
  children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
322
- chunkZFKWCGA5_cjs.ActionLink,
322
+ chunkJV5TVUOU_cjs.ActionLink,
323
323
  {
324
324
  href: item.href,
325
325
  external: item.external,
@@ -555,5 +555,5 @@ exports.prefetchChunk = prefetchChunk;
555
555
  exports.requestReload = requestReload;
556
556
  exports.workspaceKindColor = workspaceKindColor;
557
557
  exports.workspaceKindMeta = workspaceKindMeta;
558
- //# sourceMappingURL=chunk-MJHIBCF7.cjs.map
559
- //# sourceMappingURL=chunk-MJHIBCF7.cjs.map
558
+ //# sourceMappingURL=chunk-4NPCDS2X.cjs.map
559
+ //# sourceMappingURL=chunk-4NPCDS2X.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shell/Workspace.tsx","../src/shell/MobileBars.tsx","../src/shell/reload-policy.ts"],"names":["Globe","Users","Lock","jsxs","jsx","testIdOr","cn","Fragment","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuItem","LayoutGrid","Plus","DropdownMenuSeparator","DropdownMenuLabel","prefixedTestId","Menu","useRef","useShellBottomInset","ActionLink","notify"],"mappings":"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","file":"chunk-MJHIBCF7.cjs","sourcesContent":["import type { ComponentType } from 'react'\nimport { ChevronDown, Globe, LayoutGrid, Lock, Plus, Users } from 'lucide-react'\nimport {\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport type { ShellRecentWorkspace, ShellWorkspace, ShellWorkspaceKind } from './types'\n\n/** The three workspace-kind names (badge title, type glyph name, subtitle). */\nexport interface WorkspaceKindLabels {\n common: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_WORKSPACE_KIND_LABELS: WorkspaceKindLabels = {\n common: 'Common',\n shared: 'Shared',\n private: 'Private',\n}\n\n/**\n * Workspace type drives the initial-badge fill and a quiet secondary glyph:\n * private (just you) -> navy, lock shared (several) -> selection tint, people\n * common (public) -> neutral, globe\n * Navy is identity and cyan is reserved for ARBI/AI, so \"shared\" is the selection tint.\n */\nexport function workspaceKindMeta(\n kind: ShellWorkspaceKind,\n labels?: Partial<WorkspaceKindLabels>\n): {\n Icon: ComponentType<{ className?: string; 'aria-label'?: string; 'data-testid'?: string }>\n label: string\n fill: string\n} {\n const l = { ...DEFAULT_WORKSPACE_KIND_LABELS, ...labels }\n if (kind === 'common')\n return { Icon: Globe, label: l.common, fill: 'bg-muted text-muted-foreground' }\n if (kind === 'shared')\n return { Icon: Users, label: l.shared, fill: 'bg-secondary text-secondary-foreground' }\n return { Icon: Lock, label: l.private, fill: 'bg-primary text-primary-foreground' }\n}\n\n/** The kind's hue as a CSS colour, for glyphs painted by SVG fill (the workspace shield). */\nexport function workspaceKindColor(kind: ShellWorkspaceKind): string {\n if (kind === 'common') return 'var(--color-muted-foreground)'\n if (kind === 'shared') return 'var(--color-secondary)'\n return 'var(--color-primary)'\n}\n\n/** Overridable ids of the workspace identity; defaults are the current ids. */\ntype WorkspaceIdentityTestIds = Partial<Record<'initial' | 'type' | 'projectName', string>>\n\nexport interface WorkspaceIdentityProps {\n workspace: ShellWorkspace\n /** Show name + type/project line beside the badge; otherwise the badge alone. */\n expanded: boolean\n /** Selected (nav-row) styling of the name. */\n isActive?: boolean\n /** Reword the kind names. */\n labels?: Partial<WorkspaceKindLabels>\n /** Part ids; defaults are the current ids. */\n testIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * Non-interactive guts of the workspace head: the initial badge (with a tiny type glyph) and,\n * when expanded, the name and the project/type line. Hosted by the switcher trigger and by the\n * workspace settings header, so it never nests a button.\n */\nexport function WorkspaceIdentity({\n workspace,\n expanded,\n isActive = false,\n labels,\n testIds,\n}: WorkspaceIdentityProps) {\n const kind = workspaceKindMeta(workspace.kind, labels)\n const badge = (\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n data-testid={testIdOr(testIds?.initial, { testId: 'sidebar-workspace-card-initial' })}\n className={cn(\n 'flex size-7 flex-shrink-0 items-center justify-center rounded-md text-sm font-semibold leading-none',\n kind.fill\n )}\n >\n {workspace.name.charAt(0).toUpperCase()}\n </span>\n {/* Type as a tiny overlay on the badge: status reads at the icon, not after the name. */}\n <span className=\"absolute -bottom-1 -right-1 flex size-3.5 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={testIdOr(testIds?.type, { testId: 'sidebar-workspace-card-type' })}\n className=\"size-2.5 text-muted-foreground\"\n />\n </span>\n </span>\n )\n\n if (!expanded)\n return <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n\n return (\n <>\n <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n <div className=\"ml-2.5 flex min-w-0 flex-1 flex-col text-left\">\n <span\n // 600: the name of the thing you are inside, above a lighter project line.\n className={cn(\n 'min-w-0 truncate text-left text-sm font-semibold capitalize leading-tight transition-colors duration-100',\n isActive ? 'text-accent-foreground' : 'text-foreground'\n )}\n >\n {workspace.name}\n </span>\n {!workspace.projectName && (\n <span className=\"mt-0.5 truncate text-xs text-muted-foreground\">{kind.label}</span>\n )}\n {workspace.projectName && (\n <span\n className=\"mt-0.5 flex min-w-0\"\n data-testid={testIdOr(testIds?.projectName, {\n testId: 'sidebar-workspace-card-project-name',\n })}\n >\n {workspace.projectLine ?? (\n <span className=\"truncate text-xs text-muted-foreground\">\n {workspace.projectName}\n </span>\n )}\n </span>\n )}\n </div>\n </>\n )\n}\n\n/**\n * Entity nouns plus the switcher's strings. `plural` arrives lowercased and `singular`\n * capitalized in the functions below.\n */\nexport interface WorkspaceSwitcherLabels extends WorkspaceKindLabels {\n /** Entity nouns, e.g. { plural: 'workspaces', singular: 'workspace' }. */\n plural: string\n singular: string\n /** The trigger's accessible name. */\n switchWorkspace: (name: string, plural: string) => string\n allWorkspaces: (plural: string) => string\n newWorkspace: (singular: string) => string\n recentWorkspaces: (plural: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_SWITCHER_LABELS: WorkspaceSwitcherLabels = {\n ...DEFAULT_WORKSPACE_KIND_LABELS,\n plural: 'workspaces',\n singular: 'workspace',\n switchWorkspace: (name, plural) => `${name} — switch ${plural}`,\n allWorkspaces: (plural) => `All ${plural}`,\n newWorkspace: (singular) => `New ${singular}`,\n recentWorkspaces: (plural) => `Recent ${plural}`,\n}\n\nexport interface WorkspaceSwitcherProps {\n workspace: ShellWorkspace\n /** Other workspaces to jump to (the app orders and caps them). */\n recent?: ShellRecentWorkspace[]\n /** Icon-only trigger (the sidebar rail). */\n compact?: boolean\n /** `appbar`: the phone app bar's title, name + chevron on one line. */\n variant?: 'sidebar' | 'appbar'\n onSwitch: (workspace: ShellWorkspace) => void\n /** Return to the workspaces list; leaves the workspace open. */\n onGoToList: () => void\n onNewWorkspace: () => void\n /**\n * When set, \"New workspace\" is shown disabled with this explanation under it (e.g. the user may\n * not create workspaces on this deployment).\n */\n newWorkspaceDisabledReason?: string\n /** Entity nouns and menu strings; any subset (the nouns default to workspace(s)). */\n labels?: Partial<WorkspaceSwitcherLabels>\n className?: string\n /** Trigger id (default `workspace-switcher-trigger`). */\n testId?: string\n /**\n * Part ids; defaults are the current ids. `switchItem`, `type` and `lastSeen` are prefixes\n * (`<prefix>-<workspace id>`).\n */\n testIds?: Partial<Record<'menu' | 'all' | 'new' | 'switchItem' | 'type' | 'lastSeen', string>>\n /** Ids forwarded to the trigger's workspace identity. */\n identityTestIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * The current-workspace control as a dropdown: \"All workspaces\", \"New workspace\", then the\n * recent workspaces to jump straight into.\n */\nexport function WorkspaceSwitcher({\n workspace,\n recent = [],\n compact = false,\n variant = 'sidebar',\n onSwitch,\n onGoToList,\n onNewWorkspace,\n newWorkspaceDisabledReason,\n labels,\n className,\n testId,\n testIds,\n identityTestIds,\n}: WorkspaceSwitcherProps) {\n const l = { ...DEFAULT_WORKSPACE_SWITCHER_LABELS, ...labels }\n const plural = l.plural.toLowerCase()\n const singular = l.singular.charAt(0).toUpperCase() + l.singular.slice(1)\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"workspace-switcher\"\n data-testid={testIdOr(testId, { testId: 'workspace-switcher-trigger' })}\n aria-label={l.switchWorkspace(workspace.name, plural)}\n className={cn(\n 'group flex min-w-0 items-center rounded-md transition-colors duration-100 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n variant === 'appbar'\n ? 'h-11 max-w-full gap-1 px-2'\n : compact\n ? 'h-12 w-12 justify-center'\n : 'h-12 w-full px-2',\n className\n )}\n >\n {variant === 'appbar' ? (\n <span className=\"min-w-0 truncate text-base font-semibold text-foreground\">\n {workspace.name}\n </span>\n ) : (\n <WorkspaceIdentity\n workspace={workspace}\n expanded={!compact}\n labels={l}\n testIds={identityTestIds}\n />\n )}\n {!(compact && variant === 'sidebar') && (\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ml-auto size-4 flex-shrink-0 text-muted-foreground transition-transform duration-150 group-data-[state=open]:rotate-180\"\n />\n )}\n </button>\n </DropdownMenuTrigger>\n {/* Expanded menus follow the trigger width so they stay inside the sidebar. */}\n <DropdownMenuContent\n align=\"start\"\n className={cn(\n 'border-0 max-w-[calc(100vw-1.5rem)]',\n variant === 'sidebar' && !compact\n ? 'w-[var(--radix-dropdown-menu-trigger-width)]'\n : 'w-60'\n )}\n data-testid={testIdOr(testIds?.menu, { testId: 'workspace-switcher-menu' })}\n >\n <DropdownMenuItem\n onClick={onGoToList}\n data-testid={testIdOr(testIds?.all, { testId: 'workspace-switcher-all' })}\n className=\"gap-2\"\n >\n <LayoutGrid className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n {l.allWorkspaces(plural)}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={newWorkspaceDisabledReason ? undefined : onNewWorkspace}\n disabled={!!newWorkspaceDisabledReason}\n title={newWorkspaceDisabledReason}\n data-testid={testIdOr(testIds?.new, { testId: 'workspace-switcher-new' })}\n className=\"gap-2\"\n >\n <Plus className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"flex min-w-0 flex-col\">\n {l.newWorkspace(singular)}\n {newWorkspaceDisabledReason && (\n <span className=\"text-xs text-muted-foreground\">{newWorkspaceDisabledReason}</span>\n )}\n </span>\n </DropdownMenuItem>\n {recent.length > 0 && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"text-xs font-normal text-muted-foreground\">\n {l.recentWorkspaces(plural)}\n </DropdownMenuLabel>\n {recent.map((w) => {\n const kind = workspaceKindMeta(w.kind, l)\n return (\n <DropdownMenuItem\n key={w.id}\n onClick={() => onSwitch(w)}\n data-testid={prefixedTestId(testIds?.switchItem, w.id, {\n testId: `workspace-switch-${w.id}`,\n })}\n className=\"gap-2\"\n >\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-6 flex-shrink-0 items-center justify-center rounded text-xs font-semibold leading-none',\n kind.fill\n )}\n >\n {w.name.charAt(0).toUpperCase()}\n </span>\n <span className=\"absolute -bottom-1 -right-1 flex size-3 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={prefixedTestId(testIds?.type, w.id, {\n testId: `workspace-type-${w.id}`,\n })}\n className=\"size-2 text-muted-foreground\"\n />\n </span>\n </span>\n <span className=\"min-w-0 flex-1 truncate capitalize\">{w.name}</span>\n {w.lastSeen && (\n <span\n className=\"ml-2 flex-shrink-0 text-xs tabular-nums text-muted-foreground\"\n data-testid={prefixedTestId(testIds?.lastSeen, w.id, {\n testId: `workspace-last-seen-${w.id}`,\n })}\n >\n {w.lastSeen}\n </span>\n )}\n </DropdownMenuItem>\n )\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import { useRef, type ReactNode } from 'react'\nimport { Menu } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ActionLink } from '../components/ActionLink'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { useShellBottomInset } from '../lib/bottom-inset'\nimport type { NavItem } from './types'\n\n/** Fixed strings of the phone bars. */\nexport interface MobileBarsLabels {\n /** The menu button (the `menuLabel` prop wins). */\n openNavigationMenu: string\n /** The tab bar's accessible name (the `label` prop wins). */\n workspaceSections: string\n}\n\nexport const DEFAULT_MOBILE_BARS_LABELS: MobileBarsLabels = {\n openNavigationMenu: 'Open navigation menu',\n workspaceSections: 'Workspace sections',\n}\n\nexport interface MobileAppBarProps {\n /** Show the menu button that opens the drawer (nothing to open on a list page with no sidebar). */\n showMenu?: boolean\n onMenu?: () => void\n /** Replaces the brand mark (e.g. the workspace switcher). */\n title?: ReactNode\n /** Brand mark shown when there is no `title`. */\n logo?: ReactNode\n /** Right-aligned controls that fit (ask, offline pill, bell, account). */\n actions?: ReactNode\n menuLabel?: string\n labels?: Partial<Pick<MobileBarsLabels, 'openNavigationMenu'>>\n className?: string\n 'data-testid'?: string\n /** Menu button id (default `mobile-nav-toggle`). */\n menuTestId?: string\n}\n\n/**\n * The slim phone app bar (56px): menu button, a title slot and an actions slot. The app mounts\n * it only on small screens; the controls that do not fit live in the drawer.\n */\nexport function MobileAppBar({\n showMenu = true,\n onMenu,\n title,\n logo,\n actions,\n menuLabel,\n labels,\n className,\n 'data-testid': testId,\n menuTestId,\n}: MobileAppBarProps) {\n return (\n <div\n data-slot=\"mobile-app-bar\"\n data-testid={testId}\n className={cn(\n 'sm:hidden flex h-14 flex-shrink-0 items-center gap-1 bg-background pl-1 pr-2 pt-safe',\n className\n )}\n >\n {showMenu && (\n <button\n type=\"button\"\n onClick={onMenu}\n className=\"flex size-11 shrink-0 items-center justify-center rounded-md text-foreground transition-colors hover:bg-muted\"\n aria-label={\n menuLabel ?? labels?.openNavigationMenu ?? DEFAULT_MOBILE_BARS_LABELS.openNavigationMenu\n }\n data-testid={testIdOr(menuTestId, { testId: 'mobile-nav-toggle' })}\n >\n <Menu className=\"size-5\" />\n </button>\n )}\n <div className={cn('flex min-w-0 flex-1 items-center', !showMenu && 'pl-3')}>\n {title ?? logo}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-0.5\">{actions}</div>}\n </div>\n )\n}\n\n/**\n * A tab's label. It wraps at word boundaries and is never clipped or cut with an ellipsis; a tab\n * narrower than 4.5rem sets it one size smaller so a long single word still fits, and an item with\n * a `shortLabel` shows that one while its tab is narrower than 5.5rem.\n */\nfunction TabLabel({ item }: { item: NavItem }) {\n const wrap =\n 'max-w-full text-balance px-0.5 text-center [overflow-wrap:normal] @max-[4.5rem]:text-[10px]'\n if (!item.shortLabel) return <span className={wrap}>{item.label}</span>\n return (\n <>\n <span data-slot=\"tab-short-label\" aria-hidden=\"true\" className={cn(wrap, '@[5.5rem]:hidden')}>\n {item.shortLabel}\n </span>\n <span className={cn(wrap, 'hidden @[5.5rem]:block')}>{item.label}</span>\n <span className=\"sr-only @[5.5rem]:hidden\">{item.label}</span>\n </>\n )\n}\n\nexport interface MobileTabBarProps {\n /** The workspace's main areas; test ids are `{testIdPrefix}-{id}` (prefix default `mobile-tab`). */\n items: NavItem[]\n label?: string\n labels?: Partial<Pick<MobileBarsLabels, 'workspaceSections'>>\n testIdPrefix?: string\n className?: string\n 'data-testid'?: string\n}\n\n/**\n * Phone bottom navigation: a 64px tinted bar of the main areas. The drawer carries the same\n * destinations with counts, so nothing is reachable only here. The app mounts it on small\n * screens only.\n */\nexport function MobileTabBar({\n items,\n label,\n labels,\n testIdPrefix,\n className,\n 'data-testid': testId,\n}: MobileTabBarProps) {\n const navRef = useRef<HTMLElement>(null)\n // Floating elements (install prompt, toasts) read the bar's height from `--shell-bottom-inset`.\n useShellBottomInset(navRef)\n return (\n <nav\n ref={navRef}\n aria-label={\n label ?? labels?.workspaceSections ?? DEFAULT_MOBILE_BARS_LABELS.workspaceSections\n }\n data-slot=\"mobile-tab-bar\"\n data-testid={testIdOr(testId, { testId: 'mobile-tab-bar' })}\n className={cn(\n 'flex min-h-16 flex-shrink-0 items-stretch bg-sidebar px-2 pb-safe sm:hidden',\n className\n )}\n >\n {items.map((item) => (\n <ActionLink\n key={item.id}\n href={item.href}\n external={item.external}\n onSelect={item.onSelect}\n disabled={item.disabled}\n aria-current={item.active ? 'page' : undefined}\n className={cn(\n // Each tab is a size container: a `shortLabel` replaces the label when it is narrow.\n '@container flex min-h-12 min-w-0 flex-1 flex-col items-center justify-center gap-0.5 rounded-md text-[11px] leading-tight transition-colors',\n item.active\n ? 'font-semibold text-primary'\n : 'font-medium text-muted-foreground hover:text-foreground'\n )}\n data-testid={prefixedTestId(testIdPrefix, item.id, { testId: `mobile-tab-${item.id}` })}\n >\n {item.icon}\n <TabLabel item={item} />\n </ActionLink>\n ))}\n </nav>\n )\n}\n","/**\n * One policy for every automatic reload: when the running build is out of date, pick a moment\n * that costs the user nothing.\n *\n * After a deploy (or mid-rollout, while old and new pods both serve) the previous build's hashed\n * chunks can 404. Vite reports that as `vite:preloadError`. Reloading fetches the current\n * index.html (served no-cache) and its chunks, but reloading at once throws away whatever the\n * user is typing, so:\n *\n * - A failed prefetch (`prefetchChunk`) never reloads. Nothing on screen depends on it.\n * - A failed chunk the user is waiting for reloads at once, unless the user is on a sign-in form\n * or has unsaved input (a focused or edited field, or a `[data-reload-guard]` region).\n * - Otherwise the reload waits: the next route navigation becomes a full page load of its target,\n * or the page reloads once the user is idle with nothing unsaved.\n * - Per tab, at most one policy reload a minute. A second failure right after one is not a stale\n * build (a genuinely missing chunk, say), so it surfaces to the error boundary instead of looping.\n */\n\nimport { notify } from '@arbidocs/react/shell'\n\nexport const CHUNK_RELOAD_KEY = 'arbi_chunk_reload_at'\n\n/** A second failure within this window after a reload is not a stale build: let it surface. */\nconst RELOAD_GUARD_MS = 60_000\n/** A deferred reload waits until the user has done nothing for this long. */\nconst IDLE_MS = 10_000\nconst IDLE_CHECK_MS = 2_000\n\n/** Sign-in pages, and regions a host marks as holding unsaved work. */\nconst GUARD_SELECTOR =\n '[data-slot=\"auth-layout\"], input[type=\"password\"], input[autocomplete=\"one-time-code\"], [data-reload-guard]'\nconst NON_TEXT_INPUTS = new Set([\n 'button',\n 'submit',\n 'reset',\n 'checkbox',\n 'radio',\n 'hidden',\n 'range',\n 'color',\n 'file',\n 'image',\n])\n\nexport interface ReloadPolicyDeps {\n /** Reload the current page. */\n reload: () => void\n /** Full page load of `url` (instead of a client-side navigation). */\n load: (url: string, replace: boolean) => void\n now: () => number\n}\n\nconst browserDeps: ReloadPolicyDeps = {\n reload: () => window.location.reload(),\n load: (url, replace) => (replace ? window.location.replace(url) : window.location.assign(url)),\n now: () => Date.now(),\n}\n\nlet deps = browserDeps\nlet installed = false\n/** The build is out of date: the next route navigation loads the page fresh. */\nlet stale = false\n/** A chunk the user needed failed: reload as soon as nothing would be lost. */\nlet reloadWanted = false\nlet lastActivity = 0\nlet idleTimer: ReturnType<typeof setInterval> | undefined\nlet restoreNavigation: (() => void) | null = null\n/** Fields the user typed into. */\nconst edited = new Set<Element>()\n/** Errors from `prefetchChunk` loads, so the preload-error handler can tell them apart. */\nconst prefetchFailures = new WeakSet<object>()\n\nfunction isTextField(el: Element): boolean {\n if (el instanceof HTMLInputElement) return !NON_TEXT_INPUTS.has(el.type)\n return el instanceof HTMLTextAreaElement || (el as HTMLElement).isContentEditable === true\n}\n\nfunction hasText(el: Element): boolean {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n return el.value.trim() !== ''\n }\n return (el.textContent ?? '').trim() !== ''\n}\n\n/**\n * Whether reloading now could cost the user something: a sign-in form, a `[data-reload-guard]`\n * region, a focused text field, or a field they typed into that still holds text.\n */\nexport function hasUnsavedInput(doc: Document = document): boolean {\n if (doc.querySelector(GUARD_SELECTOR)) return true\n const active = doc.activeElement\n if (active && active !== doc.body && isTextField(active)) return true\n for (const el of edited) {\n if (!el.isConnected) edited.delete(el)\n else if (hasText(el)) return true\n }\n return false\n}\n\n/** Take this tab's reload slot. False within the guard window, or when storage can't record it. */\nfunction claimReload(): boolean {\n const now = deps.now()\n let last = 0\n try {\n last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n } catch {\n // Unreadable: treat as never reloaded. Writing below decides.\n }\n if (last && now - last < RELOAD_GUARD_MS) return false\n try {\n sessionStorage.setItem(CHUNK_RELOAD_KEY, String(now))\n } catch {\n // Without the guard we can't tell a loop from a stale build: don't risk one.\n return false\n }\n return true\n}\n\nfunction guardHot(): boolean {\n try {\n const last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n return !!last && deps.now() - last < RELOAD_GUARD_MS\n } catch {\n return false\n }\n}\n\nfunction settle(): void {\n stale = false\n reloadWanted = false\n if (idleTimer !== undefined) clearInterval(idleTimer)\n idleTimer = undefined\n restoreNavigation?.()\n restoreNavigation = null\n}\n\nfunction reloadNow(): boolean {\n if (!claimReload()) {\n settle()\n return false\n }\n settle()\n deps.reload()\n return true\n}\n\n/** A client-side navigation to `url` becomes a full page load of it while the build is stale. */\nfunction loadsFresh(url: string | URL | null | undefined): string | null {\n if (!stale || url == null) return null\n const target = new URL(String(url), window.location.href)\n if (target.pathname === window.location.pathname) return null\n // Leaving a sign-in page establishes the session: a full load there races its persistence.\n if (document.querySelector(GUARD_SELECTOR)) return null\n return target.href\n}\n\nfunction interceptNavigation(): void {\n if (restoreNavigation) return\n const history = window.history\n const push = history.pushState\n const replace = history.replaceState\n let shownPath = window.location.pathname\n const wrap = (original: History['pushState'], replaceEntry: boolean): History['pushState'] =>\n function (this: History, data, unused, url) {\n const target = loadsFresh(url)\n if (target && claimReload()) {\n settle()\n deps.load(target, replaceEntry)\n return\n }\n original.call(this, data, unused, url)\n shownPath = window.location.pathname\n }\n history.pushState = wrap(push, false)\n history.replaceState = wrap(replace, true)\n // Back/forward already changed the address: reloading loads that target.\n const onPopState = () => {\n if (window.location.pathname === shownPath) return\n shownPath = window.location.pathname\n if (!document.querySelector(GUARD_SELECTOR)) reloadNow()\n }\n window.addEventListener('popstate', onPopState)\n restoreNavigation = () => {\n history.pushState = push\n history.replaceState = replace\n window.removeEventListener('popstate', onPopState)\n }\n}\n\nfunction watchForIdle(): void {\n if (idleTimer !== undefined) return\n idleTimer = setInterval(() => {\n if (!reloadWanted) return\n const idle = document.visibilityState === 'hidden' || deps.now() - lastActivity >= IDLE_MS\n if (idle && !hasUnsavedInput()) reloadNow()\n }, IDLE_CHECK_MS)\n}\n\n/**\n * The running build is out of date (a chunk 404'd, or a new service worker took over): the next\n * route navigation loads its target fresh instead of rendering it client-side.\n */\nexport function markBuildStale(): void {\n stale = true\n interceptNavigation()\n}\n\nexport type ReloadOutcome = 'reloaded' | 'deferred' | 'guarded'\n\n/**\n * Reload onto the current build when nothing would be lost; otherwise defer to the next route\n * navigation or to the moment the user is idle with nothing unsaved. `guarded` means a policy\n * reload just happened in this tab, so the failure should surface instead.\n */\nexport function requestReload(): ReloadOutcome {\n if (guardHot()) return 'guarded'\n if (!hasUnsavedInput()) return reloadNow() ? 'reloaded' : 'guarded'\n reloadWanted = true\n markBuildStale()\n watchForIdle()\n return 'deferred'\n}\n\n/**\n * Load a chunk ahead of need (warming a route the user may open next). Never rejects, and a\n * failure never reloads the page: it only marks the build stale so the next navigation loads\n * fresh.\n */\nexport function prefetchChunk(load: () => Promise<unknown>): Promise<void> {\n let loading: Promise<unknown>\n try {\n loading = load()\n } catch (error) {\n loading = Promise.reject(error)\n }\n return loading.then(\n () => undefined,\n (error: unknown) => {\n if (typeof error === 'object' && error !== null) prefetchFailures.add(error)\n }\n )\n}\n\nfunction decide(payload: unknown): void {\n const prefetch = typeof payload === 'object' && payload !== null && prefetchFailures.has(payload)\n // Offline the chunk simply couldn't be downloaded (it isn't cached yet). Reloading can't fix\n // that and would throw away what's on screen; say what happened instead, and let the failed\n // import reach the nearest error boundary as usual.\n if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n if (!prefetch) {\n notify.warning(\"This part of ARBI isn't available offline yet\", {\n description: 'Reconnect to open it. Once you have, it will work offline too.',\n })\n }\n return\n }\n markBuildStale()\n if (prefetch) return\n const outcome = requestReload()\n console.warn(`[chunk] A code chunk failed to load (stale build?): ${outcome}`, payload)\n}\n\n/**\n * The `vite:preloadError` handler. Decides once the failed import's own handlers have run, so a\n * `prefetchChunk` failure is known as one. Never cancels the event: the import rejects as usual\n * and, if a reload follows, the page is replaced anyway.\n */\nexport function handleChunkLoadError(event: Event): void {\n const payload = (event as Event & { payload?: unknown }).payload\n setTimeout(() => decide(payload), 0)\n}\n\nfunction onActivity(event: Event): void {\n lastActivity = deps.now()\n if (event.type === 'input' && event.target instanceof Element && isTextField(event.target)) {\n edited.add(event.target)\n }\n}\n\nconst ACTIVITY_EVENTS = ['input', 'keydown', 'pointerdown', 'wheel', 'touchstart'] as const\n\n/** Install the reload policy. Call once at startup; later calls are no-ops. */\nexport function installReloadPolicy(overrides: Partial<ReloadPolicyDeps> = {}): void {\n deps = { ...browserDeps, ...overrides }\n if (installed || typeof window === 'undefined') return\n installed = true\n lastActivity = deps.now()\n window.addEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) {\n document.addEventListener(type, onActivity, { capture: true, passive: true })\n }\n}\n\n/** Undo `installReloadPolicy` and forget all state (tests). */\nexport function resetReloadPolicy(): void {\n settle()\n edited.clear()\n if (installed) {\n window.removeEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) document.removeEventListener(type, onActivity, true)\n }\n installed = false\n deps = browserDeps\n}\n"]}
1
+ {"version":3,"sources":["../src/shell/Workspace.tsx","../src/shell/MobileBars.tsx","../src/shell/reload-policy.ts"],"names":["Globe","Users","Lock","jsxs","jsx","testIdOr","cn","Fragment","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuItem","LayoutGrid","Plus","DropdownMenuSeparator","DropdownMenuLabel","prefixedTestId","Menu","useRef","useShellBottomInset","ActionLink","notify"],"mappings":"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","file":"chunk-4NPCDS2X.cjs","sourcesContent":["import type { ComponentType } from 'react'\nimport { ChevronDown, Globe, LayoutGrid, Lock, Plus, Users } from 'lucide-react'\nimport {\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport type { ShellRecentWorkspace, ShellWorkspace, ShellWorkspaceKind } from './types'\n\n/** The three workspace-kind names (badge title, type glyph name, subtitle). */\nexport interface WorkspaceKindLabels {\n common: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_WORKSPACE_KIND_LABELS: WorkspaceKindLabels = {\n common: 'Common',\n shared: 'Shared',\n private: 'Private',\n}\n\n/**\n * Workspace type drives the initial-badge fill and a quiet secondary glyph:\n * private (just you) -> navy, lock shared (several) -> selection tint, people\n * common (public) -> neutral, globe\n * Navy is identity and cyan is reserved for ARBI/AI, so \"shared\" is the selection tint.\n */\nexport function workspaceKindMeta(\n kind: ShellWorkspaceKind,\n labels?: Partial<WorkspaceKindLabels>\n): {\n Icon: ComponentType<{ className?: string; 'aria-label'?: string; 'data-testid'?: string }>\n label: string\n fill: string\n} {\n const l = { ...DEFAULT_WORKSPACE_KIND_LABELS, ...labels }\n if (kind === 'common')\n return { Icon: Globe, label: l.common, fill: 'bg-muted text-muted-foreground' }\n if (kind === 'shared')\n return { Icon: Users, label: l.shared, fill: 'bg-secondary text-secondary-foreground' }\n return { Icon: Lock, label: l.private, fill: 'bg-primary text-primary-foreground' }\n}\n\n/** The kind's hue as a CSS colour, for glyphs painted by SVG fill (the workspace shield). */\nexport function workspaceKindColor(kind: ShellWorkspaceKind): string {\n if (kind === 'common') return 'var(--color-muted-foreground)'\n if (kind === 'shared') return 'var(--color-secondary)'\n return 'var(--color-primary)'\n}\n\n/** Overridable ids of the workspace identity; defaults are the current ids. */\ntype WorkspaceIdentityTestIds = Partial<Record<'initial' | 'type' | 'projectName', string>>\n\nexport interface WorkspaceIdentityProps {\n workspace: ShellWorkspace\n /** Show name + type/project line beside the badge; otherwise the badge alone. */\n expanded: boolean\n /** Selected (nav-row) styling of the name. */\n isActive?: boolean\n /** Reword the kind names. */\n labels?: Partial<WorkspaceKindLabels>\n /** Part ids; defaults are the current ids. */\n testIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * Non-interactive guts of the workspace head: the initial badge (with a tiny type glyph) and,\n * when expanded, the name and the project/type line. Hosted by the switcher trigger and by the\n * workspace settings header, so it never nests a button.\n */\nexport function WorkspaceIdentity({\n workspace,\n expanded,\n isActive = false,\n labels,\n testIds,\n}: WorkspaceIdentityProps) {\n const kind = workspaceKindMeta(workspace.kind, labels)\n const badge = (\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n data-testid={testIdOr(testIds?.initial, { testId: 'sidebar-workspace-card-initial' })}\n className={cn(\n 'flex size-7 flex-shrink-0 items-center justify-center rounded-md text-sm font-semibold leading-none',\n kind.fill\n )}\n >\n {workspace.name.charAt(0).toUpperCase()}\n </span>\n {/* Type as a tiny overlay on the badge: status reads at the icon, not after the name. */}\n <span className=\"absolute -bottom-1 -right-1 flex size-3.5 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={testIdOr(testIds?.type, { testId: 'sidebar-workspace-card-type' })}\n className=\"size-2.5 text-muted-foreground\"\n />\n </span>\n </span>\n )\n\n if (!expanded)\n return <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n\n return (\n <>\n <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n <div className=\"ml-2.5 flex min-w-0 flex-1 flex-col text-left\">\n <span\n // 600: the name of the thing you are inside, above a lighter project line.\n className={cn(\n 'min-w-0 truncate text-left text-sm font-semibold capitalize leading-tight transition-colors duration-100',\n isActive ? 'text-accent-foreground' : 'text-foreground'\n )}\n >\n {workspace.name}\n </span>\n {!workspace.projectName && (\n <span className=\"mt-0.5 truncate text-xs text-muted-foreground\">{kind.label}</span>\n )}\n {workspace.projectName && (\n <span\n className=\"mt-0.5 flex min-w-0\"\n data-testid={testIdOr(testIds?.projectName, {\n testId: 'sidebar-workspace-card-project-name',\n })}\n >\n {workspace.projectLine ?? (\n <span className=\"truncate text-xs text-muted-foreground\">\n {workspace.projectName}\n </span>\n )}\n </span>\n )}\n </div>\n </>\n )\n}\n\n/**\n * Entity nouns plus the switcher's strings. `plural` arrives lowercased and `singular`\n * capitalized in the functions below.\n */\nexport interface WorkspaceSwitcherLabels extends WorkspaceKindLabels {\n /** Entity nouns, e.g. { plural: 'workspaces', singular: 'workspace' }. */\n plural: string\n singular: string\n /** The trigger's accessible name. */\n switchWorkspace: (name: string, plural: string) => string\n allWorkspaces: (plural: string) => string\n newWorkspace: (singular: string) => string\n recentWorkspaces: (plural: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_SWITCHER_LABELS: WorkspaceSwitcherLabels = {\n ...DEFAULT_WORKSPACE_KIND_LABELS,\n plural: 'workspaces',\n singular: 'workspace',\n switchWorkspace: (name, plural) => `${name} — switch ${plural}`,\n allWorkspaces: (plural) => `All ${plural}`,\n newWorkspace: (singular) => `New ${singular}`,\n recentWorkspaces: (plural) => `Recent ${plural}`,\n}\n\nexport interface WorkspaceSwitcherProps {\n workspace: ShellWorkspace\n /** Other workspaces to jump to (the app orders and caps them). */\n recent?: ShellRecentWorkspace[]\n /** Icon-only trigger (the sidebar rail). */\n compact?: boolean\n /** `appbar`: the phone app bar's title, name + chevron on one line. */\n variant?: 'sidebar' | 'appbar'\n onSwitch: (workspace: ShellWorkspace) => void\n /** Return to the workspaces list; leaves the workspace open. */\n onGoToList: () => void\n onNewWorkspace: () => void\n /**\n * When set, \"New workspace\" is shown disabled with this explanation under it (e.g. the user may\n * not create workspaces on this deployment).\n */\n newWorkspaceDisabledReason?: string\n /** Entity nouns and menu strings; any subset (the nouns default to workspace(s)). */\n labels?: Partial<WorkspaceSwitcherLabels>\n className?: string\n /** Trigger id (default `workspace-switcher-trigger`). */\n testId?: string\n /**\n * Part ids; defaults are the current ids. `switchItem`, `type` and `lastSeen` are prefixes\n * (`<prefix>-<workspace id>`).\n */\n testIds?: Partial<Record<'menu' | 'all' | 'new' | 'switchItem' | 'type' | 'lastSeen', string>>\n /** Ids forwarded to the trigger's workspace identity. */\n identityTestIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * The current-workspace control as a dropdown: \"All workspaces\", \"New workspace\", then the\n * recent workspaces to jump straight into.\n */\nexport function WorkspaceSwitcher({\n workspace,\n recent = [],\n compact = false,\n variant = 'sidebar',\n onSwitch,\n onGoToList,\n onNewWorkspace,\n newWorkspaceDisabledReason,\n labels,\n className,\n testId,\n testIds,\n identityTestIds,\n}: WorkspaceSwitcherProps) {\n const l = { ...DEFAULT_WORKSPACE_SWITCHER_LABELS, ...labels }\n const plural = l.plural.toLowerCase()\n const singular = l.singular.charAt(0).toUpperCase() + l.singular.slice(1)\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"workspace-switcher\"\n data-testid={testIdOr(testId, { testId: 'workspace-switcher-trigger' })}\n aria-label={l.switchWorkspace(workspace.name, plural)}\n className={cn(\n 'group flex min-w-0 items-center rounded-md transition-colors duration-100 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n variant === 'appbar'\n ? 'h-11 max-w-full gap-1 px-2'\n : compact\n ? 'h-12 w-12 justify-center'\n : 'h-12 w-full px-2',\n className\n )}\n >\n {variant === 'appbar' ? (\n <span className=\"min-w-0 truncate text-base font-semibold text-foreground\">\n {workspace.name}\n </span>\n ) : (\n <WorkspaceIdentity\n workspace={workspace}\n expanded={!compact}\n labels={l}\n testIds={identityTestIds}\n />\n )}\n {!(compact && variant === 'sidebar') && (\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ml-auto size-4 flex-shrink-0 text-muted-foreground transition-transform duration-150 group-data-[state=open]:rotate-180\"\n />\n )}\n </button>\n </DropdownMenuTrigger>\n {/* Expanded menus follow the trigger width so they stay inside the sidebar. */}\n <DropdownMenuContent\n align=\"start\"\n className={cn(\n 'border-0 max-w-[calc(100vw-1.5rem)]',\n variant === 'sidebar' && !compact\n ? 'w-[var(--radix-dropdown-menu-trigger-width)]'\n : 'w-60'\n )}\n data-testid={testIdOr(testIds?.menu, { testId: 'workspace-switcher-menu' })}\n >\n <DropdownMenuItem\n onClick={onGoToList}\n data-testid={testIdOr(testIds?.all, { testId: 'workspace-switcher-all' })}\n className=\"gap-2\"\n >\n <LayoutGrid className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n {l.allWorkspaces(plural)}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={newWorkspaceDisabledReason ? undefined : onNewWorkspace}\n disabled={!!newWorkspaceDisabledReason}\n title={newWorkspaceDisabledReason}\n data-testid={testIdOr(testIds?.new, { testId: 'workspace-switcher-new' })}\n className=\"gap-2\"\n >\n <Plus className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"flex min-w-0 flex-col\">\n {l.newWorkspace(singular)}\n {newWorkspaceDisabledReason && (\n <span className=\"text-xs text-muted-foreground\">{newWorkspaceDisabledReason}</span>\n )}\n </span>\n </DropdownMenuItem>\n {recent.length > 0 && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"text-xs font-normal text-muted-foreground\">\n {l.recentWorkspaces(plural)}\n </DropdownMenuLabel>\n {recent.map((w) => {\n const kind = workspaceKindMeta(w.kind, l)\n return (\n <DropdownMenuItem\n key={w.id}\n onClick={() => onSwitch(w)}\n data-testid={prefixedTestId(testIds?.switchItem, w.id, {\n testId: `workspace-switch-${w.id}`,\n })}\n className=\"gap-2\"\n >\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-6 flex-shrink-0 items-center justify-center rounded text-xs font-semibold leading-none',\n kind.fill\n )}\n >\n {w.name.charAt(0).toUpperCase()}\n </span>\n <span className=\"absolute -bottom-1 -right-1 flex size-3 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={prefixedTestId(testIds?.type, w.id, {\n testId: `workspace-type-${w.id}`,\n })}\n className=\"size-2 text-muted-foreground\"\n />\n </span>\n </span>\n <span className=\"min-w-0 flex-1 truncate capitalize\">{w.name}</span>\n {w.lastSeen && (\n <span\n className=\"ml-2 flex-shrink-0 text-xs tabular-nums text-muted-foreground\"\n data-testid={prefixedTestId(testIds?.lastSeen, w.id, {\n testId: `workspace-last-seen-${w.id}`,\n })}\n >\n {w.lastSeen}\n </span>\n )}\n </DropdownMenuItem>\n )\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import { useRef, type ReactNode } from 'react'\nimport { Menu } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ActionLink } from '../components/ActionLink'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { useShellBottomInset } from '../lib/bottom-inset'\nimport type { NavItem } from './types'\n\n/** Fixed strings of the phone bars. */\nexport interface MobileBarsLabels {\n /** The menu button (the `menuLabel` prop wins). */\n openNavigationMenu: string\n /** The tab bar's accessible name (the `label` prop wins). */\n workspaceSections: string\n}\n\nexport const DEFAULT_MOBILE_BARS_LABELS: MobileBarsLabels = {\n openNavigationMenu: 'Open navigation menu',\n workspaceSections: 'Workspace sections',\n}\n\nexport interface MobileAppBarProps {\n /** Show the menu button that opens the drawer (nothing to open on a list page with no sidebar). */\n showMenu?: boolean\n onMenu?: () => void\n /** Replaces the brand mark (e.g. the workspace switcher). */\n title?: ReactNode\n /** Brand mark shown when there is no `title`. */\n logo?: ReactNode\n /** Right-aligned controls that fit (ask, offline pill, bell, account). */\n actions?: ReactNode\n menuLabel?: string\n labels?: Partial<Pick<MobileBarsLabels, 'openNavigationMenu'>>\n className?: string\n 'data-testid'?: string\n /** Menu button id (default `mobile-nav-toggle`). */\n menuTestId?: string\n}\n\n/**\n * The slim phone app bar (56px): menu button, a title slot and an actions slot. The app mounts\n * it only on small screens; the controls that do not fit live in the drawer.\n */\nexport function MobileAppBar({\n showMenu = true,\n onMenu,\n title,\n logo,\n actions,\n menuLabel,\n labels,\n className,\n 'data-testid': testId,\n menuTestId,\n}: MobileAppBarProps) {\n return (\n <div\n data-slot=\"mobile-app-bar\"\n data-testid={testId}\n className={cn(\n 'sm:hidden flex h-14 flex-shrink-0 items-center gap-1 bg-background pl-1 pr-2 pt-safe',\n className\n )}\n >\n {showMenu && (\n <button\n type=\"button\"\n onClick={onMenu}\n className=\"flex size-11 shrink-0 items-center justify-center rounded-md text-foreground transition-colors hover:bg-muted\"\n aria-label={\n menuLabel ?? labels?.openNavigationMenu ?? DEFAULT_MOBILE_BARS_LABELS.openNavigationMenu\n }\n data-testid={testIdOr(menuTestId, { testId: 'mobile-nav-toggle' })}\n >\n <Menu className=\"size-5\" />\n </button>\n )}\n <div className={cn('flex min-w-0 flex-1 items-center', !showMenu && 'pl-3')}>\n {title ?? logo}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-0.5\">{actions}</div>}\n </div>\n )\n}\n\n/**\n * A tab's label. It wraps at word boundaries and is never clipped or cut with an ellipsis; a tab\n * narrower than 4.5rem sets it one size smaller so a long single word still fits, and an item with\n * a `shortLabel` shows that one while its tab is narrower than 5.5rem.\n */\nfunction TabLabel({ item }: { item: NavItem }) {\n const wrap =\n 'max-w-full text-balance px-0.5 text-center [overflow-wrap:normal] @max-[4.5rem]:text-[10px]'\n if (!item.shortLabel) return <span className={wrap}>{item.label}</span>\n return (\n <>\n <span data-slot=\"tab-short-label\" aria-hidden=\"true\" className={cn(wrap, '@[5.5rem]:hidden')}>\n {item.shortLabel}\n </span>\n <span className={cn(wrap, 'hidden @[5.5rem]:block')}>{item.label}</span>\n <span className=\"sr-only @[5.5rem]:hidden\">{item.label}</span>\n </>\n )\n}\n\nexport interface MobileTabBarProps {\n /** The workspace's main areas; test ids are `{testIdPrefix}-{id}` (prefix default `mobile-tab`). */\n items: NavItem[]\n label?: string\n labels?: Partial<Pick<MobileBarsLabels, 'workspaceSections'>>\n testIdPrefix?: string\n className?: string\n 'data-testid'?: string\n}\n\n/**\n * Phone bottom navigation: a 64px tinted bar of the main areas. The drawer carries the same\n * destinations with counts, so nothing is reachable only here. The app mounts it on small\n * screens only.\n */\nexport function MobileTabBar({\n items,\n label,\n labels,\n testIdPrefix,\n className,\n 'data-testid': testId,\n}: MobileTabBarProps) {\n const navRef = useRef<HTMLElement>(null)\n // Floating elements (install prompt, toasts) read the bar's height from `--shell-bottom-inset`.\n useShellBottomInset(navRef)\n return (\n <nav\n ref={navRef}\n aria-label={\n label ?? labels?.workspaceSections ?? DEFAULT_MOBILE_BARS_LABELS.workspaceSections\n }\n data-slot=\"mobile-tab-bar\"\n data-testid={testIdOr(testId, { testId: 'mobile-tab-bar' })}\n className={cn(\n 'flex min-h-16 flex-shrink-0 items-stretch bg-sidebar px-2 pb-safe sm:hidden',\n className\n )}\n >\n {items.map((item) => (\n <ActionLink\n key={item.id}\n href={item.href}\n external={item.external}\n onSelect={item.onSelect}\n disabled={item.disabled}\n aria-current={item.active ? 'page' : undefined}\n className={cn(\n // Each tab is a size container: a `shortLabel` replaces the label when it is narrow.\n '@container flex min-h-12 min-w-0 flex-1 flex-col items-center justify-center gap-0.5 rounded-md text-[11px] leading-tight transition-colors',\n item.active\n ? 'font-semibold text-primary'\n : 'font-medium text-muted-foreground hover:text-foreground'\n )}\n data-testid={prefixedTestId(testIdPrefix, item.id, { testId: `mobile-tab-${item.id}` })}\n >\n {item.icon}\n <TabLabel item={item} />\n </ActionLink>\n ))}\n </nav>\n )\n}\n","/**\n * One policy for every automatic reload: when the running build is out of date, pick a moment\n * that costs the user nothing.\n *\n * After a deploy (or mid-rollout, while old and new pods both serve) the previous build's hashed\n * chunks can 404. Vite reports that as `vite:preloadError`. Reloading fetches the current\n * index.html (served no-cache) and its chunks, but reloading at once throws away whatever the\n * user is typing, so:\n *\n * - A failed prefetch (`prefetchChunk`) never reloads. Nothing on screen depends on it.\n * - A failed chunk the user is waiting for reloads at once, unless the user is on a sign-in form\n * or has unsaved input (a focused or edited field, or a `[data-reload-guard]` region).\n * - Otherwise the reload waits: the next route navigation becomes a full page load of its target,\n * or the page reloads once the user is idle with nothing unsaved.\n * - Per tab, at most one policy reload a minute. A second failure right after one is not a stale\n * build (a genuinely missing chunk, say), so it surfaces to the error boundary instead of looping.\n */\n\nimport { notify } from '@arbidocs/react/shell'\n\nexport const CHUNK_RELOAD_KEY = 'arbi_chunk_reload_at'\n\n/** A second failure within this window after a reload is not a stale build: let it surface. */\nconst RELOAD_GUARD_MS = 60_000\n/** A deferred reload waits until the user has done nothing for this long. */\nconst IDLE_MS = 10_000\nconst IDLE_CHECK_MS = 2_000\n\n/** Sign-in pages, and regions a host marks as holding unsaved work. */\nconst GUARD_SELECTOR =\n '[data-slot=\"auth-layout\"], input[type=\"password\"], input[autocomplete=\"one-time-code\"], [data-reload-guard]'\nconst NON_TEXT_INPUTS = new Set([\n 'button',\n 'submit',\n 'reset',\n 'checkbox',\n 'radio',\n 'hidden',\n 'range',\n 'color',\n 'file',\n 'image',\n])\n\nexport interface ReloadPolicyDeps {\n /** Reload the current page. */\n reload: () => void\n /** Full page load of `url` (instead of a client-side navigation). */\n load: (url: string, replace: boolean) => void\n now: () => number\n}\n\nconst browserDeps: ReloadPolicyDeps = {\n reload: () => window.location.reload(),\n load: (url, replace) => (replace ? window.location.replace(url) : window.location.assign(url)),\n now: () => Date.now(),\n}\n\nlet deps = browserDeps\nlet installed = false\n/** The build is out of date: the next route navigation loads the page fresh. */\nlet stale = false\n/** A chunk the user needed failed: reload as soon as nothing would be lost. */\nlet reloadWanted = false\nlet lastActivity = 0\nlet idleTimer: ReturnType<typeof setInterval> | undefined\nlet restoreNavigation: (() => void) | null = null\n/** Fields the user typed into. */\nconst edited = new Set<Element>()\n/** Errors from `prefetchChunk` loads, so the preload-error handler can tell them apart. */\nconst prefetchFailures = new WeakSet<object>()\n\nfunction isTextField(el: Element): boolean {\n if (el instanceof HTMLInputElement) return !NON_TEXT_INPUTS.has(el.type)\n return el instanceof HTMLTextAreaElement || (el as HTMLElement).isContentEditable === true\n}\n\nfunction hasText(el: Element): boolean {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n return el.value.trim() !== ''\n }\n return (el.textContent ?? '').trim() !== ''\n}\n\n/**\n * Whether reloading now could cost the user something: a sign-in form, a `[data-reload-guard]`\n * region, a focused text field, or a field they typed into that still holds text.\n */\nexport function hasUnsavedInput(doc: Document = document): boolean {\n if (doc.querySelector(GUARD_SELECTOR)) return true\n const active = doc.activeElement\n if (active && active !== doc.body && isTextField(active)) return true\n for (const el of edited) {\n if (!el.isConnected) edited.delete(el)\n else if (hasText(el)) return true\n }\n return false\n}\n\n/** Take this tab's reload slot. False within the guard window, or when storage can't record it. */\nfunction claimReload(): boolean {\n const now = deps.now()\n let last = 0\n try {\n last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n } catch {\n // Unreadable: treat as never reloaded. Writing below decides.\n }\n if (last && now - last < RELOAD_GUARD_MS) return false\n try {\n sessionStorage.setItem(CHUNK_RELOAD_KEY, String(now))\n } catch {\n // Without the guard we can't tell a loop from a stale build: don't risk one.\n return false\n }\n return true\n}\n\nfunction guardHot(): boolean {\n try {\n const last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n return !!last && deps.now() - last < RELOAD_GUARD_MS\n } catch {\n return false\n }\n}\n\nfunction settle(): void {\n stale = false\n reloadWanted = false\n if (idleTimer !== undefined) clearInterval(idleTimer)\n idleTimer = undefined\n restoreNavigation?.()\n restoreNavigation = null\n}\n\nfunction reloadNow(): boolean {\n if (!claimReload()) {\n settle()\n return false\n }\n settle()\n deps.reload()\n return true\n}\n\n/** A client-side navigation to `url` becomes a full page load of it while the build is stale. */\nfunction loadsFresh(url: string | URL | null | undefined): string | null {\n if (!stale || url == null) return null\n const target = new URL(String(url), window.location.href)\n if (target.pathname === window.location.pathname) return null\n // Leaving a sign-in page establishes the session: a full load there races its persistence.\n if (document.querySelector(GUARD_SELECTOR)) return null\n return target.href\n}\n\nfunction interceptNavigation(): void {\n if (restoreNavigation) return\n const history = window.history\n const push = history.pushState\n const replace = history.replaceState\n let shownPath = window.location.pathname\n const wrap = (original: History['pushState'], replaceEntry: boolean): History['pushState'] =>\n function (this: History, data, unused, url) {\n const target = loadsFresh(url)\n if (target && claimReload()) {\n settle()\n deps.load(target, replaceEntry)\n return\n }\n original.call(this, data, unused, url)\n shownPath = window.location.pathname\n }\n history.pushState = wrap(push, false)\n history.replaceState = wrap(replace, true)\n // Back/forward already changed the address: reloading loads that target.\n const onPopState = () => {\n if (window.location.pathname === shownPath) return\n shownPath = window.location.pathname\n if (!document.querySelector(GUARD_SELECTOR)) reloadNow()\n }\n window.addEventListener('popstate', onPopState)\n restoreNavigation = () => {\n history.pushState = push\n history.replaceState = replace\n window.removeEventListener('popstate', onPopState)\n }\n}\n\nfunction watchForIdle(): void {\n if (idleTimer !== undefined) return\n idleTimer = setInterval(() => {\n if (!reloadWanted) return\n const idle = document.visibilityState === 'hidden' || deps.now() - lastActivity >= IDLE_MS\n if (idle && !hasUnsavedInput()) reloadNow()\n }, IDLE_CHECK_MS)\n}\n\n/**\n * The running build is out of date (a chunk 404'd, or a new service worker took over): the next\n * route navigation loads its target fresh instead of rendering it client-side.\n */\nexport function markBuildStale(): void {\n stale = true\n interceptNavigation()\n}\n\nexport type ReloadOutcome = 'reloaded' | 'deferred' | 'guarded'\n\n/**\n * Reload onto the current build when nothing would be lost; otherwise defer to the next route\n * navigation or to the moment the user is idle with nothing unsaved. `guarded` means a policy\n * reload just happened in this tab, so the failure should surface instead.\n */\nexport function requestReload(): ReloadOutcome {\n if (guardHot()) return 'guarded'\n if (!hasUnsavedInput()) return reloadNow() ? 'reloaded' : 'guarded'\n reloadWanted = true\n markBuildStale()\n watchForIdle()\n return 'deferred'\n}\n\n/**\n * Load a chunk ahead of need (warming a route the user may open next). Never rejects, and a\n * failure never reloads the page: it only marks the build stale so the next navigation loads\n * fresh.\n */\nexport function prefetchChunk(load: () => Promise<unknown>): Promise<void> {\n let loading: Promise<unknown>\n try {\n loading = load()\n } catch (error) {\n loading = Promise.reject(error)\n }\n return loading.then(\n () => undefined,\n (error: unknown) => {\n if (typeof error === 'object' && error !== null) prefetchFailures.add(error)\n }\n )\n}\n\nfunction decide(payload: unknown): void {\n const prefetch = typeof payload === 'object' && payload !== null && prefetchFailures.has(payload)\n // Offline the chunk simply couldn't be downloaded (it isn't cached yet). Reloading can't fix\n // that and would throw away what's on screen; say what happened instead, and let the failed\n // import reach the nearest error boundary as usual.\n if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n if (!prefetch) {\n notify.warning(\"This part of ARBI isn't available offline yet\", {\n description: 'Reconnect to open it. Once you have, it will work offline too.',\n })\n }\n return\n }\n markBuildStale()\n if (prefetch) return\n const outcome = requestReload()\n console.warn(`[chunk] A code chunk failed to load (stale build?): ${outcome}`, payload)\n}\n\n/**\n * The `vite:preloadError` handler. Decides once the failed import's own handlers have run, so a\n * `prefetchChunk` failure is known as one. Never cancels the event: the import rejects as usual\n * and, if a reload follows, the page is replaced anyway.\n */\nexport function handleChunkLoadError(event: Event): void {\n const payload = (event as Event & { payload?: unknown }).payload\n setTimeout(() => decide(payload), 0)\n}\n\nfunction onActivity(event: Event): void {\n lastActivity = deps.now()\n if (event.type === 'input' && event.target instanceof Element && isTextField(event.target)) {\n edited.add(event.target)\n }\n}\n\nconst ACTIVITY_EVENTS = ['input', 'keydown', 'pointerdown', 'wheel', 'touchstart'] as const\n\n/** Install the reload policy. Call once at startup; later calls are no-ops. */\nexport function installReloadPolicy(overrides: Partial<ReloadPolicyDeps> = {}): void {\n deps = { ...browserDeps, ...overrides }\n if (installed || typeof window === 'undefined') return\n installed = true\n lastActivity = deps.now()\n window.addEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) {\n document.addEventListener(type, onActivity, { capture: true, passive: true })\n }\n}\n\n/** Undo `installReloadPolicy` and forget all state (tests). */\nexport function resetReloadPolicy(): void {\n settle()\n edited.clear()\n if (installed) {\n window.removeEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) document.removeEventListener(type, onActivity, true)\n }\n installed = false\n deps = browserDeps\n}\n"]}
@@ -1,15 +1,15 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkZZZ6AZDR_cjs = require('./chunk-ZZZ6AZDR.cjs');
5
- var chunkENUZ35NR_cjs = require('./chunk-ENUZ35NR.cjs');
4
+ var chunk3ODEWSRO_cjs = require('./chunk-3ODEWSRO.cjs');
5
+ var chunkP5AQYC4D_cjs = require('./chunk-P5AQYC4D.cjs');
6
6
  var chunk4IOYQLKG_cjs = require('./chunk-4IOYQLKG.cjs');
7
7
  var chunkHSLPFBK2_cjs = require('./chunk-HSLPFBK2.cjs');
8
8
  var chunkQGVOT7E4_cjs = require('./chunk-QGVOT7E4.cjs');
9
- var chunkIE677C4I_cjs = require('./chunk-IE677C4I.cjs');
10
- var chunkT7J352JD_cjs = require('./chunk-T7J352JD.cjs');
11
- var chunk6YOZKXV6_cjs = require('./chunk-6YOZKXV6.cjs');
12
- var chunkU5T46QCS_cjs = require('./chunk-U5T46QCS.cjs');
9
+ var chunkSBWIA4PL_cjs = require('./chunk-SBWIA4PL.cjs');
10
+ var chunkQMIHLJMH_cjs = require('./chunk-QMIHLJMH.cjs');
11
+ var chunkJR2YSBD5_cjs = require('./chunk-JR2YSBD5.cjs');
12
+ var chunkTKHCIHE2_cjs = require('./chunk-TKHCIHE2.cjs');
13
13
  var ui = require('@arbidocs/react/ui');
14
14
  var lucideReact = require('lucide-react');
15
15
  var react = require('@arbidocs/react');
@@ -41,10 +41,10 @@ function useConnectedThreadActivity(conversationId) {
41
41
  const { data: docs = [] } = react.useDocuments();
42
42
  const activity = react.useConversationActivity(conversationId ?? void 0, { live: true });
43
43
  const { messageHistory } = react.useConversationData();
44
- const environment = chunkU5T46QCS_cjs.useBlocksEnvironment();
44
+ const environment = chunkTKHCIHE2_cjs.useBlocksEnvironment();
45
45
  const { openDocument, openMail } = environment;
46
46
  const navigateToConversation = (id, messageId) => environment.openConversation(id, messageId ? { messageId } : void 0);
47
- const openWorkflow = chunkENUZ35NR_cjs.useOpenWorkflow();
47
+ const openWorkflow = chunkP5AQYC4D_cjs.useOpenWorkflow();
48
48
  const assistantCopy = shell.useAssistantCopy();
49
49
  const workspaceExtId = react.useArbiSessionState((s) => s.workspaceId);
50
50
  const task = conversations.find((c) => c.external_id === conversationId);
@@ -88,7 +88,7 @@ function useConnectedThreadActivity(conversationId) {
88
88
  recipients,
89
89
  event.actor_ext_id
90
90
  ) : [];
91
- const callDetail = event.kind === "call" ? chunkT7J352JD_cjs.parseCallLogDetail(event.detail) : null;
91
+ const callDetail = event.kind === "call" ? chunkQMIHLJMH_cjs.parseCallLogDetail(event.detail) : null;
92
92
  const recordingCall = event.kind === "recording" && typeof event.detail?.call_ext_id === "string" ? event.detail.call_ext_id : null;
93
93
  const recordingId = typeof event.detail?.recording_ext_id === "string" ? event.detail.recording_ext_id : null;
94
94
  return {
@@ -98,7 +98,7 @@ function useConnectedThreadActivity(conversationId) {
98
98
  step: typeof event.detail?.step === "string" ? event.detail.step : void 0,
99
99
  createdAt: event.created_at,
100
100
  card: callDetail ? /* @__PURE__ */ jsxRuntime.jsx(
101
- chunkIE677C4I_cjs.ThreadCallLogCard,
101
+ chunkSBWIA4PL_cjs.ThreadCallLogCard,
102
102
  {
103
103
  detail: callDetail,
104
104
  name: personName,
@@ -106,7 +106,7 @@ function useConnectedThreadActivity(conversationId) {
106
106
  time: ui.formatRelativeTime(event.created_at, { style: "short" })
107
107
  }
108
108
  ) : recordingCall ? /* @__PURE__ */ jsxRuntime.jsx(
109
- chunkIE677C4I_cjs.RecordingCard,
109
+ chunkSBWIA4PL_cjs.RecordingCard,
110
110
  {
111
111
  callExtId: recordingCall,
112
112
  recordingExtId: recordingId,
@@ -130,7 +130,7 @@ function useConnectedThreadActivity(conversationId) {
130
130
  stepChip: eventStep ? stepChipOf(eventStep, event.kind, stepDocument) : void 0,
131
131
  // No avatar tooltip: the entry is already a button (or titled row) that carries the same
132
132
  // details, and a tooltip trigger inside it would be a nested <button>.
133
- avatar: assistant ? /* @__PURE__ */ jsxRuntime.jsx(chunk4IOYQLKG_cjs.AssistantEntity, { variant: "icon", size: 20, showTooltip: false }) : member ? /* @__PURE__ */ jsxRuntime.jsx(chunkZZZ6AZDR_cjs.DocumentUser, { user: member, tooltip: false }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, { className: "size-4 text-muted-foreground" }),
133
+ avatar: assistant ? /* @__PURE__ */ jsxRuntime.jsx(chunk4IOYQLKG_cjs.AssistantEntity, { variant: "icon", size: 20, showTooltip: false }) : member ? /* @__PURE__ */ jsxRuntime.jsx(chunk3ODEWSRO_cjs.DocumentUser, { user: member, tooltip: false }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, { className: "size-4 text-muted-foreground" }),
134
134
  time: ui.formatRelativeTime(event.created_at, { style: "short" }),
135
135
  exactTime: ui.formatFriendlyDate(event.created_at),
136
136
  onOpenDocument: docId && doc ? () => openDocument(docId) : void 0,
@@ -205,7 +205,7 @@ function useConnectedThreadActivity(conversationId) {
205
205
  return { activity, items, related, signals, startedBy };
206
206
  }
207
207
  function useSelectWorkspace() {
208
- const connection = chunk6YOZKXV6_cjs.useOptionalConnection();
208
+ const connection = chunkJR2YSBD5_cjs.useOptionalConnection();
209
209
  const { switchWorkspace } = react.useSwitchWorkspace();
210
210
  return react$1.useCallback(
211
211
  async (id) => {
@@ -218,5 +218,5 @@ function useSelectWorkspace() {
218
218
 
219
219
  exports.useConnectedThreadActivity = useConnectedThreadActivity;
220
220
  exports.useSelectWorkspace = useSelectWorkspace;
221
- //# sourceMappingURL=chunk-ONZOVO2B.cjs.map
222
- //# sourceMappingURL=chunk-ONZOVO2B.cjs.map
221
+ //# sourceMappingURL=chunk-57EE6CMW.cjs.map
222
+ //# sourceMappingURL=chunk-57EE6CMW.cjs.map