@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
@@ -1,51 +1,67 @@
1
1
  "use client";
2
+ import {
3
+ readLocalStorageUpdateDetail
4
+ } from "./chunk-3K5ZLZE7.js";
2
5
  import {
3
6
  useEndpointsRuntime,
4
7
  useRequiredEndpointsRuntime
5
8
  } from "./chunk-HFL2F4RM.js";
6
9
  import {
7
- contentFetch,
8
- createSearchParams,
9
- parseSchemaParams,
10
- positiveInt,
11
- shouldIncludeInUrl
12
- } from "./chunk-CUME3VTQ.js";
10
+ contentFetch
11
+ } from "./chunk-G3GRYDMS.js";
13
12
  import {
14
- ToolIcon,
15
- apiErrorMessage,
13
+ ELAPSED_MS_FIELD,
14
+ FORM_RESCUE_ATTEMPT_FIELD,
15
+ FORM_RESCUE_DEBOUNCE_MS,
16
+ FORM_RESCUE_EVENTS,
17
+ FORM_RESCUE_RESUME_FIELD,
18
+ FORM_RESCUE_RESUME_PARAM,
19
+ HONEYPOT_FIELD,
20
+ LOCATION_HASH_SYNC_EVENT,
21
+ captureFormRescueEvent,
22
+ consumeAccessCode,
23
+ filledRescueFields,
16
24
  getHashTargetElement,
25
+ isFormAttemptId,
26
+ isRescueEmail,
27
+ isResumeToken,
28
+ isScrollSyncedHash,
17
29
  normalizeHashFragment,
30
+ rescueCompletionPct,
31
+ sanitizeRescueFieldName,
32
+ sanitizeRescueValues,
18
33
  scrollElementIntoView,
34
+ toClaudeMirrorPath,
35
+ transformPlatformConfigsToOptions,
19
36
  useAutoplay,
20
- useDebounce
21
- } from "./chunk-CZ7Y7UG4.js";
37
+ useDebounce,
38
+ validateAccessCode,
39
+ validateAndConsumeAccessCode
40
+ } from "./chunk-CMZ3QTFQ.js";
41
+ import {
42
+ ToolIcon,
43
+ apiErrorMessage
44
+ } from "./chunk-34I6XI3N.js";
22
45
  import {
23
46
  useRouter,
24
47
  useSearchParams
25
48
  } from "./chunk-GY4IZG22.js";
26
49
  import {
27
- breakpoints,
28
- createLocalStorageAdapter,
29
- getPlatformBrandClasses,
30
- useMediaQuery
31
- } from "./chunk-FXJ3WWUB.js";
32
- import {
33
- FlamingoLogo,
34
- MiamiCyberGangLogoFaceOnly,
35
- MlgLogo,
36
- OpenFrameLogo,
37
- OpenmspLogo
38
- } from "./chunk-N45D4ZXQ.js";
50
+ createSearchParams,
51
+ parseSchemaParams,
52
+ positiveInt,
53
+ shouldIncludeInUrl
54
+ } from "./chunk-AGVXKD4K.js";
39
55
  import {
40
56
  Chevron02DownIcon,
41
57
  XmarkIcon
42
58
  } from "./chunk-NCPTID44.js";
43
- import {
44
- cn
45
- } from "./chunk-7RXWKTAP.js";
46
59
  import {
47
60
  createNatsClient
48
61
  } from "./chunk-V3JFVKHV.js";
62
+ import {
63
+ cn
64
+ } from "./chunk-7RXWKTAP.js";
49
65
 
50
66
  // src/hooks/ui/use-auto-limit-tags.ts
51
67
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -142,12 +158,6 @@ function useDeferredError(error, value, delay = 1500) {
142
158
  };
143
159
  }
144
160
 
145
- // src/hooks/ui/use-drag-and-drop-enabled.ts
146
- var DRAG_AND_DROP_MEDIA_QUERY = `(pointer: fine) and (hover: hover) and ${breakpoints.md}`;
147
- function useDragAndDropEnabled() {
148
- return useMediaQuery(DRAG_AND_DROP_MEDIA_QUERY) ?? false;
149
- }
150
-
151
161
  // src/hooks/ui/use-focus-trap.ts
152
162
  import { useEffect as useEffect3, useRef as useRef2 } from "react";
153
163
  var FOCUSABLE_SELECTOR = [
@@ -207,204 +217,29 @@ function useFocusTrap(containerRef, active, { onEscape, contain = true } = {}) {
207
217
  }, [containerRef, active, contain]);
208
218
  }
209
219
 
210
- // src/hooks/ui/use-horizontal-scrollbar.ts
211
- import { useRef as useRef3, useState as useState3, useCallback as useCallback3 } from "react";
212
- function useHorizontalScrollbar() {
213
- const scrollElRef = useRef3(null);
214
- const trackRef = useRef3(null);
215
- const thumbRef = useRef3(null);
216
- const roRef = useRef3(null);
217
- const moRef = useRef3(null);
218
- const [thumbRatio, setThumbRatio] = useState3(0);
219
- const [canScrollLeft, setCanScrollLeft] = useState3(false);
220
- const [canScrollRight, setCanScrollRight] = useState3(false);
221
- const prevCanScrollLeftRef = useRef3(false);
222
- const prevCanScrollRightRef = useRef3(false);
223
- const isDraggingRef = useRef3(false);
224
- const dragStartRef = useRef3({ mouseX: 0, scrollLeft: 0 });
225
- const rafIdRef = useRef3(0);
226
- const syncThumbToDOM = useCallback3(() => {
227
- const el = scrollElRef.current;
228
- const thumb = thumbRef.current;
229
- if (!el || !thumb) return;
230
- const maxScroll = el.scrollWidth - el.clientWidth;
231
- if (maxScroll <= 0) {
232
- thumb.style.left = "0%";
233
- return;
234
- }
235
- const ratio = el.clientWidth / el.scrollWidth;
236
- const fraction = Math.min(Math.max(el.scrollLeft, 0), maxScroll) / maxScroll;
237
- thumb.style.left = `${fraction * (1 - ratio) * 100}%`;
238
- }, []);
239
- const syncEdgeFades = useCallback3(() => {
240
- const el = scrollElRef.current;
241
- if (!el) return;
242
- const maxScroll = el.scrollWidth - el.clientWidth;
243
- const ratio = el.clientWidth / el.scrollWidth;
244
- if (ratio >= 1 || maxScroll <= 0) {
245
- if (prevCanScrollLeftRef.current) {
246
- prevCanScrollLeftRef.current = false;
247
- setCanScrollLeft(false);
248
- }
249
- if (prevCanScrollRightRef.current) {
250
- prevCanScrollRightRef.current = false;
251
- setCanScrollRight(false);
252
- }
253
- return;
254
- }
255
- const fraction = Math.min(Math.max(el.scrollLeft, 0), maxScroll) / maxScroll;
256
- const left = fraction > 1e-3;
257
- const right = fraction < 0.999;
258
- if (left !== prevCanScrollLeftRef.current) {
259
- prevCanScrollLeftRef.current = left;
260
- setCanScrollLeft(left);
261
- }
262
- if (right !== prevCanScrollRightRef.current) {
263
- prevCanScrollRightRef.current = right;
264
- setCanScrollRight(right);
265
- }
266
- }, []);
267
- const measure2 = useCallback3(() => {
268
- const el = scrollElRef.current;
269
- if (!el) return;
270
- const ratio = el.clientWidth / el.scrollWidth;
271
- setThumbRatio(ratio >= 1 ? 0 : ratio);
272
- syncThumbToDOM();
273
- syncEdgeFades();
274
- }, [syncThumbToDOM, syncEdgeFades]);
275
- const scrollRef = useCallback3(
276
- (node) => {
277
- if (roRef.current) {
278
- roRef.current.disconnect();
279
- roRef.current = null;
280
- }
281
- if (moRef.current) {
282
- moRef.current.disconnect();
283
- moRef.current = null;
284
- }
285
- if (rafIdRef.current) {
286
- cancelAnimationFrame(rafIdRef.current);
287
- rafIdRef.current = 0;
288
- }
289
- scrollElRef.current = node;
290
- if (node) {
291
- const ratio = node.clientWidth / node.scrollWidth;
292
- setThumbRatio(ratio >= 1 ? 0 : ratio);
293
- const ro = new ResizeObserver(measure2);
294
- roRef.current = ro;
295
- const observeAll = () => {
296
- ro.disconnect();
297
- ro.observe(node);
298
- for (const child of Array.from(node.children)) ro.observe(child);
299
- };
300
- observeAll();
301
- moRef.current = new MutationObserver(() => {
302
- observeAll();
303
- measure2();
304
- });
305
- moRef.current.observe(node, { childList: true });
306
- requestAnimationFrame(() => {
307
- syncThumbToDOM();
308
- syncEdgeFades();
309
- });
310
- } else {
311
- setThumbRatio(0);
312
- prevCanScrollLeftRef.current = false;
313
- prevCanScrollRightRef.current = false;
314
- setCanScrollLeft(false);
315
- setCanScrollRight(false);
316
- }
317
- },
318
- [measure2, syncThumbToDOM, syncEdgeFades]
319
- );
320
- const onScroll = useCallback3(() => {
321
- if (isDraggingRef.current) return;
322
- if (rafIdRef.current) cancelAnimationFrame(rafIdRef.current);
323
- rafIdRef.current = requestAnimationFrame(() => {
324
- syncThumbToDOM();
325
- syncEdgeFades();
326
- });
327
- }, [syncThumbToDOM, syncEdgeFades]);
328
- const onTrackClick = useCallback3((e) => {
329
- if (e.target.closest("[data-scrollbar-thumb]")) return;
330
- const track = trackRef.current;
331
- const el = scrollElRef.current;
332
- if (!track || !el) return;
333
- const ratio = el.clientWidth / el.scrollWidth;
334
- if (ratio >= 1) return;
335
- const rect = track.getBoundingClientRect();
336
- const thumbWidth = rect.width * ratio;
337
- const maxThumbOffset = rect.width - thumbWidth;
338
- if (maxThumbOffset <= 0) return;
339
- const targetFraction = Math.max(0, Math.min(1, (e.clientX - rect.left - thumbWidth / 2) / maxThumbOffset));
340
- const targetScrollLeft = targetFraction * (el.scrollWidth - el.clientWidth);
341
- el.scrollTo({ left: targetScrollLeft, behavior: "smooth" });
342
- }, []);
343
- const onTrackWheel = useCallback3((e) => {
344
- const el = scrollElRef.current;
345
- if (!el) return;
346
- e.preventDefault();
347
- el.scrollLeft += e.deltaX || e.deltaY;
348
- }, []);
349
- const onThumbPointerDown = useCallback3((e) => {
350
- e.preventDefault();
351
- e.stopPropagation();
352
- const el = scrollElRef.current;
353
- if (!el) return;
354
- isDraggingRef.current = true;
355
- dragStartRef.current = { mouseX: e.clientX, scrollLeft: el.scrollLeft };
356
- const target = e.currentTarget;
357
- target.setPointerCapture(e.pointerId);
358
- target.style.cursor = "grabbing";
359
- }, []);
360
- const onThumbPointerMove = useCallback3(
361
- (e) => {
362
- if (!isDraggingRef.current) return;
363
- const el = scrollElRef.current;
364
- const track = trackRef.current;
365
- if (!el || !track) return;
366
- const currentThumbRatio = el.clientWidth / el.scrollWidth;
367
- if (currentThumbRatio >= 1) return;
368
- const trackWidth = track.clientWidth;
369
- const thumbWidth = trackWidth * currentThumbRatio;
370
- const maxThumbTravel = trackWidth - thumbWidth;
371
- if (maxThumbTravel <= 0) return;
372
- const mouseDelta = e.clientX - dragStartRef.current.mouseX;
373
- const scrollRange = el.scrollWidth - el.clientWidth;
374
- el.scrollLeft = Math.min(
375
- Math.max(dragStartRef.current.scrollLeft + mouseDelta / maxThumbTravel * scrollRange, 0),
376
- scrollRange
377
- );
378
- syncThumbToDOM();
379
- syncEdgeFades();
380
- },
381
- [syncThumbToDOM, syncEdgeFades]
382
- );
383
- const onThumbPointerUp = useCallback3((e) => {
384
- isDraggingRef.current = false;
385
- const target = e.currentTarget;
386
- target.releasePointerCapture(e.pointerId);
387
- target.style.cursor = "grab";
388
- }, []);
389
- const onThumbPointerCancel = useCallback3((e) => {
390
- isDraggingRef.current = false;
391
- const target = e.currentTarget;
392
- target.style.cursor = "grab";
393
- }, []);
220
+ // src/hooks/ui/use-sticky-toolbar.ts
221
+ import { useCallback as useCallback3, useEffect as useEffect4, useState as useState3 } from "react";
222
+ function useStickyToolbar() {
223
+ const [node, setNode] = useState3(null);
224
+ const [height, setHeight] = useState3(0);
225
+ const toolbarRef = useCallback3((el) => setNode(el), []);
226
+ const [lastNode, setLastNode] = useState3(node);
227
+ if (node !== lastNode) {
228
+ setLastNode(node);
229
+ if (!node) setHeight(0);
230
+ }
231
+ useEffect4(() => {
232
+ if (!node) return void 0;
233
+ const update = () => setHeight(node.offsetHeight);
234
+ update();
235
+ const observer = new ResizeObserver(update);
236
+ observer.observe(node);
237
+ return () => observer.disconnect();
238
+ }, [node]);
394
239
  return {
395
- scrollRef,
396
- trackRef,
397
- thumbRef,
398
- thumbRatio,
399
- canScrollLeft,
400
- canScrollRight,
401
- onScroll,
402
- onTrackClick,
403
- onTrackWheel,
404
- onThumbPointerDown,
405
- onThumbPointerMove,
406
- onThumbPointerUp,
407
- onThumbPointerCancel
240
+ toolbarRef,
241
+ containerStyle: { "--sticky-toolbar-h": `${height}px` },
242
+ stickyHeaderOffset: "top-[var(--sticky-toolbar-h)]"
408
243
  };
409
244
  }
410
245
 
@@ -459,81 +294,10 @@ function useKeyboardCollisionPadding() {
459
294
  );
460
295
  }
