@flamingo-stack/openframe-frontend-core 0.0.204 → 0.0.205

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 (509) hide show
  1. package/dist/{chunk-4CWSZPXH.cjs → chunk-24KCAECR.cjs} +9 -9
  2. package/dist/{chunk-4CWSZPXH.cjs.map → chunk-24KCAECR.cjs.map} +1 -1
  3. package/dist/chunk-27APPAJN.cjs +24 -0
  4. package/dist/chunk-27APPAJN.cjs.map +1 -0
  5. package/dist/{chunk-UC43NICZ.cjs → chunk-664KA5FI.cjs} +2 -35
  6. package/dist/chunk-664KA5FI.cjs.map +1 -0
  7. package/dist/chunk-6RZYJICV.cjs +24 -0
  8. package/dist/chunk-6RZYJICV.cjs.map +1 -0
  9. package/dist/chunk-7L4DWM7P.js +24 -0
  10. package/dist/chunk-7L4DWM7P.js.map +1 -0
  11. package/dist/chunk-BZFW3FOF.cjs +21 -0
  12. package/dist/chunk-BZFW3FOF.cjs.map +1 -0
  13. package/dist/{chunk-N57KWHDB.js → chunk-CIPO6DXK.js} +5 -5
  14. package/dist/chunk-EL5YVPD5.js +21 -0
  15. package/dist/chunk-EL5YVPD5.js.map +1 -0
  16. package/dist/{chunk-ARQ4XP64.cjs → chunk-FDCFI7YT.cjs} +40080 -31492
  17. package/dist/chunk-FDCFI7YT.cjs.map +1 -0
  18. package/dist/chunk-G7UE6RKV.cjs +121 -0
  19. package/dist/chunk-G7UE6RKV.cjs.map +1 -0
  20. package/dist/{chunk-25LVV26X.cjs → chunk-JUZGUQMX.cjs} +178 -50
  21. package/dist/chunk-JUZGUQMX.cjs.map +1 -0
  22. package/dist/{chunk-SZPJ5R5B.js → chunk-KSOOKNBG.js} +1 -34
  23. package/dist/chunk-KSOOKNBG.js.map +1 -0
  24. package/dist/{chunk-RMB5DVED.cjs → chunk-KUZGEA7U.cjs} +83 -66
  25. package/dist/chunk-KUZGEA7U.cjs.map +1 -0
  26. package/dist/chunk-LXC6P2EO.js +63 -0
  27. package/dist/chunk-LXC6P2EO.js.map +1 -0
  28. package/dist/chunk-MJNXIEV2.js +24 -0
  29. package/dist/chunk-MJNXIEV2.js.map +1 -0
  30. package/dist/{chunk-CPXLQ57U.js → chunk-MVGGXOFA.js} +37 -20
  31. package/dist/chunk-MVGGXOFA.js.map +1 -0
  32. package/dist/{chunk-LY34ORX6.js → chunk-O55ZUAX7.js} +39920 -31332
  33. package/dist/chunk-O55ZUAX7.js.map +1 -0
  34. package/dist/chunk-OHPI2HRK.js +47 -0
  35. package/dist/chunk-OHPI2HRK.js.map +1 -0
  36. package/dist/chunk-PLJLE4A4.js +121 -0
  37. package/dist/chunk-PLJLE4A4.js.map +1 -0
  38. package/dist/{chunk-XGL5FKIK.js → chunk-SCN5WFIZ.js} +148 -20
  39. package/dist/chunk-SCN5WFIZ.js.map +1 -0
  40. package/dist/chunk-WBR7H6E3.cjs +47 -0
  41. package/dist/chunk-WBR7H6E3.cjs.map +1 -0
  42. package/dist/chunk-XL4V2PYG.cjs +63 -0
  43. package/dist/chunk-XL4V2PYG.cjs.map +1 -0
  44. package/dist/components/announcement-bar.d.ts.map +1 -1
  45. package/dist/components/chat/chat-attachment-bar.d.ts +66 -0
  46. package/dist/components/chat/chat-attachment-bar.d.ts.map +1 -0
  47. package/dist/components/chat/chat-container.d.ts +21 -1
  48. package/dist/components/chat/chat-container.d.ts.map +1 -1
  49. package/dist/components/chat/chat-input.d.ts.map +1 -1
  50. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  51. package/dist/components/chat/chat-message-list.d.ts.map +1 -1
  52. package/dist/components/chat/chat-panel-context.d.ts +9 -0
  53. package/dist/components/chat/chat-panel-context.d.ts.map +1 -0
  54. package/dist/components/chat/chat-ticket-list.d.ts +1 -1
  55. package/dist/components/chat/chat-ticket-list.d.ts.map +1 -1
  56. package/dist/components/chat/embeddable-chat.d.ts +42 -0
  57. package/dist/components/chat/embeddable-chat.d.ts.map +1 -0
  58. package/dist/components/chat/entity-cards/admin-content-card.d.ts +34 -0
  59. package/dist/components/chat/entity-cards/admin-content-card.d.ts.map +1 -0
  60. package/dist/components/chat/entity-cards/block-card.d.ts.map +1 -0
  61. package/dist/components/chat/entity-cards/blog-card.d.ts +30 -0
  62. package/dist/components/chat/entity-cards/blog-card.d.ts.map +1 -0
  63. package/dist/components/chat/entity-cards/blog-image-placeholder.d.ts +26 -0
  64. package/dist/components/chat/entity-cards/blog-image-placeholder.d.ts.map +1 -0
  65. package/dist/components/chat/entity-cards/campaign-card-admin.d.ts +33 -0
  66. package/dist/components/chat/entity-cards/campaign-card-admin.d.ts.map +1 -0
  67. package/dist/components/chat/entity-cards/case-study-card.d.ts +20 -0
  68. package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -0
  69. package/dist/components/chat/entity-cards/chat-ticket-item.d.ts.map +1 -0
  70. package/dist/components/chat/{chat-video-entity-card.d.ts → entity-cards/chat-video-entity-card.d.ts} +1 -1
  71. package/dist/components/chat/entity-cards/chat-video-entity-card.d.ts.map +1 -0
  72. package/dist/components/chat/entity-cards/customer-interview-card.d.ts +19 -0
  73. package/dist/components/chat/entity-cards/customer-interview-card.d.ts.map +1 -0
  74. package/dist/components/chat/entity-cards/data-room-doc-card.d.ts +47 -0
  75. package/dist/components/chat/entity-cards/data-room-doc-card.d.ts.map +1 -0
  76. package/dist/components/chat/entity-cards/dispatch.d.ts +119 -0
  77. package/dist/components/chat/entity-cards/dispatch.d.ts.map +1 -0
  78. package/dist/components/chat/entity-cards/entity-author-card.d.ts +87 -0
  79. package/dist/components/chat/entity-cards/entity-author-card.d.ts.map +1 -0
  80. package/dist/components/chat/entity-cards/generic-entity-card.d.ts +42 -0
  81. package/dist/components/chat/entity-cards/generic-entity-card.d.ts.map +1 -0
  82. package/dist/components/chat/entity-cards/github-activity-card.d.ts +37 -0
  83. package/dist/components/chat/entity-cards/github-activity-card.d.ts.map +1 -0
  84. package/dist/components/chat/entity-cards/hubspot-ticket-card.d.ts +28 -0
  85. package/dist/components/chat/entity-cards/hubspot-ticket-card.d.ts.map +1 -0
  86. package/dist/components/chat/entity-cards/index.d.ts +32 -0
  87. package/dist/components/chat/entity-cards/index.d.ts.map +1 -0
  88. package/dist/components/chat/entity-cards/investor-update-card.d.ts +19 -0
  89. package/dist/components/chat/entity-cards/investor-update-card.d.ts.map +1 -0
  90. package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts +20 -0
  91. package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -0
  92. package/dist/components/chat/entity-cards/product-release-card-defaults.d.ts +21 -0
  93. package/dist/components/chat/entity-cards/product-release-card-defaults.d.ts.map +1 -0
  94. package/dist/components/chat/entity-cards/product-release-card.d.ts +12 -0
  95. package/dist/components/chat/entity-cards/product-release-card.d.ts.map +1 -0
  96. package/dist/components/chat/entity-cards/program-card-defaults.d.ts +32 -0
  97. package/dist/components/chat/entity-cards/program-card-defaults.d.ts.map +1 -0
  98. package/dist/components/chat/entity-cards/program-card.d.ts +37 -0
  99. package/dist/components/chat/entity-cards/program-card.d.ts.map +1 -0
  100. package/dist/components/chat/entity-cards/roadmap-card.d.ts +28 -0
  101. package/dist/components/chat/entity-cards/roadmap-card.d.ts.map +1 -0
  102. package/dist/components/chat/entity-cards/roadmap-vote-button.d.ts +12 -0
  103. package/dist/components/chat/entity-cards/roadmap-vote-button.d.ts.map +1 -0
  104. package/dist/components/chat/entity-cards/slack-message-card.d.ts +28 -0
  105. package/dist/components/chat/entity-cards/slack-message-card.d.ts.map +1 -0
  106. package/dist/components/chat/entity-cards/task-type-icon.d.ts +6 -0
  107. package/dist/components/chat/entity-cards/task-type-icon.d.ts.map +1 -0
  108. package/dist/components/chat/hooks/index.d.ts +10 -0
  109. package/dist/components/chat/hooks/index.d.ts.map +1 -1
  110. package/dist/components/chat/hooks/use-chat-attachment-image-gallery.d.ts +5 -0
  111. package/dist/components/chat/hooks/use-chat-attachment-image-gallery.d.ts.map +1 -0
  112. package/dist/components/chat/hooks/use-chat-attachments.d.ts +33 -0
  113. package/dist/components/chat/hooks/use-chat-attachments.d.ts.map +1 -0
  114. package/dist/components/chat/hooks/use-chat-card-item.d.ts +7 -0
  115. package/dist/components/chat/hooks/use-chat-card-item.d.ts.map +1 -0
  116. package/dist/components/chat/hooks/use-chat-identity.d.ts +44 -0
  117. package/dist/components/chat/hooks/use-chat-identity.d.ts.map +1 -0
  118. package/dist/components/chat/hooks/use-chat.d.ts +30 -0
  119. package/dist/components/chat/hooks/use-chat.d.ts.map +1 -0
  120. package/dist/components/chat/hooks/use-close-on-navigation.d.ts +2 -0
  121. package/dist/components/chat/hooks/use-close-on-navigation.d.ts.map +1 -0
  122. package/dist/components/chat/hooks/use-embedded-chat.d.ts +174 -0
  123. package/dist/components/chat/hooks/use-embedded-chat.d.ts.map +1 -0
  124. package/dist/components/chat/hooks/use-proxied-image-url.d.ts +18 -0
  125. package/dist/components/chat/hooks/use-proxied-image-url.d.ts.map +1 -0
  126. package/dist/components/chat/hooks/use-slash-commands.d.ts +32 -0
  127. package/dist/components/chat/hooks/use-slash-commands.d.ts.map +1 -0
  128. package/dist/components/chat/hooks/use-sse.d.ts +57 -0
  129. package/dist/components/chat/hooks/use-sse.d.ts.map +1 -0
  130. package/dist/components/chat/index.cjs +393 -0
  131. package/dist/components/chat/index.cjs.map +1 -0
  132. package/dist/components/chat/index.d.ts +5 -3
  133. package/dist/components/chat/index.d.ts.map +1 -1
  134. package/dist/components/chat/index.js +393 -0
  135. package/dist/components/chat/index.js.map +1 -0
  136. package/dist/components/chat/nav-link-anchor-via-runtime.d.ts +33 -0
  137. package/dist/components/chat/nav-link-anchor-via-runtime.d.ts.map +1 -0
  138. package/dist/components/chat/source-action-button.d.ts +39 -0
  139. package/dist/components/chat/source-action-button.d.ts.map +1 -0
  140. package/dist/components/chat/types/chat.types.d.ts +36 -0
  141. package/dist/components/chat/types/chat.types.d.ts.map +1 -1
  142. package/dist/components/chat/types/component.types.d.ts +56 -11
  143. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  144. package/dist/components/chat/types/entities/blog.d.ts +14 -0
  145. package/dist/components/chat/types/entities/blog.d.ts.map +1 -0
  146. package/dist/components/chat/types/entities/case-study.d.ts +10 -0
  147. package/dist/components/chat/types/entities/case-study.d.ts.map +1 -0
  148. package/dist/components/chat/types/entities/content-ref.d.ts +23 -0
  149. package/dist/components/chat/types/entities/content-ref.d.ts.map +1 -0
  150. package/dist/components/chat/types/entities/customer-interview.d.ts +10 -0
  151. package/dist/components/chat/types/entities/customer-interview.d.ts.map +1 -0
  152. package/dist/components/chat/types/entities/data-room-doc.d.ts +37 -0
  153. package/dist/components/chat/types/entities/data-room-doc.d.ts.map +1 -0
  154. package/dist/components/chat/types/entities/github-activity.d.ts +29 -0
  155. package/dist/components/chat/types/entities/github-activity.d.ts.map +1 -0
  156. package/dist/components/chat/types/entities/hubspot-ticket.d.ts +39 -0
  157. package/dist/components/chat/types/entities/hubspot-ticket.d.ts.map +1 -0
  158. package/dist/components/chat/types/entities/index.d.ts +28 -0
  159. package/dist/components/chat/types/entities/index.d.ts.map +1 -0
  160. package/dist/components/chat/types/entities/investor-update.d.ts +83 -0
  161. package/dist/components/chat/types/entities/investor-update.d.ts.map +1 -0
  162. package/dist/components/chat/types/entities/onboarding-guide.d.ts +79 -0
  163. package/dist/components/chat/types/entities/onboarding-guide.d.ts.map +1 -0
  164. package/dist/components/chat/types/entities/program-types.d.ts +303 -0
  165. package/dist/components/chat/types/entities/program-types.d.ts.map +1 -0
  166. package/dist/components/chat/types/entities/roadmap-item.d.ts +41 -0
  167. package/dist/components/chat/types/entities/roadmap-item.d.ts.map +1 -0
  168. package/dist/components/chat/types/entities/slack-message.d.ts +28 -0
  169. package/dist/components/chat/types/entities/slack-message.d.ts.map +1 -0
  170. package/dist/components/chat/types/index.d.ts +1 -0
  171. package/dist/components/chat/types/index.d.ts.map +1 -1
  172. package/dist/components/chat/utils/agent-status-message.d.ts +18 -0
  173. package/dist/components/chat/utils/agent-status-message.d.ts.map +1 -0
  174. package/dist/components/chat/utils/auto-continuation-directive.d.ts +38 -0
  175. package/dist/components/chat/utils/auto-continuation-directive.d.ts.map +1 -0
  176. package/dist/components/chat/utils/chat-attachment-markdown.d.ts +114 -0
  177. package/dist/components/chat/utils/chat-attachment-markdown.d.ts.map +1 -0
  178. package/dist/components/chat/utils/chat-authed-fetch.d.ts +13 -0
  179. package/dist/components/chat/utils/chat-authed-fetch.d.ts.map +1 -0
  180. package/dist/components/chat/utils/chat-nav-resolution.d.ts +72 -0
  181. package/dist/components/chat/utils/chat-nav-resolution.d.ts.map +1 -0
  182. package/dist/components/chat/utils/chat-proxy-auth-storage.d.ts +43 -0
  183. package/dist/components/chat/utils/chat-proxy-auth-storage.d.ts.map +1 -0
  184. package/dist/components/chat/utils/chip-action-class.d.ts +16 -0
  185. package/dist/components/chat/utils/chip-action-class.d.ts.map +1 -0
  186. package/dist/components/chat/utils/chip-styles.d.ts +32 -0
  187. package/dist/components/chat/utils/chip-styles.d.ts.map +1 -0
  188. package/dist/components/chat/utils/clickup-task-type-utils.d.ts +38 -0
  189. package/dist/components/chat/utils/clickup-task-type-utils.d.ts.map +1 -0
  190. package/dist/components/chat/utils/compact-card-classes.d.ts +50 -0
  191. package/dist/components/chat/utils/compact-card-classes.d.ts.map +1 -0
  192. package/dist/components/chat/utils/decide-new-tab.d.ts +39 -0
  193. package/dist/components/chat/utils/decide-new-tab.d.ts.map +1 -0
  194. package/dist/components/chat/utils/external-app-urls.d.ts +14 -0
  195. package/dist/components/chat/utils/external-app-urls.d.ts.map +1 -0
  196. package/dist/components/chat/utils/flatten-assistant-content.d.ts +25 -0
  197. package/dist/components/chat/utils/flatten-assistant-content.d.ts.map +1 -0
  198. package/dist/components/chat/utils/icon-registry.d.ts +67 -0
  199. package/dist/components/chat/utils/icon-registry.d.ts.map +1 -0
  200. package/dist/components/chat/utils/index.d.ts +21 -0
  201. package/dist/components/chat/utils/index.d.ts.map +1 -1
  202. package/dist/components/chat/utils/is-cross-origin-url.d.ts +22 -0
  203. package/dist/components/chat/utils/is-cross-origin-url.d.ts.map +1 -0
  204. package/dist/components/chat/utils/nav-anchor-props.d.ts +54 -0
  205. package/dist/components/chat/utils/nav-anchor-props.d.ts.map +1 -0
  206. package/dist/components/chat/utils/nav-click-handler.d.ts +51 -0
  207. package/dist/components/chat/utils/nav-click-handler.d.ts.map +1 -0
  208. package/dist/components/chat/utils/scroll-anchor.d.ts +30 -0
  209. package/dist/components/chat/utils/scroll-anchor.d.ts.map +1 -0
  210. package/dist/components/chat/utils/slash-dispatch-utils.d.ts +109 -0
  211. package/dist/components/chat/utils/slash-dispatch-utils.d.ts.map +1 -0
  212. package/dist/components/chat/utils/source-icons.d.ts +8 -0
  213. package/dist/components/chat/utils/source-icons.d.ts.map +1 -0
  214. package/dist/components/chat/utils/source-row-cta.d.ts +111 -0
  215. package/dist/components/chat/utils/source-row-cta.d.ts.map +1 -0
  216. package/dist/components/features/figma-prototype-viewer.d.ts.map +1 -1
  217. package/dist/components/features/index.cjs +12 -6
  218. package/dist/components/features/index.cjs.map +1 -1
  219. package/dist/components/features/index.js +11 -5
  220. package/dist/components/features/video.d.ts.map +1 -1
  221. package/dist/components/icons/index.cjs +3 -3
  222. package/dist/components/icons/index.js +2 -2
  223. package/dist/components/index.cjs +274 -8
  224. package/dist/components/index.cjs.map +1 -1
  225. package/dist/components/index.js +273 -7
  226. package/dist/components/interactive-wrapper.d.ts +3 -3
  227. package/dist/components/navigation/index.cjs +12 -6
  228. package/dist/components/navigation/index.cjs.map +1 -1
  229. package/dist/components/navigation/index.js +11 -5
  230. package/dist/components/resizable.d.ts +1 -1
  231. package/dist/components/shared/product-release/product-release-card-skeleton.d.ts +1 -1
  232. package/dist/components/shared/product-release/product-release-card-skeleton.d.ts.map +1 -1
  233. package/dist/components/shared/product-release/product-release-card.d.ts +19 -12
  234. package/dist/components/shared/product-release/product-release-card.d.ts.map +1 -1
  235. package/dist/components/shared/product-release/release-detail-page.d.ts +2 -4
  236. package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
  237. package/dist/components/ui/button/button.d.ts +13 -0
  238. package/dist/components/ui/button/button.d.ts.map +1 -1
  239. package/dist/components/ui/dashboard-info-card.d.ts.map +1 -1
  240. package/dist/components/ui/entity-image.d.ts.map +1 -1
  241. package/dist/components/ui/file-manager/index.cjs +71 -70
  242. package/dist/components/ui/file-manager/index.cjs.map +1 -1
  243. package/dist/components/ui/file-manager/index.js +6 -5
  244. package/dist/components/ui/file-manager/index.js.map +1 -1
  245. package/dist/components/ui/hover-dropdown.d.ts +66 -0
  246. package/dist/components/ui/hover-dropdown.d.ts.map +1 -0
  247. package/dist/components/ui/index.cjs +276 -6
  248. package/dist/components/ui/index.cjs.map +1 -1
  249. package/dist/components/ui/index.d.ts +1 -0
  250. package/dist/components/ui/index.d.ts.map +1 -1
  251. package/dist/components/ui/index.js +278 -8
  252. package/dist/components/ui/simple-markdown-renderer.d.ts.map +1 -1
  253. package/dist/components/ui/square-avatar.d.ts.map +1 -1
  254. package/dist/contexts/chat-runtime-context.d.ts +109 -0
  255. package/dist/contexts/chat-runtime-context.d.ts.map +1 -0
  256. package/dist/contexts/endpoints-runtime-context.d.ts +28 -0
  257. package/dist/contexts/endpoints-runtime-context.d.ts.map +1 -0
  258. package/dist/contexts/index.cjs +30 -0
  259. package/dist/contexts/index.cjs.map +1 -0
  260. package/dist/contexts/index.d.ts +26 -0
  261. package/dist/contexts/index.d.ts.map +1 -0
  262. package/dist/contexts/index.js +30 -0
  263. package/dist/contexts/index.js.map +1 -0
  264. package/dist/contexts/use-outer-or-default.d.ts +29 -0
  265. package/dist/contexts/use-outer-or-default.d.ts.map +1 -0
  266. package/dist/embed-shims/index.cjs +51 -0
  267. package/dist/embed-shims/index.cjs.map +1 -0
  268. package/dist/embed-shims/index.d.ts +31 -0
  269. package/dist/embed-shims/index.d.ts.map +1 -0
  270. package/dist/embed-shims/index.js +51 -0
  271. package/dist/embed-shims/index.js.map +1 -0
  272. package/dist/embed-shims/next-dynamic.cjs +12 -0
  273. package/dist/embed-shims/next-dynamic.cjs.map +1 -0
  274. package/dist/embed-shims/next-dynamic.d.ts +47 -0
  275. package/dist/embed-shims/next-dynamic.d.ts.map +1 -0
  276. package/dist/embed-shims/next-dynamic.js +12 -0
  277. package/dist/embed-shims/next-dynamic.js.map +1 -0
  278. package/dist/embed-shims/next-image.cjs +12 -0
  279. package/dist/embed-shims/next-image.cjs.map +1 -0
  280. package/dist/embed-shims/next-image.d.ts +28 -0
  281. package/dist/embed-shims/next-image.d.ts.map +1 -0
  282. package/dist/embed-shims/next-image.js +12 -0
  283. package/dist/embed-shims/next-image.js.map +1 -0
  284. package/dist/embed-shims/next-link.cjs +14 -0
  285. package/dist/embed-shims/next-link.cjs.map +1 -0
  286. package/dist/embed-shims/next-link.d.ts +22 -0
  287. package/dist/embed-shims/next-link.d.ts.map +1 -0
  288. package/dist/embed-shims/next-link.js +14 -0
  289. package/dist/embed-shims/next-link.js.map +1 -0
  290. package/dist/embed-shims/next-navigation.cjs +30 -0
  291. package/dist/embed-shims/next-navigation.cjs.map +1 -0
  292. package/dist/embed-shims/next-navigation.d.ts +46 -0
  293. package/dist/embed-shims/next-navigation.d.ts.map +1 -0
  294. package/dist/embed-shims/next-navigation.js +30 -0
  295. package/dist/embed-shims/next-navigation.js.map +1 -0
  296. package/dist/hooks/index.cjs +10 -4
  297. package/dist/hooks/index.cjs.map +1 -1
  298. package/dist/hooks/index.d.ts +2 -0
  299. package/dist/hooks/index.d.ts.map +1 -1
  300. package/dist/hooks/index.js +9 -3
  301. package/dist/hooks/use-access-code-integration.d.ts +48 -0
  302. package/dist/hooks/use-access-code-integration.d.ts.map +1 -0
  303. package/dist/hooks/use-contact-submission.d.ts.map +1 -1
  304. package/dist/hooks/use-og-placeholder.d.ts +31 -0
  305. package/dist/hooks/use-og-placeholder.d.ts.map +1 -0
  306. package/dist/hooks/use-toast.d.ts +1 -1
  307. package/dist/index.cjs +367 -7
  308. package/dist/index.cjs.map +1 -1
  309. package/dist/index.js +378 -18
  310. package/dist/types/index.cjs.map +1 -1
  311. package/dist/types/index.js.map +1 -1
  312. package/dist/utils/access-code-client.d.ts +21 -37
  313. package/dist/utils/access-code-client.d.ts.map +1 -1
  314. package/dist/utils/cn.d.ts +0 -27
  315. package/dist/utils/cn.d.ts.map +1 -1
  316. package/dist/utils/color-analysis.d.ts +33 -0
  317. package/dist/utils/color-analysis.d.ts.map +1 -0
  318. package/dist/utils/date-formatters.d.ts +16 -5
  319. package/dist/utils/date-formatters.d.ts.map +1 -1
  320. package/dist/utils/fetch-priority.d.ts +3 -0
  321. package/dist/utils/fetch-priority.d.ts.map +1 -0
  322. package/dist/utils/format.d.ts +192 -1
  323. package/dist/utils/format.d.ts.map +1 -1
  324. package/dist/utils/image-proxy.d.ts +67 -2
  325. package/dist/utils/image-proxy.d.ts.map +1 -1
  326. package/dist/utils/index.cjs +1274 -155
  327. package/dist/utils/index.cjs.map +1 -1
  328. package/dist/utils/index.d.ts +19 -3
  329. package/dist/utils/index.d.ts.map +1 -1
  330. package/dist/utils/index.js +1200 -157
  331. package/dist/utils/index.js.map +1 -1
  332. package/dist/utils/local-storage-adapter.d.ts +46 -0
  333. package/dist/utils/local-storage-adapter.d.ts.map +1 -0
  334. package/dist/utils/source-icons.d.ts +78 -0
  335. package/dist/utils/source-icons.d.ts.map +1 -0
  336. package/package.json +29 -2
  337. package/src/components/announcement-bar.tsx +26 -4
  338. package/src/components/categories-cart.tsx +1 -1
  339. package/src/components/chat/chat-attachment-bar.tsx +323 -0
  340. package/src/components/chat/chat-container.tsx +39 -5
  341. package/src/components/chat/chat-input.tsx +7 -1
  342. package/src/components/chat/chat-message-enhanced.tsx +32 -22
  343. package/src/components/chat/chat-message-list.tsx +53 -4
  344. package/src/components/chat/chat-panel-context.tsx +37 -0
  345. package/src/components/chat/chat-ticket-list.tsx +1 -1
  346. package/src/components/chat/embeddable-chat.tsx +1106 -0
  347. package/src/components/chat/entity-cards/admin-content-card.tsx +155 -0
  348. package/src/components/chat/entity-cards/blog-card.tsx +259 -0
  349. package/src/components/chat/entity-cards/blog-image-placeholder.tsx +52 -0
  350. package/src/components/chat/entity-cards/campaign-card-admin.tsx +113 -0
  351. package/src/components/chat/entity-cards/case-study-card.tsx +192 -0
  352. package/src/components/chat/{chat-ticket-item.tsx → entity-cards/chat-ticket-item.tsx} +2 -2
  353. package/src/components/chat/{chat-video-entity-card.tsx → entity-cards/chat-video-entity-card.tsx} +2 -2
  354. package/src/components/chat/entity-cards/customer-interview-card.tsx +211 -0
  355. package/src/components/chat/entity-cards/data-room-doc-card.tsx +120 -0
  356. package/src/components/chat/entity-cards/dispatch.tsx +1093 -0
  357. package/src/components/chat/entity-cards/entity-author-card.tsx +193 -0
  358. package/src/components/chat/entity-cards/generic-entity-card.tsx +144 -0
  359. package/src/components/chat/entity-cards/github-activity-card.tsx +305 -0
  360. package/src/components/chat/entity-cards/hubspot-ticket-card.tsx +205 -0
  361. package/src/components/chat/entity-cards/index.ts +125 -0
  362. package/src/components/chat/entity-cards/investor-update-card.tsx +150 -0
  363. package/src/components/chat/entity-cards/onboarding-guide-card.tsx +326 -0
  364. package/src/components/chat/entity-cards/product-release-card-defaults.ts +57 -0
  365. package/src/components/chat/entity-cards/product-release-card.tsx +19 -0
  366. package/src/components/chat/entity-cards/program-card-defaults.ts +62 -0
  367. package/src/components/chat/entity-cards/program-card.tsx +451 -0
  368. package/src/components/chat/entity-cards/roadmap-card.tsx +356 -0
  369. package/src/components/chat/entity-cards/roadmap-vote-button.tsx +54 -0
  370. package/src/components/chat/entity-cards/slack-message-card.tsx +182 -0
  371. package/src/components/chat/entity-cards/task-type-icon.tsx +60 -0
  372. package/src/components/chat/hooks/index.ts +22 -0
  373. package/src/components/chat/hooks/use-chat-attachment-image-gallery.tsx +114 -0
  374. package/src/components/chat/hooks/use-chat-attachments.ts +429 -0
  375. package/src/components/chat/hooks/use-chat-card-item.ts +102 -0
  376. package/src/components/chat/hooks/use-chat-identity.ts +139 -0
  377. package/src/components/chat/hooks/use-chat.ts +501 -0
  378. package/src/components/chat/hooks/use-close-on-navigation.ts +87 -0
  379. package/src/components/chat/hooks/use-embedded-chat.ts +1023 -0
  380. package/src/components/chat/hooks/use-proxied-image-url.ts +31 -0
  381. package/src/components/chat/hooks/use-slash-commands.ts +106 -0
  382. package/src/components/chat/hooks/use-sse.ts +143 -0
  383. package/src/components/chat/index.ts +30 -4
  384. package/src/components/chat/nav-link-anchor-via-runtime.tsx +72 -0
  385. package/src/components/chat/source-action-button.tsx +120 -0
  386. package/src/components/chat/types/chat.types.ts +61 -0
  387. package/src/components/chat/types/component.types.ts +57 -11
  388. package/src/components/chat/types/entities/blog.ts +27 -0
  389. package/src/components/chat/types/entities/case-study.ts +14 -0
  390. package/src/components/chat/types/entities/content-ref.ts +23 -0
  391. package/src/components/chat/types/entities/customer-interview.ts +15 -0
  392. package/src/components/chat/types/entities/data-room-doc.ts +37 -0
  393. package/src/components/chat/types/entities/github-activity.ts +36 -0
  394. package/src/components/chat/types/entities/hubspot-ticket.ts +39 -0
  395. package/src/components/chat/types/entities/index.ts +28 -0
  396. package/src/components/chat/types/entities/investor-update.ts +100 -0
  397. package/src/components/chat/types/entities/onboarding-guide.ts +101 -0
  398. package/src/components/chat/types/entities/program-types.ts +433 -0
  399. package/src/components/chat/types/entities/roadmap-item.ts +42 -0
  400. package/src/components/chat/types/entities/slack-message.ts +28 -0
  401. package/src/components/chat/types/index.ts +1 -0
  402. package/src/components/chat/utils/agent-status-message.ts +52 -0
  403. package/src/components/chat/utils/auto-continuation-directive.ts +70 -0
  404. package/src/components/chat/utils/chat-attachment-markdown.ts +190 -0
  405. package/src/components/chat/utils/chat-authed-fetch.ts +73 -0
  406. package/src/components/chat/utils/chat-nav-resolution.ts +151 -0
  407. package/src/components/chat/utils/chat-proxy-auth-storage.ts +148 -0
  408. package/src/components/chat/utils/chip-action-class.ts +19 -0
  409. package/src/components/chat/utils/chip-styles.ts +51 -0
  410. package/src/components/chat/utils/clickup-task-type-utils.ts +59 -0
  411. package/src/components/chat/utils/compact-card-classes.ts +97 -0
  412. package/src/components/chat/utils/decide-new-tab.ts +57 -0
  413. package/src/components/chat/utils/external-app-urls.ts +19 -0
  414. package/src/components/chat/utils/flatten-assistant-content.ts +35 -0
  415. package/src/components/chat/utils/icon-registry.ts +297 -0
  416. package/src/components/chat/utils/index.ts +133 -0
  417. package/src/components/chat/utils/is-cross-origin-url.ts +28 -0
  418. package/src/components/chat/utils/nav-anchor-props.ts +78 -0
  419. package/src/components/chat/utils/nav-click-handler.ts +81 -0
  420. package/src/components/chat/utils/scroll-anchor.ts +35 -0
  421. package/src/components/chat/utils/slash-dispatch-utils.ts +183 -0
  422. package/src/components/chat/utils/source-icons.ts +14 -0
  423. package/src/components/chat/utils/source-row-cta.ts +215 -0
  424. package/src/components/empty-state.tsx +1 -1
  425. package/src/components/features/board/ticket-card.tsx +1 -1
  426. package/src/components/features/figma-prototype-viewer.tsx +2 -1
  427. package/src/components/features/media-gallery-manager.tsx +1 -1
  428. package/src/components/features/parallax-image-showcase.tsx +1 -1
  429. package/src/components/features/release-media-manager.tsx +1 -1
  430. package/src/components/features/seo-editor-preview.tsx +1 -1
  431. package/src/components/features/video.tsx +54 -3
  432. package/src/components/footer-waitlist-button.tsx +1 -1
  433. package/src/components/navigation/header.tsx +1 -1
  434. package/src/components/shared/onboarding/onboarding-step-card.tsx +1 -1
  435. package/src/components/shared/product-release/product-release-card-skeleton.tsx +8 -44
  436. package/src/components/shared/product-release/product-release-card.tsx +31 -116
  437. package/src/components/shared/product-release/release-detail-page.tsx +12 -16
  438. package/src/components/ui/actions-menu.tsx +1 -1
  439. package/src/components/ui/button/button.tsx +41 -11
  440. package/src/components/ui/button/split-button.tsx +1 -1
  441. package/src/components/ui/dashboard-info-card.tsx +2 -3
  442. package/src/components/ui/data-table/data-table-row.tsx +1 -1
  443. package/src/components/ui/entity-image.tsx +2 -8
  444. package/src/components/ui/hover-dropdown.tsx +258 -0
  445. package/src/components/ui/image-gallery-modal.tsx +1 -1
  446. package/src/components/ui/index.ts +1 -0
  447. package/src/components/ui/markdown-editor.tsx +1 -1
  448. package/src/components/ui/more-actions-menu.tsx +1 -1
  449. package/src/components/ui/organization-card.tsx +1 -1
  450. package/src/components/ui/simple-markdown-renderer.tsx +53 -5
  451. package/src/components/ui/square-avatar.tsx +3 -12
  452. package/src/components/ui/tab-navigation.tsx +1 -1
  453. package/src/components/ui/table/table-row.tsx +1 -1
  454. package/src/components/unified-filter-logic.tsx +1 -1
  455. package/src/components/unified-pagination.tsx +1 -1
  456. package/src/components/user-summary-stub.tsx +1 -1
  457. package/src/components/vendor-display-button.tsx +1 -1
  458. package/src/components/vendor-icon.tsx +1 -1
  459. package/src/contexts/chat-runtime-context.tsx +163 -0
  460. package/src/contexts/endpoints-runtime-context.tsx +68 -0
  461. package/src/contexts/index.ts +38 -0
  462. package/src/contexts/use-outer-or-default.ts +42 -0
  463. package/src/embed-shims/index.ts +42 -0
  464. package/src/embed-shims/next-dynamic.tsx +70 -0
  465. package/src/embed-shims/next-image.tsx +114 -0
  466. package/src/embed-shims/next-link.tsx +91 -0
  467. package/src/embed-shims/next-navigation.tsx +201 -0
  468. package/src/hooks/index.ts +9 -0
  469. package/src/hooks/state/use-api-params.ts +1 -1
  470. package/src/hooks/state/use-query-params.ts +1 -1
  471. package/src/hooks/use-access-code-integration.ts +107 -0
  472. package/src/hooks/use-contact-submission.ts +7 -3
  473. package/src/hooks/use-og-placeholder.ts +45 -0
  474. package/src/stories/OnboardingStepCard.stories.tsx +140 -0
  475. package/src/styles/chat-animations.css +65 -0
  476. package/src/styles/index.css +1 -0
  477. package/src/utils/access-code-client.ts +32 -75
  478. package/src/utils/cn.ts +0 -65
  479. package/src/utils/color-analysis.ts +205 -0
  480. package/src/utils/date-formatters.ts +54 -11
  481. package/src/utils/fetch-priority.ts +41 -0
  482. package/src/utils/format.ts +525 -1
  483. package/src/utils/image-proxy.ts +127 -7
  484. package/src/utils/index.ts +145 -5
  485. package/src/utils/local-storage-adapter.ts +105 -0
  486. package/src/utils/source-icons.ts +219 -0
  487. package/dist/chunk-25LVV26X.cjs.map +0 -1
  488. package/dist/chunk-ARQ4XP64.cjs.map +0 -1
  489. package/dist/chunk-CPXLQ57U.js.map +0 -1
  490. package/dist/chunk-LY34ORX6.js.map +0 -1
  491. package/dist/chunk-RMB5DVED.cjs.map +0 -1
  492. package/dist/chunk-SZPJ5R5B.js.map +0 -1
  493. package/dist/chunk-UC43NICZ.cjs.map +0 -1
  494. package/dist/chunk-XGL5FKIK.js.map +0 -1
  495. package/dist/components/chat/block-card.d.ts.map +0 -1
  496. package/dist/components/chat/chat-ticket-item.d.ts.map +0 -1
  497. package/dist/components/chat/chat-video-entity-card.d.ts.map +0 -1
  498. package/dist/utils/dynamic-icons.d.ts +0 -26
  499. package/dist/utils/dynamic-icons.d.ts.map +0 -1
  500. package/dist/utils/format-relative-time.d.ts +0 -21
  501. package/dist/utils/format-relative-time.d.ts.map +0 -1
  502. package/src/utils/.dynamic-icons.md +0 -30
  503. package/src/utils/.format-relative-time.md +0 -36
  504. package/src/utils/dynamic-icons.tsx +0 -120
  505. package/src/utils/format-relative-time.ts +0 -52
  506. /package/dist/{chunk-N57KWHDB.js.map → chunk-CIPO6DXK.js.map} +0 -0
  507. /package/dist/components/chat/{block-card.d.ts → entity-cards/block-card.d.ts} +0 -0
  508. /package/dist/components/chat/{chat-ticket-item.d.ts → entity-cards/chat-ticket-item.d.ts} +0 -0
  509. /package/src/components/chat/{block-card.tsx → entity-cards/block-card.tsx} +0 -0
