@flamingo-stack/openframe-frontend-core 0.0.710 → 0.0.712

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 (534) hide show
  1. package/dist/chunk-2NASBO7O.js +1137 -0
  2. package/dist/{chunk-RQRX4YC3.cjs → chunk-2RKFMUNW.cjs} +46 -46
  3. package/dist/chunk-2Y7QZAB2.cjs +158 -0
  4. package/dist/chunk-34I6XI3N.js +136 -0
  5. package/dist/chunk-3K5ZLZE7.js +292 -0
  6. package/dist/chunk-3LU4UFPS.cjs +14 -0
  7. package/dist/{chunk-YBUT4AMG.cjs → chunk-3RKBJT6K.cjs} +8 -6
  8. package/dist/{chunk-LNW45N2C.js → chunk-3SEEGNRE.js} +35 -27
  9. package/dist/{chunk-L6Y6OOKG.cjs → chunk-3UAJLO5U.cjs} +41 -39
  10. package/dist/chunk-4HJRHEXD.cjs +1612 -0
  11. package/dist/{chunk-JPG7OHEG.js → chunk-4QFWGLZO.js} +1 -1
  12. package/dist/chunk-4R2L3DSA.js +14 -0
  13. package/dist/{chunk-36BCTE7D.js → chunk-4UYKNOZG.js} +12 -10
  14. package/dist/{chunk-DA5UDTLG.js → chunk-5SDELRH3.js} +5 -5
  15. package/dist/{chunk-CZSZSDD4.js → chunk-5Y72YQEK.js} +22 -113
  16. package/dist/{chunk-KUC673HM.js → chunk-6T3BTD6Q.js} +204 -982
  17. package/dist/{chunk-F57ECE2I.js → chunk-6YPTUHM7.js} +4 -4
  18. package/dist/{chunk-TDYIREDJ.js → chunk-7HNYYNKE.js} +28 -22
  19. package/dist/{chunk-2G7UYK35.cjs → chunk-7NSU5EQD.cjs} +57 -148
  20. package/dist/chunk-AAYNCJMW.cjs +48 -0
  21. package/dist/{chunk-FXJ3WWUB.js → chunk-ADBE7QF3.js} +5 -252
  22. package/dist/chunk-AECTRMGQ.cjs +334 -0
  23. package/dist/chunk-AGVXKD4K.js +334 -0
  24. package/dist/chunk-AL2GUHAJ.cjs +18 -0
  25. package/dist/{chunk-WMX26HB5.js → chunk-APJZBDQN.js} +12 -12
  26. package/dist/chunk-AUMKE74M.cjs +16 -0
  27. package/dist/chunk-B4NCVYEQ.cjs +292 -0
  28. package/dist/{chunk-2RNB5DTN.cjs → chunk-BXSRTBLU.cjs} +82 -54
  29. package/dist/chunk-CMGFZHCN.js +233 -0
  30. package/dist/chunk-CMZ3QTFQ.js +1207 -0
  31. package/dist/chunk-CPA2CKRZ.cjs +125 -0
  32. package/dist/{chunk-B73373AG.cjs → chunk-CSCJU6YC.cjs} +35 -33
  33. package/dist/chunk-CYUUHFXL.js +41 -0
  34. package/dist/chunk-DC4RTYWK.cjs +1122 -0
  35. package/dist/{chunk-6YKAT7NV.js → chunk-DDWFCWOE.js} +5 -7
  36. package/dist/{chunk-F5FF4DME.js → chunk-EFNKS5W4.js} +322 -428
  37. package/dist/{chunk-2KXTOP6G.cjs → chunk-EOKSKJSS.cjs} +25 -83
  38. package/dist/{chunk-6NTPY5QA.cjs → chunk-ETYLOZOB.cjs} +978 -2413
  39. package/dist/chunk-F5BPGWGT.cjs +931 -0
  40. package/dist/{chunk-4L6XCMOU.js → chunk-FCAVAEHF.js} +8277 -9990
  41. package/dist/chunk-FFT56TYB.cjs +401 -0
  42. package/dist/chunk-FYEJTF5Y.js +125 -0
  43. package/dist/chunk-G3GRYDMS.js +16 -0
  44. package/dist/{chunk-MR3A4MZV.js → chunk-G3OMVCID.js} +13 -7
  45. package/dist/chunk-G6OHIX5C.cjs +100 -0
  46. package/dist/{chunk-UDFRUKLC.cjs → chunk-GEDY7HQI.cjs} +2 -2
  47. package/dist/chunk-GQ7JJUIT.cjs +1207 -0
  48. package/dist/chunk-H3PKYE4N.js +18 -0
  49. package/dist/{chunk-CNWOMQQJ.js → chunk-H5R7U2D2.js} +206 -5
  50. package/dist/{chunk-SEXWHIMS.cjs → chunk-HETQETPV.cjs} +9648 -9680
  51. package/dist/{chunk-Y2GSOUCS.cjs → chunk-HWVUR735.cjs} +2 -2
  52. package/dist/chunk-II4QMH26.cjs +35 -0
  53. package/dist/chunk-ILNN6QRW.js +1612 -0
  54. package/dist/chunk-IYVFSLWJ.js +931 -0
  55. package/dist/{chunk-3AHTOSXJ.cjs → chunk-JGCFRTND.cjs} +23 -17
  56. package/dist/chunk-JHQ334WS.js +655 -0
  57. package/dist/{chunk-WCVZCGK5.cjs → chunk-JO5TLJPM.cjs} +129 -907
  58. package/dist/{chunk-JRU2CXLB.cjs → chunk-JVCAK4W3.cjs} +210 -9
  59. package/dist/chunk-KBJJQFYU.js +1122 -0
  60. package/dist/chunk-KEKCQENI.js +48 -0
  61. package/dist/chunk-KHXZFLIN.cjs +41 -0
  62. package/dist/chunk-KT3U3ZRP.cjs +1137 -0
  63. package/dist/chunk-L2VUINHN.js +35 -0
  64. package/dist/{chunk-P42V6N34.cjs → chunk-L6ZQGWCX.cjs} +4521 -6234
  65. package/dist/{chunk-PLYEKV3N.cjs → chunk-MA4Q5RBP.cjs} +6 -6
  66. package/dist/{chunk-SS5MBHDP.js → chunk-N67XG5GY.js} +10 -8
  67. package/dist/chunk-NPAQSMRY.js +2087 -0
  68. package/dist/{chunk-I3ST4PLM.js → chunk-NQWJAOHO.js} +6 -4
  69. package/dist/{chunk-QAOFMK2A.cjs → chunk-OBZJICEA.cjs} +8 -8
  70. package/dist/{chunk-6IW7TWPV.js → chunk-OPYODNV2.js} +3 -3
  71. package/dist/chunk-P3JMAMHP.js +401 -0
  72. package/dist/chunk-PPXR22YC.cjs +2087 -0
  73. package/dist/chunk-PSVSEN4J.cjs +655 -0
  74. package/dist/{chunk-4UM2ETLM.js → chunk-RBYVFPER.js} +74 -46
  75. package/dist/{chunk-PO33GZVY.js → chunk-ROBQ5TR7.js} +10549 -10581
  76. package/dist/{chunk-ZCLBYT2V.cjs → chunk-T3CLXR43.cjs} +114 -220
  77. package/dist/{chunk-FI6GMDO7.js → chunk-TTVOLEUS.js} +3605 -5040
  78. package/dist/{chunk-LM7TXMLU.cjs → chunk-ULWVKHSI.cjs} +8 -255
  79. package/dist/{chunk-6I4ZAFO2.cjs → chunk-UT3ODMBU.cjs} +15 -15
  80. package/dist/chunk-WANCBTUE.js +71 -0
  81. package/dist/{chunk-BIZNSF3U.cjs → chunk-WBNAEYTQ.cjs} +2 -51
  82. package/dist/chunk-WFPCCBOM.cjs +71 -0
  83. package/dist/chunk-WI6FHKD7.js +158 -0
  84. package/dist/chunk-WMNCVLES.js +100 -0
  85. package/dist/{chunk-UT4YHQZW.js → chunk-WSDT7LYL.js} +0 -49
  86. package/dist/chunk-WVOTC7HW.cjs +136 -0
  87. package/dist/{chunk-AOWDNSTM.cjs → chunk-WWJG4GVG.cjs} +93 -87
  88. package/dist/chunk-XXBLN4BP.cjs +233 -0
  89. package/dist/{chunk-4IBPRIQH.js → chunk-YBQQNDC7.js} +1 -1
  90. package/dist/{chunk-LFFB6EMB.js → chunk-YBS5QGON.js} +70 -128
  91. package/dist/{chunk-NSGXARGJ.cjs → chunk-Z5SWJW5Q.cjs} +125 -117
  92. package/dist/{chunk-OJLR5MEO.cjs → chunk-ZX7SCPLO.cjs} +6 -8
  93. package/dist/cloud-tenants-KZUZGD4A.cjs +117 -0
  94. package/dist/cloud-tenants-OGLVVQ7X.js +117 -0
  95. package/dist/components/case-studies/index.cjs +45 -29
  96. package/dist/components/case-studies/index.js +32 -16
  97. package/dist/components/chat/ask-prompts.d.ts +64 -0
  98. package/dist/components/chat/ask-prompts.d.ts.map +1 -0
  99. package/dist/components/chat/entity-cards/case-study-card.d.ts +6 -3
  100. package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -1
  101. package/dist/components/chat/hooks/use-chat-dialog-manager.d.ts +4 -1
  102. package/dist/components/chat/hooks/use-chat-dialog-manager.d.ts.map +1 -1
  103. package/dist/components/chat/hooks/use-unified-chat.d.ts.map +1 -1
  104. package/dist/components/chat/index.cjs +27 -8
  105. package/dist/components/chat/index.d.ts +1 -0
  106. package/dist/components/chat/index.d.ts.map +1 -1
  107. package/dist/components/chat/index.js +57 -38
  108. package/dist/components/chat/quick-action-chip.d.ts +7 -3
  109. package/dist/components/chat/quick-action-chip.d.ts.map +1 -1
  110. package/dist/components/chat/types/component.types.d.ts +4 -0
  111. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  112. package/dist/components/chat/types/unified-chat-state.types.d.ts +12 -0
  113. package/dist/components/chat/types/unified-chat-state.types.d.ts.map +1 -1
  114. package/dist/components/contact/index.cjs +29 -13
  115. package/dist/components/contact/index.js +28 -12
  116. package/dist/components/docs/index.cjs +33 -16
  117. package/dist/components/docs/index.js +33 -16
  118. package/dist/components/docs/use-scroll-spy.d.ts +23 -1
  119. package/dist/components/docs/use-scroll-spy.d.ts.map +1 -1
  120. package/dist/components/embeds/index.cjs +29 -13
  121. package/dist/components/embeds/index.js +28 -12
  122. package/dist/components/faq/faq-section.d.ts +8 -1
  123. package/dist/components/faq/faq-section.d.ts.map +1 -1
  124. package/dist/components/faq/index.cjs +30 -14
  125. package/dist/components/faq/index.js +29 -13
  126. package/dist/components/features/array-entry-manager.d.ts +5 -1
  127. package/dist/components/features/array-entry-manager.d.ts.map +1 -1
  128. package/dist/components/features/board/board.d.ts +2 -0
  129. package/dist/components/features/board/board.d.ts.map +1 -1
  130. package/dist/components/features/board/ticket-card.d.ts.map +1 -1
  131. package/dist/components/features/board/touch-board.d.ts +1 -1
  132. package/dist/components/features/board/touch-board.d.ts.map +1 -1
  133. package/dist/components/features/board/types.d.ts +3 -0
  134. package/dist/components/features/board/types.d.ts.map +1 -1
  135. package/dist/components/features/board/use-board-collapse.d.ts +6 -1
  136. package/dist/components/features/board/use-board-collapse.d.ts.map +1 -1
  137. package/dist/components/features/capability-explorer.d.ts +94 -0
  138. package/dist/components/features/capability-explorer.d.ts.map +1 -0
  139. package/dist/components/features/cloud-tenants/index.d.ts +14 -0
  140. package/dist/components/features/cloud-tenants/index.d.ts.map +1 -0
  141. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts +9 -0
  142. package/dist/components/features/cloud-tenants/tenant-access-cell.d.ts.map +1 -0
  143. package/dist/components/features/cloud-tenants/tenant-cell.d.ts +8 -0
  144. package/dist/components/features/cloud-tenants/tenant-cell.d.ts.map +1 -0
  145. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts +9 -0
  146. package/dist/components/features/cloud-tenants/tenant-customer-cell.d.ts.map +1 -0
  147. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts +42 -0
  148. package/dist/components/features/cloud-tenants/tenant-presentation.d.ts.map +1 -0
  149. package/dist/components/features/cloud-tenants/tenant-row.d.ts +22 -0
  150. package/dist/components/features/cloud-tenants/tenant-row.d.ts.map +1 -0
  151. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts +42 -0
  152. package/dist/components/features/cloud-tenants/tenants-table-columns.d.ts.map +1 -0
  153. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts +26 -0
  154. package/dist/components/features/cloud-tenants/tenants-table-view.d.ts.map +1 -0
  155. package/dist/components/features/devices/device-last-online.d.ts +3 -0
  156. package/dist/components/features/devices/device-last-online.d.ts.map +1 -0
  157. package/dist/components/features/devices/device-name.d.ts +42 -0
  158. package/dist/components/features/devices/device-name.d.ts.map +1 -0
  159. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts +26 -0
  160. package/dist/components/features/devices/device-selector/device-selection-mode-radio.d.ts.map +1 -0
  161. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts +25 -0
  162. package/dist/components/features/devices/device-selector/device-selector-skeleton.d.ts.map +1 -0
  163. package/dist/components/features/devices/device-selector/device-selector.d.ts +38 -0
  164. package/dist/components/features/devices/device-selector/device-selector.d.ts.map +1 -0
  165. package/dist/components/features/devices/device-selector/device-selector.types.d.ts +133 -0
  166. package/dist/components/features/devices/device-selector/device-selector.types.d.ts.map +1 -0
  167. package/dist/components/features/devices/device-selector/narrowing.d.ts +13 -0
  168. package/dist/components/features/devices/device-selector/narrowing.d.ts.map +1 -0
  169. package/dist/components/features/devices/device-selector/use-device-selector.d.ts +17 -0
  170. package/dist/components/features/devices/device-selector/use-device-selector.d.ts.map +1 -0
  171. package/dist/components/features/devices/device-status.d.ts +23 -0
  172. package/dist/components/features/devices/device-status.d.ts.map +1 -0
  173. package/dist/components/features/devices/device-statuses.d.ts +40 -0
  174. package/dist/components/features/devices/device-statuses.d.ts.map +1 -0
  175. package/dist/components/features/devices/device-tags-filter-button.d.ts +22 -0
  176. package/dist/components/features/devices/device-tags-filter-button.d.ts.map +1 -0
  177. package/dist/components/features/devices/device-type-icon.d.ts +11 -0
  178. package/dist/components/features/devices/device-type-icon.d.ts.map +1 -0
  179. package/dist/components/features/devices/device-type-tile.d.ts +9 -0
  180. package/dist/components/features/devices/device-type-tile.d.ts.map +1 -0
  181. package/dist/components/features/devices/devices-filter-toolbar.d.ts +46 -0
  182. package/dist/components/features/devices/devices-filter-toolbar.d.ts.map +1 -0
  183. package/dist/components/features/devices/devices-grid-filters.d.ts +25 -0
  184. package/dist/components/features/devices/devices-grid-filters.d.ts.map +1 -0
  185. package/dist/components/features/devices/devices-grid.d.ts +12 -0
  186. package/dist/components/features/devices/devices-grid.d.ts.map +1 -0
  187. package/dist/components/features/devices/devices-list.d.ts +131 -0
  188. package/dist/components/features/devices/devices-list.d.ts.map +1 -0
  189. package/dist/components/features/devices/devices-panel-header.d.ts +46 -0
  190. package/dist/components/features/devices/devices-panel-header.d.ts.map +1 -0
  191. package/dist/components/features/devices/devices-panel-view.d.ts +79 -0
  192. package/dist/components/features/devices/devices-panel-view.d.ts.map +1 -0
  193. package/dist/components/features/devices/devices-table-columns.d.ts +76 -0
  194. package/dist/components/features/devices/devices-table-columns.d.ts.map +1 -0
  195. package/dist/components/features/devices/devices-view-config.d.ts +25 -0
  196. package/dist/components/features/devices/devices-view-config.d.ts.map +1 -0
  197. package/dist/components/features/devices/index.d.ts +24 -0
  198. package/dist/components/features/devices/index.d.ts.map +1 -0
  199. package/dist/components/features/devices/types.d.ts +68 -0
  200. package/dist/components/features/devices/types.d.ts.map +1 -0
  201. package/dist/components/features/devices/use-tag-filter-modal.d.ts +50 -0
  202. package/dist/components/features/devices/use-tag-filter-modal.d.ts.map +1 -0
  203. package/dist/components/features/index.cjs +227 -12
  204. package/dist/components/features/index.d.ts +7 -0
  205. package/dist/components/features/index.d.ts.map +1 -1
  206. package/dist/components/features/index.js +266 -51
  207. package/dist/components/features/knowledge-base/index.d.ts +7 -0
  208. package/dist/components/features/knowledge-base/index.d.ts.map +1 -0
  209. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts +44 -0
  210. package/dist/components/features/knowledge-base/knowledge-base-article-view.d.ts.map +1 -0
  211. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts +13 -0
  212. package/dist/components/features/knowledge-base/knowledge-base-item-icon.d.ts.map +1 -0
  213. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts +8 -0
  214. package/dist/components/features/knowledge-base/knowledge-base-status.d.ts.map +1 -0
  215. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts +52 -0
  216. package/dist/components/features/knowledge-base/knowledge-base-table.d.ts.map +1 -0
  217. package/dist/components/features/logs/index.d.ts +12 -0
  218. package/dist/components/features/logs/index.d.ts.map +1 -0
  219. package/dist/components/features/logs/log-drawer.d.ts +29 -0
  220. package/dist/components/features/logs/log-drawer.d.ts.map +1 -0
  221. package/dist/components/features/logs/log-source-labels.d.ts +11 -0
  222. package/dist/components/features/logs/log-source-labels.d.ts.map +1 -0
  223. package/dist/components/features/logs/logs-page-view.d.ts +32 -0
  224. package/dist/components/features/logs/logs-page-view.d.ts.map +1 -0
  225. package/dist/components/features/logs/logs-table-columns.d.ts +15 -0
  226. package/dist/components/features/logs/logs-table-columns.d.ts.map +1 -0
  227. package/dist/components/features/logs/logs-table-view.d.ts +64 -0
  228. package/dist/components/features/logs/logs-table-view.d.ts.map +1 -0
  229. package/dist/components/features/logs/types.d.ts +52 -0
  230. package/dist/components/features/logs/types.d.ts.map +1 -0
  231. package/dist/components/features/policies/compute-policy-summary.d.ts +37 -0
  232. package/dist/components/features/policies/compute-policy-summary.d.ts.map +1 -0
  233. package/dist/components/features/policies/index.d.ts +8 -0
  234. package/dist/components/features/policies/index.d.ts.map +1 -0
  235. package/dist/components/features/policies/policies-table.d.ts +34 -0
  236. package/dist/components/features/policies/policies-table.d.ts.map +1 -0
  237. package/dist/components/features/policies/policy-summary-cards.d.ts +17 -0
  238. package/dist/components/features/policies/policy-summary-cards.d.ts.map +1 -0
  239. package/dist/components/features/policies/policy-table-row.d.ts +37 -0
  240. package/dist/components/features/policies/policy-table-row.d.ts.map +1 -0
  241. package/dist/components/features/remote-session/index.d.ts +8 -0
  242. package/dist/components/features/remote-session/index.d.ts.map +1 -1
  243. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts +21 -0
  244. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts.map +1 -0
  245. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts +31 -0
  246. package/dist/components/features/remote-session/remote-desktop-chat-panel.d.ts.map +1 -0
  247. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts +21 -0
  248. package/dist/components/features/remote-session/remote-desktop-fullscreen-toolbar.d.ts.map +1 -0
  249. package/dist/components/features/remote-session/remote-desktop-view.d.ts +50 -0
  250. package/dist/components/features/remote-session/remote-desktop-view.d.ts.map +1 -0
  251. package/dist/components/features/software/index.d.ts +8 -0
  252. package/dist/components/features/software/index.d.ts.map +1 -0
  253. package/dist/components/features/software/package-managers.d.ts +30 -0
  254. package/dist/components/features/software/package-managers.d.ts.map +1 -0
  255. package/dist/components/features/software/package-search-field-placeholder.d.ts +7 -0
  256. package/dist/components/features/software/package-search-field-placeholder.d.ts.map +1 -0
  257. package/dist/components/features/software/schedule-fields.d.ts +34 -0
  258. package/dist/components/features/software/schedule-fields.d.ts.map +1 -0
  259. package/dist/components/features/software/software-action-copy.d.ts +25 -0
  260. package/dist/components/features/software/software-action-copy.d.ts.map +1 -0
  261. package/dist/components/features/software/software-action-form.d.ts +71 -0
  262. package/dist/components/features/software/software-action-form.d.ts.map +1 -0
  263. package/dist/components/features/software/software-row-fields.d.ts +23 -0
  264. package/dist/components/features/software/software-row-fields.d.ts.map +1 -0
  265. package/dist/components/features/software/software-row.d.ts +18 -0
  266. package/dist/components/features/software/software-row.d.ts.map +1 -0
  267. package/dist/components/features/sortable-list/index.d.ts +1 -0
  268. package/dist/components/features/sortable-list/index.d.ts.map +1 -1
  269. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts +21 -0
  270. package/dist/components/features/sortable-list/sortable-drag-handle.d.ts.map +1 -0
  271. package/dist/components/help-center-pages/index.cjs +133 -114
  272. package/dist/components/help-center-pages/index.js +58 -39
  273. package/dist/components/index.cjs +320 -82
  274. package/dist/components/index.js +451 -213
  275. package/dist/components/layout/page-heading.d.ts +12 -3
  276. package/dist/components/layout/page-heading.d.ts.map +1 -1
  277. package/dist/components/meeting-scheduler/index.cjs +120 -98
  278. package/dist/components/meeting-scheduler/index.js +50 -28
  279. package/dist/components/navigation/index.cjs +36 -17
  280. package/dist/components/navigation/index.d.ts +3 -0
  281. package/dist/components/navigation/index.d.ts.map +1 -1
  282. package/dist/components/navigation/index.js +36 -17
  283. package/dist/components/navigation/mingo-ai-button.d.ts +23 -10
  284. package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
  285. package/dist/components/navigation/sticky-section-nav.d.ts +14 -1
  286. package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
  287. package/dist/components/onboarding-guides/index.cjs +32 -16
  288. package/dist/components/onboarding-guides/index.js +31 -15
  289. package/dist/components/product-demo/cast.d.ts +58 -0
  290. package/dist/components/product-demo/cast.d.ts.map +1 -0
  291. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts +10 -0
  292. package/dist/components/product-demo/fixtures/cloud-tenants.d.ts.map +1 -0
  293. package/dist/components/product-demo/fixtures/devices.d.ts +14 -0
  294. package/dist/components/product-demo/fixtures/devices.d.ts.map +1 -0
  295. package/dist/components/product-demo/fixtures/knowledge.d.ts +14 -0
  296. package/dist/components/product-demo/fixtures/knowledge.d.ts.map +1 -0
  297. package/dist/components/product-demo/fixtures/logs.d.ts +15 -0
  298. package/dist/components/product-demo/fixtures/logs.d.ts.map +1 -0
  299. package/dist/components/product-demo/fixtures/policies.d.ts +13 -0
  300. package/dist/components/product-demo/fixtures/policies.d.ts.map +1 -0
  301. package/dist/components/product-demo/fixtures/remote-session.d.ts +20 -0
  302. package/dist/components/product-demo/fixtures/remote-session.d.ts.map +1 -0
  303. package/dist/components/product-demo/fixtures/shared.d.ts +156 -0
  304. package/dist/components/product-demo/fixtures/shared.d.ts.map +1 -0
  305. package/dist/components/product-demo/fixtures/software-update.d.ts +19 -0
  306. package/dist/components/product-demo/fixtures/software-update.d.ts.map +1 -0
  307. package/dist/components/product-demo/fixtures/tickets-board.d.ts +8 -0
  308. package/dist/components/product-demo/fixtures/tickets-board.d.ts.map +1 -0
  309. package/dist/components/product-demo/index.cjs +112 -0
  310. package/dist/components/product-demo/index.d.ts +6 -0
  311. package/dist/components/product-demo/index.d.ts.map +1 -0
  312. package/dist/components/product-demo/index.js +112 -0
  313. package/dist/components/product-demo/product-screen.d.ts +22 -0
  314. package/dist/components/product-demo/product-screen.d.ts.map +1 -0
  315. package/dist/components/product-demo/registry.d.ts +13 -0
  316. package/dist/components/product-demo/registry.d.ts.map +1 -0
  317. package/dist/components/product-demo/screen-keys.cjs +25 -0
  318. package/dist/components/product-demo/screen-keys.d.ts +27 -0
  319. package/dist/components/product-demo/screen-keys.d.ts.map +1 -0
  320. package/dist/components/product-demo/screen-keys.js +20 -0
  321. package/dist/components/product-demo/screens/cloud-tenants.d.ts +8 -0
  322. package/dist/components/product-demo/screens/cloud-tenants.d.ts.map +1 -0
  323. package/dist/components/product-demo/screens/devices.d.ts +10 -0
  324. package/dist/components/product-demo/screens/devices.d.ts.map +1 -0
  325. package/dist/components/product-demo/screens/knowledge.d.ts +9 -0
  326. package/dist/components/product-demo/screens/knowledge.d.ts.map +1 -0
  327. package/dist/components/product-demo/screens/logs.d.ts +4 -0
  328. package/dist/components/product-demo/screens/logs.d.ts.map +1 -0
  329. package/dist/components/product-demo/screens/policies.d.ts +8 -0
  330. package/dist/components/product-demo/screens/policies.d.ts.map +1 -0
  331. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts +11 -0
  332. package/dist/components/product-demo/screens/remote-desktop-picture.d.ts.map +1 -0
  333. package/dist/components/product-demo/screens/remote-session.d.ts +8 -0
  334. package/dist/components/product-demo/screens/remote-session.d.ts.map +1 -0
  335. package/dist/components/product-demo/screens/software-update.d.ts +12 -0
  336. package/dist/components/product-demo/screens/software-update.d.ts.map +1 -0
  337. package/dist/components/product-demo/screens/tickets-board.d.ts +4 -0
  338. package/dist/components/product-demo/screens/tickets-board.d.ts.map +1 -0
  339. package/dist/components/product-demo/types.d.ts +9 -0
  340. package/dist/components/product-demo/types.d.ts.map +1 -0
  341. package/dist/components/related-content/index.cjs +14 -8
  342. package/dist/components/related-content/index.js +13 -7
  343. package/dist/components/tickets/index.cjs +36 -20
  344. package/dist/components/tickets/index.js +35 -19
  345. package/dist/components/ui/file-manager/index.cjs +38 -34
  346. package/dist/components/ui/file-manager/index.js +8 -4
  347. package/dist/components/ui/index.cjs +57 -17
  348. package/dist/components/ui/index.d.ts +1 -0
  349. package/dist/components/ui/index.d.ts.map +1 -1
  350. package/dist/components/ui/index.js +141 -101
  351. package/dist/components/ui/product-screen-frame.d.ts +45 -0
  352. package/dist/components/ui/product-screen-frame.d.ts.map +1 -0
  353. package/dist/components/ui/radio-group.d.ts +5 -0
  354. package/dist/components/ui/radio-group.d.ts.map +1 -1
  355. package/dist/components/ui/snap-carousel.d.ts +11 -1
  356. package/dist/components/ui/snap-carousel.d.ts.map +1 -1
  357. package/dist/components/ui/tag.d.ts +1 -1
  358. package/dist/components/ui/tag.d.ts.map +1 -1
  359. package/dist/devices-LBMG42K6.js +81 -0
  360. package/dist/devices-YGYJIXQY.cjs +81 -0
  361. package/dist/hooks/index.cjs +17 -8
  362. package/dist/hooks/index.js +32 -23
  363. package/dist/hooks/ui/index.d.ts +1 -0
  364. package/dist/hooks/ui/index.d.ts.map +1 -1
  365. package/dist/hooks/ui/use-header-height.d.ts +12 -0
  366. package/dist/hooks/ui/use-header-height.d.ts.map +1 -1
  367. package/dist/hooks/ui/use-sticky-toolbar.d.ts +29 -0
  368. package/dist/hooks/ui/use-sticky-toolbar.d.ts.map +1 -0
  369. package/dist/hooks/use-location-hash.d.ts +2 -2
  370. package/dist/hooks/use-location-hash.d.ts.map +1 -1
  371. package/dist/hooks/use-scroll-to-hash.d.ts +7 -0
  372. package/dist/hooks/use-scroll-to-hash.d.ts.map +1 -1
  373. package/dist/index.cjs +276 -25
  374. package/dist/index.js +729 -478
  375. package/dist/knowledge-H5BIWJVI.js +108 -0
  376. package/dist/knowledge-KTCVJIWN.cjs +108 -0
  377. package/dist/logs-DB5Z7M5Q.js +216 -0
  378. package/dist/logs-RVCC2UQW.cjs +216 -0
  379. package/dist/policies-EWUULFBR.js +121 -0
  380. package/dist/policies-HV4IQCBV.cjs +121 -0
  381. package/dist/remote-session-GSGZOFDX.js +196 -0
  382. package/dist/remote-session-R6VAFESR.cjs +196 -0
  383. package/dist/software-update-6PXKRKBT.js +179 -0
  384. package/dist/software-update-D4OVSWSG.cjs +179 -0
  385. package/dist/tickets-board-BHLPAVNJ.cjs +137 -0
  386. package/dist/tickets-board-PYDNELSK.js +137 -0
  387. package/dist/types/case-study.d.ts +15 -1
  388. package/dist/types/case-study.d.ts.map +1 -1
  389. package/dist/utils/date-utils.d.ts +5 -0
  390. package/dist/utils/date-utils.d.ts.map +1 -1
  391. package/dist/utils/index.cjs +45 -2
  392. package/dist/utils/index.d.ts +2 -1
  393. package/dist/utils/index.d.ts.map +1 -1
  394. package/dist/utils/index.js +41 -3
  395. package/dist/utils/open-in-new-tab.d.ts +7 -0
  396. package/dist/utils/open-in-new-tab.d.ts.map +1 -0
  397. package/dist/utils/same-page-hash-nav.d.ts +31 -0
  398. package/dist/utils/same-page-hash-nav.d.ts.map +1 -1
  399. package/dist/utils/scroll-into-view.d.ts +14 -1
  400. package/dist/utils/scroll-into-view.d.ts.map +1 -1
  401. package/package.json +13 -1
  402. package/src/components/chat/ask-prompts.tsx +226 -0
  403. package/src/components/chat/embeddable-chat.tsx +38 -2
  404. package/src/components/chat/entity-cards/case-study-card.tsx +122 -46
  405. package/src/components/chat/hooks/use-chat-dialog-manager.ts +22 -4
  406. package/src/components/chat/hooks/use-unified-chat.ts +1 -0
  407. package/src/components/chat/index.ts +1 -0
  408. package/src/components/chat/quick-action-chip.tsx +33 -9
  409. package/src/components/chat/types/component.types.ts +4 -0
  410. package/src/components/chat/types/unified-chat-state.types.ts +13 -0
  411. package/src/components/docs/use-scroll-spy.ts +93 -18
  412. package/src/components/faq/faq-section.tsx +82 -43
  413. package/src/components/features/array-entry-manager.tsx +10 -1
  414. package/src/components/features/board/board.tsx +4 -1
  415. package/src/components/features/board/ticket-card.tsx +11 -1
  416. package/src/components/features/board/touch-board.tsx +2 -1
  417. package/src/components/features/board/types.ts +3 -0
  418. package/src/components/features/board/use-board-collapse.ts +7 -2
  419. package/src/components/features/capability-explorer.tsx +412 -0
  420. package/src/components/features/cloud-tenants/index.ts +28 -0
  421. package/src/components/features/cloud-tenants/tenant-access-cell.tsx +24 -0
  422. package/src/components/features/cloud-tenants/tenant-cell.tsx +26 -0
  423. package/src/components/features/cloud-tenants/tenant-customer-cell.tsx +27 -0
  424. package/src/components/features/cloud-tenants/tenant-presentation.ts +111 -0
  425. package/src/components/features/cloud-tenants/tenant-row.ts +21 -0
  426. package/src/components/features/cloud-tenants/tenants-table-columns.ts +30 -0
  427. package/src/components/features/cloud-tenants/tenants-table-view.tsx +142 -0
  428. package/src/components/features/devices/device-last-online.ts +6 -0
  429. package/src/components/features/devices/device-name.ts +51 -0
  430. package/src/components/features/devices/device-selector/device-selection-mode-radio.tsx +107 -0
  431. package/src/components/features/devices/device-selector/device-selector-skeleton.tsx +32 -0
  432. package/src/components/features/devices/device-selector/device-selector.tsx +799 -0
  433. package/src/components/features/devices/device-selector/device-selector.types.ts +138 -0
  434. package/src/components/features/devices/device-selector/narrowing.ts +33 -0
  435. package/src/components/features/devices/device-selector/use-device-selector.ts +51 -0
  436. package/src/components/features/devices/device-status.ts +102 -0
  437. package/src/components/features/devices/device-statuses.ts +88 -0
  438. package/src/components/features/devices/device-tags-filter-button.tsx +49 -0
  439. package/src/components/features/devices/device-type-icon.tsx +29 -0
  440. package/src/components/features/devices/device-type-tile.tsx +17 -0
  441. package/src/components/features/devices/devices-filter-toolbar.tsx +114 -0
  442. package/src/components/features/devices/devices-grid-filters.tsx +99 -0
  443. package/src/components/features/devices/devices-grid.tsx +86 -0
  444. package/src/components/features/devices/devices-list.tsx +357 -0
  445. package/src/components/features/devices/devices-panel-header.tsx +97 -0
  446. package/src/components/features/devices/devices-panel-view.tsx +261 -0
  447. package/src/components/features/devices/devices-table-columns.tsx +356 -0
  448. package/src/components/features/devices/devices-view-config.tsx +38 -0
  449. package/src/components/features/devices/index.ts +89 -0
  450. package/src/components/features/devices/types.ts +74 -0
  451. package/src/components/features/devices/use-tag-filter-modal.ts +109 -0
  452. package/src/components/features/index.ts +9 -0
  453. package/src/components/features/knowledge-base/index.ts +19 -0
  454. package/src/components/features/knowledge-base/knowledge-base-article-view.tsx +134 -0
  455. package/src/components/features/knowledge-base/knowledge-base-item-icon.ts +14 -0
  456. package/src/components/features/knowledge-base/knowledge-base-status.ts +12 -0
  457. package/src/components/features/knowledge-base/knowledge-base-table.tsx +180 -0
  458. package/src/components/features/logs/index.ts +20 -0
  459. package/src/components/features/logs/log-drawer.tsx +138 -0
  460. package/src/components/features/logs/log-source-labels.ts +25 -0
  461. package/src/components/features/logs/logs-page-view.tsx +100 -0
  462. package/src/components/features/logs/logs-table-columns.ts +16 -0
  463. package/src/components/features/logs/logs-table-view.tsx +509 -0
  464. package/src/components/features/logs/types.ts +71 -0
  465. package/src/components/features/policies/compute-policy-summary.ts +115 -0
  466. package/src/components/features/policies/index.ts +14 -0
  467. package/src/components/features/policies/policies-table.tsx +235 -0
  468. package/src/components/features/policies/policy-summary-cards.tsx +69 -0
  469. package/src/components/features/policies/policy-table-row.ts +37 -0
  470. package/src/components/features/remote-session/index.ts +8 -0
  471. package/src/components/features/remote-session/remote-desktop-chat-message-row.tsx +56 -0
  472. package/src/components/features/remote-session/remote-desktop-chat-panel.tsx +102 -0
  473. package/src/components/features/remote-session/remote-desktop-fullscreen-toolbar.tsx +119 -0
  474. package/src/components/features/remote-session/remote-desktop-view.tsx +209 -0
  475. package/src/components/features/software/index.ts +39 -0
  476. package/src/components/features/software/package-managers.ts +54 -0
  477. package/src/components/features/software/package-search-field-placeholder.tsx +23 -0
  478. package/src/components/features/software/schedule-fields.tsx +105 -0
  479. package/src/components/features/software/software-action-copy.ts +70 -0
  480. package/src/components/features/software/software-action-form.tsx +199 -0
  481. package/src/components/features/software/software-row-fields.tsx +105 -0
  482. package/src/components/features/software/software-row.ts +22 -0
  483. package/src/components/features/sortable-list/index.ts +1 -0
  484. package/src/components/features/sortable-list/sortable-drag-handle.tsx +41 -0
  485. package/src/components/layout/page-heading.tsx +23 -6
  486. package/src/components/navigation/index.ts +5 -0
  487. package/src/components/navigation/mingo-ai-button.tsx +37 -13
  488. package/src/components/navigation/sticky-section-nav.tsx +99 -1
  489. package/src/components/product-demo/cast.tsx +78 -0
  490. package/src/components/product-demo/fixtures/cloud-tenants.ts +63 -0
  491. package/src/components/product-demo/fixtures/devices.ts +87 -0
  492. package/src/components/product-demo/fixtures/knowledge.ts +48 -0
  493. package/src/components/product-demo/fixtures/logs.ts +103 -0
  494. package/src/components/product-demo/fixtures/policies.ts +77 -0
  495. package/src/components/product-demo/fixtures/remote-session.ts +65 -0
  496. package/src/components/product-demo/fixtures/shared.ts +53 -0
  497. package/src/components/product-demo/fixtures/software-update.ts +63 -0
  498. package/src/components/product-demo/fixtures/tickets-board.ts +100 -0
  499. package/src/components/product-demo/index.ts +7 -0
  500. package/src/components/product-demo/product-screen.tsx +94 -0
  501. package/src/components/product-demo/registry.ts +20 -0
  502. package/src/components/product-demo/screen-keys.ts +31 -0
  503. package/src/components/product-demo/screens/cloud-tenants.tsx +23 -0
  504. package/src/components/product-demo/screens/devices.tsx +41 -0
  505. package/src/components/product-demo/screens/knowledge.tsx +27 -0
  506. package/src/components/product-demo/screens/logs.tsx +113 -0
  507. package/src/components/product-demo/screens/policies.tsx +29 -0
  508. package/src/components/product-demo/screens/remote-desktop-picture.tsx +118 -0
  509. package/src/components/product-demo/screens/remote-session.tsx +46 -0
  510. package/src/components/product-demo/screens/software-update.tsx +97 -0
  511. package/src/components/product-demo/screens/tickets-board.tsx +28 -0
  512. package/src/components/product-demo/types.ts +10 -0
  513. package/src/components/ui/index.ts +1 -0
  514. package/src/components/ui/product-screen-frame.tsx +136 -0
  515. package/src/components/ui/radio-group.tsx +16 -4
  516. package/src/components/ui/snap-carousel.tsx +26 -1
  517. package/src/components/ui/tag.tsx +5 -0
  518. package/src/hooks/ui/index.ts +1 -0
  519. package/src/hooks/ui/use-header-height.ts +51 -2
  520. package/src/hooks/ui/use-sticky-toolbar.ts +60 -0
  521. package/src/hooks/use-location-hash.ts +9 -5
  522. package/src/hooks/use-scroll-to-hash.ts +9 -1
  523. package/src/types/case-study.ts +21 -1
  524. package/src/utils/date-utils.ts +8 -1
  525. package/src/utils/index.ts +5 -0
  526. package/src/utils/open-in-new-tab.ts +12 -0
  527. package/src/utils/same-page-hash-nav.ts +57 -0
  528. package/src/utils/scroll-into-view.ts +21 -5
  529. package/dist/chunk-BM5MVGH3.cjs +0 -499
  530. package/dist/chunk-CUME3VTQ.js +0 -144
  531. package/dist/chunk-CZ7Y7UG4.js +0 -732
  532. package/dist/chunk-FLKJYMVB.js +0 -499
  533. package/dist/chunk-OF6GEI5A.cjs +0 -144
  534. package/dist/chunk-UVTD52MD.cjs +0 -732