461
296
 
462
- // src/hooks/ui/use-local-storage.ts
463
- import { useEffect as useEffect4, useMemo, useRef as useRef4, useState as useState4 } from "react";
464
-
465
- // src/utils/storage-event.ts
466
- function readLocalStorageUpdateDetail(event) {
467
- if (!("detail" in event)) return null;
468
- const detail = event.detail;
469
- if (typeof detail !== "object" || detail === null) return null;
470
- if (!("key" in detail) || typeof detail.key !== "string") return null;
471
- const newValue = "newValue" in detail ? detail.newValue : null;
472
- if (newValue !== null && newValue !== void 0 && typeof newValue !== "string") return null;
473
- return { key: detail.key, newValue: newValue ?? null };
474
- }
475
-
476
- // src/hooks/ui/use-local-storage.ts
477
- function useLocalStorage(key, initialValue, options) {
478
- const initialValueRef = useRef4(initialValue);
479
- useEffect4(() => {
480
- initialValueRef.current = initialValue;
481
- });
482
- const validate = options?.validate;
483
- const storage = useMemo(
484
- () => createLocalStorageAdapter({ key, validate, logTag: `[useLocalStorage:${key}]` }),
485
- [key, validate]
486
- );
487
- const [storedValue, setStoredValue] = useState4(() => storage.load() ?? initialValue);
488
- const isInitialized = useRef4(true);
489
- const isFromStorageEvent = useRef4(false);
490
- useEffect4(() => {
491
- if (!isInitialized.current) return void 0;
492
- const syncFromStorage = (source) => {
493
- const next = storage.load();
494
- isFromStorageEvent.current = true;
495
- setStoredValue(next ?? initialValueRef.current);
496
- console.log(`\u{1F504} ${next === null ? "Cleared" : "Updated"} localStorage key "${key}" from ${source}`);
497
- };
498
- const handleStorageChange = (e) => {
499
- if (e.key !== key) return;
500
- syncFromStorage("storage event");
501
- };
502
- const handleCustomStorageUpdate = (event) => {
503
- const detail = readLocalStorageUpdateDetail(event);
504
- if (detail?.key !== key) return;
505
- syncFromStorage("custom storage event");
506
- };
507
- window.addEventListener("storage", handleStorageChange);
508
- window.addEventListener("localStorageUpdate", handleCustomStorageUpdate);
509
- return () => {
510
- window.removeEventListener("storage", handleStorageChange);
511
- window.removeEventListener("localStorageUpdate", handleCustomStorageUpdate);
512
- };
513
- }, [key, storage]);
514
- useEffect4(() => {
515
- if (!isInitialized.current) return;
516
- if (isFromStorageEvent.current) {
517
- isFromStorageEvent.current = false;
518
- return;
519
- }
520
- storage.save(storedValue);
521
- }, [storage, storedValue]);
522
- const setValue = (value) => {
523
- try {
524
- const valueToStore = value instanceof Function ? value(storedValue) : value;
525
- setStoredValue(valueToStore);
526
- } catch (error) {
527
- console.error(`Error setting value for localStorage key "${key}":`, error);
528
- }
529
- };
530
- return [storedValue, setValue];
531
- }
532
-
533
297
  // src/hooks/ui/use-memoized-callback.ts