@@ -0,0 +1,258 @@
1
+ 'use client'
2
+
3
+ import React, { useState, useRef, useCallback } from 'react'
4
+
5
+ // =============================================================================
6
+ // Types
7
+ // =============================================================================
8
+
9
+ export interface HoverDropdownItem {
10
+ label: string
11
+ icon?: React.ReactNode
12
+ href?: string
13
+ /**
14
+ * Target platform for the row's link — threaded through to the caller's
15
+ * `renderAnchor` slot, which decides how to route (same tab vs new tab,
16
+ * embed-aware open, etc.). Plain UI dropdown — no internal click rule.
17
+ */
18
+ targetPlatform?: string | null
19
+ /**
20
+ * In-app doc-tree path for `markdown` / `data_room_doc` refs. Threaded
21
+ * through to the caller's `renderAnchor` so chat consumers can wire it
22
+ * into `handleChatNavClick` and trigger an in-page doc-tree swap
23
+ * (parity with source chips and inline cards).
24
+ */
25
+ path?: string | null
26
+ /**
27
+ * @deprecated Pass `targetPlatform` to the consumer's `renderAnchor` and
28
+ * let it decide. Kept on the item shape for caller-side decisions but
29
+ * unused by this component.
30
+ */
31
+ alwaysNewTab?: boolean
32
+ onClick?: () => void
33
+ /** Optional secondary action rendered as a small icon-button at the
34
+ * right edge of the row. Independent of the row's primary click target
35
+ * — clicking the secondary button does NOT navigate. */
36
+ secondaryAction?: {
37
+ icon: React.ReactNode
38
+ label: string
39
+ onClick: () => void
40
+ }
41
+ }
42
+
43
+ export interface HoverDropdownRenderAnchorArgs {
44
+ href: string
45
+ targetPlatform?: string | null
46
+ /** In-app doc-tree path — chat consumers forward to `handleChatNavClick`
47
+ * for doc-tree swap parity with chips + inline cards. */
48
+ path?: string | null
49
+ alwaysNewTab?: boolean
50
+ className: string
51
+ children: React.ReactNode
52
+ }
53
+
54
+ interface HoverDropdownProps {
55
+ /** The trigger element — dropdown appears on hover */
56
+ children: React.ReactNode
57
+ /** Items to show in the dropdown */
58
+ items: HoverDropdownItem[]
59
+ /** Dropdown position relative to trigger (default: 'top') */
60
+ side?: 'top' | 'bottom'
61
+ /** Delay in ms before hiding on mouse leave (default: 200) */
62
+ hideDelay?: number
63
+ /** Additional className for the dropdown container */
64
+ className?: string
65
+ /**
66
+ * Optional anchor renderer for rows that have an `href`. Chat consumers
67
+ * supply a `<NavLinkAnchorViaRuntime>`-backed renderer so clicks route
68
+ * through the chat runtime; non-chat consumers can skip this and rely
69
+ * on the default plain `<a>`.
70
+ */
71
+ renderAnchor?: (args: HoverDropdownRenderAnchorArgs) => React.ReactNode
72
+ }
73
+
74
+ // =============================================================================
75
+ // Component
76
+ // =============================================================================
77
+
78
+ /**
79
+ * Generic hover dropdown — shows a list of clickable items on hover.
80
+ *
81
+ * Uses fixed positioning with getBoundingClientRect for proper placement
82
+ * inside containers with overflow hidden (e.g., Sheet, modals).
83
+ *
84
+ * Usage:
85
+ * <HoverDropdown items={[{ label: 'Blog Post', href: '/blog/1' }]}>
86
+ * <span>Blog Posts (5)</span>
87
+ * </HoverDropdown>
88
+ */
89
+ function DefaultAnchor({
90
+ href,
91
+ className,
92
+ children,
93
+ }: HoverDropdownRenderAnchorArgs) {
94
+ return (
95
+ <a href={href} className={className}>
96
+ {children}
97
+ </a>
98
+ )
99
+ }
100
+
101
+ export function HoverDropdown({
102
+ children,
103
+ items,
104
+ side = 'top',
105
+ hideDelay = 200,
106
+ className,
107
+ renderAnchor,
108
+ }: HoverDropdownProps) {
109
+ const [open, setOpen] = useState(false)
110
+ const timeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined)
111
+ const containerRef = useRef<HTMLDivElement>(null)
112
+
113
+ const show = useCallback(() => {
114
+ clearTimeout(timeoutRef.current)
115
+ setOpen(true)
116
+ }, [])
117
+
118
+ const hide = useCallback(() => {
119
+ timeoutRef.current = setTimeout(() => setOpen(false), hideDelay)
120
+ }, [hideDelay])
121
+
122
+ if (items.length === 0) return <>{children}</>
123
+
124
+ // Click handler — touch / mobile (no hover) + desktop users who
125
+ // expect clicking a chip to open a menu. Toggles the dropdown state
126
+ // so a second click closes it. `stopPropagation` prevents the click
127
+ // from bubbling to ancestor handlers (the chip's parent message
128
+ // bubble shouldn't react to chip clicks).
129
+ const toggle = useCallback((e: React.MouseEvent) => {
130
+ e.stopPropagation()
131
+ clearTimeout(timeoutRef.current)
132
+ setOpen((prev) => !prev)
133
+ }, [])
134
+
135
+ const renderAnchorFn = renderAnchor ?? DefaultAnchor
136
+
137
+ return (
138
+ <div
139
+ ref={containerRef}
140
+ className="relative inline-flex"
141
+ onMouseEnter={show}
142
+ onMouseLeave={hide}
143
+ onClick={toggle}
144
+ >
145
+ {children}
146
+ {open && (
147
+ <div
148
+ className={`fixed z-[9999] min-w-[220px] max-w-[340px] max-h-[420px] overflow-y-auto rounded-lg bg-ods-card border border-ods-border shadow-xl p-1 ${className || ''}`}
149
+ ref={(el) => {
150
+ if (!el || !containerRef.current) return
151
+ const rect = containerRef.current.getBoundingClientRect()
152
+ const elHeight = el.offsetHeight
153
+ const elWidth = el.offsetWidth
154
+
155
+ // Try to place to the right of the trigger first
156
+ const spaceRight = window.innerWidth - rect.right
157
+ const spaceLeft = rect.left
158
+ const fitsRight = spaceRight >= elWidth + 8
159
+ const fitsLeft = spaceLeft >= elWidth + 8
160
+
161
+ if (fitsRight || (!fitsLeft && spaceRight >= spaceLeft)) {
162
+ // Place to the right
163
+ el.style.left = `${rect.right + 4}px`
164
+ el.style.top = `${Math.min(Math.max(rect.top, 8), window.innerHeight - elHeight - 8)}px`
165
+ } else if (fitsLeft) {
166
+ // Place to the left
167
+ el.style.left = `${rect.left - elWidth - 4}px`
168
+ el.style.top = `${Math.min(Math.max(rect.top, 8), window.innerHeight - elHeight - 8)}px`
169
+ } else {
170
+ // Fallback: place above or below
171
+ const left = Math.min(Math.max(rect.left, 8), window.innerWidth - elWidth - 8)
172
+ el.style.left = `${left}px`
173
+ if (side === 'top' || window.innerHeight - rect.bottom < elHeight + 8) {
174
+ el.style.top = `${Math.max(rect.top - elHeight - 4, 8)}px`
175
+ } else {
176
+ el.style.top = `${rect.bottom + 4}px`
177
+ }
178
+ }
179
+ }}
180
+ >
181
+ {items.map((item, i) => {
182
+ const content = (
183
+ <>
184
+ {item.icon && <span className="flex-shrink-0 [&_svg]:size-3.5">{item.icon}</span>}
185
+ <span className="truncate flex-1 min-w-0">{item.label}</span>
186
+ </>
187
+ )
188
+
189
+ // Each row is a flex container: primary action (link or button)
190
+ // occupies the left expanding region; the optional secondary
191
+ // action ("Ask") sits at the right as a sibling icon-button so
192
+ // its click is independent of the primary navigation.
193
+ const rowClass = 'group flex w-full items-center gap-1.5 pl-2 pr-1 py-1.5 rounded text-[11px] text-ods-text-secondary hover:bg-ods-accent/10 transition-colors text-left'
194
+ const primaryClass = 'flex flex-1 items-center gap-1.5 min-w-0 hover:text-ods-accent cursor-pointer no-underline'
195
+
196
+ const secondary = item.secondaryAction ? (
197
+ <button
198
+ onClick={(e) => {
199
+ e.preventDefault()
200
+ e.stopPropagation()
201
+ item.secondaryAction!.onClick()
202
+ }}
203
+ aria-label={item.secondaryAction.label}
204
+ title={item.secondaryAction.label}
205
+ className="flex-shrink-0 inline-flex items-center justify-center h-5 w-5 rounded text-ods-text-secondary opacity-60 hover:opacity-100 hover:text-ods-text-primary hover:bg-ods-accent/15 transition-opacity [&_svg]:size-3"
206
+ >
207
+ {item.secondaryAction.icon}
208
+ </button>
209
+ ) : null
210
+
211
+ if (item.href) {
212
+ // Caller supplies the anchor renderer (defaults to plain <a>).
213
+ // Chat consumers wire `NavLinkAnchorViaRuntime` here so clicks
214
+ // route through the chat runtime.
215
+ return (
216
+ <div key={i} className={rowClass}>
217
+ {renderAnchorFn({
218
+ href: item.href,
219
+ targetPlatform: item.targetPlatform,
220
+ path: item.path,
221
+ alwaysNewTab: item.alwaysNewTab,
222
+ className: primaryClass,
223
+ children: content,
224
+ })}
225
+ {secondary}
226
+ </div>
227
+ )
228
+ }
229
+
230
+ // Item has no primary action — render the label as a
231
+ // non-interactive span. The secondary Ask button remains
232
+ // active, so the row is still useful for rows that have no
233
+ // public viewer URL but DO have a working Ask drill-in.
234
+ if (!item.onClick) {
235
+ return (
236
+ <div key={i} className={rowClass}>
237
+ <span className={`${primaryClass} cursor-default hover:!text-ods-text-secondary`}>
238
+ {content}
239
+ </span>
240
+ {secondary}
241
+ </div>
242
+ )
243
+ }
244
+
245
+ return (
246
+ <div key={i} className={rowClass}>
247
+ <button onClick={item.onClick} className={primaryClass}>
248
+ {content}
249
+ </button>
250
+ {secondary}
251
+ </div>
252
+ )
253
+ })}
254
+ </div>
255
+ )}
256
+ </div>
257
+ )
258
+ }
@@ -3,7 +3,7 @@
3
3
  import { useState, useEffect } from 'react';