@@ -0,0 +1,2087 @@
1
+ "use client";
2
+ import {
3
+ ChatInput,
4
+ Modal,
5
+ ModalFooter,
6
+ ModalHeader,
7
+ ModalTitle,
8
+ formatTime
9
+ } from "./chunk-KBJJQFYU.js";
10
+ import {
11
+ ActionsMenuDropdown,
12
+ Tooltip,
13
+ TooltipContent,
14
+ TooltipProvider,
15
+ TooltipTrigger
16
+ } from "./chunk-P3JMAMHP.js";
17
+ import {
18
+ FloatingTooltip,
19
+ SquareAvatar,
20
+ Tag,
21
+ personInitials
22
+ } from "./chunk-IYVFSLWJ.js";
23
+ import {
24
+ next_image_default
25
+ } from "./chunk-FBZMAPWO.js";
26
+ import {
27
+ useAuthedImageSrc,
28
+ useIsTruncated
29
+ } from "./chunk-ADBE7QF3.js";
30
+ import {
31
+ OpenFrameLogo
32
+ } from "./chunk-N45D4ZXQ.js";
33
+ import {
34
+ AlertTriangleIcon,
35
+ ChatOffIcon,
36
+ ChatTextIcon,
37
+ ChatsIcon,
38
+ CheckIcon,
39
+ Chevron02DownIcon,
40
+ Chevron02LeftIcon,
41
+ Chevron02UpIcon,
42
+ Chevrons03LeftIcon,
43
+ Chevrons03RightIcon,
44
+ Collapse02Icon,
45
+ DraggerIcon,
46
+ Ellipsis01Icon,
47
+ Expand02Icon,
48
+ ExternalLinkIcon,
49
+ HourglassIcon,
50
+ InfoCircleIcon,
51
+ LockIcon,
52
+ MessageOffIcon,
53
+ MonitorOffIcon,
54
+ RecordingIcon,
55
+ Send03Icon,
56
+ Settings01Icon
57
+ } from "./chunk-NCPTID44.js";
58
+ import {
59
+ MonitorIcon
60
+ } from "./chunk-OSIKGEBU.js";
61
+ import {
62
+ FieldWrapper,
63
+ Input
64
+ } from "./chunk-CMGFZHCN.js";
65
+ import {
66
+ DropdownMenu,
67
+ DropdownMenuContent,
68
+ DropdownMenuItem,
69
+ DropdownMenuTrigger
70
+ } from "./chunk-WI6FHKD7.js";
71
+ import {
72
+ Button,
73
+ SplitButton
74
+ } from "./chunk-YDPKUAP4.js";
75
+ import {
76
+ next_link_default
77
+ } from "./chunk-DAAVMYUT.js";
78
+ import {
79
+ Skeleton
80
+ } from "./chunk-FYEJTF5Y.js";
81
+ import {
82
+ cn
83
+ } from "./chunk-7RXWKTAP.js";
84
+
85
+ // src/components/ui/truncate-text.tsx
86
+ import { jsx } from "react/jsx-runtime";
87
+ var VARIANT_CLASS = {
88
+ h1: "text-h1",
89
+ h2: "text-h2",
90
+ h3: "text-h3",
91
+ h4: "text-h4",
92
+ h5: "text-h5",
93
+ h6: "text-h6"
94
+ };
95
+ var TONE_CLASS = {
96
+ primary: "text-ods-text-primary",
97
+ secondary: "text-ods-text-secondary"
98
+ };
99
+ var LINE_CLAMP_CLASS = {
100
+ 2: "line-clamp-2",
101
+ 3: "line-clamp-3",
102
+ 4: "line-clamp-4",
103
+ 5: "line-clamp-5",
104
+ 6: "line-clamp-6"
105
+ };
106
+ function TruncateText({
107
+ children,
108
+ tooltip,
109
+ className,
110
+ side = "top",
111
+ lines = 1,
112
+ variant = "h4",
113
+ tone = "primary",
114
+ mono = false,
115
+ triggerClassName,
116
+ as = "div"
117
+ }) {
118
+ const isMultiLine = lines > 1;
119
+ const { ref, isTruncated } = useIsTruncated(children, { multiline: isMultiLine });
120
+ const clampClass = isMultiLine ? LINE_CLAMP_CLASS[lines] : "truncate block";
121
+ return /* @__PURE__ */ jsx(
122
+ FloatingTooltip,
123
+ {
124
+ content: tooltip ?? children,
125
+ side,
126
+ disabled: !isTruncated,
127
+ className: "max-w-xs whitespace-pre-line [overflow-wrap:anywhere]",
128
+ as,
129
+ triggerClassName: cn("min-w-0 max-w-full", as === "span" && "inline-block align-bottom", triggerClassName),
130
+ children: /* @__PURE__ */ jsx(
131
+ "span",
132
+ {
133
+ ref,
134
+ className: cn(
135
+ VARIANT_CLASS[variant],
136
+ TONE_CLASS[tone],
137
+ mono && "[font-family:var(--font-family-heading)]",
138
+ clampClass,
139
+ className
140
+ ),
141
+ children
142
+ }
143
+ )
144
+ }
145
+ );
146
+ }
147
+
148
+ // src/components/ui/select.tsx
149
+ import * as SelectPrimitive from "@radix-ui/react-select";
150
+ import { ChevronDown, ChevronUp } from "lucide-react";
151
+ import { forwardRef } from "react";
152
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
153
+ var Select = SelectPrimitive.Root;
154
+ var SelectGroup = SelectPrimitive.Group;
155
+ var SelectValue = SelectPrimitive.Value;
156
+ var SelectTrigger = forwardRef((allProps, ref) => {
157
+ const { className, children, invalid, label, labelVariant, error, ...props } = allProps;
158
+ const errorSlot = "error" in allProps;
159
+ const isInvalid = invalid || !!error;
160
+ const trigger = /* @__PURE__ */ jsxs(
161
+ SelectPrimitive.Trigger,
162
+ {
163
+ ref,
164
+ "data-invalid": isInvalid || void 0,
165
+ className: cn(
166
+ // Layout & spacing - match Input
167
+ // text-left resets the <button> UA default text-align:center, which the
168
+ // SelectValue span inherits and would otherwise center short values,
169
+ // reading as spurious left indentation on the selected value.
170
+ "flex h-11 w-full items-center justify-between gap-2 rounded-[6px] border px-3 text-left outline-none md:h-12",
171
+ // Typography - match Input exactly
172
+ "text-h4",
173
+ // Theme palette - match Input exactly
174
+ "border-ods-border bg-ods-card text-ods-text-primary data-[placeholder]:text-ods-text-secondary",
175
+ "enabled:hover:border-ods-border-hover enabled:hover:bg-ods-bg-hover enabled:active:border-ods-border-active enabled:active:bg-ods-bg-active",
176
+ !isInvalid && "data-[state=open]:border-ods-accent data-[state=open]:hover:border-ods-accent",
177
+ "group",
178
+ // Disabled - match Input exactly: value greys out, placeholder dims
179
+ // further. The `data-[placeholder]` rule above is a class+attribute
180
+ // selector, so the disabled placeholder rule stacks `:disabled` on top
181
+ // of it to win on specificity rather than on source order.
182
+ "disabled:!cursor-not-allowed disabled:bg-ods-bg",
183
+ "disabled:text-ods-text-disabled disabled:data-[placeholder]:text-ods-border",
184
+ // The chevron sets its own colour — grey it with the value.
185
+ "disabled:[&_svg]:text-ods-text-disabled",
186
+ "cursor-pointer transition-colors duration-200",
187
+ "[&>span]:line-clamp-1",
188
+ isInvalid && "border-ods-error enabled:hover:border-ods-error enabled:active:border-ods-error data-[state=open]:border-ods-error",
189
+ className
190
+ ),
191
+ ...props,
192
+ children: [
193
+ children,
194
+ /* @__PURE__ */ jsx2(SelectPrimitive.Icon, { asChild: true, children: /* @__PURE__ */ jsx2(
195
+ Chevron02DownIcon,
196
+ {
197
+ className: cn(
198
+ "shrink-0 text-ods-text-secondary transition-all duration-200 group-data-[state=open]:rotate-180",
199
+ isInvalid ? "text-ods-error" : "group-data-[state=open]:text-ods-accent"
200
+ ),
201
+ size: 24
202
+ }
203
+ ) })
204
+ ]
205
+ }
206
+ );
207
+ return /* @__PURE__ */ jsx2(FieldWrapper, { label, labelVariant, error, errorSlot, children: trigger });
208
+ });
209
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
210
+ var SelectScrollUpButton = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
211
+ SelectPrimitive.ScrollUpButton,
212
+ {
213
+ ref,
214
+ className: cn("flex cursor-default items-center justify-center py-1", className),
215
+ ...props,
216
+ children: /* @__PURE__ */ jsx2(ChevronUp, { className: "h-4 w-4" })
217
+ }
218
+ ));
219
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
220
+ var SelectScrollDownButton = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
221
+ SelectPrimitive.ScrollDownButton,
222
+ {
223
+ ref,
224
+ className: cn("flex cursor-default items-center justify-center py-1", className),
225
+ ...props,
226
+ children: /* @__PURE__ */ jsx2(ChevronDown, { className: "h-4 w-4" })
227
+ }
228
+ ));
229
+ SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
230
+ var SelectContent = forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx2(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
231
+ SelectPrimitive.Content,
232
+ {
233
+ ref,
234
+ className: cn(
235
+ "relative z-[9999] max-h-96 overflow-hidden rounded-[4px] border border-ods-border bg-ods-card text-ods-text-primary",
236
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
237
+ position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
238
+ className
239
+ ),
240
+ position,
241
+ style: {
242
+ width: "var(--radix-select-trigger-width)",
243
+ minWidth: "var(--radix-select-trigger-width)"
244
+ },
245
+ ...props,
246
+ children: [
247
+ /* @__PURE__ */ jsx2(SelectScrollUpButton, {}),
248
+ /* @__PURE__ */ jsx2(SelectPrimitive.Viewport, { className: "w-full", children }),
249
+ /* @__PURE__ */ jsx2(SelectScrollDownButton, {})
250
+ ]
251
+ }
252
+ ) }));
253
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
254
+ var SelectLabel = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(SelectPrimitive.Label, { ref, className: cn("py-1.5 pl-8 pr-2 font-semibold text-h6", className), ...props }));
255
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
256
+ var SelectItem = forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(
257
+ SelectPrimitive.Item,
258
+ {
259
+ ref,
260
+ className: cn(
261
+ "flex h-11 w-full cursor-pointer select-none items-center justify-between border-b border-ods-border px-4 last:border-b-0 md:h-12",
262
+ // Typography - match trigger
263
+ "whitespace-nowrap text-h4",
264
+ // Hover state with visible background change
265
+ "outline-none hover:bg-ods-bg-hover data-[highlighted]:bg-ods-bg-surface",
266
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
267
+ "transition-colors duration-150",
268
+ className
269
+ ),
270
+ ...props,
271
+ children: [
272
+ /* @__PURE__ */ jsx2(SelectPrimitive.ItemText, { children }),
273
+ /* @__PURE__ */ jsx2(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx2(CheckIcon, { className: "text-ods-accent", size: 20 }) })
274
+ ]
275
+ }
276
+ ));
277
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
278
+ var SelectSeparator = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(SelectPrimitive.Separator, { ref, className: cn("-mx-1 my-1 h-px bg-ods-border", className), ...props }));
279
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
280
+
281
+ // src/components/layout/back-button.tsx
282
+ import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
283
+ var BACK_BUTTON_CLASS = cn(
284
+ "group inline-flex items-center justify-center self-start rounded-md",
285
+ "gap-[var(--spacing-system-xsf)] py-[var(--spacing-system-sf)]",
286
+ "text-ods-text-secondary hover:text-ods-text-primary",
287
+ "transition-colors duration-200",
288
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-focus"
289
+ );
290
+ var BACK_BUTTON_SKELETON_CLASS = "h-12 w-40 rounded-md";
291
+ function BackButton({ label = "Back", className, type = "button", href, ...props }) {
292
+ const content = /* @__PURE__ */ jsxs2(Fragment, { children: [
293
+ /* @__PURE__ */ jsx3(Chevron02LeftIcon, { className: "size-6 shrink-0" }),
294
+ /* @__PURE__ */ jsx3("span", { className: "text-h4", children: label })
295
+ ] });
296
+ if (href) {
297
+ const {
298
+ disabled: _disabled,
299
+ form: _form,
300
+ formAction: _formAction,
301
+ formEncType: _formEncType,
302
+ formMethod: _formMethod,
303
+ formNoValidate: _formNoValidate,
304
+ formTarget: _formTarget,
305
+ name: _name,
306
+ value: _value,
307
+ ...shared
308
+ } = props;
309
+ return /* @__PURE__ */ jsx3(
310
+ next_link_default,
311
+ {
312
+ ...shared,
313
+ href,
314
+ className: cn(BACK_BUTTON_CLASS, className),
315
+ children: content
316
+ }
317
+ );
318
+ }
319
+ return /* @__PURE__ */ jsx3("button", { type, className: cn(BACK_BUTTON_CLASS, className), ...props, children: content });
320
+ }
321
+
322
+ // src/components/ui/page-actions.tsx
323
+ import React from "react";
324
+ import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
325
+ function actionKey(action, idx) {
326
+ return `${action.label ?? action.ariaLabel ?? "action"}-${idx}`;
327
+ }
328
+ function actionToMenuItems(action, idx) {
329
+ if (action.submenu && action.submenu.length > 0) {
330
+ if (!action.label) return action.submenu;
331
+ return action.submenu.map((item) => ({
332
+ ...item,
333
+ label: `${action.label} (${item.label})`
334
+ }));
335
+ }
336
+ if (!action.label) return [];
337
+ return [
338
+ {
339
+ id: `action-${idx}`,
340
+ label: action.label,
341
+ icon: action.icon,
342
+ onClick: action.onClick,
343
+ disabled: action.disabled,
344
+ href: action.href,
345
+ iconAction: action.iconAction ? {
346
+ icon: action.iconAction.icon,
347
+ "aria-label": action.iconAction["aria-label"],
348
+ onClick: action.iconAction.onClick,
349
+ href: action.iconAction.href,
350
+ openInNewTab: action.iconAction.openInNewTab,
351
+ disabled: action.iconAction.disabled
352
+ } : void 0
353
+ }
354
+ ];
355
+ }
356
+ function renderActionButton(action, opts = {}) {
357
+ const button = renderRawActionButton(action, opts);
358
+ if (!action.tooltip) return button;
359
+ return /* @__PURE__ */ jsx4(TooltipProvider, { delayDuration: 0, children: /* @__PURE__ */ jsxs3(Tooltip, { children: [
360
+ /* @__PURE__ */ jsx4(TooltipTrigger, { asChild: true, children: button }),
361
+ /* @__PURE__ */ jsx4(TooltipContent, { children: action.tooltip })
362
+ ] }) });
363
+ }
364
+ function renderRawActionButton(action, opts = {}) {
365
+ if (action.iconAction) {
366
+ return /* @__PURE__ */ jsx4(
367
+ SplitButton,
368
+ {
369
+ variant: action.variant ?? void 0,
370
+ href: action.href,
371
+ prefetch: action.prefetch,
372
+ openInNewTab: action.openInNewTab,
373
+ onClick: action.onClick,
374
+ disabled: action.disabled,
375
+ mainDisabled: action.mainDisabled,
376
+ leftIcon: action.icon,
377
+ fullWidth: opts.fullWidth,
378
+ iconAction: action.iconAction,
379
+ children: action.label
380
+ }
381
+ );
382
+ }
383
+ if (action.submenu && action.submenu.length > 0) {
384
+ return /* @__PURE__ */ jsx4(
385
+ ActionsMenuDropdown,
386
+ {
387
+ groups: [{ items: action.submenu }],
388
+ customTrigger: /* @__PURE__ */ jsx4(
389
+ Button,
390
+ {
391
+ variant: "outline",
392
+ disabled: action.disabled,
393
+ loading: action.loading,
394
+ leftIcon: action.icon,
395
+ splitIcon: /* @__PURE__ */ jsx4(Chevron02DownIcon, { className: "h-4 w-4" }),
396
+ className: opts.fullWidth ? "flex-1" : void 0,
397
+ children: action.label
398
+ }
399
+ )
400
+ }
401
+ );
402
+ }
403
+ const isIconOnly = opts.iconOnly || !action.label || action.iconOnlyOnDesktop;
404
+ if (isIconOnly) {
405
+ const iconNode = action.iconOnlyOnDesktop ? /* @__PURE__ */ jsx4("span", { className: "inline-flex [&_svg]:!text-ods-text-primary", children: action.icon }) : action.icon;
406
+ return /* @__PURE__ */ jsx4(
407
+ Button,
408
+ {
409
+ variant: action.variant,
410
+ size: "icon",
411
+ href: action.href,
412
+ prefetch: action.prefetch,
413
+ openInNewTab: action.openInNewTab,
414
+ onClick: action.onClick,
415
+ disabled: action.disabled,
416
+ loading: action.loading,
417
+ leftIcon: iconNode,
418
+ "aria-label": action.label ?? action.ariaLabel
419
+ }
420
+ );
421
+ }
422
+ return /* @__PURE__ */ jsx4(
423
+ Button,
424
+ {
425
+ variant: action.variant,
426
+ href: action.href,
427
+ prefetch: action.prefetch,
428
+ openInNewTab: action.openInNewTab,
429
+ onClick: action.onClick,
430
+ disabled: action.disabled,
431
+ loading: action.loading,
432
+ leftIcon: action.icon,
433
+ className: opts.fullWidth ? "flex-1" : void 0,
434
+ children: action.label
435
+ }
436
+ );
437
+ }
438
+ var ACTIONS_GAP = "gap-[var(--spacing-system-xs)]";
439
+ var SKELETON_HEIGHT = "h-11 md:h-12";
440
+ var SKELETON_ICON_WIDTH = "w-11 md:w-12";
441
+ var SKELETON_LABEL_WIDTH = "w-[120px] md:w-[140px]";
442
+ var SKELETON_RADIUS = "rounded-md";
443
+ function ActionSkeletons({
444
+ actions,
445
+ fullWidth,
446
+ emptyFallback = "icon"
447
+ }) {
448
+ const items = actions.length > 0 ? actions : [null];
449
+ return /* @__PURE__ */ jsx4(Fragment2, { children: items.map((action, idx) => {
450
+ const isIconOnly = action ? !action.label || !!action.iconOnlyOnDesktop : emptyFallback === "icon";
451
+ return /* @__PURE__ */ jsx4(
452
+ Skeleton,
453
+ {
454
+ className: cn(
455
+ SKELETON_HEIGHT,
456
+ SKELETON_RADIUS,
457
+ isIconOnly ? SKELETON_ICON_WIDTH : fullWidth ? "flex-1" : SKELETON_LABEL_WIDTH
458
+ )
459
+ },
460
+ `action-skeleton-${idx}`
461
+ );
462
+ }) });
463
+ }
464
+ function MobileTriggerSkeleton() {
465
+ return /* @__PURE__ */ jsx4(Skeleton, { className: cn(SKELETON_HEIGHT, SKELETON_ICON_WIDTH, SKELETON_RADIUS) });
466
+ }
467
+ function PageActions({
468
+ variant = "icon-buttons",
469
+ actions,
470
+ menuActions,
471
+ selector,
472
+ className,
473
+ loading
474
+ }) {
475
+ if (variant === "icon-buttons") {
476
+ return /* @__PURE__ */ jsx4(
477
+ IconButtonsVariant,
478
+ {
479
+ actions,
480
+ menuActions,
481
+ selector,
482
+ className,
483
+ loading
484
+ }
485
+ );
486
+ }
487
+ if (variant === "menu-primary") {
488
+ return /* @__PURE__ */ jsx4(
489
+ MenuPrimaryVariant,
490
+ {
491
+ actions,
492
+ menuActions: menuActions || [],
493
+ selector,
494
+ className,
495
+ loading
496
+ }
497
+ );
498
+ }
499
+ return /* @__PURE__ */ jsx4(PrimaryButtonsVariant, { actions, className, loading });
500
+ }
501
+ function IconButtonsVariant({
502
+ actions,
503
+ menuActions,
504
+ selector,
505
+ className,
506
+ loading
507
+ }) {
508
+ const desktopActions = actions.filter((a) => !a.showOnlyMobile);
509
+ const hasMenuActions = !!menuActions && menuActions.some((g) => g.items.length > 0);
510
+ const isSingleAction = actions.length === 1 && !actions[0].submenu?.length;
511
+ const singleAction = isSingleAction ? actions[0] : null;
512
+ const useSingleActionMobile = isSingleAction && !hasMenuActions;
513
+ const mobileMenuGroups = [{ items: actions.flatMap(actionToMenuItems) }, ...menuActions ?? []];
514
+ const hasMobileMenuItems = mobileMenuGroups.some((g) => g.items.length > 0);
515
+ return /* @__PURE__ */ jsxs3(Fragment2, { children: [
516
+ /* @__PURE__ */ jsxs3("div", { className: cn("hidden items-center content-md:flex", ACTIONS_GAP, className), children: [
517
+ selector,
518
+ loading ? /* @__PURE__ */ jsx4(ActionSkeletons, { actions: desktopActions }) : /* @__PURE__ */ jsxs3(Fragment2, { children: [
519
+ desktopActions.map((action, idx) => /* @__PURE__ */ jsx4(React.Fragment, { children: renderActionButton(action) }, actionKey(action, idx))),
520
+ hasMenuActions && /* @__PURE__ */ jsx4(ActionsMenuDropdown, { groups: menuActions })
521
+ ] })
522
+ ] }),
523
+ /* @__PURE__ */ jsx4("div", { className: cn("flex content-md:hidden", className), children: loading ? /* @__PURE__ */ jsx4(MobileTriggerSkeleton, {}) : useSingleActionMobile && singleAction ? renderActionButton(singleAction, { iconOnly: true }) : hasMobileMenuItems ? /* @__PURE__ */ jsx4(ActionsMenuDropdown, { groups: mobileMenuGroups }) : null })
524
+ ] });
525
+ }
526
+ function PrimaryButtonsVariant({
527
+ actions,
528
+ className,
529
+ loading
530
+ }) {
531
+ const sortedActions = [...actions].sort((a, b) => {
532
+ if (a.variant === "accent" && b.variant !== "accent") return 1;
533
+ if (a.variant !== "accent" && b.variant === "accent") return -1;
534
+ return 0;
535
+ });
536
+ const desktopActions = sortedActions.filter((a) => !a.showOnlyMobile);
537
+ return /* @__PURE__ */ jsxs3(Fragment2, { children: [
538
+ /* @__PURE__ */ jsx4("div", { className: cn("hidden items-center md:content-md:flex", ACTIONS_GAP, className), children: loading ? (
539
+ // No overflow trigger in this variant — an unknown action set settles
540
+ // into a labelled button, not a square one.
541
+ /* @__PURE__ */ jsx4(ActionSkeletons, { actions: desktopActions, emptyFallback: "label" })
542
+ ) : desktopActions.map((action, idx) => /* @__PURE__ */ jsx4(React.Fragment, { children: renderActionButton(action) }, `desktop-${actionKey(action, idx)}`)) }),
543
+ /* @__PURE__ */ jsx4("div", { className: cn("hidden items-center md:content-max-md:flex", ACTIONS_GAP, className), children: loading ? /* @__PURE__ */ jsx4(MobileTriggerSkeleton, {}) : /* @__PURE__ */ jsx4(CompactPrimaryActions, { actions: desktopActions }) }),
544
+ /* @__PURE__ */ jsx4(MobileBottomActions, { actions: sortedActions, loading })
545
+ ] });
546
+ }
547
+ function MenuPrimaryVariant({
548
+ actions,
549
+ menuActions,
550
+ selector,
551
+ className,
552
+ loading
553
+ }) {
554
+ const desktopActions = actions.filter((a) => !a.showOnlyMobile);
555
+ const hasMenuActions = menuActions.some((g) => g.items.length > 0);
556
+ const mobileMenuGroups = [{ items: actions.flatMap(actionToMenuItems) }, ...menuActions];
557
+ const hasMobileMenuItems = mobileMenuGroups.some((g) => g.items.length > 0);
558
+ return /* @__PURE__ */ jsxs3(Fragment2, { children: [
559
+ /* @__PURE__ */ jsxs3("div", { className: cn("hidden items-center content-md:flex", ACTIONS_GAP, className), children: [
560
+ selector,
561
+ loading ? /* @__PURE__ */ jsx4(ActionSkeletons, { actions: desktopActions }) : /* @__PURE__ */ jsxs3(Fragment2, { children: [
562
+ hasMenuActions && /* @__PURE__ */ jsx4(ActionsMenuDropdown, { groups: menuActions }),
563
+ desktopActions.map((action, idx) => /* @__PURE__ */ jsx4(React.Fragment, { children: renderActionButton({ ...action, variant: action.variant || "accent" }) }, `desktop-${actionKey(action, idx)}`))
564
+ ] })
565
+ ] }),
566
+ /* @__PURE__ */ jsx4("div", { className: cn("flex content-md:hidden", className), children: loading ? /* @__PURE__ */ jsx4(MobileTriggerSkeleton, {}) : hasMobileMenuItems || selector ? (
567
+ // The selector rides into the menu as its header row: on mobile the
568
+ // title row has no room for it, and hiding it entirely (what
569
+ // `icon-buttons` does) would leave no way to switch views at all.
570
+ /* @__PURE__ */ jsx4(ActionsMenuDropdown, { groups: mobileMenuGroups, header: selector })
571
+ ) : null })
572
+ ] });
573
+ }
574
+ function CompactPrimaryActions({ actions }) {
575
+ const foldable = actions.filter((action) => action.variant !== "accent" && !!action.label);
576
+ const fold = foldable.length > 1;
577
+ const inline = fold ? actions.filter((action) => !foldable.includes(action)) : actions;
578
+ return /* @__PURE__ */ jsxs3(Fragment2, { children: [
579
+ fold && /* @__PURE__ */ jsx4(ActionsMenuDropdown, { groups: [{ items: foldable.flatMap(actionToMenuItems) }] }),
580
+ inline.map((action, idx) => /* @__PURE__ */ jsx4(React.Fragment, { children: renderActionButton(action) }, `compact-${actionKey(action, idx)}`))
581
+ ] });
582
+ }
583
+ function MobileBottomActions({ actions, loading }) {
584
+ return /* @__PURE__ */ jsx4(
585
+ "div",
586
+ {
587
+ className: cn(
588
+ "fixed bottom-0 left-0 right-0 z-50 md:hidden",
589
+ "border-t border-ods-border bg-ods-card",
590
+ // `lf` (24px at every breakpoint), NOT `l` — this bar is `md:hidden`, so the
591
+ // only value it ever uses is the MOBILE one, and `l` is 16px there. The
592
+ // fixed variant is what keeps the 24px the bar has always had.
593
+ "flex items-start p-[var(--spacing-system-lf)]",
594
+ ACTIONS_GAP
595
+ ),
596
+ children: loading ? /* @__PURE__ */ jsx4(ActionSkeletons, { actions, fullWidth: true, emptyFallback: "label" }) : actions.map((action, idx) => /* @__PURE__ */ jsx4(React.Fragment, { children: renderActionButton(action, { fullWidth: !!action.label }) }, `mobile-${actionKey(action, idx)}`))
597
+ }
598
+ );
599
+ }
600
+ function usePageActionsBottomPadding(variant) {
601
+ return variant === "primary-buttons" || variant === "menu-primary" ? "pb-40 md:pb-0" : "";
602
+ }
603
+
604
+ // src/components/ui/entity-image.tsx
605
+ import React2 from "react";
606
+ import { jsx as jsx5 } from "react/jsx-runtime";
607
+ var ENTITY_IMAGE_SIZE = "size-[52px] content-md:size-[60px]";
608
+ function EntityImage({ src, alt, fallbackText, sizeClassName, className }) {
609
+ const resolvedSrc = useAuthedImageSrc(src);
610
+ const [failedSrc, setFailedSrc] = React2.useState(null);
611
+ const imageFailed = resolvedSrc !== void 0 && failedSrc === resolvedSrc;
612
+ const showFallback = imageFailed || !resolvedSrc;
613
+ const initials = personInitials(fallbackText ?? alt);
614
+ if (showFallback) {
615
+ return /* @__PURE__ */ jsx5(
616
+ "div",
617
+ {
618
+ "aria-label": alt,
619
+ className: cn(
620
+ "flex shrink-0 select-none items-center justify-center rounded-md border border-ods-border bg-ods-bg text-ods-text-secondary text-h4",
621
+ sizeClassName ?? ENTITY_IMAGE_SIZE,
622
+ className
623
+ ),
624
+ children: initials || "?"
625
+ }
626
+ );
627
+ }
628
+ return /* @__PURE__ */ jsx5(
629
+ next_image_default,
630
+ {
631
+ src: resolvedSrc,
632
+ alt: alt ?? "",
633
+ onError: () => setFailedSrc(resolvedSrc),
634
+ className: cn(
635
+ "shrink-0 rounded-md border border-ods-border object-contain",
636
+ sizeClassName ?? ENTITY_IMAGE_SIZE,
637
+ className
638
+ ),
639
+ width: 60,
640
+ height: 60,
641
+ unoptimized: true
642
+ }
643
+ );
644
+ }
645
+
646
+ // src/components/layout/title-block.tsx
647
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
648
+ var TITLE_BLOCK_MIN_HEIGHT = "min-h-11 content-md:min-h-12";
649
+ function TitleTextSkeleton({ widthClass, heightClass }) {
650
+ return /* @__PURE__ */ jsx6(
651
+ "span",
652
+ {
653
+ "aria-hidden": true,
654
+ className: cn("inline-block max-w-full animate-pulse rounded-md bg-ods-border", widthClass, heightClass)
655
+ }
656
+ );
657
+ }
658
+ var TITLE_SKELETON_SIZE = {
659
+ h1: { width: "w-56 content-md:w-80 content-lg:w-96", height: "h-7 content-md:h-8 content-lg:h-9" },
660
+ h2: { width: "w-48 content-md:w-72", height: "h-4 content-md:h-6" }
661
+ };
662
+ function TitleBlock({
663
+ title,
664
+ subtitle,
665
+ image,
666
+ backButton,
667
+ actions,
668
+ actionsVariant = "icon-buttons",
669
+ menuActions,
670
+ selector,
671
+ variant = "plain",
672
+ className,
673
+ titleSize = "h2",
674
+ titleAdornment,
675
+ loading,
676
+ loadingActions,
677
+ subtitleRow = "when-set",
678
+ titleWrap = false
679
+ }) {
680
+ const hasSubtitleRow = !!subtitle || subtitleRow === "always" || subtitleRow === "while-loading" && !!loading;
681
+ const hasActions = actions && actions.length > 0;
682
+ const hasMenuActions = !!menuActions && menuActions.some((g) => g.items.length > 0);
683
+ const titleClass = titleSize === "h1" ? "text-h1" : "text-h2";
684
+ const titleOverflowClass = titleWrap ? "break-words" : "truncate";
685
+ const skeletonSize = TITLE_SKELETON_SIZE[titleSize];
686
+ const { ref: titleRef, isTruncated: titleTruncated } = useIsTruncated(loading ? null : title);
687
+ const { ref: subtitleRef, isTruncated: subtitleTruncated } = useIsTruncated(
688
+ loading ? null : subtitle
689
+ );
690
+ const titleNode = loading ? /* @__PURE__ */ jsx6(TitleTextSkeleton, { widthClass: skeletonSize.width, heightClass: skeletonSize.height }) : title;
691
+ return /* @__PURE__ */ jsxs4(
692
+ "div",
693
+ {
694
+ className: cn(
695
+ "flex items-end justify-between gap-[var(--spacing-system-m)]",
696
+ // md+: one wrapping row — actions stay inline with a short title and
697
+ // wrap to a second row only when the title overflows (ClickUp 86ahd6uy5).
698
+ "content-md:flex-wrap content-md:content-end",
699
+ "pt-[var(--spacing-system-l)]",
700
+ variant === "card" ? cn(
701
+ "border-b border-ods-border bg-ods-card",
702
+ "px-[var(--spacing-system-l)] pb-[var(--spacing-system-l)]",
703
+ "content-md:border-b-0 content-md:bg-transparent",
704
+ "content-md:px-0 content-md:pb-0",
705
+ "content-md:mb-[var(--spacing-system-l)]"
706
+ ) : "mb-[var(--spacing-system-l)]",
707
+ className
708
+ ),
709
+ children: [
710
+ /* @__PURE__ */ jsxs4(
711
+ "div",
712
+ {
713
+ className: cn(
714
+ "flex min-w-0 flex-1 flex-col justify-center gap-[var(--spacing-system-xs)] content-md:max-w-full content-md:flex-none",
715
+ TITLE_BLOCK_MIN_HEIGHT
716
+ ),
717
+ children: [
718
+ backButton && /* @__PURE__ */ jsx6(BackButton, { onClick: backButton.onClick, label: backButton.label, className: "hidden content-md:inline-flex" }),
719
+ image || hasSubtitleRow || loading ? /* @__PURE__ */ jsxs4("div", { className: "flex w-full min-w-0 items-center gap-[var(--spacing-system-m)]", children: [
720
+ image && /* @__PURE__ */ jsx6(EntityImage, { src: image.src, alt: image.alt, fallbackText: image.alt || title }),
721
+ /* @__PURE__ */ jsxs4("div", { className: "flex min-w-0 flex-1 flex-col justify-center", children: [
722
+ (loading || title) && (titleAdornment ? /* @__PURE__ */ jsxs4("div", { className: "flex w-full min-w-0 items-center gap-[var(--spacing-system-m)]", children: [
723
+ /* @__PURE__ */ jsx6(
724
+ FloatingTooltip,
725
+ {
726
+ content: title,
727
+ side: "bottom",
728
+ disabled: !titleTruncated,
729
+ triggerClassName: "min-w-0",
730
+ children: /* @__PURE__ */ jsx6(
731
+ "h1",
732
+ {
733
+ ref: titleRef,
734
+ className: cn(titleClass, "min-w-0 text-ods-text-primary", titleOverflowClass),
735
+ children: titleNode
736
+ }
737
+ )
738
+ }
739
+ ),
740
+ /* @__PURE__ */ jsx6("span", { className: "shrink-0", children: titleAdornment })
741
+ ] }) : /* @__PURE__ */ jsx6(FloatingTooltip, { content: title, side: "bottom", disabled: !titleTruncated, children: /* @__PURE__ */ jsx6("h1", { ref: titleRef, className: cn(titleClass, "text-ods-text-primary", titleOverflowClass), children: titleNode }) })),
742
+ hasSubtitleRow && /* The NBSP is a pure spacer, reached only in `'always'` mode: an
743
+ empty `p` collapses to zero height (its only content would be
744
+ collapsible whitespace), which is exactly the shift that mode
745
+ exists to prevent. Hidden from AT — it carries no meaning. */
746
+ /* @__PURE__ */ jsx6(FloatingTooltip, { content: subtitle, side: "bottom", disabled: !subtitleTruncated, children: /* @__PURE__ */ jsx6(
747
+ "p",
748
+ {
749
+ ref: subtitleRef,
750
+ className: "truncate text-ods-text-secondary text-h6",
751
+ "aria-hidden": !loading && !subtitle ? true : void 0,
752
+ children: loading ? /* @__PURE__ */ jsx6(TitleTextSkeleton, { widthClass: "w-28 content-md:w-36", heightClass: "h-2.5 content-md:h-3" }) : subtitle || "\xA0"
753
+ }
754
+ ) })
755
+ ] })
756
+ ] }) : title && (titleAdornment ? /* @__PURE__ */ jsxs4("div", { className: "flex w-full min-w-0 items-center gap-[var(--spacing-system-m)]", children: [
757
+ /* @__PURE__ */ jsx6(FloatingTooltip, { content: title, side: "bottom", disabled: !titleTruncated, triggerClassName: "min-w-0", children: /* @__PURE__ */ jsx6("h1", { ref: titleRef, className: cn(titleClass, "min-w-0 text-ods-text-primary", titleOverflowClass), children: title }) }),
758
+ /* @__PURE__ */ jsx6("span", { className: "shrink-0", children: titleAdornment })
759
+ ] }) : (
760
+ /* This branch never had the single-line clamp, so text already
761
+ wraps; `titleWrap` only adds break-words for pathological
762
+ unbroken tokens. No class change when the prop is unset —
763
+ the frozen baseline stays byte-identical. */
764
+ /* @__PURE__ */ jsx6("h1", { className: cn(titleClass, "text-ods-text-primary", titleWrap && "break-words"), children: title })
765
+ ))
766
+ ]
767
+ }
768
+ ),
769
+ (hasActions || hasMenuActions || selector || loadingActions) && /* @__PURE__ */ jsx6("div", { className: "flex shrink-0 items-center gap-2", children: /* @__PURE__ */ jsx6(
770
+ PageActions,
771
+ {
772
+ variant: actionsVariant,
773
+ actions: actions ?? [],
774
+ menuActions,
775
+ selector,
776
+ loading: loadingActions
777
+ }
778
+ ) })
779
+ ]
780
+ }
781
+ );
782
+ }
783
+
784
+ // src/components/layout/page-layout.tsx
785
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
786
+ function PageLayout({
787
+ children,
788
+ title,
789
+ subtitle,
790
+ image,
791
+ backButton,
792
+ actions,
793
+ actionsVariant = "icon-buttons",
794
+ menuActions,
795
+ selector,
796
+ headerVariant,
797
+ className,
798
+ contentClassName,
799
+ showHeader = true,
800
+ titleSize,
801
+ titleAdornment,
802
+ loading,
803
+ loadingActions,
804
+ subtitleRow,
805
+ titleWrap
806
+ }) {
807
+ const hasActions = actions && actions.length > 0;
808
+ const needsBottomPadding = hasActions && actionsVariant === "primary-buttons";
809
+ const hasHeader = showHeader && (title || subtitle || image || backButton || hasActions || selector || loading);
810
+ return /* @__PURE__ */ jsxs5("div", { className: cn("flex w-full flex-col", className), children: [
811
+ hasHeader && /* @__PURE__ */ jsx7(
812
+ TitleBlock,
813
+ {
814
+ title,
815
+ subtitle,
816
+ image,
817
+ backButton,
818
+ actions,
819
+ actionsVariant,
820
+ menuActions,
821
+ selector,
822
+ variant: headerVariant,
823
+ titleSize,
824
+ titleAdornment,
825
+ loading,
826
+ loadingActions,
827
+ subtitleRow,
828
+ titleWrap
829
+ }
830
+ ),
831
+ /* @__PURE__ */ jsx7(
832
+ "div",
833
+ {
834
+ className: cn(
835
+ "flex flex-1 flex-col gap-[var(--spacing-system-l)]",
836
+ needsBottomPadding && "pb-28 content-md:pb-0",
837
+ contentClassName
838
+ ),
839
+ children
840
+ }
841
+ )
842
+ ] });
843
+ }
844
+
845
+ // src/components/features/remote-session/remote-session-viewers.tsx
846
+ import { useState } from "react";
847
+ import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
848
+ function viewerLabel(viewer) {
849
+ if (viewer.isHost) return `${viewer.name} (host)`;
850
+ if (viewer.isYou) return `${viewer.name} (you)`;
851
+ return viewer.name;
852
+ }
853
+ function hostFirst(viewers) {
854
+ return [...viewers.filter((viewer) => viewer.isHost), ...viewers.filter((viewer) => !viewer.isHost)];
855
+ }
856
+ function RemoteSessionViewers({ viewers, max = 4, className }) {
857
+ const [open, setOpen] = useState(false);
858
+ if (viewers.length === 0) return null;
859
+ const ordered = hostFirst(viewers);
860
+ const faces = ordered.slice(0, max);
861
+ const overflow = ordered.length - faces.length;
862
+ const Chevron = open ? Chevron02UpIcon : Chevron02DownIcon;
863
+ return /* @__PURE__ */ jsxs6(DropdownMenu, { open, onOpenChange: setOpen, children: [
864
+ /* @__PURE__ */ jsxs6(
865
+ DropdownMenuTrigger,
866
+ {
867
+ "aria-label": `In this session: ${ordered.map(viewerLabel).join(", ")}`,
868
+ className: cn(
869
+ "flex shrink-0 items-center gap-[var(--spacing-system-xxs)] rounded-md outline-none",
870
+ "focus-visible:ring-2 focus-visible:ring-ods-focus",
871
+ className
872
+ ),
873
+ children: [
874
+ /* @__PURE__ */ jsxs6("span", { className: "flex items-center", children: [
875
+ faces.map((viewer, index) => /* @__PURE__ */ jsx8(
876
+ SquareAvatar,
877
+ {
878
+ variant: "round",
879
+ sizePx: 32,
880
+ src: viewer.avatarUrl ?? void 0,
881
+ alt: viewer.name,
882
+ fallback: viewer.name,
883
+ className: cn(
884
+ "relative bg-ods-bg",
885
+ viewer.isHost ? "ring-2 ring-ods-accent" : "ring-1 ring-ods-border",
886
+ index > 0 && "-ml-2"
887
+ ),
888
+ style: { zIndex: faces.length - index + 1 }
889
+ },
890
+ viewer.id
891
+ )),
892
+ overflow > 0 && /* @__PURE__ */ jsxs6("span", { className: "relative -ml-2 flex size-8 shrink-0 items-center justify-center rounded-full bg-ods-bg text-ods-text-secondary ring-1 ring-ods-border text-h6", children: [
893
+ "+",
894
+ overflow
895
+ ] })
896
+ ] }),
897
+ /* @__PURE__ */ jsx8("span", { className: "flex size-8 items-center justify-center rounded-md text-ods-text-primary", children: /* @__PURE__ */ jsx8(Chevron, { size: 16, color: "currentColor" }) })
898
+ ]
899
+ }
900
+ ),
901
+ /* @__PURE__ */ jsx8(DropdownMenuContent, { align: "end", className: "w-[280px] p-0", children: ordered.map((viewer) => /* @__PURE__ */ jsxs6(
902
+ DropdownMenuItem,
903
+ {
904
+ className: cn(
905
+ "gap-[var(--spacing-system-xsf)] rounded-none border-b border-ods-border bg-ods-bg last:border-b-0",
906
+ "py-[var(--spacing-system-s)] pl-[var(--spacing-system-mf)] pr-[var(--spacing-system-xs)] text-h4"
907
+ ),
908
+ children: [
909
+ /* @__PURE__ */ jsx8(
910
+ SquareAvatar,
911
+ {
912
+ variant: "round",
913
+ sizePx: 24,
914
+ src: viewer.avatarUrl ?? void 0,
915
+ alt: "",
916
+ fallback: viewer.name,
917
+ className: "shrink-0"
918
+ }
919
+ ),
920
+ /* @__PURE__ */ jsx8("span", { className: "min-w-0 flex-1 truncate", children: viewerLabel(viewer) })
921
+ ]
922
+ },
923
+ viewer.id
924
+ )) })
925
+ ] });
926
+ }
927
+
928
+ // src/components/features/remote-session/remote-session-parts.tsx
929
+ import { useEffect, useState as useState2 } from "react";
930
+ import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
931
+ var DESKTOP_SCALE = {
932
+ "--spacing-system-xs": "0.5rem",
933
+ "--spacing-system-s": "0.75rem",
934
+ "--spacing-system-m": "1rem",
935
+ "--spacing-system-l": "1.5rem",
936
+ "--spacing-system-xl": "2.5rem",
937
+ "--font-size-h1-title": "3.5rem",
938
+ "--font-size-h2-sub-title": "2rem",
939
+ "--font-size-h3-body": "1.125rem",
940
+ "--font-size-h4-body": "1.125rem",
941
+ "--font-size-h5-caption": "0.875rem",
942
+ "--font-size-h6-caption": "0.875rem",
943
+ "--font-line-space-h1-main-title": "4rem",
944
+ "--font-line-space-h2-sub-title": "2.5rem",
945
+ "--font-line-space-h3-body": "1.5rem",
946
+ "--font-line-space-h4-body": "1.5rem",
947
+ "--font-line-space-h5-caption": "1.25rem",
948
+ "--font-line-space-h6-caption": "1.25rem"
949
+ };
950
+ function RemoteSessionScope({ children, className }) {
951
+ return /* @__PURE__ */ jsx9("div", { "data-app-type": "openframe", style: DESKTOP_SCALE, className, children });
952
+ }
953
+ function RemoteSessionOrgLogo({ name, logoUrl, sizePx, className }) {
954
+ if (logoUrl) {
955
+ return /* @__PURE__ */ jsx9(
956
+ SquareAvatar,
957
+ {
958
+ variant: "square",
959
+ fit: "contain",
960
+ sizePx,
961
+ src: logoUrl,
962
+ alt: name,
963
+ fallback: name,
964
+ className: cn("shrink-0 rounded-md border border-ods-border bg-ods-card", className)
965
+ }
966
+ );
967
+ }
968
+ return /* @__PURE__ */ jsx9(
969
+ "div",
970
+ {
971
+ role: "img",
972
+ "aria-label": name,
973
+ style: { width: sizePx, height: sizePx },
974
+ className: cn(
975
+ "flex shrink-0 items-center justify-center rounded-md border border-ods-border bg-ods-card",
976
+ className
977
+ ),
978
+ children: /* @__PURE__ */ jsx9(OpenFrameLogo, { className: "size-1/2" })
979
+ }
980
+ );
981
+ }
982
+ function RemoteSessionRecordingTag({ className }) {
983
+ return /* @__PURE__ */ jsxs7(
984
+ "div",
985
+ {
986
+ className: cn(
987
+ "flex h-8 items-center gap-[var(--spacing-system-xs)] self-start rounded-md bg-ods-success-secondary p-[var(--spacing-system-xsf)]",
988
+ className
989
+ ),
990
+ children: [
991
+ /* @__PURE__ */ jsx9(RecordingIcon, { size: 16, color: "currentColor", className: "text-ods-success" }),
992
+ /* @__PURE__ */ jsx9("span", { className: "text-ods-success text-h5", children: "Session Recording" })
993
+ ]
994
+ }
995
+ );
996
+ }
997
+ function RemoteSessionStatusRow({
998
+ showRecordingTag,
999
+ viewers
1000
+ }) {
1001
+ const hasViewers = !!viewers && viewers.length > 0;
1002
+ if (!showRecordingTag && !hasViewers) return null;
1003
+ if (!hasViewers) return /* @__PURE__ */ jsx9(RemoteSessionRecordingTag, {});
1004
+ return /* @__PURE__ */ jsxs7("div", { className: "flex w-full items-center gap-[var(--spacing-system-m)]", children: [
1005
+ showRecordingTag && /* @__PURE__ */ jsx9(RemoteSessionRecordingTag, { className: "flex-1 justify-center self-auto" }),
1006
+ /* @__PURE__ */ jsx9(RemoteSessionViewers, { viewers, className: "ml-auto" })
1007
+ ] });
1008
+ }
1009
+ var REMOTE_SESSION_DRAG_HANDLE_CLASS = "cursor-grab active:cursor-grabbing";
1010
+ function RemoteSessionDragger({ dragHandlers }) {
1011
+ return /* @__PURE__ */ jsx9(
1012
+ "span",
1013
+ {
1014
+ "aria-hidden": true,
1015
+ className: cn(
1016
+ "absolute right-[var(--spacing-system-xsf)] top-[var(--spacing-system-xsf)] text-ods-text-secondary",
1017
+ dragHandlers && REMOTE_SESSION_DRAG_HANDLE_CLASS
1018
+ ),
1019
+ ...dragHandlers,
1020
+ children: /* @__PURE__ */ jsx9(DraggerIcon, { size: 24, color: "currentColor" })
1021
+ }
1022
+ );
1023
+ }
1024
+ function formatRemoteSessionElapsed(elapsedMs) {
1025
+ const total = Math.max(0, Math.floor(elapsedMs / 1e3));
1026
+ const hours = Math.floor(total / 3600);
1027
+ const minutes = Math.floor(total % 3600 / 60);
1028
+ const seconds = String(total % 60).padStart(2, "0");
1029
+ return hours > 0 ? `${hours}:${String(minutes).padStart(2, "0")}:${seconds}` : `${minutes}:${seconds}`;
1030
+ }
1031
+ function useRemoteSessionTimer(startedAt) {
1032
+ const [nowMs, setNowMs] = useState2(() => Date.now());
1033
+ useEffect(() => {
1034
+ const timer = setInterval(() => setNowMs(Date.now()), 1e3);
1035
+ return () => clearInterval(timer);
1036
+ }, []);
1037
+ return formatRemoteSessionElapsed(nowMs - Date.parse(startedAt));
1038
+ }
1039
+
1040
+ // src/components/features/remote-session/remote-access-request-card.tsx
1041
+ import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
1042
+ function displaySiteUrl(url) {
1043
+ return url.replace(/^https?:\/\//, "").replace(/\/$/, "");
1044
+ }
1045
+ function RemoteAccessRequestCard({
1046
+ party,
1047
+ showRecordingNotice = false,
1048
+ deciding = null,
1049
+ error,
1050
+ onDecide,
1051
+ onOpenSite
1052
+ }) {
1053
+ const { organizationName } = party;
1054
+ const siteUrl = party.organizationSiteUrl ?? void 0;
1055
+ const openableSite = siteUrl?.startsWith("https://") ? siteUrl : void 0;
1056
+ return /* @__PURE__ */ jsxs8("div", { className: "flex w-full flex-col gap-[var(--spacing-system-l)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-xl)]", children: [
1057
+ /* @__PURE__ */ jsx10("h1", { className: "w-full text-ods-text-primary text-h2", children: "Your IT support team is requesting remote access" }),
1058
+ /* @__PURE__ */ jsxs8("div", { className: "flex w-full items-center gap-[var(--spacing-system-m)] rounded-md border border-ods-border bg-ods-bg p-[var(--spacing-system-m)]", children: [
1059
+ /* @__PURE__ */ jsx10(RemoteSessionOrgLogo, { name: organizationName, logoUrl: party.organizationLogoUrl, sizePx: 64 }),
1060
+ /* @__PURE__ */ jsxs8("div", { className: "flex min-w-0 flex-1 flex-col", children: [
1061
+ /* @__PURE__ */ jsx10("p", { className: "w-full truncate text-ods-text-primary text-h3", children: organizationName }),
1062
+ siteUrl && /* @__PURE__ */ jsx10("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: displaySiteUrl(siteUrl) })
1063
+ ] }),
1064
+ openableSite && onOpenSite && /* @__PURE__ */ jsx10(Button, { variant: "outline", size: "icon", "aria-label": "Open website", onClick: () => onOpenSite(openableSite), children: /* @__PURE__ */ jsx10(ExternalLinkIcon, { size: 24, color: "currentColor" }) })
1065
+ ] }),
1066
+ /* @__PURE__ */ jsxs8("p", { className: "w-full text-ods-text-primary text-h4", children: [
1067
+ "A technician from ",
1068
+ /* @__PURE__ */ jsx10("span", { className: "text-ods-accent", children: organizationName }),
1069
+ " will be able to view your screen and control your mouse and keyboard during this session."
1070
+ ] }),
1071
+ /* @__PURE__ */ jsxs8("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
1072
+ showRecordingNotice && /* @__PURE__ */ jsxs8("div", { className: "flex w-full items-center gap-[var(--spacing-system-xs)] rounded-md border border-ods-border bg-ods-bg p-[var(--spacing-system-s)]", children: [
1073
+ /* @__PURE__ */ jsx10(InfoCircleIcon, { size: 24, color: "currentColor", className: "shrink-0 text-ods-accent" }),
1074
+ /* @__PURE__ */ jsx10("p", { className: "min-w-0 flex-1 text-ods-text-primary text-h6", children: "This session will be recorded and available upon request." })
1075
+ ] }),
1076
+ error ? /* @__PURE__ */ jsx10("p", { className: "w-full text-ods-text-primary text-h6", children: error }) : /* @__PURE__ */ jsx10("p", { className: "w-full text-ods-text-secondary text-h6", children: "You can end the session at any time." })
1077
+ ] }),
1078
+ /* @__PURE__ */ jsxs8("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-l)]", children: [
1079
+ /* @__PURE__ */ jsx10(
1080
+ Button,
1081
+ {
1082
+ variant: "outline",
1083
+ fullWidth: true,
1084
+ loading: deciding === "DENIED",
1085
+ disabled: deciding !== null,
1086
+ onClick: () => onDecide("DENIED"),
1087
+ children: "Decline"
1088
+ }
1089
+ ),
1090
+ /* @__PURE__ */ jsx10(
1091
+ Button,
1092
+ {
1093
+ variant: "accent",
1094
+ fullWidth: true,
1095
+ loading: deciding === "APPROVED",
1096
+ disabled: deciding !== null,
1097
+ onClick: () => onDecide("APPROVED"),
1098
+ children: "Allow Access"
1099
+ }
1100
+ )
1101
+ ] })
1102
+ ] });
1103
+ }
1104
+
1105
+ // src/components/features/remote-session/remote-session-block.tsx
1106
+ import { forwardRef as forwardRef2 } from "react";
1107
+ import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
1108
+ var RemoteSessionBlockFrame = forwardRef2(
1109
+ ({ children, expanded = false, onHide, className }, ref) => {
1110
+ return /* @__PURE__ */ jsxs9(
1111
+ "div",
1112
+ {
1113
+ ref,
1114
+ className: cn(
1115
+ "flex w-[440px] shrink-0 flex-col overflow-hidden rounded-md border border-ods-border bg-ods-bg",
1116
+ expanded && "h-[680px]",
1117
+ className
1118
+ ),
1119
+ children: [
1120
+ children,
1121
+ /* @__PURE__ */ jsxs9(
1122
+ "button",
1123
+ {
1124
+ type: "button",
1125
+ className: "flex h-12 w-full shrink-0 items-center gap-[var(--spacing-system-xs)] border-t border-ods-border bg-ods-card px-[var(--spacing-system-m)]",
1126
+ onClick: onHide,
1127
+ children: [
1128
+ /* @__PURE__ */ jsx11(Chevrons03RightIcon, { size: 24 }),
1129
+ /* @__PURE__ */ jsx11("span", { className: "min-w-0 flex-1 truncate text-left text-ods-text-secondary text-h4", children: "Hide this Block" }),
1130
+ /* @__PURE__ */ jsx11(OpenFrameLogo, { className: "size-6 shrink-0" })
1131
+ ]
1132
+ }
1133
+ )
1134
+ ]
1135
+ }
1136
+ );
1137
+ }
1138
+ );
1139
+ RemoteSessionBlockFrame.displayName = "RemoteSessionBlockFrame";
1140
+ function RemoteSessionEndButton({ onEndSession }) {
1141
+ return /* @__PURE__ */ jsx11(
1142
+ Button,
1143
+ {
1144
+ variant: "outline",
1145
+ fullWidth: true,
1146
+ leftIcon: /* @__PURE__ */ jsx11(MonitorOffIcon, { size: 24, color: "currentColor", className: "text-ods-error" }),
1147
+ onClick: onEndSession,
1148
+ children: "End Session"
1149
+ }
1150
+ );
1151
+ }
1152
+ function RemoteSessionSummary({
1153
+ party,
1154
+ elapsed,
1155
+ showRecordingTag = false,
1156
+ viewers,
1157
+ onOpenChat,
1158
+ onEndSession,
1159
+ dragHandlers
1160
+ }) {
1161
+ const technician = party.technicianName;
1162
+ return /* @__PURE__ */ jsxs9("div", { className: "relative flex flex-col gap-[var(--spacing-system-m)] p-[var(--spacing-system-m)]", children: [
1163
+ /* @__PURE__ */ jsx11(RemoteSessionDragger, { dragHandlers }),
1164
+ /* @__PURE__ */ jsxs9(
1165
+ "div",
1166
+ {
1167
+ className: cn(
1168
+ "flex w-full items-center gap-[var(--spacing-system-xs)] pr-[var(--spacing-system-mf)]",
1169
+ dragHandlers && REMOTE_SESSION_DRAG_HANDLE_CLASS
1170
+ ),
1171
+ ...dragHandlers,
1172
+ children: [
1173
+ technician ? /* @__PURE__ */ jsx11(
1174
+ SquareAvatar,
1175
+ {
1176
+ variant: "round",
1177
+ sizePx: 48,
1178
+ src: party.technicianAvatarUrl ?? void 0,
1179
+ fallback: technician
1180
+ }
1181
+ ) : /* @__PURE__ */ jsx11(RemoteSessionOrgLogo, { name: party.organizationName, logoUrl: party.organizationLogoUrl, sizePx: 48 }),
1182
+ /* @__PURE__ */ jsxs9("div", { className: "flex min-w-0 flex-1 flex-col", children: [
1183
+ /* @__PURE__ */ jsxs9("p", { className: "w-full truncate text-ods-text-primary text-h4", children: [
1184
+ technician ? `${technician} connected` : "IT support team is connected",
1185
+ " ",
1186
+ /* @__PURE__ */ jsxs9("span", { className: "text-ods-text-secondary", children: [
1187
+ "(",
1188
+ elapsed,
1189
+ ")"
1190
+ ] })
1191
+ ] }),
1192
+ /* @__PURE__ */ jsx11("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: party.organizationName })
1193
+ ] })
1194
+ ]
1195
+ }
1196
+ ),
1197
+ /* @__PURE__ */ jsx11(RemoteSessionStatusRow, { showRecordingTag, viewers }),
1198
+ /* @__PURE__ */ jsxs9("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
1199
+ /* @__PURE__ */ jsx11(
1200
+ Button,
1201
+ {
1202
+ variant: "outline",
1203
+ fullWidth: true,
1204
+ leftIcon: /* @__PURE__ */ jsx11(ChatsIcon, { size: 24, color: "currentColor" }),
1205
+ onClick: onOpenChat,
1206
+ children: "Open Chat"
1207
+ }
1208
+ ),
1209
+ /* @__PURE__ */ jsx11(RemoteSessionEndButton, { onEndSession })
1210
+ ] })
1211
+ ] });
1212
+ }
1213
+ var RemoteSessionMinimizedChip = forwardRef2(
1214
+ ({ party, onExpand, dragHandlers }, ref) => {
1215
+ const technician = party.technicianName;
1216
+ return /* @__PURE__ */ jsxs9(
1217
+ "button",
1218
+ {
1219
+ ref,
1220
+ type: "button",
1221
+ "aria-label": "Show session block",
1222
+ className: cn(
1223
+ "flex shrink-0 flex-col overflow-hidden rounded-md border border-ods-border",
1224
+ dragHandlers && REMOTE_SESSION_DRAG_HANDLE_CLASS
1225
+ ),
1226
+ onClick: onExpand,
1227
+ ...dragHandlers,
1228
+ children: [
1229
+ technician ? /* @__PURE__ */ jsx11(
1230
+ SquareAvatar,
1231
+ {
1232
+ sizePx: 48,
1233
+ src: party.technicianAvatarUrl ?? void 0,
1234
+ fallback: technician,
1235
+ className: "rounded-none"
1236
+ }
1237
+ ) : /* @__PURE__ */ jsx11(
1238
+ RemoteSessionOrgLogo,
1239
+ {
1240
+ name: party.organizationName,
1241
+ logoUrl: party.organizationLogoUrl,
1242
+ sizePx: 48,
1243
+ className: "rounded-none border-0"
1244
+ }
1245
+ ),
1246
+ /* @__PURE__ */ jsx11("span", { className: "flex h-9 w-12 items-center justify-center border-t border-ods-border bg-ods-card", children: /* @__PURE__ */ jsx11(Chevrons03LeftIcon, { size: 24 }) })
1247
+ ]
1248
+ }
1249
+ );
1250
+ }
1251
+ );
1252
+ RemoteSessionMinimizedChip.displayName = "RemoteSessionMinimizedChip";
1253
+
1254
+ // src/components/features/remote-session/remote-session-chat-panel.tsx
1255
+ import { useEffect as useEffect2, useRef } from "react";
1256
+ import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
1257
+ function formatTime2(at) {
1258
+ return at.toLocaleTimeString([], { hour: "numeric", minute: "2-digit" });
1259
+ }
1260
+ function RemoteSessionChatPanel({
1261
+ party,
1262
+ elapsed,
1263
+ messages,
1264
+ showRecordingTag = false,
1265
+ viewers,
1266
+ draft,
1267
+ onDraftChange,
1268
+ onSend,
1269
+ ready = true,
1270
+ error,
1271
+ onCloseChat,
1272
+ onEndSession,
1273
+ dragHandlers
1274
+ }) {
1275
+ const listRef = useRef(null);
1276
+ useEffect2(() => {
1277
+ const list = listRef.current;
1278
+ if (list) list.scrollTop = list.scrollHeight;
1279
+ }, [messages]);
1280
+ const handleSend = () => {
1281
+ const text = draft.trim();
1282
+ if (!text) return;
1283
+ onSend(text);
1284
+ onDraftChange("");
1285
+ };
1286
+ return /* @__PURE__ */ jsxs10("div", { className: "flex min-h-0 flex-1 flex-col", children: [
1287
+ /* @__PURE__ */ jsxs10("div", { className: "relative flex flex-col gap-[var(--spacing-system-m)] p-[var(--spacing-system-m)]", children: [
1288
+ /* @__PURE__ */ jsx12(RemoteSessionDragger, { dragHandlers }),
1289
+ /* @__PURE__ */ jsxs10(
1290
+ "div",
1291
+ {
1292
+ className: cn(
1293
+ "flex w-full flex-col pr-[var(--spacing-system-mf)]",
1294
+ dragHandlers && REMOTE_SESSION_DRAG_HANDLE_CLASS
1295
+ ),
1296
+ ...dragHandlers,
1297
+ children: [
1298
+ /* @__PURE__ */ jsxs10("p", { className: "w-full truncate text-ods-text-primary text-h4", children: [
1299
+ "Your IT support team is connected ",
1300
+ /* @__PURE__ */ jsxs10("span", { className: "text-ods-text-secondary", children: [
1301
+ "(",
1302
+ elapsed,
1303
+ ")"
1304
+ ] })
1305
+ ] }),
1306
+ /* @__PURE__ */ jsx12("p", { className: "w-full truncate text-ods-text-secondary text-h4", children: "You can end this session at any time" })
1307
+ ]
1308
+ }
1309
+ ),
1310
+ /* @__PURE__ */ jsx12(RemoteSessionStatusRow, { showRecordingTag, viewers }),
1311
+ /* @__PURE__ */ jsxs10("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-m)]", children: [
1312
+ /* @__PURE__ */ jsx12(
1313
+ Button,
1314
+ {
1315
+ variant: "outline",
1316
+ fullWidth: true,
1317
+ leftIcon: /* @__PURE__ */ jsx12(MessageOffIcon, { size: 24, color: "currentColor" }),
1318
+ onClick: onCloseChat,
1319
+ children: "Close Chat"
1320
+ }
1321
+ ),
1322
+ /* @__PURE__ */ jsx12(RemoteSessionEndButton, { onEndSession })
1323
+ ] })
1324
+ ] }),
1325
+ /* @__PURE__ */ jsx12(
1326
+ "div",
1327
+ {
1328
+ ref: listRef,
1329
+ className: "flex min-h-0 flex-1 flex-col overflow-y-auto bg-ods-card p-[var(--spacing-system-m)]",
1330
+ children: /* @__PURE__ */ jsx12("div", { className: "mt-auto flex flex-col gap-[var(--spacing-system-s)]", children: messages.map(
1331
+ (message) => message.author === "system" ? /* @__PURE__ */ jsx12("p", { className: "w-full text-center text-ods-text-secondary text-h6", children: message.text }, message.id) : /* @__PURE__ */ jsx12(RemoteSessionChatMessageRow, { message, party }, message.id)
1332
+ ) })
1333
+ }
1334
+ ),
1335
+ error && /* @__PURE__ */ jsx12("p", { className: "bg-ods-card px-[var(--spacing-system-m)] text-ods-error text-h6", children: error }),
1336
+ /* @__PURE__ */ jsxs10(
1337
+ "form",
1338
+ {
1339
+ className: "flex items-center gap-[var(--spacing-system-xs)] bg-ods-card px-[var(--spacing-system-m)] pb-[var(--spacing-system-m)]",
1340
+ onSubmit: (event) => {
1341
+ event.preventDefault();
1342
+ handleSend();
1343
+ },
1344
+ children: [
1345
+ /* @__PURE__ */ jsx12(
1346
+ "input",
1347
+ {
1348
+ value: draft,
1349
+ onChange: (event) => onDraftChange(event.target.value),
1350
+ disabled: !ready,
1351
+ placeholder: ready ? "Enter your Message..." : "Loading chat...",
1352
+ "aria-label": "Message",
1353
+ className: "h-12 min-w-0 flex-1 rounded-md border border-ods-border bg-ods-bg px-[var(--spacing-system-s)] text-ods-text-primary outline-none text-h6 placeholder:text-ods-text-secondary"
1354
+ }
1355
+ ),
1356
+ /* @__PURE__ */ jsx12(
1357
+ "button",
1358
+ {
1359
+ type: "submit",
1360
+ "aria-label": "Send message",
1361
+ disabled: !ready,
1362
+ className: "flex size-12 shrink-0 items-center justify-center",
1363
+ children: /* @__PURE__ */ jsx12(Send03Icon, { size: 24, color: "currentColor", className: "text-ods-text-primary" })
1364
+ }
1365
+ )
1366
+ ]
1367
+ }
1368
+ )
1369
+ ] });
1370
+ }
1371
+ function RemoteSessionChatMessageRow({
1372
+ message,
1373
+ party
1374
+ }) {
1375
+ const isTechnician = message.author === "technician";
1376
+ const technician = message.name ?? party.technicianName ?? "Technician";
1377
+ return /* @__PURE__ */ jsxs10("div", { className: "flex w-full flex-col", children: [
1378
+ /* @__PURE__ */ jsxs10("div", { className: "flex w-full items-center gap-[var(--spacing-system-xs)]", children: [
1379
+ isTechnician && /* @__PURE__ */ jsx12(
1380
+ SquareAvatar,
1381
+ {
1382
+ variant: "round",
1383
+ sizePx: 16,
1384
+ src: party.technicianAvatarUrl ?? void 0,
1385
+ fallback: technician
1386
+ }
1387
+ ),
1388
+ /* @__PURE__ */ jsx12(
1389
+ "span",
1390
+ {
1391
+ className: cn(
1392
+ "min-w-0 flex-1 truncate text-code",
1393
+ isTechnician ? "text-ods-accent" : "text-ods-text-secondary"
1394
+ ),
1395
+ children: isTechnician ? technician : "User"
1396
+ }
1397
+ ),
1398
+ /* @__PURE__ */ jsx12("span", { className: "shrink-0 text-ods-text-secondary text-h6", children: formatTime2(message.at) })
1399
+ ] }),
1400
+ /* @__PURE__ */ jsx12("p", { className: "w-full break-words text-ods-text-primary text-h6", children: message.text })
1401
+ ] });
1402
+ }
1403
+
1404
+ // src/components/features/remote-session/remote-desktop-chat-message-row.tsx
1405
+ import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
1406
+ function RemoteDesktopChatMessageRow({
1407
+ authorName,
1408
+ isTechnician,
1409
+ avatarUrl,
1410
+ sentAt,
1411
+ body
1412
+ }) {
1413
+ return /* @__PURE__ */ jsxs11("div", { className: "grid grid-cols-1 gap-[var(--spacing-system-xxs)]", children: [
1414
+ /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-[var(--spacing-system-xxs)]", children: [
1415
+ isTechnician && /* @__PURE__ */ jsx13(SquareAvatar, { variant: "round", sizePx: 24, src: avatarUrl, alt: authorName, className: "shrink-0" }),
1416
+ /* @__PURE__ */ jsx13(
1417
+ "span",
1418
+ {
1419
+ className: cn(
1420
+ "min-w-0 flex-1 truncate text-h4 [font-family:var(--font-family-heading)]",
1421
+ isTechnician ? "text-ods-accent" : "text-ods-text-secondary"
1422
+ ),
1423
+ children: authorName
1424
+ }
1425
+ ),
1426
+ /* @__PURE__ */ jsx13("span", { suppressHydrationWarning: true, className: "shrink-0 text-ods-text-secondary text-h6", children: formatTime(sentAt) })
1427
+ ] }),
1428
+ /* @__PURE__ */ jsx13("p", { className: "whitespace-pre-wrap text-ods-text-primary text-h4", children: body })
1429
+ ] });
1430
+ }
1431
+
1432
+ // src/components/features/remote-session/remote-desktop-chat-panel.tsx
1433
+ import { useEffect as useEffect3, useRef as useRef2 } from "react";
1434
+ import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
1435
+ var REMOTE_DESKTOP_CHAT_END_USER_NAME = "User";
1436
+ function RemoteDesktopChatPanel({
1437
+ messages,
1438
+ loading,
1439
+ technician,
1440
+ sending,
1441
+ onSend,
1442
+ variant
1443
+ }) {
1444
+ const scrollRef = useRef2(null);
1445
+ const rows = messages.filter((message) => message.author !== "system");
1446
+ useEffect3(() => {
1447
+ const el = scrollRef.current;
1448
+ if (el) el.scrollTop = el.scrollHeight;
1449
+ }, [rows.length]);
1450
+ return /* @__PURE__ */ jsxs12(
1451
+ "aside",
1452
+ {
1453
+ "aria-label": "Session chat",
1454
+ className: cn(
1455
+ "flex flex-col gap-[var(--spacing-system-mf)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-mf)]",
1456
+ variant === "side" ? "h-full w-[400px] flex-shrink-0" : "absolute bottom-[var(--spacing-system-mf)] right-[var(--spacing-system-mf)] top-[calc(var(--spacing-system-xlf)+var(--spacing-system-mf))] z-10 w-[360px] shadow-lg"
1457
+ ),
1458
+ children: [
1459
+ /* @__PURE__ */ jsx14("div", { ref: scrollRef, className: "min-h-0 flex-1 overflow-y-auto", children: /* @__PURE__ */ jsx14("div", { className: "flex min-h-full flex-col justify-end gap-[var(--spacing-system-xsf)]", children: rows.length === 0 ? /* @__PURE__ */ jsx14("p", { className: "text-center text-ods-text-muted text-h6", children: loading ? "Loading the chat..." : "No messages yet - say hello to the user." }) : rows.map((message) => /* @__PURE__ */ jsx14(
1460
+ RemoteDesktopChatMessageRow,
1461
+ {
1462
+ authorName: message.name || (message.author === "technician" ? technician.name : REMOTE_DESKTOP_CHAT_END_USER_NAME),
1463
+ isTechnician: message.author === "technician",
1464
+ avatarUrl: message.author === "technician" ? technician.avatarUrl : void 0,
1465
+ sentAt: message.at,
1466
+ body: message.text
1467
+ },
1468
+ message.id
1469
+ )) }) }),
1470
+ /* @__PURE__ */ jsx14(
1471
+ ChatInput,
1472
+ {
1473
+ placeholder: "Enter your Message...",
1474
+ onSend,
1475
+ sending,
1476
+ showSendButton: true,
1477
+ fullWidth: true,
1478
+ maxRows: 4
1479
+ }
1480
+ )
1481
+ ]
1482
+ }
1483
+ );
1484
+ }
1485
+
1486
+ // src/components/features/remote-session/remote-desktop-fullscreen-toolbar.tsx
1487
+ import { Fragment as Fragment3, jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
1488
+ function RemoteDesktopFullscreenToolbar({
1489
+ deviceName,
1490
+ displayMenuGroups,
1491
+ currentDisplayLabel,
1492
+ actionsMenuGroups,
1493
+ onOpenSettings,
1494
+ onExitFullscreen,
1495
+ chatOpen = false,
1496
+ onToggleChat
1497
+ }) {
1498
+ return /* @__PURE__ */ jsxs13(Fragment3, { children: [
1499
+ /* @__PURE__ */ jsx15(OpenFrameLogo, { className: "absolute left-[var(--spacing-system-mf)] top-[var(--spacing-system-mf)] z-10 h-6 w-6 opacity-50" }),
1500
+ /* @__PURE__ */ jsxs13(
1501
+ "div",
1502
+ {
1503
+ className: "absolute left-1/2 top-0 z-10 w-[calc(100%-7rem)] -translate-x-1/2 flex items-center gap-[var(--spacing-system-xs)] rounded-b-[6px] border-x border-b border-ods-border bg-ods-overlay py-[var(--spacing-system-xsf)] pl-[var(--spacing-system-mf)] pr-[var(--spacing-system-xsf)]",
1504
+ children: [
1505
+ /* @__PURE__ */ jsxs13("div", { className: "flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xsf)]", children: [
1506
+ /* @__PURE__ */ jsx15("span", { className: "truncate text-ods-text-primary text-h6", children: deviceName }),
1507
+ displayMenuGroups.length > 0 && /* @__PURE__ */ jsx15(
1508
+ ActionsMenuDropdown,
1509
+ {
1510
+ groups: displayMenuGroups,
1511
+ customTrigger: /* @__PURE__ */ jsxs13(
1512
+ "button",
1513
+ {
1514
+ type: "button",
1515
+ "aria-label": "Switch display",
1516
+ className: "flex h-8 flex-shrink-0 items-center gap-[var(--spacing-system-xs)] rounded-[6px] border border-ods-border bg-ods-card p-[var(--spacing-system-xsf)] text-ods-text-primary hover:border-ods-border-hover",
1517
+ children: [
1518
+ /* @__PURE__ */ jsx15(MonitorIcon, { className: "h-4 w-4" }),
1519
+ /* @__PURE__ */ jsx15("span", { className: "whitespace-nowrap text-h5", children: currentDisplayLabel }),
1520
+ /* @__PURE__ */ jsx15(Chevron02DownIcon, { className: "h-4 w-4" })
1521
+ ]
1522
+ }
1523
+ )
1524
+ }
1525
+ )
1526
+ ] }),
1527
+ /* @__PURE__ */ jsxs13("div", { className: "flex flex-shrink-0 items-center gap-[var(--spacing-system-xs)]", children: [
1528
+ onToggleChat && /* @__PURE__ */ jsx15(
1529
+ Button,
1530
+ {
1531
+ variant: "outline",
1532
+ size: "small",
1533
+ onClick: onToggleChat,
1534
+ leftIcon: chatOpen ? /* @__PURE__ */ jsx15(ChatOffIcon, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx15(ChatTextIcon, { className: "h-4 w-4" }),
1535
+ children: /* @__PURE__ */ jsx15("span", { className: "text-h5", children: chatOpen ? "Close Chat" : "Open Chat" })
1536
+ }
1537
+ ),
1538
+ /* @__PURE__ */ jsx15(
1539
+ ActionsMenuDropdown,
1540
+ {
1541
+ groups: actionsMenuGroups,
1542
+ customTrigger: /* @__PURE__ */ jsx15(
1543
+ Button,
1544
+ {
1545
+ variant: "outline",
1546
+ size: "icon-sm",
1547
+ "aria-label": "Actions",
1548
+ leftIcon: /* @__PURE__ */ jsx15(Ellipsis01Icon, { className: "h-4 w-4" })
1549
+ }
1550
+ )
1551
+ }
1552
+ ),
1553
+ /* @__PURE__ */ jsx15(
1554
+ Button,
1555
+ {
1556
+ variant: "outline",
1557
+ size: "icon-sm",
1558
+ "aria-label": "Exit fullscreen",
1559
+ onClick: onExitFullscreen,
1560
+ leftIcon: /* @__PURE__ */ jsx15(Collapse02Icon, { className: "h-4 w-4" })
1561
+ }
1562
+ ),
1563
+ /* @__PURE__ */ jsx15(
1564
+ Button,
1565
+ {
1566
+ variant: "outline",
1567
+ size: "icon-sm",
1568
+ "aria-label": "Settings",
1569
+ onClick: onOpenSettings,
1570
+ leftIcon: /* @__PURE__ */ jsx15(Settings01Icon, { className: "h-4 w-4" })
1571
+ }
1572
+ )
1573
+ ] })
1574
+ ]
1575
+ }
1576
+ )
1577
+ ] });
1578
+ }
1579
+
1580
+ // src/components/features/remote-session/remote-desktop-view.tsx
1581
+ import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1582
+ var PAGE_CLASS = "h-full overflow-hidden px-[var(--spacing-system-l)] pb-[var(--spacing-system-l)]";
1583
+ var CONTROLS_BAR_CLASS = "flex flex-shrink-0 items-center justify-between gap-[var(--spacing-system-mf)] rounded-md border border-ods-border bg-ods-card px-[var(--spacing-system-mf)] py-[var(--spacing-system-xs)]";
1584
+ function RemoteDesktopView({
1585
+ deviceName,
1586
+ organizationName,
1587
+ onBack,
1588
+ fullscreen = false,
1589
+ onEnterFullscreen,
1590
+ onExitFullscreen,
1591
+ displayMenuGroups = [],
1592
+ currentDisplayLabel,
1593
+ actionsMenuGroups,
1594
+ onOpenSettings,
1595
+ chatOpen = false,
1596
+ onToggleChat,
1597
+ screen,
1598
+ chat,
1599
+ children
1600
+ }) {
1601
+ const controlsBar = /* @__PURE__ */ jsxs14("div", { className: CONTROLS_BAR_CLASS, children: [
1602
+ /* @__PURE__ */ jsxs14("div", { className: "flex min-w-0 items-center gap-[var(--spacing-system-mf)]", children: [
1603
+ /* @__PURE__ */ jsx16("div", { className: "flex-shrink-0 rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-xsf)]", children: /* @__PURE__ */ jsx16(MonitorIcon, { className: "h-4 w-4 text-ods-text-primary" }) }),
1604
+ /* @__PURE__ */ jsxs14("div", { className: "flex min-w-0 flex-col", children: [
1605
+ /* @__PURE__ */ jsx16(TruncateText, { children: deviceName }),
1606
+ /* @__PURE__ */ jsx16(
1607
+ TruncateText,
1608
+ {
1609
+ variant: "h6",
1610
+ tone: "secondary",
1611
+ children: `Desktop \u2022 ${organizationName || "Unknown Customer"}`
1612
+ }
1613
+ )
1614
+ ] })
1615
+ ] }),
1616
+ /* @__PURE__ */ jsxs14("div", { className: "flex flex-shrink-0 items-center gap-[var(--spacing-system-xs)]", children: [
1617
+ displayMenuGroups.length > 0 && /* @__PURE__ */ jsx16(
1618
+ ActionsMenuDropdown,
1619
+ {
1620
+ groups: displayMenuGroups,
1621
+ customTrigger: /* @__PURE__ */ jsx16(Button, { variant: "outline", leftIcon: /* @__PURE__ */ jsx16(MonitorIcon, { className: "h-4 w-4 md:h-6 md:w-6" }), children: /* @__PURE__ */ jsx16("span", { className: "sr-only content-md:not-sr-only", children: currentDisplayLabel }) })
1622
+ }
1623
+ ),
1624
+ onToggleChat && /* @__PURE__ */ jsx16(
1625
+ Button,
1626
+ {
1627
+ variant: "outline",
1628
+ onClick: onToggleChat,
1629
+ leftIcon: chatOpen ? /* @__PURE__ */ jsx16(ChatOffIcon, { className: "h-4 w-4 md:h-6 md:w-6" }) : /* @__PURE__ */ jsx16(ChatTextIcon, { className: "h-4 w-4 md:h-6 md:w-6" }),
1630
+ children: /* @__PURE__ */ jsx16("span", { className: "sr-only content-md:not-sr-only", children: chatOpen ? "Close Chat" : "Open Chat" })
1631
+ }
1632
+ ),
1633
+ /* @__PURE__ */ jsx16(ActionsMenuDropdown, { groups: actionsMenuGroups, triggerAriaLabel: "Actions" }),
1634
+ /* @__PURE__ */ jsx16(
1635
+ Button,
1636
+ {
1637
+ variant: "outline",
1638
+ size: "icon",
1639
+ "aria-label": "Settings",
1640
+ onClick: onOpenSettings,
1641
+ leftIcon: /* @__PURE__ */ jsx16(Settings01Icon, {})
1642
+ }
1643
+ ),
1644
+ /* @__PURE__ */ jsx16(
1645
+ Button,
1646
+ {
1647
+ variant: "outline",
1648
+ size: "icon",
1649
+ "aria-label": fullscreen ? "Exit fullscreen" : "Enter fullscreen",
1650
+ onClick: fullscreen ? onExitFullscreen : onEnterFullscreen,
1651
+ leftIcon: fullscreen ? /* @__PURE__ */ jsx16(Collapse02Icon, {}) : /* @__PURE__ */ jsx16(Expand02Icon, {})
1652
+ }
1653
+ )
1654
+ ] })
1655
+ ] });
1656
+ return /* @__PURE__ */ jsxs14(
1657
+ PageLayout,
1658
+ {
1659
+ className: PAGE_CLASS,
1660
+ backButton: onBack ? { label: "Back", onClick: onBack } : void 0,
1661
+ showHeader: !fullscreen,
1662
+ children: [
1663
+ /* @__PURE__ */ jsxs14("div", { className: fullscreen ? "fixed inset-0 z-50 flex flex-col bg-black" : "contents", children: [
1664
+ fullscreen ? /* @__PURE__ */ jsx16(
1665
+ RemoteDesktopFullscreenToolbar,
1666
+ {
1667
+ deviceName,
1668
+ displayMenuGroups,
1669
+ currentDisplayLabel,
1670
+ actionsMenuGroups,
1671
+ onOpenSettings,
1672
+ onExitFullscreen,
1673
+ chatOpen: onToggleChat ? chatOpen : void 0,
1674
+ onToggleChat
1675
+ }
1676
+ ) : controlsBar,
1677
+ /* @__PURE__ */ jsxs14("div", { className: `relative flex min-h-0 min-w-0 flex-1 ${fullscreen ? "" : "gap-[var(--spacing-system-mf)]"}`, children: [
1678
+ /* @__PURE__ */ jsx16("div", { className: `relative min-h-0 min-w-0 flex-1 overflow-hidden bg-black ${fullscreen ? "" : "rounded-lg"}`, children: screen }),
1679
+ chat
1680
+ ] })
1681
+ ] }),
1682
+ children
1683
+ ]
1684
+ }
1685
+ );
1686
+ }
1687
+ function RemoteDesktopViewSkeleton({ onBack }) {
1688
+ return /* @__PURE__ */ jsxs14(PageLayout, { className: PAGE_CLASS, backButton: onBack ? { label: "Back", onClick: onBack } : void 0, children: [
1689
+ /* @__PURE__ */ jsxs14("div", { className: CONTROLS_BAR_CLASS, children: [
1690
+ /* @__PURE__ */ jsxs14("div", { className: "flex min-w-0 items-center gap-[var(--spacing-system-mf)]", children: [
1691
+ /* @__PURE__ */ jsx16(Skeleton, { className: "h-9 w-9 flex-shrink-0 rounded-md" }),
1692
+ /* @__PURE__ */ jsxs14("div", { className: "flex min-w-0 flex-col gap-[var(--spacing-system-xxs)]", children: [
1693
+ /* @__PURE__ */ jsx16(Skeleton, { className: "h-5 w-48" }),
1694
+ /* @__PURE__ */ jsx16(Skeleton, { className: "h-4 w-36" })
1695
+ ] })
1696
+ ] }),
1697
+ /* @__PURE__ */ jsxs14("div", { className: "flex flex-shrink-0 items-center gap-[var(--spacing-system-xs)]", children: [
1698
+ /* @__PURE__ */ jsx16(Skeleton, { className: "h-11 w-11 rounded-lg md:h-12 md:w-12" }),
1699
+ /* @__PURE__ */ jsx16(Skeleton, { className: "h-11 w-11 rounded-lg md:h-12 md:w-12" }),
1700
+ /* @__PURE__ */ jsx16(Skeleton, { className: "h-11 w-11 rounded-lg md:h-12 md:w-12" })
1701
+ ] })
1702
+ ] }),
1703
+ /* @__PURE__ */ jsx16("div", { className: "min-h-0 min-w-0 flex-1 rounded-lg bg-black" })
1704
+ ] });
1705
+ }
1706
+
1707
+ // src/components/features/remote-session/remote-session-dialog.tsx
1708
+ import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
1709
+ var NOTICE_COPY = {
1710
+ "session-ended": { title: "Remote session ended", suffix: "has disconnected from your device." },
1711
+ "connection-lost": { title: "Connection lost", suffix: "lost the connection to your device." }
1712
+ };
1713
+ function RemoteSessionDialog({
1714
+ variant,
1715
+ organizationName,
1716
+ ending = false,
1717
+ onEndSession,
1718
+ onClose
1719
+ }) {
1720
+ if (variant === "end-confirm") {
1721
+ return /* @__PURE__ */ jsxs15(DialogCard, { children: [
1722
+ /* @__PURE__ */ jsxs15("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
1723
+ /* @__PURE__ */ jsx17("h1", { className: "w-full text-ods-text-primary text-h2", children: "End remote session?" }),
1724
+ /* @__PURE__ */ jsx17("p", { className: "w-full text-ods-text-primary text-h4", children: "The technician will lose access to your device immediately." })
1725
+ ] }),
1726
+ /* @__PURE__ */ jsxs15("div", { className: "flex w-full items-stretch gap-[var(--spacing-system-l)]", children: [
1727
+ /* @__PURE__ */ jsx17(Button, { variant: "outline", fullWidth: true, disabled: ending, onClick: onClose, children: "Cancel" }),
1728
+ /* @__PURE__ */ jsx17(Button, { variant: "destructive", fullWidth: true, loading: ending, onClick: onEndSession, children: "End Session" })
1729
+ ] })
1730
+ ] });
1731
+ }
1732
+ const copy = NOTICE_COPY[variant];
1733
+ return /* @__PURE__ */ jsxs15(DialogCard, { children: [
1734
+ /* @__PURE__ */ jsxs15("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
1735
+ /* @__PURE__ */ jsx17("h1", { className: "w-full text-ods-text-primary text-h2", children: copy.title }),
1736
+ /* @__PURE__ */ jsxs15("p", { className: "w-full text-ods-text-primary text-h4", children: [
1737
+ /* @__PURE__ */ jsx17("span", { className: "text-ods-accent", children: organizationName }),
1738
+ " ",
1739
+ copy.suffix
1740
+ ] })
1741
+ ] }),
1742
+ /* @__PURE__ */ jsx17("div", { className: "flex w-full justify-end", children: /* @__PURE__ */ jsx17(Button, { variant: "outline", className: "w-1/2", onClick: onClose, children: "Close" }) })
1743
+ ] });
1744
+ }
1745
+ function DialogCard({ children }) {
1746
+ return /* @__PURE__ */ jsx17("div", { className: "flex w-full flex-col gap-[var(--spacing-system-l)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-xl)]", children });
1747
+ }
1748
+
1749
+ // src/components/features/remote-session/remote-session-overlay.tsx
1750
+ import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
1751
+ function RemoteSessionBorder({ className }) {
1752
+ return /* @__PURE__ */ jsx18("div", { className: cn("pointer-events-none size-full border-4 border-ods-warning", className) });
1753
+ }
1754
+ function RemoteSessionPill({ onEndSession }) {
1755
+ return /* @__PURE__ */ jsxs16(
1756
+ "button",
1757
+ {
1758
+ type: "button",
1759
+ className: "flex items-center gap-[var(--spacing-system-xsf)] rounded-b-md bg-ods-warning px-[var(--spacing-system-m)] py-[var(--spacing-system-xs)] text-ods-text-on-accent",
1760
+ onClick: onEndSession,
1761
+ children: [
1762
+ /* @__PURE__ */ jsx18(MonitorOffIcon, { size: 24, color: "currentColor" }),
1763
+ /* @__PURE__ */ jsx18("span", { className: "whitespace-nowrap text-h3", children: "End Session" })
1764
+ ]
1765
+ }
1766
+ );
1767
+ }
1768
+
1769
+ // src/components/features/remote-session/remote-session-keep-modals.tsx
1770
+ import { useState as useState3 } from "react";
1771
+ import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
1772
+ var REMOTE_SESSION_KEEP_REASON_LABELS = {
1773
+ CLIENT_DISPUTE: "Client dispute",
1774
+ INTERNAL_REVIEW: "Internal review",
1775
+ LEGAL_OR_COMPLIANCE: "Legal or compliance request",
1776
+ OTHER: "Other"
1777
+ };
1778
+ var KEEP_REASONS = Object.keys(REMOTE_SESSION_KEEP_REASON_LABELS);
1779
+ var DESCRIPTION_MAX_LENGTH = 500;
1780
+ function KeepNotice({ icon, title, children }) {
1781
+ return /* @__PURE__ */ jsxs17("div", { className: "flex w-full items-start gap-[var(--spacing-system-m)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-m)]", children: [
1782
+ /* @__PURE__ */ jsx19("span", { className: "flex shrink-0 text-ods-text-secondary", children: icon }),
1783
+ /* @__PURE__ */ jsxs17("div", { className: "flex min-w-0 flex-1 flex-col", children: [
1784
+ /* @__PURE__ */ jsx19("p", { className: "text-ods-text-primary text-h3", children: title }),
1785
+ /* @__PURE__ */ jsx19("p", { className: "text-ods-text-secondary text-h4", children })
1786
+ ] })
1787
+ ] });
1788
+ }
1789
+ function KeepRecordingModal({
1790
+ isOpen,
1791
+ onClose,
1792
+ keptUsage,
1793
+ isPending = false,
1794
+ onConfirm
1795
+ }) {
1796
+ const [reason, setReason] = useState3("");
1797
+ const [description, setDescription] = useState3("");
1798
+ const [seededOpen, setSeededOpen] = useState3(isOpen);
1799
+ if (seededOpen !== isOpen) {
1800
+ setSeededOpen(isOpen);
1801
+ if (isOpen) {
1802
+ setReason("");
1803
+ setDescription("");
1804
+ }
1805
+ }
1806
+ const trimmed = description.trim();
1807
+ const canKeep = reason !== "" && (reason !== "OTHER" || trimmed !== "");
1808
+ const handleKeep = () => {
1809
+ if (!canKeep || isPending) return;
1810
+ onConfirm({ reason, description: reason === "OTHER" ? trimmed : null });
1811
+ };
1812
+ return /* @__PURE__ */ jsxs17(Modal, { isOpen, onClose: isPending ? () => {
1813
+ } : onClose, className: "text-left md:max-w-[600px]", children: [
1814
+ /* @__PURE__ */ jsx19(ModalHeader, { children: /* @__PURE__ */ jsx19(ModalTitle, { children: "Keep this recording" }) }),
1815
+ /* @__PURE__ */ jsxs17(
1816
+ KeepNotice,
1817
+ {
1818
+ icon: /* @__PURE__ */ jsx19(InfoCircleIcon, { size: 24, color: "currentColor" }),
1819
+ title: "This recording won't be deleted automatically",
1820
+ children: [
1821
+ "It stays until you stop keeping it. Kept recordings use ",
1822
+ keptUsage,
1823
+ "."
1824
+ ]
1825
+ }
1826
+ ),
1827
+ /* @__PURE__ */ jsxs17("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xs)]", children: [
1828
+ /* @__PURE__ */ jsxs17(
1829
+ Select,
1830
+ {
1831
+ value: reason,
1832
+ onValueChange: (value) => setReason(value),
1833
+ disabled: isPending,
1834
+ children: [
1835
+ /* @__PURE__ */ jsx19(SelectTrigger, { label: "Reason", labelVariant: "large", children: /* @__PURE__ */ jsx19(SelectValue, { placeholder: "Select Reason" }) }),
1836
+ /* @__PURE__ */ jsx19(SelectContent, { children: KEEP_REASONS.map((value) => /* @__PURE__ */ jsx19(SelectItem, { value, children: REMOTE_SESSION_KEEP_REASON_LABELS[value] }, value)) })
1837
+ ]
1838
+ }
1839
+ ),
1840
+ reason === "OTHER" && /* @__PURE__ */ jsx19(
1841
+ Input,
1842
+ {
1843
+ "aria-label": "Reason description",
1844
+ value: description,
1845
+ onChange: (event) => setDescription(event.target.value),
1846
+ placeholder: "Briefly describe what's going on",
1847
+ maxLength: DESCRIPTION_MAX_LENGTH,
1848
+ disabled: isPending
1849
+ }
1850
+ )
1851
+ ] }),
1852
+ /* @__PURE__ */ jsxs17(ModalFooter, { children: [
1853
+ /* @__PURE__ */ jsx19(Button, { type: "button", variant: "outline", onClick: onClose, disabled: isPending, className: "flex-1 md:hidden", children: "Cancel" }),
1854
+ /* @__PURE__ */ jsx19("div", { className: "hidden flex-1 md:block" }),
1855
+ /* @__PURE__ */ jsx19(
1856
+ Button,
1857
+ {
1858
+ type: "button",
1859
+ variant: "accent",
1860
+ onClick: handleKeep,
1861
+ loading: isPending,
1862
+ disabled: !canKeep,
1863
+ className: "flex-1",
1864
+ children: "Keep"
1865
+ }
1866
+ )
1867
+ ] })
1868
+ ] });
1869
+ }
1870
+ function ReleaseKeepingModal({
1871
+ isOpen,
1872
+ onClose,
1873
+ keptBy,
1874
+ keptOn,
1875
+ reason,
1876
+ ticket,
1877
+ expiresOn,
1878
+ dueOn,
1879
+ isPending = false,
1880
+ onConfirm
1881
+ }) {
1882
+ return /* @__PURE__ */ jsxs17(Modal, { isOpen, onClose: isPending ? () => {
1883
+ } : onClose, className: "text-left md:max-w-[600px]", children: [
1884
+ /* @__PURE__ */ jsx19(ModalHeader, { children: /* @__PURE__ */ jsx19(ModalTitle, { children: "Release Keeping" }) }),
1885
+ /* @__PURE__ */ jsxs17("div", { className: "flex w-full flex-col gap-[var(--spacing-system-xsf)] text-ods-text-primary text-h4", children: [
1886
+ /* @__PURE__ */ jsxs17("p", { children: [
1887
+ "Kept by ",
1888
+ keptBy,
1889
+ " on ",
1890
+ keptOn,
1891
+ " for ",
1892
+ reason,
1893
+ "."
1894
+ ] }),
1895
+ ticket && /* @__PURE__ */ jsxs17("p", { children: [
1896
+ "Ticket: ",
1897
+ ticket
1898
+ ] })
1899
+ ] }),
1900
+ /* @__PURE__ */ jsx19(KeepNotice, { icon: /* @__PURE__ */ jsx19(HourglassIcon, { size: 24, color: "currentColor" }), title: `It will expire on ${expiresOn}`, children: dueOn ? `It was due to expire on ${dueOn}. Releasing gives it 3 days' grace, and it shows amber until then. Whoever placed the Keep is reminded the day before it goes. Nothing is deleted now.` : "Nothing is deleted now." }),
1901
+ /* @__PURE__ */ jsxs17(ModalFooter, { children: [
1902
+ /* @__PURE__ */ jsx19(Button, { type: "button", variant: "outline", onClick: onClose, disabled: isPending, className: "flex-1 md:hidden", children: "Cancel" }),
1903
+ /* @__PURE__ */ jsx19("div", { className: "hidden flex-1 md:block" }),
1904
+ /* @__PURE__ */ jsx19(Button, { type: "button", variant: "accent", onClick: onConfirm, loading: isPending, className: "flex-1", children: "Release Keeping" })
1905
+ ] })
1906
+ ] });
1907
+ }
1908
+
1909
+ // src/components/features/remote-session/remote-session-events.tsx
1910
+ import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
1911
+ function formatRemoteSessionOffset(offsetMs) {
1912
+ const total = Math.max(0, Math.floor(offsetMs / 1e3));
1913
+ const hours = Math.floor(total / 3600);
1914
+ const minutes = String(Math.floor(total % 3600 / 60)).padStart(2, "0");
1915
+ const seconds = String(total % 60).padStart(2, "0");
1916
+ return hours > 0 ? `${hours}:${minutes}:${seconds}` : `${minutes}:${seconds}`;
1917
+ }
1918
+ function RemoteSessionEventList({ events, activeEventId, onSelect, className }) {
1919
+ return /* @__PURE__ */ jsxs18("section", { className: cn("flex w-full flex-col gap-[var(--spacing-system-xxs)]", className), children: [
1920
+ /* @__PURE__ */ jsx20("h2", { className: "text-ods-text-secondary text-h5", children: "Session Events" }),
1921
+ /* @__PURE__ */ jsx20("ol", { className: "flex w-full flex-col gap-[var(--spacing-system-xxs)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-m)]", children: events.map((event) => /* @__PURE__ */ jsx20("li", { children: /* @__PURE__ */ jsxs18(
1922
+ "button",
1923
+ {
1924
+ type: "button",
1925
+ "aria-current": event.id === activeEventId || void 0,
1926
+ onClick: () => onSelect?.(event),
1927
+ className: cn(
1928
+ "flex w-full items-start gap-[var(--spacing-system-xxs)] rounded-md p-[var(--spacing-system-xxs)] text-left outline-none transition-colors",
1929
+ "hover:bg-ods-bg-hover focus-visible:ring-2 focus-visible:ring-ods-focus",
1930
+ event.id === activeEventId && "bg-ods-border hover:bg-ods-border"
1931
+ ),
1932
+ children: [
1933
+ /* @__PURE__ */ jsx20("span", { className: "w-[84px] shrink-0 text-ods-text-secondary text-h4", children: formatRemoteSessionOffset(event.offsetMs) }),
1934
+ /* @__PURE__ */ jsxs18("span", { className: "flex min-w-0 flex-1 flex-col", children: [
1935
+ /* @__PURE__ */ jsx20("span", { className: "text-ods-text-primary text-h4", children: event.title }),
1936
+ event.detail && /* @__PURE__ */ jsx20("span", { className: "text-ods-text-secondary text-h6", children: event.detail })
1937
+ ] })
1938
+ ]
1939
+ }
1940
+ ) }, event.id)) })
1941
+ ] });
1942
+ }
1943
+ function RemoteSessionTimelineMarkers({
1944
+ events,
1945
+ durationMs,
1946
+ onSelect,
1947
+ className
1948
+ }) {
1949
+ if (durationMs <= 0) return null;
1950
+ return /* @__PURE__ */ jsx20("div", { className: cn("relative h-4 w-full", className), children: events.map((event) => {
1951
+ const share = Math.min(1, Math.max(0, event.offsetMs / durationMs));
1952
+ const label = `${event.title} at ${formatRemoteSessionOffset(event.offsetMs)}`;
1953
+ return /* @__PURE__ */ jsx20(
1954
+ "button",
1955
+ {
1956
+ type: "button",
1957
+ "aria-label": label,
1958
+ title: label,
1959
+ onClick: () => onSelect?.(event),
1960
+ style: { left: `${share * 100}%` },
1961
+ className: "absolute top-0 h-4 w-1 -translate-x-1/2 rounded-md bg-ods-text-secondary outline-none transition-colors hover:bg-ods-text-primary focus-visible:ring-2 focus-visible:ring-ods-focus"
1962
+ },
1963
+ event.id
1964
+ );
1965
+ }) });
1966
+ }
1967
+
1968
+ // src/components/features/remote-session/remote-session-status.tsx
1969
+ import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
1970
+ function LiveDot() {
1971
+ return /* @__PURE__ */ jsx21("span", { "aria-hidden": true, className: "size-2 animate-live-pulse rounded-full bg-current motion-reduce:animate-none" });
1972
+ }
1973
+ var STATUS_TAG = {
1974
+ live: { label: "Live", variant: "critical" },
1975
+ processing: { label: "Processing", variant: "warning" },
1976
+ failed: { label: "Failed", variant: "error" }
1977
+ };
1978
+ function RemoteSessionStatusTag({ status, className }) {
1979
+ const { label, variant } = STATUS_TAG[status];
1980
+ return /* @__PURE__ */ jsx21(
1981
+ Tag,
1982
+ {
1983
+ label,
1984
+ variant,
1985
+ icon: status === "live" ? /* @__PURE__ */ jsx21(LiveDot, {}) : void 0,
1986
+ className: cn("pointer-events-none shrink-0", className)
1987
+ }
1988
+ );
1989
+ }
1990
+ function RemoteSessionExpiry(props) {
1991
+ const { className } = props;
1992
+ if (props.state === "none") {
1993
+ return /* @__PURE__ */ jsx21("p", { className: cn("text-ods-text-primary text-h4", className), children: "-" });
1994
+ }
1995
+ if (props.state === "expired") {
1996
+ return /* @__PURE__ */ jsx21("p", { className: cn("text-ods-text-secondary text-h4", className), children: "Expired" });
1997
+ }
1998
+ if (props.state === "kept") {
1999
+ return /* @__PURE__ */ jsxs19("div", { className: cn("flex min-w-0 flex-col", className), children: [
2000
+ /* @__PURE__ */ jsxs19("p", { className: "flex items-center gap-[var(--spacing-system-xxs)] text-ods-text-primary text-h4", children: [
2001
+ /* @__PURE__ */ jsx21(LockIcon, { size: 24, color: "currentColor", className: "shrink-0" }),
2002
+ "Kept"
2003
+ ] }),
2004
+ /* @__PURE__ */ jsxs19("p", { className: "truncate text-ods-text-secondary text-h6", children: [
2005
+ "Kept by ",
2006
+ props.keptBy,
2007
+ " \xB7 ",
2008
+ props.reason
2009
+ ] })
2010
+ ] });
2011
+ }
2012
+ return /* @__PURE__ */ jsxs19("div", { className: cn("flex min-w-0 flex-col", className), children: [
2013
+ /* @__PURE__ */ jsx21("p", { className: "text-ods-text-primary text-h4", children: props.date }),
2014
+ props.remaining && /* @__PURE__ */ jsx21("p", { className: "truncate text-ods-text-secondary text-h6", children: props.remaining })
2015
+ ] });
2016
+ }
2017
+ function RemoteSessionStorageAlert({ scope, capacity, className }) {
2018
+ const message = scope === "session" ? "This session isn't being recorded. Recording storage is full. New sessions aren't recorded until space is freed." : `Recording storage full. New sessions aren't recorded.${capacity ? ` All ${capacity} of recording storage is used.` : ""}`;
2019
+ return /* @__PURE__ */ jsxs19(
2020
+ "div",
2021
+ {
2022
+ role: "alert",
2023
+ className: cn(
2024
+ "flex w-full items-start gap-[var(--spacing-system-m)] rounded-md bg-ods-warning-secondary p-[var(--spacing-system-s)] text-ods-warning",
2025
+ className
2026
+ ),
2027
+ children: [
2028
+ /* @__PURE__ */ jsx21(AlertTriangleIcon, { size: 24, color: "currentColor", className: "shrink-0" }),
2029
+ /* @__PURE__ */ jsx21("p", { className: "min-w-0 flex-1 text-h3", children: message })
2030
+ ]
2031
+ }
2032
+ );
2033
+ }
2034
+
2035
+ export {
2036
+ TruncateText,
2037
+ Select,
2038
+ SelectGroup,
2039
+ SelectValue,
2040
+ SelectTrigger,
2041
+ SelectScrollUpButton,
2042
+ SelectScrollDownButton,
2043
+ SelectContent,
2044
+ SelectLabel,
2045
+ SelectItem,
2046
+ SelectSeparator,
2047
+ BACK_BUTTON_SKELETON_CLASS,
2048
+ BackButton,
2049
+ PageActions,
2050
+ usePageActionsBottomPadding,
2051
+ EntityImage,
2052
+ TITLE_BLOCK_MIN_HEIGHT,
2053
+ TitleBlock,
2054
+ PageLayout,
2055
+ RemoteSessionViewers,
2056
+ RemoteSessionScope,
2057
+ RemoteSessionOrgLogo,
2058
+ RemoteSessionRecordingTag,
2059
+ REMOTE_SESSION_DRAG_HANDLE_CLASS,
2060
+ RemoteSessionDragger,
2061
+ formatRemoteSessionElapsed,
2062
+ useRemoteSessionTimer,
2063
+ RemoteAccessRequestCard,
2064
+ RemoteSessionBlockFrame,
2065
+ RemoteSessionEndButton,
2066
+ RemoteSessionSummary,
2067
+ RemoteSessionMinimizedChip,
2068
+ RemoteSessionChatPanel,
2069
+ RemoteDesktopChatMessageRow,
2070
+ REMOTE_DESKTOP_CHAT_END_USER_NAME,
2071
+ RemoteDesktopChatPanel,
2072
+ RemoteDesktopFullscreenToolbar,
2073
+ RemoteDesktopView,
2074
+ RemoteDesktopViewSkeleton,
2075
+ RemoteSessionDialog,
2076
+ RemoteSessionBorder,
2077
+ RemoteSessionPill,
2078
+ REMOTE_SESSION_KEEP_REASON_LABELS,
2079
+ KeepRecordingModal,
2080
+ ReleaseKeepingModal,
2081
+ formatRemoteSessionOffset,
2082
+ RemoteSessionEventList,
2083
+ RemoteSessionTimelineMarkers,
2084
+ RemoteSessionStatusTag,
2085
+ RemoteSessionExpiry,
2086
+ RemoteSessionStorageAlert
2087
+ };