534
- import { useCallback as useCallback4, useEffect as useEffect5, useRef as useRef5 } from "react";
298
+ import { useCallback as useCallback4, useEffect as useEffect5, useRef as useRef3 } from "react";
535
299
  function useMemoizedCallback(callback, _dependencies) {
536
- const callbackRef = useRef5(callback);
300
+ const callbackRef = useRef3(callback);
537
301
  useEffect5(() => {
538
302
  callbackRef.current = callback;
539
303
  });
@@ -542,10 +306,10 @@ function useMemoizedCallback(callback, _dependencies) {
542
306
  }
543
307
 
544
308
  // src/hooks/ui/use-notification-permission.ts
545
- import { useCallback as useCallback5, useEffect as useEffect6, useState as useState5 } from "react";
309
+ import { useCallback as useCallback5, useEffect as useEffect6, useState as useState4 } from "react";
546
310
  function useNotificationPermission() {
547
- const [supported, setSupported] = useState5(false);
548
- const [permission, setPermission] = useState5("default");
311
+ const [supported, setSupported] = useState4(false);
312
+ const [permission, setPermission] = useState4("default");
549
313
  useEffect6(() => {
550
314
  if (typeof window === "undefined" || !("Notification" in window)) return void 0;
551
315
  const sync2 = () => {
@@ -586,7 +350,7 @@ function useNotificationPermission() {
586
350
  }
587
351
 
588
352
  // src/hooks/ui/use-onboarding-state.ts
589
- import { useState as useState6, useEffect as useEffect7, useCallback as useCallback6 } from "react";
353
+ import { useState as useState5, useEffect as useEffect7, useCallback as useCallback6 } from "react";
590
354
 
591
355
  // src/utils/onboarding-storage.ts
592
356
  var DEFAULT_STATE = {
@@ -670,8 +434,8 @@ function resetOnboardingState(key) {
670
434
 
671
435
  // src/hooks/ui/use-onboarding-state.ts
672
436
  function useOnboardingState(storageKey = "openframe-onboarding-state") {
673
- const [state, setState] = useState6(() => loadOnboardingState(storageKey));
674
- const [, forceUpdate] = useState6(0);
437
+ const [state, setState] = useState5(() => loadOnboardingState(storageKey));
438
+ const [, forceUpdate] = useState5(0);
675
439
  useEffect7(() => {
676
440
  const handleStorageUpdate = (event) => {
677
441
  const detail = readLocalStorageUpdateDetail(event);
@@ -751,16 +515,16 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
751
515
  }
752
516
 
753
517
  // src/hooks/ui/use-search.ts
754
- import { useState as useState7, useEffect as useEffect8, useCallback as useCallback7, useRef as useRef6 } from "react";
518
+ import { useState as useState6, useEffect as useEffect8, useCallback as useCallback7, useRef as useRef4 } from "react";
755
519
  var NO_RESULTS = [];
756
520
  function useSearch(config) {
757
521
  const { searchFn, mapResult, debounceMs = 300, minQueryLength = 2 } = config;
758
- const [query, setQuery] = useState7("");
759
- const [results, setResults] = useState7(NO_RESULTS);
760
- const [isLoading, setIsLoading] = useState7(false);
761
- const [error, setError] = useState7(null);
762
- const searchFnRef = useRef6(searchFn);
763
- const mapResultRef = useRef6(mapResult);
522
+ const [query, setQuery] = useState6("");
523
+ const [results, setResults] = useState6(NO_RESULTS);
524
+ const [isLoading, setIsLoading] = useState6(false);
525
+ const [error, setError] = useState6(null);
526
+ const searchFnRef = useRef4(searchFn);
527
+ const mapResultRef = useRef4(mapResult);
764
528
  useEffect8(() => {
765
529
  searchFnRef.current = searchFn;
766
530
  mapResultRef.current = mapResult;
@@ -771,7 +535,7 @@ function useSearch(config) {
771
535
  setError(null);
772
536
  }, []);
773
537
  const searchable = Boolean(debouncedQuery) && debouncedQuery.length >= minQueryLength;
774
- const [wasSearchable, setWasSearchable] = useState7(searchable);
538
+ const [wasSearchable, setWasSearchable] = useState6(searchable);
775
539
  if (wasSearchable !== searchable) {
776
540
  setWasSearchable(searchable);
777
541
  if (!searchable) {
@@ -811,9 +575,9 @@ function useSearch(config) {
811
575
  }
812
576
 
813
577
  // src/hooks/ui/use-table-pagination.ts
814
- import { useMemo as useMemo2 } from "react";
578
+ import { useMemo } from "react";
815
579
  function useTablePagination(config) {
816
- return useMemo2(() => {
580
+ return useMemo(() => {
817
581
  if (!config) return void 0;
818
582
  if (config.type === "client") {
819
583
  if (config.totalPages <= 1) return void 0;
@@ -848,11 +612,11 @@ function useTablePagination(config) {
848
612
  }
849
613
 
850
614
  // src/hooks/ui/use-throttle.ts
851
- import { useState as useState8, useEffect as useEffect9, useRef as useRef7 } from "react";
615
+ import { useState as useState7, useEffect as useEffect9, useRef as useRef5 } from "react";
852
616
  function useThrottle(value, limit = 200) {
853
- const [throttledValue, setThrottledValue] = useState8(value);
854
- const [mountedAt] = useState8(() => Date.now());
855
- const lastUpdated = useRef7(mountedAt);
617
+ const [throttledValue, setThrottledValue] = useState7(value);
618
+ const [mountedAt] = useState7(() => Date.now());
619
+ const lastUpdated = useRef5(mountedAt);
856
620
  useEffect9(() => {
857
621
  const now = Date.now();
858
622
  const elapsed = now - lastUpdated.current;
@@ -873,9 +637,9 @@ function useThrottle(value, limit = 200) {
873
637
  }
874
638
 
875
639
  // src/hooks/ui/use-window-size.ts
876
- import { useLayoutEffect, useState as useState9 } from "react";
640
+ import { useLayoutEffect, useState as useState8 } from "react";
877
641
  function useWindowSize() {
878
- const [windowSize, setWindowSize] = useState9({
642
+ const [windowSize, setWindowSize] = useState8({
879
643
  width: 0,
880
644
  height: 0
881
645
  });
@@ -896,7 +660,7 @@ function useWindowSize() {
896
660
  import { usePreventScroll } from "@react-aria/overlays";
897
661
 
898
662
  // src/hooks/ui/use-active-section.ts
899
- import { useMemo as useMemo3 } from "react";
663
+ import { useMemo as useMemo2 } from "react";
900
664
  function pathOf(href) {
901
665
  if (!href || !href.startsWith("/") || href.startsWith("//")) return null;
902
666
  const path = href.split(/[?#]/)[0];
@@ -921,7 +685,7 @@ function resolveActiveSection(menus, pathname) {
921
685
  return best?.id ?? null;
922
686
  }
923
687
  function useActiveSection(menus, pathname) {
924
- return useMemo3(() => resolveActiveSection(menus, pathname), [menus, pathname]);
688
+ return useMemo2(() => resolveActiveSection(menus, pathname), [menus, pathname]);
925
689
  }
926
690
 
927
691
  // src/hooks/ui/use-nav-menus.ts
@@ -929,8 +693,8 @@ import {
929
693
  useCallback as useCallback8,
930
694
  useEffect as useEffect10,
931
695
  useId,
932
- useRef as useRef8,
933
- useState as useState10
696
+ useRef as useRef6,
697
+ useState as useState9
934
698
  } from "react";
935
699
  function useNavMenus({
936
700
  pathname,
@@ -938,15 +702,15 @@ function useNavMenus({
938
702
  hoverCloseMs = 300
939
703
  }) {
940
704
  const baseId = useId();
941
- const [opened, setOpened] = useState10(null);
705
+ const [opened, setOpened] = useState9(null);
942
706
  const stale = opened !== null && opened.pathname !== pathname;
943
707
  if (stale) setOpened(null);
944
708
  const openId = opened && !stale ? opened.id : null;
945
- const triggers = useRef8(/* @__PURE__ */ new Map());
946
- const panels = useRef8(/* @__PURE__ */ new Map());
947
- const openTimer = useRef8(null);
948
- const closeTimer = useRef8(null);
949
- const openedByHover = useRef8(null);
709
+ const triggers = useRef6(/* @__PURE__ */ new Map());
710
+ const panels = useRef6(/* @__PURE__ */ new Map());
711
+ const openTimer = useRef6(null);
712
+ const closeTimer = useRef6(null);
713
+ const openedByHover = useRef6(null);
950
714
  const clearTimers = useCallback8(() => {
951
715
  if (openTimer.current) clearTimeout(openTimer.current);
952
716
  if (closeTimer.current) clearTimeout(closeTimer.current);
@@ -1046,145 +810,8 @@ function useNavMenus({
1046
810
  return { openId, close, getTriggerProps, getPanelProps };
1047
811
  }
1048
812
 
1049
- // src/hooks/ui/use-visitor-os.ts
1050
- import { useSyncExternalStore as useSyncExternalStore2 } from "react";
1051
-
1052
- // src/utils/visitor-os.ts
1053
- var DESKTOP_OSES = ["mac", "windows", "linux"];
1054
- var HINT_PLATFORMS = {
1055
- macos: "mac",
1056
- windows: "windows",
1057
- linux: "linux",
1058
- "chrome os": "linux",
1059
- "chromium os": "linux",
1060
- android: "android",
1061
- ios: "ios"
1062
- };
1063
- function detectVisitorOs(userAgent, hints = {}) {
1064
- const touchMac = (os) => os === "mac" && (hints.maxTouchPoints ?? 0) > 1 ? "ios" : os;
1065
- const hinted = HINT_PLATFORMS[(hints.platform ?? "").replace(/"/g, "").trim().toLowerCase()];
1066
- if (hinted) return touchMac(hinted);
1067
- const ua = userAgent ?? "";
1068
- if (!ua) return null;
1069
- if (/iPhone|iPad|iPod/i.test(ua)) return "ios";
1070
- if (/Android/i.test(ua)) return "android";
1071
- if (/Windows NT|Win64|Win32/i.test(ua)) return "windows";
1072
- if (/Macintosh|Mac OS X/i.test(ua)) return touchMac("mac");
1073
- if (/Linux|X11|CrOS/i.test(ua)) return "linux";
1074
- return null;
1075
- }
1076
- function desktopOsOf(os) {
1077
- return os !== null && DESKTOP_OSES.includes(os) ? os : null;
1078
- }
1079
- function detectDesktopOs(userAgent, hints) {
1080
- return desktopOsOf(detectVisitorOs(userAgent, hints));
1081
- }
1082
- function usesCommandKey(os) {
1083
- return os === "mac" || os === "ios";
1084
- }
1085
- function shortcutLabel(os, key) {
1086
- return usesCommandKey(os) ? `\u2318${key}` : `Ctrl ${key}`;
1087
- }
1088
-
1089
- // src/hooks/ui/use-visitor-os.ts
1090
- var UNKNOWN = { known: false, os: null };
1091
- var KNOWN = /* @__PURE__ */ new Map();
1092
- var subscribe2 = () => () => {
1093
- };
1094
- var getServerSnapshot = () => UNKNOWN;
1095
- function getSnapshot() {
1096
- const stated = navigator.userAgentData?.platform;
1097
- const os = detectVisitorOs(navigator.userAgent, { platform: stated, maxTouchPoints: navigator.maxTouchPoints });
1098
- let state = KNOWN.get(os);
1099
- if (!state) {
1100
- state = { known: true, os };
1101
- KNOWN.set(os, state);
1102
- }
1103
- return state;
1104
- }
1105
- function useVisitorOs() {
1106
- return useSyncExternalStore2(subscribe2, getSnapshot, getServerSnapshot);
1107
- }
1108
-
1109
- // src/hooks/platform/use-platform-config.ts
1110
- import { useState as useState11, useEffect as useEffect11 } from "react";
1111
-
1112
- // src/utils/platform-config.tsx
1113
- import { Globe } from "lucide-react";
1114
- import { jsx } from "react/jsx-runtime";
1115
- function renderPlatformIcon(platformName, className) {
1116
- const tinted = cn(className, getPlatformBrandClasses(platformName).accentText);
1117
- switch (platformName) {
1118
- case "openframe":
1119
- return /* @__PURE__ */ jsx(
1120
- OpenFrameLogo,
1121
- {
1122
- className: tinted,
1123
- lowerPathColor: "currentColor",
1124
- upperPathColor: "var(--ods-system-greys-white)"
1125
- }
1126
- );
1127
- case "openmsp":
1128
- return /* @__PURE__ */ jsx(
1129
- OpenmspLogo,
1130
- {
1131
- className: tinted,
1132
- backBubbleColor: "currentColor",
1133
- frontBubbleColor: "var(--ods-system-greys-white)",
1134
- innerFrontBubbleColor: "var(--ods-system-greys-black)"
1135
- }
1136
- );
1137
- case "tmcg":
1138
- return /* @__PURE__ */ jsx(MiamiCyberGangLogoFaceOnly, { className });
1139
- case "mlg":
1140
- return /* @__PURE__ */ jsx(MlgLogo, { className: tinted, size: 20 });
1141
- case "universal":
1142
- return /* @__PURE__ */ jsx(Globe, { className: tinted });
1143
- default:
1144
- return /* @__PURE__ */ jsx(FlamingoLogo, { className: tinted, fill: "currentColor" });
1145
- }
1146
- }
1147
- var platformIcons = {
1148
- openframe: renderPlatformIcon("openframe", "h-5 w-5"),
1149
- openmsp: renderPlatformIcon("openmsp", "h-5 w-5"),
1150
- flamingo: renderPlatformIcon("flamingo", "h-5 w-5"),
1151
- "flamingo-teaser": renderPlatformIcon("flamingo-teaser", "h-5 w-5"),
1152
- "marketing-hub": renderPlatformIcon("marketing-hub", "h-5 w-5"),
1153
- "product-hub": renderPlatformIcon("product-hub", "h-5 w-5"),
1154
- "revenue-hub": renderPlatformIcon("revenue-hub", "h-5 w-5"),
1155
- "people-hub": renderPlatformIcon("people-hub", "h-5 w-5"),
1156
- "company-hub": renderPlatformIcon("company-hub", "h-5 w-5"),
1157
- tmcg: renderPlatformIcon("tmcg", "h-5 w-5"),
1158
- mlg: renderPlatformIcon("mlg", "h-5 w-5"),
1159
- universal: renderPlatformIcon("universal", "h-5 w-5")
1160
- };
1161
- function transformPlatformConfigsToOptions(platformConfigs) {
1162
- return platformConfigs.map((platform) => ({
1163
- id: platform.id,
1164
- // Database UUID for matching
1165
- name: platform.name,
1166
- // Platform name enum
1167
- displayName: platform.display_name,
1168
- // Human-readable name
1169
- description: platform.description,
1170
- icon: getPlatformIcon(platform.name),
1171
- color: getPlatformColorClass(platform.name)
1172
- }));
1173
- }
1174
- function getPlatformIcon(platformName) {
1175
- return platformIcons[platformName] ?? platformIcons.universal;
1176
- }
1177
- function getSmallPlatformIcon(platformName) {
1178
- return renderPlatformIcon(platformName, "h-4 w-4 flex-shrink-0");
1179
- }
1180
- function getPlatformIconComponent(platformName, className = "h-6 w-6") {
1181
- return renderPlatformIcon(platformName, className);
1182
- }
1183
- function getPlatformColorClass(platformName) {
1184
- return getPlatformBrandClasses(platformName).accentBg;
1185
- }
1186
-
1187
813
  // src/hooks/platform/use-platform-config.ts
814
+ import { useState as useState10, useEffect as useEffect11 } from "react";
1188
815
  var platformCache = null;
1189
816
  var fetchPromise = null;
1190
817
  function isRecord(value) {
@@ -1220,9 +847,9 @@ function toPlatformConfigs(payload) {
1220
847
  return configs;
1221
848
  }
1222
849
  function usePlatformConfig() {
1223
- const [platforms, setPlatforms] = useState11(platformCache || []);
1224
- const [isLoading, setIsLoading] = useState11(!platformCache);
1225
- const [error, setError] = useState11(null);
850
+ const [platforms, setPlatforms] = useState10(platformCache || []);
851
+ const [isLoading, setIsLoading] = useState10(!platformCache);
852
+ const [error, setError] = useState10(null);
1226
853
  useEffect11(() => {
1227
854
  const commit = (data) => {
1228
855
  setPlatforms((prev) => prev === data ? prev : data);
@@ -1291,9 +918,9 @@ function useValidatePlatform(value) {
1291
918
  import { toast as sonnerToast2 } from "sonner";
1292
919
 
1293
920
  // src/components/ui/toaster.tsx
1294
- import { useState as useState12 } from "react";
921
+ import { useState as useState11 } from "react";
1295
922
  import { Toaster as SonnerToaster, toast as sonnerToast } from "sonner";
1296
- import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
923
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
1297
924
  var dotColorByVariant = {
1298
925
  default: "bg-ods-text-secondary",
1299
926
  success: "bg-ods-success",
@@ -1319,9 +946,9 @@ function ToastHeader({
1319
946
  showProgress = true
1320
947
  }) {
1321
948
  return /* @__PURE__ */ jsxs("div", { className: cn("relative flex w-full items-start gap-2 overflow-hidden bg-ods-card p-3", className), children: [
1322
- /* @__PURE__ */ jsx2("div", { className: "flex size-6 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx2("span", { className: cn("size-[9px] rounded-full", dotColorByVariant[variant]) }) }),
949
+ /* @__PURE__ */ jsx("div", { className: "flex size-6 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx("span", { className: cn("size-[9px] rounded-full", dotColorByVariant[variant]) }) }),
1323
950
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col justify-center", children: [
1324
- title ? /* @__PURE__ */ jsx2(
951
+ title ? /* @__PURE__ */ jsx(
1325
952
  "p",
1326
953
  {
1327
954
  className: "truncate pr-5 text-ods-text-primary text-h4",
@@ -1329,7 +956,7 @@ function ToastHeader({
1329
956
  children: title
1330
957
  }
1331
958
  ) : null,
1332
- description ? /* @__PURE__ */ jsx2(
959
+ description ? /* @__PURE__ */ jsx(
1333
960
  "p",
1334
961
  {
1335
962
  className: "line-clamp-3 text-ods-text-secondary text-h6",
@@ -1338,17 +965,17 @@ function ToastHeader({
1338
965
  }
1339
966
  ) : null
1340
967
  ] }),
1341
- dismissible ? /* @__PURE__ */ jsx2(
968
+ dismissible ? /* @__PURE__ */ jsx(
1342
969
  "button",
1343
970
  {
1344
971
  type: "button",
1345
972
  "aria-label": "Close",
1346
973
  onClick: () => sonnerToast.dismiss(id),
1347
974
  className: "absolute right-[7px] top-[7px] flex size-4 items-center justify-center text-ods-text-secondary transition-colors hover:text-ods-text-primary",
1348
- children: /* @__PURE__ */ jsx2(XmarkIcon, { size: 16 })
975
+ children: /* @__PURE__ */ jsx(XmarkIcon, { size: 16 })
1349
976
  }
1350
977
  ) : null,
1351
- showProgress && duration !== Infinity && duration > 0 ? /* @__PURE__ */ jsx2(
978
+ showProgress && duration !== Infinity && duration > 0 ? /* @__PURE__ */ jsx(
1352
979
  "div",
1353
980
  {
1354
981
  className: cn("absolute inset-x-0 bottom-0 h-1 origin-left", progressColorByVariant[variant]),
@@ -1368,7 +995,7 @@ function ToastCard({
1368
995
  dismissible = true,
1369
996
  className
1370
997
  }) {
1371
- return /* @__PURE__ */ jsx2(
998
+ return /* @__PURE__ */ jsx(
1372
999
  "div",
1373
1000
  {
1374
1001
  role: "status",
@@ -1376,7 +1003,7 @@ function ToastCard({
1376
1003
  "w-[368px] max-w-[calc(100vw-32px)] overflow-hidden rounded-md border border-ods-border bg-ods-card shadow-lg",
1377
1004
  className
1378
1005
  ),
1379
- children: /* @__PURE__ */ jsx2(
1006
+ children: /* @__PURE__ */ jsx(
1380
1007
  ToastHeader,
1381
1008
  {
1382
1009
  id,
@@ -1407,7 +1034,7 @@ function CommandApprovalToast({
1407
1034
  defaultExpanded = false,
1408
1035
  className
1409
1036
  }) {
1410
- const [expanded, setExpanded] = useState12(defaultExpanded);
1037
+ const [expanded, setExpanded] = useState11(defaultExpanded);
1411
1038
  const handleApprove = () => {
1412
1039
  onApprove?.();
1413
1040
  sonnerToast.dismiss(id);
@@ -1425,7 +1052,7 @@ function CommandApprovalToast({
1425
1052
  className
1426
1053
  ),
1427
1054
  children: [
1428
- /* @__PURE__ */ jsx2(
1055
+ /* @__PURE__ */ jsx(
1429
1056
  ToastHeader,
1430
1057
  {
1431
1058
  id,
@@ -1438,7 +1065,7 @@ function CommandApprovalToast({
1438
1065
  className: "border-b border-ods-border"
1439
1066
  }
1440
1067
  ),
1441
- /* @__PURE__ */ jsx2(
1068
+ /* @__PURE__ */ jsx(
1442
1069
  "div",
1443
1070
  {
1444
1071
  className: "grid transition-[grid-template-rows] duration-300 ease-out",
@@ -1446,13 +1073,13 @@ function CommandApprovalToast({
1446
1073
  "aria-hidden": !expanded,
1447
1074
  children: /* @__PURE__ */ jsxs("div", { className: "overflow-hidden", children: [
1448
1075
  /* @__PURE__ */ jsxs("div", { className: "flex h-11 w-full items-center gap-2 border-b border-ods-border bg-ods-card px-3 py-2", children: [
1449
- /* @__PURE__ */ jsx2("p", { className: "min-w-0 flex-1 truncate text-ods-text-primary text-h6", title: command, children: command }),
1450
- toolType ? /* @__PURE__ */ jsx2(ToolIcon, { toolType, size: 16 }) : null
1076
+ /* @__PURE__ */ jsx("p", { className: "min-w-0 flex-1 truncate text-ods-text-primary text-h6", title: command, children: command }),
1077
+ toolType ? /* @__PURE__ */ jsx(ToolIcon, { toolType, size: 16 }) : null
1451
1078
  ] }),
1452
1079
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 bg-ods-bg p-3", children: [
1453
- approvalDescription ? /* @__PURE__ */ jsx2("p", { className: "text-ods-text-secondary text-h6", children: approvalDescription }) : null,
1080
+ approvalDescription ? /* @__PURE__ */ jsx("p", { className: "text-ods-text-secondary text-h6", children: approvalDescription }) : null,
1454
1081
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
1455
- /* @__PURE__ */ jsx2(
1082
+ /* @__PURE__ */ jsx(
1456
1083
  "button",
1457
1084
  {
1458
1085
  type: "button",
@@ -1462,7 +1089,7 @@ function CommandApprovalToast({
1462
1089
  children: approveLabel
1463
1090
  }
1464
1091
  ),
1465
- /* @__PURE__ */ jsx2(
1092
+ /* @__PURE__ */ jsx(
1466
1093
  "button",
1467
1094
  {
1468
1095
  type: "button",
@@ -1485,8 +1112,8 @@ function CommandApprovalToast({
1485
1112
  className: "flex w-full items-center gap-2 bg-ods-card px-3 py-2 text-left text-ods-text-primary transition-colors text-h6 hover:bg-ods-bg-hover",
1486
1113
  "aria-expanded": false,
1487
1114
  children: [
1488
- /* @__PURE__ */ jsx2("span", { className: "flex-1", children: "Show Command" }),
1489
- /* @__PURE__ */ jsx2(Chevron02DownIcon, { size: 16 })
1115
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: "Show Command" }),
1116
+ /* @__PURE__ */ jsx(Chevron02DownIcon, { size: 16 })
1490
1117
  ]
1491
1118
  }
1492
1119
  )
@@ -1497,13 +1124,13 @@ function CommandApprovalToast({
1497
1124
  function Toaster({ position = "bottom-right", offset = 24, gap = 8, toastOptions, ...rest } = {}) {
1498
1125
  const { classNames: userClassNames, ...restToastOptions } = toastOptions ?? {};
1499
1126
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1500
- /* @__PURE__ */ jsx2("style", { children: `
1127
+ /* @__PURE__ */ jsx("style", { children: `
1501
1128
  @keyframes toast-progress {
1502
1129
  from { transform: scaleX(1); }
1503
1130
  to { transform: scaleX(0); }
1504
1131
  }
1505
1132
  ` }),
1506
- /* @__PURE__ */ jsx2(
1133
+ /* @__PURE__ */ jsx(
1507
1134
  SonnerToaster,
1508
1135
  {
1509
1136
  position,
@@ -1526,7 +1153,7 @@ function showToast(options) {
1526
1153
  const opts = typeof options === "string" ? { title: options } : options;
1527
1154
  const { title, description, variant = "default", duration = 4e3, dismissible = true, ...rest } = opts;
1528
1155
  return sonnerToast.custom(
1529
- (id) => /* @__PURE__ */ jsx2(
1156
+ (id) => /* @__PURE__ */ jsx(
1530
1157
  ToastCard,
1531
1158
  {
1532
1159
  id,
@@ -1558,7 +1185,7 @@ function showCommandApprovalToast(options) {
1558
1185
  ...rest
1559
1186
  } = options;
1560
1187
  return sonnerToast.custom(
1561
- (id) => /* @__PURE__ */ jsx2(
1188
+ (id) => /* @__PURE__ */ jsx(
1562
1189
  CommandApprovalToast,
1563
1190
  {
1564
1191
  id,
@@ -1607,14 +1234,14 @@ var useToast = () => ({
1607
1234
  });
1608
1235
 
1609
1236
  // src/hooks/use-contact-submission.ts
1610
- import { useState as useState13, useCallback as useCallback9, useEffect as useEffect12 } from "react";
1237
+ import { useState as useState12, useCallback as useCallback9, useEffect as useEffect12 } from "react";
1611
1238
  function useContactSubmission(options = {}) {
1612
1239
  const { userId, successRedirectUrl, successToastMessage, onSuccess } = options;
1613
1240
  const { toast: toast2 } = useToast();
1614
1241
  const router = useRouter();
1615
1242
  const { contactUrl } = useRequiredEndpointsRuntime();
1616
- const [isSubmitting, setIsSubmitting] = useState13(false);
1617
- const [isSuccess, setIsSuccess] = useState13(false);
1243
+ const [isSubmitting, setIsSubmitting] = useState12(false);
1244
+ const [isSuccess, setIsSuccess] = useState12(false);
1618
1245
  const submit = useCallback9(
1619
1246
  async (formData) => {
1620
1247
  if (isSubmitting) return;
@@ -1675,7 +1302,7 @@ function useContactSubmission(options = {}) {
1675
1302
  }
1676
1303
 
1677
1304
  // src/hooks/use-copy-to-clipboard.ts
1678
- import { useCallback as useCallback10, useState as useState14 } from "react";
1305
+ import { useCallback as useCallback10, useState as useState13 } from "react";
1679
1306
  function useCopyToClipboard({
1680
1307
  successTitle = "Copied",
1681
1308
  successDescription = "Copied to clipboard",
@@ -1684,7 +1311,7 @@ function useCopyToClipboard({
1684
1311
  resetDelay = 2e3
1685
1312
  } = {}) {
1686
1313
  const { toast: toast2 } = useToast();
1687
- const [copied, setCopied] = useState14(false);
1314
+ const [copied, setCopied] = useState13(false);
1688
1315
  const copy = useCallback10(
1689
1316
  async (text) => {
1690
1317
  try {
@@ -1702,7 +1329,7 @@ function useCopyToClipboard({
1702
1329
  }
1703
1330
 
1704
1331
  // src/hooks/use-batch-images.ts
1705
- import { useEffect as useEffect13, useMemo as useMemo4, useState as useState15, useRef as useRef9 } from "react";
1332
+ import { useEffect as useEffect13, useMemo as useMemo3, useState as useState14, useRef as useRef7 } from "react";
1706
1333
  var globalBatchImageConfig = {};
1707
1334
  function configureBatchImageFetch(config) {
1708
1335
  globalBatchImageConfig = { ...globalBatchImageConfig, ...config };
@@ -1775,13 +1402,13 @@ async function batchFetchAuthenticatedImages(imageUrls, config) {
1775
1402
  return results;
1776
1403
  }
1777
1404
  function useBatchImages(imageUrls, config) {
1778
- const [fetchedImages, setFetchedImages] = useState15({});
1779
- const uniqueUrls = useMemo4(
1405
+ const [fetchedImages, setFetchedImages] = useState14({});
1406
+ const uniqueUrls = useMemo3(
1780
1407
  () => Array.from(new Set(imageUrls.filter((url) => Boolean(url)))),
1781
1408
  [imageUrls]
1782
1409
  );
1783
- const requestedUrls = useRef9(/* @__PURE__ */ new Set());
1784
- const fetchedImagesRef = useRef9(fetchedImages);
1410
+ const requestedUrls = useRef7(/* @__PURE__ */ new Set());
1411
+ const fetchedImagesRef = useRef7(fetchedImages);
1785
1412
  useEffect13(() => {
1786
1413
  fetchedImagesRef.current = fetchedImages;
1787
1414
  }, [fetchedImages]);
@@ -1813,7 +1440,7 @@ function useBatchImages(imageUrls, config) {
1813
1440
  }
1814
1441
 
1815
1442
  // src/hooks/use-authenticated-image.ts
1816
- import { useEffect as useEffect14, useState as useState16, useRef as useRef10 } from "react";
1443
+ import { useEffect as useEffect14, useState as useState15, useRef as useRef8 } from "react";
1817
1444
  var globalImageConfig = {};
1818
1445
  var imageCache = /* @__PURE__ */ new Map();
1819
1446
  var pendingRequests = /* @__PURE__ */ new Map();
@@ -1842,8 +1469,8 @@ function getImageConfig() {
1842
1469
  };
1843
1470
  }
1844
1471
  function useAuthenticatedImage(imageUrl, refreshKey, config) {
1845
- const [settled, setSettled] = useState16(null);
1846
- const currentCacheKeyRef = useRef10(null);
1472
+ const [settled, setSettled] = useState15(null);
1473
+ const currentCacheKeyRef = useRef8(null);
1847
1474
  const { tenantHostUrl, enableDevMode, accessTokenKey } = {
1848
1475
  ...getImageConfig(),
1849
1476
  ...config
@@ -1959,7 +1586,7 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
1959
1586
  }
1960
1587
 
1961
1588
  // src/hooks/state/use-query-params.ts
1962
- import { useEffect as useEffect15, useState as useState17, useMemo as useMemo5, useCallback as useCallback11, useRef as useRef11 } from "react";
1589
+ import { useEffect as useEffect15, useState as useState16, useMemo as useMemo4, useCallback as useCallback11, useRef as useRef9 } from "react";
1963
1590
 
1964
1591
  // src/hooks/state/flatten-schema.ts
1965
1592
  function flattenQueryVariables(queryVariables, introspector2) {
@@ -2410,14 +2037,14 @@ function validateVariables(variables, schema) {
2410
2037
  function useQueryParams(query, options = {}) {
2411
2038
  const router = useRouter();
2412
2039
  const searchParams = useSearchParams();
2413
- const [isLoading, setIsLoading] = useState17(true);
2414
- const [isReady, setIsReady] = useState17(false);
2415
- const [error, setError] = useState17(null);
2416
- const [schema, setSchema] = useState17({});
2417
- const defaultValues = useMemo5(() => options.defaultValues || {}, [options.defaultValues]);
2040
+ const [isLoading, setIsLoading] = useState16(true);
2041
+ const [isReady, setIsReady] = useState16(false);
2042
+ const [error, setError] = useState16(null);
2043
+ const [schema, setSchema] = useState16({});
2044
+ const defaultValues = useMemo4(() => options.defaultValues || {}, [options.defaultValues]);
2418
2045
  const skipIntrospection = options.skipIntrospection || false;
2419
2046
  const debug = options.debug || false;
2420
- const initSourceRef = useRef11({
2047
+ const initSourceRef = useRef9({
2421
2048
  introspectionHeaders: options.introspectionHeaders,
2422
2049
  paramMapping: options.paramMapping,
2423
2050
  defaultValues
@@ -2476,7 +2103,7 @@ function useQueryParams(query, options = {}) {
2476
2103
  cancelled = true;
2477
2104
  };
2478
2105
  }, [query, options.introspectionEndpoint, skipIntrospection, debug]);
2479
- const variables = useMemo5(() => {
2106
+ const variables = useMemo4(() => {
2480
2107
  if (!isReady) {
2481
2108
  return defaultValues;
2482
2109
  }
@@ -2492,7 +2119,7 @@ function useQueryParams(query, options = {}) {
2492
2119
  return defaultValues;
2493
2120
  }
2494
2121
  }, [searchParams, schema, isReady, defaultValues, debug]);
2495
- const params = useMemo5(() => {
2122
+ const params = useMemo4(() => {
2496
2123
  const result = {};
2497
2124
  searchParams.forEach((value, key) => {
2498
2125
  const existing = result[key];
@@ -2599,9 +2226,9 @@ function applyParamMapping(schema, mapping) {
2599
2226
  }
2600
2227
 
2601
2228
  // src/hooks/state/use-api-params.ts
2602
- import { useCallback as useCallback12, useEffect as useEffect16, useMemo as useMemo6, useRef as useRef12, useState as useState18 } from "react";
2229
+ import { useCallback as useCallback12, useEffect as useEffect16, useMemo as useMemo5, useRef as useRef10, useState as useState17 } from "react";
2603
2230
  function useContentStable(value, key) {
2604
- const [cached, setCached] = useState18({ value, key });
2231
+ const [cached, setCached] = useState17({ value, key });
2605
2232
  if (cached.key !== key) setCached({ value, key });
2606
2233
  return cached.key === key ? cached.value : value;
2607
2234
  }
@@ -2628,14 +2255,14 @@ function useApiParams(schema, options = {}) {
2628
2255
  const searchParamsLive = useSearchParams();
2629
2256
  const debug = options.debug || false;
2630
2257
  const searchString = searchParamsLive.toString();
2631
- const pendingRef = useRef12([]);
2632
- const [pendingTail, setPendingTail] = useState18(void 0);
2258
+ const pendingRef = useRef10([]);
2259
+ const [pendingTail, setPendingTail] = useState17(void 0);
2633
2260
  const syncPendingTail = useCallback12(() => {
2634
2261
  setPendingTail(pendingRef.current[pendingRef.current.length - 1]);
2635
2262
  }, []);
2636
- const schemaKey = useMemo6(() => JSON.stringify(schema), [schema]);
2263
+ const schemaKey = useMemo5(() => JSON.stringify(schema), [schema]);
2637
2264
  const stableSchema = useContentStable(schema, schemaKey);
2638
- const flattenedSchema = useMemo6(() => {
2265
+ const flattenedSchema = useMemo5(() => {
2639
2266
  const flattened = {};
2640
2267
  for (const [key, config] of Object.entries(stableSchema)) {
2641
2268
  flattened[key] = {
@@ -2649,7 +2276,7 @@ function useApiParams(schema, options = {}) {
2649
2276
  }
2650
2277
  return flattened;
2651
2278
  }, [stableSchema]);
2652
- const rawParams = useMemo6(() => {
2279
+ const rawParams = useMemo5(() => {
2653
2280
  const result = parseSchemaParams(stableSchema, new URLSearchParams(searchString), {
2654
2281
  absent: options.absent === "null" ? "null" : "undefined"
2655
2282
  });
@@ -2658,7 +2285,7 @@ function useApiParams(schema, options = {}) {
2658
2285
  }
2659
2286
  return result;
2660
2287
  }, [searchString, debug, stableSchema, options.absent]);
2661
- const [paramsCache, setParamsCache] = useState18(() => ({ src: rawParams, value: rawParams }));
2288
+ const [paramsCache, setParamsCache] = useState17(() => ({ src: rawParams, value: rawParams }));
2662
2289
  let stableParams = paramsCache.value;
2663
2290
  if (paramsCache.src !== rawParams) {
2664
2291
  stableParams = reuseArrayRefs(paramsCache.value, rawParams);
@@ -2668,7 +2295,7 @@ function useApiParams(schema, options = {}) {
2668
2295
  const addParamToSearchParams = useCallback12((searchParams, key, value) => {
2669
2296
  for (const [k, v] of createSearchParams({ [key]: value })) searchParams.append(k, v);
2670
2297
  }, []);
2671
- const urlSearchParams = useMemo6(() => {
2298
+ const urlSearchParams = useMemo5(() => {
2672
2299
  const newParams = new URLSearchParams();
2673
2300
  for (const key of Object.keys(stableSchema)) {
2674
2301
  const value = params[key];
@@ -2772,7 +2399,7 @@ function useApiParams(schema, options = {}) {
2772
2399
  }
2773
2400
  router.replace(window.location.pathname, { scroll: false });
2774
2401
  }, [router, debug]);
2775
- const pendingParams = useMemo6(() => {
2402
+ const pendingParams = useMemo5(() => {
2776
2403
  if (pendingTail === void 0 || pendingTail === searchString) return params;
2777
2404
  return parseSchemaParams(stableSchema, new URLSearchParams(pendingTail), {
2778
2405
  absent: options.absent === "null" ? "null" : "undefined"
@@ -2790,7 +2417,7 @@ function useApiParams(schema, options = {}) {
2790
2417
  }
2791
2418
 
2792
2419
  // src/hooks/state/use-cursor-pagination-state.ts
2793
- import { useCallback as useCallback13, useEffect as useEffect17, useRef as useRef13, useState as useState19 } from "react";
2420
+ import { useCallback as useCallback13, useEffect as useEffect17, useRef as useRef11, useState as useState18 } from "react";
2794
2421
  var urlSchema = {
2795
2422
  search: { type: "string", default: "" },
2796
2423
  cursor: { type: "string", default: "" }
@@ -2798,15 +2425,15 @@ var urlSchema = {
2798
2425
  function useCursorPaginationState(options) {
2799
2426
  const { onInitialLoad, onSearchChange } = options;
2800
2427
  const { params, setParam, setParams } = useApiParams(urlSchema);
2801
- const [searchInput, setSearchInput] = useState19(params.search || "");
2802
- const [hasLoadedBeyondFirst, setHasLoadedBeyondFirst] = useState19(false);
2803
- const [initialLoadCount, setInitialLoadCount] = useState19(0);
2804
- const lastSearchRef = useRef13(null);
2805
- const isSyncingFromUrl = useRef13(false);
2806
- const isInitialLoadInProgress = useRef13(true);
2807
- const searchInputRef = useRef13(searchInput);
2808
- const onInitialLoadRef = useRef13(onInitialLoad);
2809
- const paramsRef = useRef13(params);
2428
+ const [searchInput, setSearchInput] = useState18(params.search || "");
2429
+ const [hasLoadedBeyondFirst, setHasLoadedBeyondFirst] = useState18(false);
2430
+ const [initialLoadCount, setInitialLoadCount] = useState18(0);
2431
+ const lastSearchRef = useRef11(null);
2432
+ const isSyncingFromUrl = useRef11(false);
2433
+ const isInitialLoadInProgress = useRef11(true);
2434
+ const searchInputRef = useRef11(searchInput);
2435
+ const onInitialLoadRef = useRef11(onInitialLoad);
2436
+ const paramsRef = useRef11(params);
2810
2437
  useEffect17(() => {
2811
2438
  searchInputRef.current = searchInput;
2812
2439
  onInitialLoadRef.current = onInitialLoad;
@@ -2892,16 +2519,16 @@ function useCursorPaginationState(options) {
2892
2519
  }
2893
2520
 
2894
2521
  // src/hooks/nats/use-nats-client.ts
2895
- import { useEffect as useEffect18, useMemo as useMemo7, useState as useState20 } from "react";
2522
+ import { useEffect as useEffect18, useMemo as useMemo6, useState as useState19 } from "react";
2896
2523
  function useNatsClient(clientOptions, options = {}) {
2897
2524
  const { autoConnect = true } = options;
2898
- const client = useMemo7(() => {
2525
+ const client = useMemo6(() => {
2899
2526
  if (!clientOptions) return null;
2900
2527
  return createNatsClient(clientOptions);
2901
2528
  }, [clientOptions]);
2902
- const [status, setStatus] = useState20("disconnected");
2903
- const [lastError, setLastError] = useState20(null);
2904
- const [statusClient, setStatusClient] = useState20(client);
2529
+ const [status, setStatus] = useState19("disconnected");
2530
+ const [lastError, setLastError] = useState19(null);
2531
+ const [statusClient, setStatusClient] = useState19(client);
2905
2532
  if (statusClient !== client) {
2906
2533
  setStatusClient(client);
2907
2534
  setStatus("disconnected");
@@ -2934,7 +2561,7 @@ function useNatsClient(clientOptions, options = {}) {
2934
2561
  }
2935
2562
 
2936
2563
  // src/hooks/use-scenario-player.ts
2937
- import { useCallback as useCallback14, useEffect as useEffect19, useRef as useRef14, useState as useState21 } from "react";
2564
+ import { useCallback as useCallback14, useEffect as useEffect19, useRef as useRef12, useState as useState20 } from "react";
2938
2565
  var START_MS = 300;
2939
2566
  function useScenarioPlayer({
2940
2567
  scenarioCount,
@@ -2947,13 +2574,13 @@ function useScenarioPlayer({
2947
2574
  }) {
2948
2575
  const auto = useAutoplay(enabled);
2949
2576
  const { reducedMotion, paused, setPaused } = auto;
2950
- const [scenario, setScenario] = useState21(initialScenario);
2951
- const [rawStep, setRawStep] = useState21(startAtEnd ? Number.MAX_SAFE_INTEGER : 0);
2577
+ const [scenario, setScenario] = useState20(initialScenario);
2578
+ const [rawStep, setRawStep] = useState20(startAtEnd ? Number.MAX_SAFE_INTEGER : 0);
2952
2579
  const lastStep = typeof lastStepOption === "function" ? lastStepOption(scenario) : lastStepOption;
2953
2580
  const step = reducedMotion ? lastStep : Math.min(rawStep, lastStep);
2954
2581
  const playing = auto.playing && scenarioCount > 0;
2955
- const starting = useRef14(false);
2956
- const wasPlaying = useRef14(false);
2582
+ const starting = useRef12(false);
2583
+ const wasPlaying = useRef12(false);
2957
2584
  useEffect19(() => {
2958
2585
  if (playing && !wasPlaying.current) starting.current = true;
2959
2586
  wasPlaying.current = playing;
@@ -2994,65 +2621,6 @@ function useScenarioPlayer({
2994
2621
 
2995
2622
  // src/hooks/use-access-code-integration.ts
2996
2623
  import React from "react";
2997
-
2998
- // src/utils/access-code-client.ts
2999
- async function validateAccessCode(email, code, endpoints) {
3000
- try {
3001
- const response = await fetch(endpoints.validateUrl, {
3002
- method: "POST",
3003
- headers: {
3004
- "Content-Type": "application/json"
3005
- },
3006
- body: JSON.stringify({ email, code })
3007
- });
3008
- if (!response.ok) {
3009
- const failure = await response.json().catch(() => null);
3010
- throw new Error(apiErrorMessage(failure, "Validation request failed"));
3011
- }
3012
- return await response.json();
3013
- } catch (error) {
3014
- return {
3015
- valid: false,
3016
- message: error instanceof Error ? error.message : "Validation failed"
3017
- };
3018
- }
3019
- }
3020
- async function consumeAccessCode(email, code, endpoints) {
3021
- try {
3022
- const response = await fetch(endpoints.consumeUrl, {
3023
- method: "POST",
3024
- headers: {
3025
- "Content-Type": "application/json"
3026
- },
3027
- body: JSON.stringify({ email, code })
3028
- });
3029
- if (!response.ok) {
3030
- const failure = await response.json().catch(() => null);
3031
- throw new Error(apiErrorMessage(failure, "Consumption request failed"));
3032
- }
3033
- return await response.json();
3034
- } catch (error) {
3035
- return {
3036
- success: false,
3037
- consumed: false,
3038
- message: error instanceof Error ? error.message : "Consumption failed"
3039
- };
3040
- }
3041
- }
3042
- async function validateAndConsumeAccessCode(email, code, endpoints) {
3043
- const validation = await validateAccessCode(email, code, endpoints);
3044
- if (!validation.valid) {
3045
- return validation;
3046
- }
3047
- const consumption = await consumeAccessCode(email, code, endpoints);
3048
- return {
3049
- ...validation,
3050
- consumed: consumption.consumed,
3051
- message: consumption.consumed ? `Access granted for ${validation.cohort_name}` : consumption.message || validation.message
3052
- };
3053
- }
3054
-
3055
- // src/hooks/use-access-code-integration.ts
3056
2624
  function useAccessCodeIntegration() {
3057
2625
  const runtime = useRequiredEndpointsRuntime();
3058
2626
  const endpoints = runtime.accessCode;
@@ -3095,83 +2663,7 @@ function useAccessCodeIntegration() {
3095
2663
  }
3096
2664
 
3097
2665
  // src/hooks/use-claude-mirror-src.ts
3098
- import { useEffect as useEffect20, useState as useState22 } from "react";
3099
-
3100
- // src/utils/embed-url-converters.ts
3101
- function toGoogleSheetsEmbedUrl(url) {
3102
- if (url.includes("/htmlembed")) return url;
3103
- const match = url.match(/\/spreadsheets\/d\/([a-zA-Z0-9-_]+)/);
3104
- if (!match) return url;
3105
- const gidMatch = url.match(/[#?&]gid=(\d+)/);
3106
- const gid = gidMatch ? gidMatch[1] : "0";
3107
- return `https://docs.google.com/spreadsheets/d/${match[1]}/htmlembed?widget=true&chrome=false&headers=false&gid=${gid}`;
3108
- }
3109
- function toGoogleSheetsOriginalUrl(url) {
3110
- const match = url.match(/\/spreadsheets\/d\/([a-zA-Z0-9-_]+)/);
3111
- if (!match) return url;
3112
- const gidMatch = url.match(/[#?&]gid=(\d+)/);
3113
- const gid = gidMatch ? gidMatch[1] : "0";
3114
- return `https://docs.google.com/spreadsheets/d/${match[1]}/edit#gid=${gid}`;
3115
- }
3116
- function toFigmaEmbedUrl(url, opts) {
3117
- if (url.includes("embed.figma.com")) return url;
3118
- if (url.includes("figma.com/embed")) return url;
3119
- const match = url.match(/figma\.com\/(design|file|proto|board|slides|deck)\/([a-zA-Z0-9]+)(?:\/([^?]*))?(\?.*)?$/);
3120
- if (match) {
3121
- const [, urlType, fileKey, titleSlug, queryString] = match;
3122
- const isSlides = urlType === "slides" || urlType === "deck";
3123
- const embedType = urlType === "proto" ? "proto" : isSlides ? opts?.slidesView === "browse" ? "slides" : "deck" : "design";
3124
- const pathSuffix = titleSlug ? `/${titleSlug}` : "";
3125
- const params = new URLSearchParams(queryString?.replace(/^\?/, "") || "");
3126
- if (!params.has("embed-host")) {
3127
- params.set("embed-host", "flamingo");
3128
- }
3129
- const clientId = process.env.NEXT_PUBLIC_FIGMA_CLIENT_ID;
3130
- if (clientId && !params.has("client-id")) {
3131
- params.set("client-id", clientId);
3132
- }
3133
- return `https://embed.figma.com/${embedType}/${fileKey}${pathSuffix}?${params.toString()}`;
3134
- }
3135
- return `https://www.figma.com/embed?embed-host=flamingo&url=${encodeURIComponent(url)}`;
3136
- }
3137
- function isFigmaSlidesUrl(url) {
3138
- if (!url) return false;
3139
- return /(?:www\.|embed\.)?figma\.com\/(?:slides|deck)\/[a-zA-Z0-9]+/.test(url);
3140
- }
3141
- function toFigmaOriginalUrl(url) {
3142
- if (url.includes("embed.figma.com")) {
3143
- return url.replace("embed.figma.com", "www.figma.com").replace(/\?.*$/, "");
3144
- }
3145
- return url.replace(/\?.*$/, "");
3146
- }
3147
- function toClaudeMirrorPath(url, storageViewBaseUrl) {
3148
- if (!url || !storageViewBaseUrl) return null;
3149
- try {
3150
- const u = new URL(url);
3151
- const host = u.hostname.toLowerCase();
3152
- const id = host === "claude.ai" && /^\/(?:code\/artifact|public\/artifacts)\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[/?#]|$)/i.exec(
3153
- u.pathname
3154
- )?.[1] || host === "claude.site" && /^\/artifacts\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[/?#]|$)/i.exec(
3155
- u.pathname
3156
- )?.[1] || null;
3157
- return id ? `${storageViewBaseUrl.replace(/\/$/, "")}/design-briefs/${id.toLowerCase()}.html` : null;
3158
- } catch {
3159
- return null;
3160
- }
3161
- }
3162
- function toClaudeEmbedUrl(url) {
3163
- if (!url) return null;
3164
- try {
3165
- const u = new URL(url);
3166
- const host = u.hostname.toLowerCase();
3167
- const publicId = host === "claude.ai" && /^\/public\/artifacts\/([\w-]+)(?:\/embed)?\/?$/.exec(u.pathname)?.[1] || host === "claude.site" && /^\/artifacts\/([\w-]+)(?:\/embed)?\/?$/.exec(u.pathname)?.[1] || null;
3168
- return publicId ? `https://claude.ai/public/artifacts/${publicId}/embed` : null;
3169
- } catch {
3170
- return null;
3171
- }
3172
- }
3173
-
3174
- // src/hooks/use-claude-mirror-src.ts
2666
+ import { useEffect as useEffect20, useState as useState21 } from "react";
3175
2667
  async function revalidateMirror(mirrorPath) {
3176
2668
  try {
3177
2669
  const res = await fetch(`${mirrorPath}?revalidate=1`);
@@ -3185,7 +2677,7 @@ async function revalidateMirror(mirrorPath) {
3185
2677
  function useClaudeMirrorSrc(url) {
3186
2678
  const endpoints = useEndpointsRuntime();
3187
2679
  const mirrorPath = toClaudeMirrorPath(url, endpoints?.storageViewBaseUrl);
3188
- const [resolved, setResolved] = useState22(null);
2680
+ const [resolved, setResolved] = useState21(null);
3189
2681
  const state = resolved && resolved.key === mirrorPath ? resolved.value : { src: null, status: mirrorPath ? "probing" : "absent" };
3190
2682
  useEffect20(() => {
3191
2683
  if (!mirrorPath) return void 0;
@@ -3214,9 +2706,9 @@ function useClaudeMirrorSrc(url) {
3214
2706
  }
3215
2707
 
3216
2708
  // src/hooks/use-location-hash.ts
3217
- import { useSyncExternalStore as useSyncExternalStore3 } from "react";
3218
- var HASH_EVENTS = ["hashchange", "popstate"];
3219
- function subscribe3(onChange) {
2709
+ import { useSyncExternalStore as useSyncExternalStore2 } from "react";
2710
+ var HASH_EVENTS = ["hashchange", "popstate", LOCATION_HASH_SYNC_EVENT];
2711
+ function subscribe2(onChange) {
3220
2712
  for (const event of HASH_EVENTS) window.addEventListener(event, onChange);
3221
2713
  return () => {
3222
2714
  for (const event of HASH_EVENTS) window.removeEventListener(event, onChange);
@@ -3231,7 +2723,7 @@ function readHash() {
3231
2723
  }
3232
2724
  }
3233
2725
  function useLocationHash() {
3234
- return useSyncExternalStore3(subscribe3, readHash, () => "");
2726
+ return useSyncExternalStore2(subscribe2, readHash, () => "");
3235
2727
  }
3236
2728
 
3237
2729
  // src/hooks/use-scroll-to-hash.ts
@@ -3250,6 +2742,7 @@ function useScrollToHash(readyDep = true, options) {
3250
2742
  }
3251
2743
  };
3252
2744
  const tryScrollToHash = () => {
2745
+ if (isScrollSyncedHash()) return;
3253
2746
  const hash = normalizeHashFragment(window.location.hash).slice(1);
3254
2747
  if (!hash) return;
3255
2748
  cancelPoll();
@@ -3279,71 +2772,11 @@ function useScrollToHash(readyDep = true, options) {
3279
2772
  }
3280
2773
 
3281
2774
  // src/hooks/use-humanity-signals.ts
3282
- import { useCallback as useCallback15, useRef as useRef15, useState as useState23 } from "react";
3283
-
3284
- // src/utils/humanity-signals.ts
3285
- var HONEYPOT_FIELD = "form_extra_note";
3286
- var ELAPSED_MS_FIELD = "form_elapsed_ms";
3287
- var DEFAULT_MIN_FILL_MS = 700;
3288
- var HUMANITY_SIGNAL_KEYS = [HONEYPOT_FIELD, ELAPSED_MS_FIELD];
3289
- var isHumanitySignalKey = (key) => HUMANITY_SIGNAL_KEYS.includes(key);
3290
- function extractHumanitySignals(body) {
3291
- const b = body ?? {};
3292
- const rawHp = b[HONEYPOT_FIELD];
3293
- const honeypot = rawHp == null ? "" : typeof rawHp === "string" ? rawHp : JSON.stringify(rawHp) ?? String(rawHp);
3294
- const rawMs = b[ELAPSED_MS_FIELD];
3295
- const elapsedMs = typeof rawMs === "number" && Number.isFinite(rawMs) ? rawMs : null;
3296
- return { honeypot, elapsedMs };
3297
- }
3298
- var normalizeForCopyMatch = (s) => s.normalize("NFKC").trim().toLowerCase();
3299
- var digitsOf = (s) => s.replace(/\D/g, "");
3300
- var MIN_COPY_MATCH_LENGTH = 2;
3301
- var MIN_PHONE_DIGITS = 7;
3302
- var phoneDigitsMatch = (a, b) => a.length >= MIN_PHONE_DIGITS && b.length >= MIN_PHONE_DIGITS && (a.endsWith(b) || b.endsWith(a));
3303
- function findHoneypotCopySource(body, honeypot) {
3304
- const hpNorm = normalizeForCopyMatch(honeypot);
3305
- const hpDigits = digitsOf(honeypot);
3306
- const phoneCandidate = hpDigits.length >= MIN_PHONE_DIGITS;
3307
- if (hpNorm.length < MIN_COPY_MATCH_LENGTH && !phoneCandidate) return null;
3308
- const matches = (value) => {
3309
- if (typeof value !== "string" || value.trim() === "") return false;
3310
- if (normalizeForCopyMatch(value) === hpNorm) return true;
3311
- return phoneCandidate && phoneDigitsMatch(digitsOf(value), hpDigits);
3312
- };
3313
- const matchInArray = (value) => Array.isArray(value) && value.some(matches);
3314
- const b = body ?? {};
3315
- for (const [key, value] of Object.entries(b)) {
3316
- if (isHumanitySignalKey(key)) continue;
3317
- if (matches(value)) return key;
3318
- if (matchInArray(value)) return `${key}[]`;
3319
- if (value && typeof value === "object" && !Array.isArray(value)) {
3320
- for (const [nestedKey, nested] of Object.entries(value)) {
3321
- if (matches(nested)) return `${key}.${nestedKey}`;
3322
- if (matchInArray(nested)) return `${key}.${nestedKey}[]`;
3323
- }
3324
- }
3325
- }
3326
- return null;
3327
- }
3328
- function evaluateHumanitySignals(body, opts) {
3329
- const { honeypot, elapsedMs } = extractHumanitySignals(body);
3330
- const diagnostics = {
3331
- honeypotLength: honeypot.length,
3332
- timingAffirmed: elapsedMs !== null && elapsedMs >= opts.minFillMs
3333
- };
3334
- const filled = honeypot.trim() !== "";
3335
- const sourceField = filled ? findHoneypotCopySource(body, honeypot) : null;
3336
- if (filled && sourceField === null) return { ...diagnostics, ok: false, reason: "honeypot" };
3337
- if (elapsedMs !== null && elapsedMs < opts.minFillMs) return { ...diagnostics, ok: false, reason: "too_fast" };
3338
- return sourceField !== null ? { ...diagnostics, ok: true, note: "honeypot_autofill", sourceField } : { ...diagnostics, ok: true };
3339
- }
3340
- var splitCsvEnv = (s) => s?.split(",").map((t) => t.trim()).filter(Boolean) ?? [];
3341
-
3342
- // src/hooks/use-humanity-signals.ts
2775
+ import { useCallback as useCallback15, useRef as useRef13, useState as useState22 } from "react";
3343
2776
  function useHumanitySignals() {
3344
- const ref = useRef15(null);
3345
- const [mountedAt] = useState23(() => typeof performance !== "undefined" ? performance.now() : 0);
3346
- const startedAtRef = useRef15(mountedAt);
2777
+ const ref = useRef13(null);
2778
+ const [mountedAt] = useState22(() => typeof performance !== "undefined" ? performance.now() : 0);
2779
+ const startedAtRef = useRef13(mountedAt);
3347
2780
  const getSignals = useCallback15(
3348
2781
  () => ({
3349
2782
  [HONEYPOT_FIELD]: ref.current?.value ?? "",
@@ -3359,162 +2792,10 @@ function useHumanitySignals() {
3359
2792
  }
3360
2793
 
3361
2794
  // src/hooks/use-form-rescue.ts
3362
- import { useCallback as useCallback16, useEffect as useEffect22, useMemo as useMemo8, useRef as useRef16 } from "react";
3363
-
3364
- // src/utils/form-rescue.ts
3365
- var FORM_ID_PATTERN = /^[a-z][a-z0-9_]{1,47}$/;
3366
- var definitions = /* @__PURE__ */ new Map();
3367
- function defineRescueForm(definition) {
3368
- if (!FORM_ID_PATTERN.test(definition.id)) throw new Error(`[form-rescue] invalid form id "${definition.id}"`);
3369
- const existing = definitions.get(definition.id);
3370
- if (existing) {
3371
- if (existing.label !== definition.label) {
3372
- throw new Error(`[form-rescue] form id "${definition.id}" is already defined as "${existing.label}"`);
3373
- }
3374
- return existing;
3375
- }
3376
- const frozen = Object.freeze({ id: definition.id, label: definition.label });
3377
- definitions.set(frozen.id, frozen);
3378
- return frozen;
3379
- }
3380
- function getRescueForm(id) {
3381
- return typeof id === "string" ? definitions.get(id) ?? null : null;
3382
- }
3383
- function listRescueForms() {
3384
- return [...definitions.values()];
3385
- }
3386
- var RESCUE_FORMS = {
3387
- contact: defineRescueForm({ id: "contact", label: "Contact form" }),
3388
- caseStudyPitch: defineRescueForm({ id: "case_study_pitch", label: "Case study pitch" }),
3389
- dataRoomRequest: defineRescueForm({ id: "data_room_request", label: "Data room request" }),
3390
- trustCenterRequest: defineRescueForm({ id: "trust_center_request", label: "Trust Center document request" }),
3391
- meetingBooking: defineRescueForm({ id: "meeting_booking", label: "Meeting booking" }),
3392
- waitlist: defineRescueForm({ id: "waitlist", label: "Waitlist" })
3393
- };
3394
- var FORM_RESCUE_VALUE_FIELDS = [
3395
- "email",
3396
- "name",
3397
- "firstName",
3398
- "lastName",
3399
- "company",
3400
- "jobtitle",
3401
- "companySize",
3402
- "linkedin_url"
3403
- ];
3404
- var EXCLUDED_FIELD_PATTERN = /pass(word|code)?|card|cvv|cvc|ssn|social.?security|iban|bank|routing|token|secret|otp|pin$/i;
3405
- function isExcludedRescueField(name) {
3406
- return EXCLUDED_FIELD_PATTERN.test(name);
3407
- }
3408
- var FORM_RESCUE_MAX_VALUE_CHARS = 200;
3409
- var FORM_RESCUE_DEBOUNCE_MS = 1500;
3410
- var FORM_RESCUE_MAX_FIELDS = 40;
3411
- var FORM_RESCUE_ATTEMPT_FIELD = "form_attempt_id";
3412
- var FORM_RESCUE_RESUME_FIELD = "form_resume_token";
3413
- var FORM_RESCUE_SUBMIT_KEYS = [FORM_RESCUE_ATTEMPT_FIELD, FORM_RESCUE_RESUME_FIELD];
3414
- var FORM_RESCUE_RESUME_PARAM = "resume";
3415
- var RESUME_TOKEN_PATTERN = /^[A-Za-z0-9_-]{16,128}$/;
3416
- function isResumeToken(value) {
3417
- return typeof value === "string" && RESUME_TOKEN_PATTERN.test(value);
3418
- }
3419
- var FORM_DRAFT_STATUSES = ["started", "rescuable", "rescued", "submitted"];
3420
- var FORM_RESCUE_SKIP_REASONS = {
3421
- finishedElsewhere: "finished_elsewhere",
3422
- alreadyRescued: "already_rescued",
3423
- internal: "internal_email"
3424
- };
3425
- var EMAIL_PATTERN = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;
3426
- function isRescueEmail(value) {
3427
- return typeof value === "string" && value.length <= FORM_RESCUE_MAX_VALUE_CHARS && EMAIL_PATTERN.test(value.trim());
3428
- }
3429
- var UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
3430
- function isFormAttemptId(value) {
3431
- return typeof value === "string" && UUID_PATTERN.test(value);
3432
- }
3433
- function isFilled(value) {
3434
- if (value == null) return false;
3435
- if (typeof value === "string") return value.trim().length > 0;
3436
- if (typeof value === "boolean") return value;
3437
- if (Array.isArray(value)) return value.length > 0;
3438
- if (typeof value === "object") return Object.values(value).some(isFilled);
3439
- return true;
3440
- }
3441
- function sanitizeRescueValues(values) {
3442
- const out = {};
3443
- if (!values || typeof values !== "object") return out;
3444
- for (const key of FORM_RESCUE_VALUE_FIELDS) {
3445
- if (isExcludedRescueField(key)) continue;
3446
- const raw = values[key];
3447
- if (typeof raw !== "string") continue;
3448
- const trimmed = raw.trim().slice(0, FORM_RESCUE_MAX_VALUE_CHARS);
3449
- if (trimmed) out[key] = trimmed;
3450
- }
3451
- return out;
3452
- }
3453
- function filledRescueFields(values, fieldNames) {
3454
- return fieldNames.filter((name) => !isExcludedRescueField(name) && isFilled(values[name])).slice(0, FORM_RESCUE_MAX_FIELDS);
3455
- }
3456
- function rescueCompletionPct(filledCount, totalCount) {
3457
- if (totalCount <= 0) return 0;
3458
- return Math.max(0, Math.min(100, Math.round(filledCount / totalCount * 100)));
3459
- }
3460
- function sanitizeRescueFieldName(value) {
3461
- if (typeof value !== "string") return null;
3462
- const trimmed = value.trim();
3463
- return /^[A-Za-z0-9_.-]{1,64}$/.test(trimmed) && !isExcludedRescueField(trimmed) ? trimmed : null;
3464
- }
3465
- var UTM_KEYS = ["source", "medium", "campaign", "content", "term"];
3466
- var MAX_SOURCE_PATH_CHARS = 500;
3467
- function parseFormDraftSaveRequest(body) {
3468
- const form = getRescueForm(body.form_id);
3469
- if (!isFormAttemptId(body.attempt_id) || !form) return null;
3470
- const rawValues = body.values && typeof body.values === "object" ? body.values : {};
3471
- const values = sanitizeRescueValues(rawValues);
3472
- const fieldsFilled = (Array.isArray(body.fields_filled) ? body.fields_filled : []).map(sanitizeRescueFieldName).filter((name) => name !== null).slice(0, FORM_RESCUE_MAX_FIELDS);
3473
- const path = typeof body.source_path === "string" ? body.source_path : "";
3474
- const utmIn = body.utm && typeof body.utm === "object" ? body.utm : {};
3475
- const utm = {};
3476
- for (const key of UTM_KEYS) {
3477
- const value = utmIn[key];
3478
- if (typeof value === "string" && value.trim()) utm[key] = value.trim().slice(0, FORM_RESCUE_MAX_VALUE_CHARS);
3479
- }
3480
- return {
3481
- request: {
3482
- attempt_id: body.attempt_id,
3483
- form_id: form.id,
3484
- values,
3485
- fields_filled: fieldsFilled,
3486
- last_field: sanitizeRescueFieldName(body.last_field),
3487
- completion_pct: typeof body.completion_pct === "number" ? rescueCompletionPct(body.completion_pct, 100) : 0,
3488
- // Same-site only: a path, never a scheme-relative or absolute URL.
3489
- source_path: path.startsWith("/") && !path.startsWith("//") ? path.slice(0, MAX_SOURCE_PATH_CHARS) : "",
3490
- ...Object.keys(utm).length ? { utm } : {},
3491
- ...isResumeToken(body.resume_token) ? { resume_token: body.resume_token } : {}
3492
- },
3493
- dropped: Object.keys(rawValues).filter((key) => !(key in values))
3494
- };
3495
- }
3496
- var FORM_RESCUE_EVENTS = {
3497
- started: "form_started",
3498
- progress: "form_progress",
3499
- leadCaptured: "form_lead_captured",
3500
- abandoned: "form_abandoned",
3501
- submitted: "form_submitted",
3502
- rescued: "form_rescued",
3503
- resumed: "form_resumed"
3504
- };
3505
- function captureFormRescueEvent(event, properties) {
3506
- try {
3507
- if (typeof window === "undefined") return;
3508
- const ph = window.posthog;
3509
- if (typeof ph?.capture === "function") ph.capture(event, properties);
3510
- } catch {
3511
- }
3512
- }
3513
-
3514
- // src/hooks/use-form-rescue.ts
2795
+ import { useCallback as useCallback16, useEffect as useEffect22, useMemo as useMemo7, useRef as useRef14 } from "react";
3515
2796
  var LOCAL_DRAFT_TTL_MS = 7 * 24 * 60 * 60 * 1e3;
3516
2797
  var STORAGE_PREFIX = "form-rescue:v1:";
3517
- var UTM_KEYS2 = ["source", "medium", "campaign", "content", "term"];
2798
+ var UTM_KEYS = ["source", "medium", "campaign", "content", "term"];
3518
2799
  function newAttemptId() {
3519
2800
  if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") return crypto.randomUUID();
3520
2801
  const bytes = new Uint8Array(16);
@@ -3561,7 +2842,7 @@ function readUtm() {
3561
2842
  try {
3562
2843
  const params = new URLSearchParams(window.location.search);
3563
2844
  const utm = {};
3564
- for (const key of UTM_KEYS2) {
2845
+ for (const key of UTM_KEYS) {
3565
2846
  const value = params.get(`utm_${key}`);
3566
2847
  if (value) utm[key] = value.slice(0, 200);
3567
2848
  }
@@ -3573,17 +2854,17 @@ function readUtm() {
3573
2854
  function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
3574
2855
  const draftsUrl = useEndpointsRuntime()?.formDraftsUrl;
3575
2856
  const formId = form?.id ?? null;
3576
- const attemptIdRef = useRef16(null);
3577
- const resumeTokenRef = useRef16(null);
3578
- const latestRef = useRef16(null);
3579
- const dirtyRef = useRef16(false);
3580
- const startedRef = useRef16(false);
3581
- const leadCapturedRef = useRef16(false);
3582
- const completedRef = useRef16(false);
3583
- const timerRef = useRef16(null);
3584
- const fieldNamesRef = useRef16(fieldNames);
3585
- const onRestoreRef = useRef16(onRestore);
3586
- const getSignalsRef = useRef16(getSignals);
2857
+ const attemptIdRef = useRef14(null);
2858
+ const resumeTokenRef = useRef14(null);
2859
+ const latestRef = useRef14(null);
2860
+ const dirtyRef = useRef14(false);
2861
+ const startedRef = useRef14(false);
2862
+ const leadCapturedRef = useRef14(false);
2863
+ const completedRef = useRef14(false);
2864
+ const timerRef = useRef14(null);
2865
+ const fieldNamesRef = useRef14(fieldNames);
2866
+ const onRestoreRef = useRef14(onRestore);
2867
+ const getSignalsRef = useRef14(getSignals);
3587
2868
  useEffect22(() => {
3588
2869
  fieldNamesRef.current = fieldNames;
3589
2870
  onRestoreRef.current = onRestore;
@@ -3735,7 +3016,7 @@ function useFormRescue({ form, fieldNames, onRestore, getSignals }) {
3735
3016
  startedRef.current = false;
3736
3017
  leadCapturedRef.current = false;
3737
3018
  }, [attemptId, form, formId]);
3738
- return useMemo8(() => ({ track, submitFields, complete }), [track, submitFields, complete]);
3019
+ return useMemo7(() => ({ track, submitFields, complete }), [track, submitFields, complete]);
3739
3020
  }
3740
3021
 
3741
3022
  // src/hooks/use-rescued-form.ts
@@ -3776,11 +3057,8 @@ export {
3776
3057
  useAutoLimitTags,
3777
3058
  useKeyboardCollisionPadding,
3778
3059
  useDeferredError,
3779
- DRAG_AND_DROP_MEDIA_QUERY,
3780
- useDragAndDropEnabled,
3781
3060
  useFocusTrap,
3782
- useHorizontalScrollbar,
3783
- useLocalStorage,
3061
+ useStickyToolbar,
3784
3062
  useMemoizedCallback,
3785
3063
  useNotificationPermission,
3786
3064
  useOnboardingState,
@@ -3791,19 +3069,7 @@ export {
3791
3069
  resolveActiveSection,
3792
3070
  useActiveSection,
3793
3071
  useNavMenus,
3794
- DESKTOP_OSES,
3795
- detectVisitorOs,
3796
- desktopOsOf,
3797
- detectDesktopOs,
3798
- usesCommandKey,
3799
- shortcutLabel,
3800
- useVisitorOs,
3801
3072
  usePreventScroll,
3802
- platformIcons,
3803
- transformPlatformConfigsToOptions,
3804
- getPlatformIcon,
3805
- getSmallPlatformIcon,
3806
- getPlatformIconComponent,
3807
3073
  usePlatformConfig,
3808
3074
  usePlatformByValue,
3809
3075
  useValidatePlatform,
@@ -3846,55 +3112,11 @@ export {
3846
3112
  useCursorPaginationState,
3847
3113
  useNatsClient,
3848
3114
  useScenarioPlayer,
3849
- validateAccessCode,
3850
- consumeAccessCode,
3851
- validateAndConsumeAccessCode,
3852
3115
  useAccessCodeIntegration,
3853
- toGoogleSheetsEmbedUrl,
3854
- toGoogleSheetsOriginalUrl,
3855
- toFigmaEmbedUrl,
3856
- isFigmaSlidesUrl,
3857
- toFigmaOriginalUrl,
3858
- toClaudeMirrorPath,
3859
- toClaudeEmbedUrl,
3860
3116
  useClaudeMirrorSrc,
3861
3117
  useLocationHash,
3862
3118
  useScrollToHash,
3863
- HONEYPOT_FIELD,
3864
- ELAPSED_MS_FIELD,
3865
- DEFAULT_MIN_FILL_MS,
3866
- HUMANITY_SIGNAL_KEYS,
3867
- isHumanitySignalKey,
3868
- extractHumanitySignals,
3869
- findHoneypotCopySource,
3870
- evaluateHumanitySignals,
3871
- splitCsvEnv,
3872
3119
  useHumanitySignals,
3873
- defineRescueForm,
3874
- getRescueForm,
3875
- listRescueForms,
3876
- RESCUE_FORMS,
3877
- FORM_RESCUE_VALUE_FIELDS,
3878
- isExcludedRescueField,
3879
- FORM_RESCUE_MAX_VALUE_CHARS,
3880
- FORM_RESCUE_DEBOUNCE_MS,
3881
- FORM_RESCUE_MAX_FIELDS,
3882
- FORM_RESCUE_ATTEMPT_FIELD,
3883
- FORM_RESCUE_RESUME_FIELD,
3884
- FORM_RESCUE_SUBMIT_KEYS,
3885
- FORM_RESCUE_RESUME_PARAM,
3886
- isResumeToken,
3887
- FORM_DRAFT_STATUSES,
3888
- FORM_RESCUE_SKIP_REASONS,
3889
- isRescueEmail,
3890
- isFormAttemptId,
3891
- sanitizeRescueValues,
3892
- filledRescueFields,
3893
- rescueCompletionPct,
3894
- sanitizeRescueFieldName,
3895
- parseFormDraftSaveRequest,
3896
- FORM_RESCUE_EVENTS,
3897
- captureFormRescueEvent,
3898
3120
  completeFormRescue,
3899
3121
  useFormRescue,
3900
3122
  useRescuedForm