4
4
  import { Modal, Button } from './index';
5
5
  import { ChevronLeft, ChevronRight } from 'lucide-react';
6
- import Image from 'next/image';
6
+ import Image from '../../embed-shims/next-image';
7
7
 
8
8
  interface ImageGalleryModalProps {
9
9
  images: string[];
@@ -54,6 +54,7 @@ export * from './status-indicator'
54
54
  export * from './toaster'
55
55
  // TODO: Add other UI components as they are moved to ui-kit
56
56
  export * from './skeleton'
57
+ export * from './hover-dropdown'
57
58
  // Chat components
58
59
  export * from '../chat'
59
60
  export * from '../layout/list-page-layout'
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
 
3
3
  import React, { useRef, useCallback, useState, useEffect } from "react"
4
- import dynamic from "next/dynamic"
4
+ import dynamic from "../../embed-shims/next-dynamic"
5
5
  import { Loader2, Upload } from "lucide-react"
6
6
  import { cn } from "../../utils/cn"
7
7
 
@@ -1,7 +1,7 @@
1
1
  'use client'
2
2
 
3
3
  import React from 'react'
4
- import Link from 'next/link'
4
+ import Link from '../../embed-shims/next-link'
5
5
  import { cn } from '../../utils/cn'
6
6
  import { Ellipsis01Icon } from '../icons-v2-generated'
7
7
  import { Button } from './button'
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
 
3
3
  import React from "react"
4
- import Link from "next/link"
4
+ import Link from "../../embed-shims/next-link"
5
5
  import { Monitor } from "lucide-react"
6
6
  import { cn } from "../../utils/cn"
7
7
  import { EntityImage } from "./entity-image"
@@ -8,7 +8,7 @@ import remarkBreaks from 'remark-breaks';
8
8
  import rehypeHighlight from 'rehype-highlight';
9
9
  import rehypeRaw from 'rehype-raw';
10
10
  import { visit } from 'unist-util-visit';
11
- import Image from 'next/image';
11
+ import Image from '../../embed-shims/next-image';
12
12
  import { AlertCircleIcon } from '../icons-v2-generated';
13
13
  import { cn } from '../../utils/cn';
14
14
 
@@ -794,16 +794,64 @@ export const SimpleMarkdownRenderer: React.FC<SimpleMarkdownRendererProps> = ({
794
794
  },
795
795
 
796
796
  // --- images ---
797
+ // Inline content image renderer. Used by blog posts, docs, AND chat
798
+ // messages (where users may attach screenshots / photos via the +
799
+ // attachment button).
800
+ //
801
+ // Sizing rules (2025-2026 best practice — Claude.ai, ChatGPT,
802
+ // iMessage, Slack, Discord inline image patterns):
803
+ //
804
+ // - CAP max-width at 400px so inline images don't blow out the
805
+ // message column on wide panels. Click-to-expand opens a
806
+ // full-resolution modal for users who need detail.
807
+ // - CAP max-height at 400px so portrait-orientation images
808
+ // don't dominate vertical space (a 1000x3000 phone screenshot
809
+ // would otherwise push the next message off-screen).
810
+ // - Small images render at NATURAL pixel size — a 64x64
811
+ // thumbnail stays 64x64, not stretched to fill the column.
812
+ // - `object-contain` preserves aspect ratio when both dimensions
813
+ // are constrained (long landscape, tall portrait).
814
+ //
815
+ // Implementation: Next.js `<Image>` — the project's canonical
816
+ // image primitive. Gives us:
817
+ // - WebP/AVIF format conversion for modern browsers (smaller
818
+ // bytes for the same visual quality).
819
+ // - Responsive `srcset` via the `sizes` prop (browser picks the
820
+ // right variant for the viewport).
821
+ // - Automatic lazy-loading (`loading="lazy"` by default, mid-
822
+ // page images skipped until they near the viewport).
823
+ // - Automatic `decoding="async"` so image decode doesn't block
824
+ // paint.
825
+ //
826
+ // `width={400} height={400}` props are REQUIRED by Next.js
827
+ // `<Image>` (non-`fill` mode throws without them) but they're
828
+ // effectively a CEILING here, not the display size — the CSS
829
+ // overrides (`w-auto h-auto max-w-full max-h-[400px]`) drive
830
+ // the actual rendered size. The inline `style={{ width: 'auto',
831
+ // height: 'auto' }}` is belt-and-suspenders: Next.js Image sets
832
+ // matching HTML `width`/`height` attributes on the rendered
833
+ // `<img>` and inline style wins over both HTML attributes AND
834
+ // utility classes regardless of CSS-specificity surprises.
835
+ //
836
+ // Layout reservation trade-off: until image bytes arrive, the
837
+ // browser may reserve a placeholder box up to 400x400 (the props'
838
+ // intrinsic-ratio hint). Once loaded, the box collapses to the
839
+ // natural size if smaller. This is the standard Next.js Image
840
+ // behavior across the codebase — accepted for the optimizer +
841
+ // responsive-srcset benefits. Chat attachments hosted in side
842
+ // panels see this only on first render of a fresh attachment
843
+ // (cached re-renders pop in without a perceptible shift).
797
844
  img: ({ src, alt }: any) => {
798
845
  if (!src || typeof src !== 'string' || src.trim() === '') return null;
799
846
  return (
800
847
  <Image
801
848
  src={src}
802
849
  alt={alt ?? 'No image available'}
803
- width={896}
804
- height={200}
805
- sizes="(max-width: 896px) 100vw, 896px"
806
- className="max-w-full h-auto rounded-lg"
850
+ width={400}
851
+ height={400}
852
+ sizes="(max-width: 400px) 100vw, 400px"
853
+ className="max-w-full max-h-[400px] w-auto h-auto rounded-lg object-contain"
854
+ style={{ width: 'auto', height: 'auto' }}
807
855
  />
808
856
  );
809
857
  },
@@ -1,18 +1,9 @@
1
1
  "use client"
2
2
 
3
3
  import * as React from "react";
4
- import Image from "next/image";
4
+ import Image from "../../embed-shims/next-image";
5
5
  import { cn } from "../../utils/cn";
6
-
7
- // Extract initials from a name (first letter of first and last word)
8
- const getInitials = (name?: string): string => {
9
- if (!name) return '';
10
- const words = name.trim().split(/\s+/);
11
- if (words.length === 1) {
12
- return words[0].charAt(0).toUpperCase();
13
- }
14
- return (words[0].charAt(0) + words[words.length - 1].charAt(0)).toUpperCase();
15
- };
6
+ import { getFirstLastInitials } from "../../utils/format";
16
7
 
17
8
  interface SquareAvatarProps extends React.HTMLAttributes<HTMLDivElement> {
18
9
  src?: string;
@@ -58,7 +49,7 @@ const SquareAvatar = React.memo(React.forwardRef<HTMLDivElement, SquareAvatarPro
58
49
  'flex items-center justify-center text-xs font-medium text-ods-text-secondary',
59
50
  src && 'hidden'
60
51
  )}>
61
- {getInitials(fallback || alt) || '?'}
52
+ {getFirstLastInitials(fallback || alt) || '?'}
62
53
  </div>
63
54
  {src && (
64
55
  <Image
@@ -1,7 +1,7 @@
1
1
  'use client'
2
2
 
3
3
  import React, { useState, useEffect, useMemo, useRef, useCallback } from 'react'
4
- import { useSearchParams, useRouter, usePathname } from 'next/navigation'
4
+ import { useSearchParams, useRouter, usePathname } from '../../embed-shims/next-navigation'
5
5
  import { cn } from '../../utils/cn'
6
6
 
7
7
  export interface TabItem {
@@ -1,6 +1,6 @@
1
1
  'use client'
2
2
 
3
- import Link from 'next/link'
3
+ import Link from '../../../embed-shims/next-link'
4
4
  import React from 'react'
5
5
  import { cn } from '../../../utils/cn'
6
6
  import { Checkbox } from '../checkbox'
@@ -1,6 +1,6 @@
1
1
  "use client"
2
2
 
3
- import { useSearchParams, useRouter } from "next/navigation"
3
+ import { useSearchParams, useRouter } from "../embed-shims/next-navigation"
4
4
  import { useTransition } from "react"
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  "use client"
2
2
 
3
- import { useRouter, useSearchParams, usePathname } from "next/navigation"
3
+ import { useRouter, useSearchParams, usePathname } from "../embed-shims/next-navigation"
4
4
  import { Pagination } from "./pagination"
5
5
 
6
6
  interface UnifiedPaginationProps {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import Image from "next/image";
3
+ import Image from "../embed-shims/next-image";
4
4
  import { getProxiedImageUrl } from "../utils/image-proxy-stub";
5
5
 
6
6
  interface Props {
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { Button } from "./ui/button"
4
4
  import { getVendorLogo, VendorWithMedia } from "../utils/vendor-media-stub"
5
- import Image from "next/image"
5
+ import Image from "../embed-shims/next-image"
6
6
  import { getProxiedImageUrl } from "../utils/image-proxy-stub"
7
7
 
8
8
  interface VendorDisplayButtonProps {
@@ -1,7 +1,7 @@
1
1
  "use client"
2
2
 
3
3
  import React from 'react'
4
- import Image from 'next/image'
4
+ import Image from '../embed-shims/next-image'
5
5
  import { cn } from "../utils/cn"
6
6
  import { getVendorLogo, VendorWithMedia } from '../utils/vendor-media-stub'
7
7
  import { getProxiedImageUrl } from '../utils/image-proxy-stub'
@@ -0,0 +1,163 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * Chat runtime context — single seam for embedding the chat panel in a
5
+ * different host (e.g. user1.openframe.ai reverse-proxying API calls
6
+ * under /api/mingo-guide/* to hub.openframe.ai/api/*).
7
+ *
8
+ * Three concerns, one context:
9
+ * 1. API endpoints: chatStreamUrl / approvalToolUrl / commandsUrl /
10
+ * buildListUrl + attachment endpoints + chat-identity. The chat
11
+ * reads them from runtime; hub vs embedded app supply different
12
+ * strings via different providers.
13
+ * 2. Navigation mode + callbacks: 'host' or 'embed' mode. Host wires
14
+ * its own router/docNav via the optional `navigate` callback
15
+ * (plain function, NOT a hook); embed forces new-tab via
16
+ * `defaultContentOrigin` + lib's `resolveExternalNavigation`.
17
+ * 3. Identity context: only `source` (required for localStorage
18
+ * namespacing). The display identity (greeting first-name etc.)
19
+ * comes from the server via `useChatIdentity()` — never injected
20
+ * client-side, so it always matches the server-resolved auth.
21
+ *
22
+ * Sibling of EndpointsRuntimeContext (announcement bar, contact form,
23
+ * access codes). Each runtime stays an independent React context so
24
+ * embedders can opt into either feature without forcing the other.
25
+ *
26
+ * IMPORTANT for embedders: memoize the value passed to
27
+ * `<ChatRuntimeContext.Provider value={...}>` (e.g. via React.useMemo).
28
+ * Every change to its reference identity invalidates downstream
29
+ * `useMemo` consumers (the chat input's slash-commands binding,
30
+ * useNavLink's embed-resolution memo, useDocChat's streamFn factory).
31
+ * The hub's `<HubRuntimeProvider>` already memoizes correctly with
32
+ * stable deps. Embedded apps that build the value inline on each render
33
+ * will pay an avoidable re-render cost across the entire chat tree.
34
+ */
35
+
36
+ import { createContext, useContext, type ReactNode } from 'react'
37
+
38
+ /**
39
+ * Runtime config consumed by the chat panel.
40
+ */
41
+ export interface ChatRuntime {
42
+ endpoints: {
43
+ /** POST streaming chat. Hub: '/api/docs/chat'. */
44
+ chatStreamUrl: string
45
+ /** POST agent approve/reject. Hub: '/api/chat/agent/confirm-tool'. */
46
+ approvalToolUrl: string
47
+ /** GET slash-command catalog. Hub: '/api/docs/commands'. */
48
+ commandsUrl: string
49
+ /** Build entity-card list URL for a content type + ids. Hub delegates
50
+ * to the rag-table-config registry; embedded app provides its own
51
+ * per-type URL builder against the reverse proxy. Returns null when
52
+ * the type has no list endpoint (caller skips rendering). */
53
+ buildListUrl: (type: string, ids: string[]) => string | null
54
+ /** Chat-attachment endpoints — added for the v2 attachment feature.
55
+ *
56
+ * Three concerns:
57
+ * - `attachmentUploadUrl` — POSTed by the chat-attachment hook
58
+ * to mint a Supabase signed-upload-URL + HMAC view token.
59
+ * - `attachmentViewUrlPrefix` — embedded in markdown URLs the
60
+ * chat hosts in user message bubbles (`![]()` / `[Attached]`).
61
+ * Stored in chat history; chosen at SEND time. In host mode the
62
+ * relative `/api/storage/view/chat-attachments/` is sufficient
63
+ * (same-origin); embedders supply an absolute hub URL so the
64
+ * browser can fetch cross-origin.
65
+ * - `chatIdentityUrl` — GET endpoint the `useChatIdentity` hook
66
+ * hits to learn the `{authTier, source, attachmentsEnabled}`
67
+ * capability bag for the current session. */
68
+ attachmentUploadUrl: string
69
+ attachmentViewUrlPrefix: string
70
+ chatIdentityUrl: string
71
+ /** Optional URL prefix for the image proxy (`<prefix>?url=<external>`).
72
+ * When unset, lib's `getProxiedImageUrl` returns the original URL
73
+ * unchanged. Hub default: '/api/image-proxy'. Embedders that don't
74
+ * host an image-proxy route leave this undefined → images load
75
+ * directly cross-origin (CORS-permitting). */
76
+ imageProxyUrlPrefix?: string
77
+ /** Optional list of hostnames that should bypass the image proxy
78
+ * (rendered direct). Hub uses ['openmsp.ai']; embedders typically
79
+ * leave it unset. Matches the `skipDomains` parameter of
80
+ * `getProxiedImageUrl`. */
81
+ imageProxySkipDomains?: string[]
82
+ }
83
+ navigation: {
84
+ /** ONE knob, two behaviors:
85
+ * - 'host' = use the host page's existing click-routing untouched.
86
+ * The chat panel calls `navigate?.()` for in-app routing.
87
+ * - 'embed' = guest inside another app: short-circuit at the top
88
+ * of click handlers to force new-tab + absolutize via
89
+ * resolveExternalNavigation. */
90
+ mode: 'host' | 'embed'
91
+ /** Embed-only fallback origin for relative URLs whose target platform
92
+ * can't be inferred. Used by resolveExternalNavigation when
93
+ * `targetPlatform` is null — without this, a relative `/foo` href would
94
+ * window.open against the embedder's origin, which is WRONG.
95
+ * Set to your content host (e.g. 'https://hub.openframe.ai').
96
+ * Required by the embedded app whenever mode='embed'. */
97
+ defaultContentOrigin?: string
98
+ /** Override for opening external URLs. MUST BE SYNCHRONOUS —
99
+ * Safari/Firefox block popups opened outside a direct user gesture.
100
+ * Default: window.open(href, '_blank', 'noopener,noreferrer'). */
101
+ openExternal?: (href: string) => void
102
+ /** Optional in-app navigation callback (host-mode only).
103
+ * Returns `true` if the host handled the click in-app
104
+ * (router.push + docNav.navigate); returns `false`, `undefined`,
105
+ * or `void` → lib falls back to window.location.assign(href).
106
+ * Hub wires this via HubRuntimeProvider's HubNavigationWiring;
107
+ * embedders not in Next.js leave it undefined. */
108
+ navigate?: (input: { href: string; path?: string | null; targetPlatform?: string | null }) => boolean | void
109
+ /** Optional new-tab decision callback. Returns true → lib opens in
110
+ * new tab; false → same tab via `navigate`. Hub wires the existing
111
+ * `decideNewTab` logic from use-nav-link.tsx (re-imports the pure
112
+ * helper from lib). Embedders may omit; lib defaults to:
113
+ * same-origin/same-platform → same tab, else new tab. */
114
+ decideNewTab?: (args: { href: string; targetPlatform?: string | null }) => boolean
115
+ }
116
+ /** Chat source identifier — REQUIRED. Used for localStorage
117
+ * namespacing (`mingo-chat-<source>-v1`). Hub sets via
118
+ * `currentPlatform()`; embedders set explicitly.
119
+ * `useEmbeddedChat()` throws if source is empty/missing. */
120
+ source: string
121
+ // NOTE: No `user` field. The chat's display identity (greeting
122
+ // first-name, etc.) comes from the SERVER-resolved auth via
123
+ // `useChatIdentity()` — the same identity the server uses to
124
+ // authorize requests. Letting embedders pass a client-side `user`
125
+ // would let it desync from the actual auth tier, causing greetings
126
+ // like "Hey Bob" while the server treats the session as
127
+ // alice@example.com. Single source of truth: the server.
128
+ }
129
+
130
+ export const ChatRuntimeContext = createContext<ChatRuntime | null>(null)
131
+
132
+ /**
133
+ * Returns the active runtime, or null when no provider is mounted.
134
+ * NULL is a first-class value — it signals "no chat runtime configured."
135
+ * Optional consumers fall back to no-op behavior; strict consumers
136
+ * use `useRequiredChatRuntime` (below).
137
+ */
138
+ export function useChatRuntime(): ChatRuntime | null {
139
+ return useContext(ChatRuntimeContext)
140
+ }
141
+
142
+ /**
143
+ * Strict variant used INSIDE the chat panel. Throws if no provider.
144
+ * The hub guarantees one exists by mounting `<HubRuntimeProvider>` at
145
+ * root; the embedded app mounts its own `<ChatRuntimeContext.Provider>`
146
+ * at the tree root. In Jest / Storybook tests that render chat
147
+ * internals directly, wrap with `<HubRuntimeProvider>` (hub defaults)
148
+ * or supply `<ChatRuntimeContext.Provider value={mockedRuntime}>`.
149
+ */
150
+ export function useRequiredChatRuntime(): ChatRuntime {
151
+ const v = useContext(ChatRuntimeContext)
152
+ if (!v) {
153
+ throw new Error(
154
+ '[chat-runtime] hook called outside a <ChatRuntimeContext.Provider>. ' +
155
+ 'The hub mounts <HubRuntimeProvider> at root — this only fires when ' +
156
+ 'chat internals are rendered above the provider tree. ' +
157
+ 'Fix: ensure the rendering subtree descends from the runtime provider. ' +
158
+ 'In tests/Storybook: wrap with <HubRuntimeProvider> or supply ' +
159
+ 'a <ChatRuntimeContext.Provider value={mockedRuntime}>.',
160
+ )
161
+ }
162
+ return v
163
+ }