@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,192 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * CaseStudyCard (pure presentation). Two densities — `default` (vertical
5
+ * detail) and `sm` (compact horizontal for chat-inline).
6
+ *
7
+ * The card writes NO click logic — callers wrap with their own anchor
8
+ * and pass the resolved detail URL via `href`.
9
+ *
10
+ * Image-fallback chain:
11
+ * `study.featured_image` → `placeholderUrl` (caller passes
12
+ * `useOgPlaceholder(...)`) → `bg-ods-bg`.
13
+ */
14
+
15
+ import React from 'react'
16
+ import Image from '../../../embed-shims/next-image'
17
+ import { Card } from '../../ui/card'
18
+ import { cn } from '../../../utils/cn'
19
+ import type { CaseStudy } from '../../../types/case-study'
20
+ import {
21
+ COMPACT_CARD_IMAGE_SLOT,
22
+ COMPACT_CARD_META_ROW_BOX,
23
+ COMPACT_CARD_OUTER,
24
+ COMPACT_CARD_ROW_FILLER,
25
+ COMPACT_CARD_SKELETON_IMAGE_SLOT,
26
+ COMPACT_CARD_SKELETON_OUTER,
27
+ COMPACT_CARD_SUBTITLE,
28
+ COMPACT_CARD_SUMMARY,
29
+ COMPACT_CARD_TEXT_COL,
30
+ COMPACT_CARD_TITLE,
31
+ COMPACT_CARD_TITLE_ROW,
32
+ } from '../utils/compact-card-classes'
33
+
34
+ const hideOnError = (e: React.SyntheticEvent<HTMLImageElement>) => {
35
+ ;(e.currentTarget as HTMLImageElement).style.display = 'none'
36
+ }
37
+
38
+ export interface CaseStudyCardProps {
39
+ study: CaseStudy
40
+ /** Detail URL resolved by the caller. */
41
+ href: string
42
+ /** When `_blank`, opens in a new tab. Set by chat dispatch via
43
+ * `computeIsNewTab`. Defaults to same-tab. */
44
+ target?: '_blank'
45
+ rel?: 'noopener noreferrer'
46
+ targetPlatform?: string | null
47
+ /** OG placeholder URL, used when `study.featured_image` is missing. */
48
+ placeholderUrl?: string | null
49
+ size?: 'default' | 'sm'
50
+ className?: string
51
+ }
52
+
53
+ export function CaseStudyCardSkeleton({ size = 'default' }: { size?: 'default' | 'sm' }) {
54
+ if (size === 'sm') {
55
+ return (
56
+ <span className={COMPACT_CARD_SKELETON_OUTER}>
57
+ <span className={COMPACT_CARD_SKELETON_IMAGE_SLOT} />
58
+ <span className={COMPACT_CARD_TEXT_COL}>
59
+ <span className={COMPACT_CARD_TITLE_ROW}>
60
+ <span className="h-3.5 w-3/5 rounded bg-ods-bg" />
61
+ </span>
62
+ <span className={COMPACT_CARD_META_ROW_BOX}>
63
+ <span className="h-3 w-1/2 rounded bg-ods-bg/70" />
64
+ </span>
65
+ <span className={COMPACT_CARD_META_ROW_BOX}>
66
+ <span className="h-3 w-11/12 rounded bg-ods-bg/40" />
67
+ </span>
68
+ </span>
69
+ </span>
70
+ )
71
+ }
72
+ return (
73
+ <div className="bg-ods-card border border-ods-border rounded-lg overflow-hidden p-6 flex flex-col gap-6 animate-pulse">
74
+ <div className="h-[200px] w-full rounded-sm bg-ods-bg" />
75
+ <div className="h-[72px] flex flex-col gap-2">
76
+ <div className="h-5 w-3/4 bg-ods-bg rounded" />
77
+ <div className="h-5 w-1/2 bg-ods-bg rounded" />
78
+ </div>
79
+ <div className="h-[60px] flex items-center gap-3">
80
+ <div className="h-12 w-12 rounded-full bg-ods-bg" />
81
+ <div className="flex-1 space-y-2">
82
+ <div className="h-4 w-2/3 bg-ods-bg rounded" />
83
+ <div className="h-3 w-1/2 bg-ods-bg/60 rounded" />
84
+ </div>
85
+ </div>
86
+ </div>
87
+ )
88
+ }
89
+
90
+ export function CaseStudyCard({ study, href, target, rel, placeholderUrl, size = 'default', className }: CaseStudyCardProps) {
91
+ const coverImage = study.featured_image || placeholderUrl || null
92
+
93
+ if (size === 'sm') {
94
+ return (
95
+ <a href={href} target={target} rel={rel} className={cn(COMPACT_CARD_OUTER, className)}>
96
+ <span className={COMPACT_CARD_IMAGE_SLOT}>
97
+ {coverImage ? (
98
+ <img
99
+ src={coverImage}
100
+ alt={`${study.msp?.name || study.title} cover`}
101
+ className="absolute inset-0 block w-full h-full object-contain"
102
+ onError={hideOnError}
103
+ />
104
+ ) : null}
105
+ </span>
106
+ <span className={COMPACT_CARD_TEXT_COL}>
107
+ <span className={COMPACT_CARD_TITLE_ROW}>
108
+ <span className={COMPACT_CARD_TITLE}>{study.title}</span>
109
+ </span>
110
+ <span className={COMPACT_CARD_META_ROW_BOX}>
111
+ <span className={COMPACT_CARD_SUBTITLE}>
112
+ {[study.msp?.name, study.user?.full_name].filter(Boolean).join(' · ') || 'Case study'}
113
+ </span>
114
+ </span>
115
+ <span className={COMPACT_CARD_META_ROW_BOX}>
116
+ <span className={COMPACT_CARD_SUMMARY}>
117
+ {study.summary || COMPACT_CARD_ROW_FILLER}
118
+ </span>
119
+ </span>
120
+ </span>
121
+ </a>
122
+ )
123
+ }
124
+
125
+ return (
126
+ <a href={href} target={target} rel={rel} className={cn('block h-full', className)}>
127
+ <Card className="bg-ods-card border border-ods-border hover:border-ods-accent transition-colors p-6 flex flex-col gap-6 overflow-hidden">
128
+ <div className="relative h-[200px] w-full rounded-sm overflow-hidden bg-ods-bg shrink-0">
129
+ {coverImage && (
130
+ <Image
131
+ src={coverImage}
132
+ alt={study.msp?.name || study.title}
133
+ className="w-full h-full object-cover"
134
+ sizes="(min-width: 1545px) 515px, (min-width: 1280px) 33vw, (min-width: 800px) 50vw, 100vw"
135
+ fill
136
+ unoptimized
137
+ onError={hideOnError}
138
+ />
139
+ )}
140
+ </div>
141
+
142
+ <div className="h-[72px] flex items-center shrink-0">
143
+ <p className="text-h4 text-ods-text-primary line-clamp-3 break-words">{study.title}</p>
144
+ </div>
145
+
146
+ <div className="h-[60px] flex items-center shrink-0">
147
+ <div className="flex items-center gap-3 min-w-0 w-full">
148
+ <div className="relative shrink-0 w-12 h-12">
149
+ {study.user?.avatar_url ? (
150
+ <Image
151
+ src={study.user.avatar_url}
152
+ alt={study.user?.full_name || 'User'}
153
+ className="w-12 h-12 rounded-full object-cover bg-ods-background border border-ods-border"
154
+ width={48}
155
+ height={48}
156
+ unoptimized
157
+ />
158
+ ) : (
159
+ <div className="w-12 h-12 rounded-full bg-ods-background border border-ods-border flex items-center justify-center">
160
+ <span className="text-ods-text-secondary font-medium text-xl">
161
+ {(study.user?.full_name || 'A').charAt(0).toUpperCase()}
162
+ </span>
163
+ </div>
164
+ )}
165
+ {study.msp?.icon_url && (
166
+ <div className="absolute -bottom-1 -right-1 w-6 h-6 rounded-full bg-ods-text-primary ring-1 ring-ods-bg overflow-hidden flex items-center justify-center">
167
+ <Image
168
+ src={study.msp.icon_url}
169
+ alt={study.msp.name || 'MSP'}
170
+ className="w-full h-full object-cover"
171
+ width={24}
172
+ height={24}
173
+ unoptimized
174
+ />
175
+ </div>
176
+ )}
177
+ </div>
178
+ <div className="min-w-0 flex-1">
179
+ <p className="font-['DM_Sans'] text-[16px] leading-[1.3] text-ods-text-primary truncate">
180
+ {study.user?.full_name || 'Anonymous'}
181
+ {study.msp?.name && <span className="text-ods-text-secondary"> • {study.msp.name}</span>}
182
+ </p>
183
+ <p className="font-['DM_Sans'] text-[14px] leading-none text-ods-text-secondary truncate">
184
+ {study.user?.job_title || ' '}
185
+ </p>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </Card>
190
+ </a>
191
+ )
192
+ }
@@ -1,9 +1,9 @@
1
1
  'use client'
2
2
 
3
3
  import * as React from 'react'
4
- import { cn } from '../../utils/cn'
4
+ import { cn } from '../../../utils/cn'
5
5
  import { ChevronRight } from 'lucide-react'
6
- import { TicketStatusTag, resolveTicketStatus } from '../ui/ticket-status-tag'
6
+ import { TicketStatusTag, resolveTicketStatus } from '../../ui/ticket-status-tag'
7
7
 
8
8
  export interface ChatTicketItemData {
9
9
  id: string
@@ -1,8 +1,8 @@
1
1
  "use client"
2
2
 
3
3
  import React from 'react'
4
- import { EntityVideoSection } from '../features/entity-video-section'
5
- import type { ChatRef } from './chat-ref.types'
4
+ import { EntityVideoSection } from '../../features/entity-video-section'
5
+ import type { ChatRef } from '../chat-ref.types'
6
6
 
7
7
  /**
8
8
  * <ChatVideoEntityCard> — chat-side inline render for video-bearing
@@ -0,0 +1,211 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * CustomerInterviewCard (pure presentation). Two densities — `default`
5
+ * and `sm` (compact horizontal for chat-inline).
6
+ *
7
+ * The card writes NO click logic — callers wrap with their own anchor
8
+ * and pass the resolved detail URL via `href`.
9
+ */
10
+
11
+ import React from 'react'
12
+ import { Card } from '../../ui/card'
13
+ import { cn } from '../../../utils/cn'
14
+ import { Video } from 'lucide-react'
15
+ import type { CustomerInterview } from '../../../types/customer-interview'
16
+ import {
17
+ COMPACT_CARD_IMAGE_SLOT,
18
+ COMPACT_CARD_META_ROW_BOX,
19
+ COMPACT_CARD_OUTER,
20
+ COMPACT_CARD_ROW_FILLER,
21
+ COMPACT_CARD_SKELETON_IMAGE_SLOT,
22
+ COMPACT_CARD_SKELETON_OUTER,
23
+ COMPACT_CARD_SUBTITLE,
24
+ COMPACT_CARD_SUMMARY,
25
+ COMPACT_CARD_TEXT_COL,
26
+ COMPACT_CARD_TITLE,
27
+ COMPACT_CARD_TITLE_ROW,
28
+ } from '../utils/compact-card-classes'
29
+
30
+ const hideOnError = (e: React.SyntheticEvent<HTMLImageElement>) => {
31
+ ;(e.currentTarget as HTMLImageElement).style.display = 'none'
32
+ }
33
+
34
+ export interface CustomerInterviewCardProps {
35
+ interview: CustomerInterview
36
+ href: string
37
+ /** When `_blank`, opens in a new tab. Set by chat dispatch via
38
+ * `computeIsNewTab`. Defaults to same-tab. */
39
+ target?: '_blank'
40
+ rel?: 'noopener noreferrer'
41
+ targetPlatform?: string | null
42
+ /** OG placeholder URL fallback when `interview.featured_image` is missing. */
43
+ placeholderUrl?: string | null
44
+ size?: 'default' | 'sm'
45
+ className?: string
46
+ }
47
+
48
+ export function CustomerInterviewCardSkeleton({ size = 'default' }: { size?: 'default' | 'sm' }) {
49
+ if (size === 'sm') {
50
+ return (
51
+ <span className={COMPACT_CARD_SKELETON_OUTER}>
52
+ <span className={COMPACT_CARD_SKELETON_IMAGE_SLOT} />
53
+ <span className={COMPACT_CARD_TEXT_COL}>
54
+ <span className={COMPACT_CARD_TITLE_ROW}>
55
+ <span className="h-3.5 w-3/5 rounded bg-ods-bg" />
56
+ </span>
57
+ <span className={COMPACT_CARD_META_ROW_BOX}>
58
+ <span className="h-3 w-2/5 rounded bg-ods-bg/70" />
59
+ </span>
60
+ <span className={COMPACT_CARD_META_ROW_BOX}>
61
+ <span className="h-3 w-11/12 rounded bg-ods-bg/40" />
62
+ </span>
63
+ </span>
64
+ </span>
65
+ )
66
+ }
67
+ return (
68
+ <div className="bg-ods-card border border-ods-border rounded-lg overflow-hidden p-6 flex flex-col gap-6 animate-pulse">
69
+ <div className="h-[200px] w-full rounded-sm bg-ods-bg" />
70
+ <div className="space-y-2">
71
+ <div className="h-5 w-3/4 bg-ods-bg rounded" />
72
+ <div className="h-5 w-1/2 bg-ods-bg rounded" />
73
+ </div>
74
+ <div className="space-y-2">
75
+ <div className="h-3 w-full bg-ods-bg/60 rounded" />
76
+ <div className="h-3 w-5/6 bg-ods-bg/60 rounded" />
77
+ <div className="h-3 w-4/5 bg-ods-bg/60 rounded" />
78
+ </div>
79
+ <div className="h-[60px] flex items-center gap-3 mt-auto">
80
+ <div className="h-12 w-12 rounded-full bg-ods-bg" />
81
+ <div className="flex-1 space-y-2">
82
+ <div className="h-4 w-2/3 bg-ods-bg rounded" />
83
+ <div className="h-3 w-1/2 bg-ods-bg/60 rounded" />
84
+ </div>
85
+ </div>
86
+ </div>
87
+ )
88
+ }
89
+
90
+ export function CustomerInterviewCard({ interview, href, target, rel, placeholderUrl, size = 'default', className }: CustomerInterviewCardProps) {
91
+ const thumbnailUrl = interview.featured_image || placeholderUrl || null
92
+
93
+ if (size === 'sm') {
94
+ return (
95
+ <a href={href} target={target} rel={rel} className={cn(COMPACT_CARD_OUTER, className)}>
96
+ <span className={COMPACT_CARD_IMAGE_SLOT}>
97
+ {thumbnailUrl ? (
98
+ <img
99
+ src={thumbnailUrl}
100
+ alt={interview.title}
101
+ className="absolute inset-0 block w-full h-full object-contain"
102
+ onError={hideOnError}
103
+ />
104
+ ) : null}
105
+ {interview.main_video_url ? (
106
+ <span className="absolute inset-0 flex items-center justify-center bg-black/30">
107
+ <Video className="h-4 w-4 text-white" />
108
+ </span>
109
+ ) : null}
110
+ </span>
111
+ <span className={COMPACT_CARD_TEXT_COL}>
112
+ <span className={COMPACT_CARD_TITLE_ROW}>
113
+ <span className={COMPACT_CARD_TITLE}>{interview.title}</span>
114
+ </span>
115
+ <span className={COMPACT_CARD_META_ROW_BOX}>
116
+ <span className={COMPACT_CARD_SUBTITLE}>
117
+ {[interview.user?.full_name, interview.msp?.name].filter(Boolean).join(' · ') || 'Customer interview'}
118
+ </span>
119
+ </span>
120
+ <span className={COMPACT_CARD_META_ROW_BOX}>
121
+ <span className={COMPACT_CARD_SUMMARY}>
122
+ {interview.video_summary || COMPACT_CARD_ROW_FILLER}
123
+ </span>
124
+ </span>
125
+ </span>
126
+ </a>
127
+ )
128
+ }
129
+
130
+ return (
131
+ <a href={href} target={target} rel={rel} className={cn('block h-full', className)}>
132
+ <Card className="bg-ods-card border border-ods-border hover:border-ods-accent transition-colors p-6 flex flex-col gap-6 overflow-hidden">
133
+ <div className="h-[200px] w-full rounded-sm overflow-hidden bg-ods-bg shrink-0 relative">
134
+ {thumbnailUrl ? (
135
+ <>
136
+ <img
137
+ src={thumbnailUrl}
138
+ alt={interview.title}
139
+ className="w-full h-full object-cover"
140
+ onError={hideOnError}
141
+ />
142
+ {interview.main_video_url && (
143
+ <div className="absolute inset-0 bg-black/40 flex items-center justify-center">
144
+ <div className="w-16 h-16 rounded-full bg-ods-accent/90 flex items-center justify-center">
145
+ <Video className="w-8 h-8 text-black" />
146
+ </div>
147
+ </div>
148
+ )}
149
+ </>
150
+ ) : (
151
+ <div className="w-full h-full flex items-center justify-center bg-ods-bg">
152
+ <Video className="w-12 h-12 text-ods-text-secondary" />
153
+ </div>
154
+ )}
155
+ </div>
156
+
157
+ <div className="shrink-0">
158
+ <h3 className="font-['DM_Sans'] font-semibold text-[20px] leading-[28px] text-ods-text-primary line-clamp-2 break-words">
159
+ {interview.title}
160
+ </h3>
161
+ </div>
162
+
163
+ {interview.video_summary && (
164
+ <div className="shrink-0">
165
+ <p className="font-['DM_Sans'] text-[14px] leading-[20px] text-ods-text-secondary line-clamp-3">
166
+ {interview.video_summary}
167
+ </p>
168
+ </div>
169
+ )}
170
+
171
+ <div className="h-[60px] flex items-center shrink-0 mt-auto">
172
+ <div className="flex items-center gap-3 min-w-0 w-full">
173
+ <div className="relative shrink-0 w-12 h-12">
174
+ {interview.user?.avatar_url ? (
175
+ <img
176
+ src={interview.user.avatar_url}
177
+ alt={interview.user?.full_name || 'Customer'}
178
+ className="w-12 h-12 rounded-full object-cover bg-ods-background border border-ods-border"
179
+ />
180
+ ) : (
181
+ <div className="w-12 h-12 rounded-full bg-ods-background border border-ods-border flex items-center justify-center">
182
+ <span className="text-ods-text-secondary font-medium text-xl">
183
+ {(interview.user?.full_name || 'A').charAt(0).toUpperCase()}
184
+ </span>
185
+ </div>
186
+ )}
187
+ {interview.msp?.icon_url && (
188
+ <div className="absolute -bottom-1 -right-1 w-6 h-6 rounded-full bg-ods-text-primary ring-1 ring-ods-bg overflow-hidden flex items-center justify-center">
189
+ <img
190
+ src={interview.msp.icon_url}
191
+ alt={interview.msp.name || 'MSP'}
192
+ className="w-full h-full object-cover"
193
+ />
194
+ </div>
195
+ )}
196
+ </div>
197
+ <div className="min-w-0 flex-1">
198
+ <p className="font-['DM_Sans'] text-[16px] leading-[1.3] text-ods-text-primary truncate">
199
+ {interview.user?.full_name || 'Anonymous'}
200
+ {interview.msp?.name && <span className="text-ods-text-secondary"> • {interview.msp.name}</span>}
201
+ </p>
202
+ <p className="font-['DM_Sans'] text-[14px] leading-none text-ods-text-secondary truncate">
203
+ {interview.user?.job_title || ' '}
204
+ </p>
205
+ </div>
206
+ </div>
207
+ </div>
208
+ </Card>
209
+ </a>
210
+ )
211
+ }
@@ -0,0 +1,120 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * Data-room / OpenFrame-docs inline chat card.
5
+ *
6
+ * PURE PRESENTATION. The card receives a pre-composed `<a>` prop bundle
7
+ * (`anchorProps`) plus a pre-resolved badge label — both decisions
8
+ * (URL composition + cross-app routing) are made in the consumer's
9
+ * runtime layer, not inside this card.
10
+ *
11
+ * Renders `[card://data_room_doc:<id>]` and `[card://markdown:<id>]` markers
12
+ * — both use this card because their viewer surface is structurally
13
+ * identical; only the `baseRoute` differs (`/data-room` vs `/knowledge-base`).
14
+ */
15
+
16
+ import React from 'react'
17
+ import { ExternalLink } from 'lucide-react'
18
+ import { StatusBadge } from '../../ui/status-badge'
19
+ import {
20
+ COMPACT_CARD_OUTER,
21
+ COMPACT_CARD_OUTER_STATIC,
22
+ COMPACT_CARD_SKELETON_OUTER,
23
+ COMPACT_CARD_TEXT_COL,
24
+ COMPACT_CARD_TITLE,
25
+ } from '../utils/compact-card-classes'
26
+ import type { DataRoomDocCardItem } from '../types/entities/data-room-doc'
27
+
28
+ export interface DataRoomDocCardAnchorProps {
29
+ href: string
30
+ target?: '_blank'
31
+ rel?: 'noopener noreferrer'
32
+ onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void
33
+ }
34
+
35
+ export interface DataRoomDocCardProps {
36
+ item: DataRoomDocCardItem
37
+ className?: string
38
+ /** Pre-composed badge label. REQUIRED — the consumer resolves
39
+ * `sourceRepo` against its `SOURCE_LABELS_BY_TABLE` registry and
40
+ * passes the result here.
41
+ *
42
+ * Why required (no default): if the badge silently defaulted to a
43
+ * literal like "Data room", a card sourced from openframe-docs (or
44
+ * any other repo) whose `sourceRepo` resolution failed would
45
+ * display the wrong provenance label — a real security signal,
46
+ * because "Data Room" implies private/internal documents to
47
+ * end-users. Forcing the consumer to supply the label means a
48
+ * bug at the resolution step surfaces as a TypeScript error
49
+ * ("badgeText required") instead of a falsely-labeled production
50
+ * card. The hub-side dispatcher already passes
51
+ * `getSourceLabel(sourceRepo)` with a non-null fallback. */
52
+ badgeText: string
53
+ /** Pre-composed `<a>` prop bundle. When provided, the outer renders
54
+ * as `<a {...anchorProps}>`; otherwise the card is non-interactive. */
55
+ anchorProps?: DataRoomDocCardAnchorProps
56
+ }
57
+
58
+ export function DataRoomDocCard({ item, className, badgeText, anchorProps }: DataRoomDocCardProps) {
59
+ const body = (
60
+ <>
61
+ <span className={COMPACT_CARD_TEXT_COL}>
62
+ <span className="flex flex-wrap items-center gap-1.5 min-w-0">
63
+ <span className={`${COMPACT_CARD_TITLE} shrink min-w-0`}>{item.title}</span>
64
+ <StatusBadge text={badgeText} variant="button" colorScheme="cyan" className="shrink-0" />
65
+ </span>
66
+ {item.path ? (
67
+ <span className="flex min-w-0 items-center gap-1 text-[11px] leading-4 text-ods-text-secondary">
68
+ <span className="shrink-0 text-ods-text-secondary/70">Path:</span>
69
+ <span className="min-w-0 truncate font-mono">{item.path}</span>
70
+ </span>
71
+ ) : null}
72
+ {item.preview ? (
73
+ <span className="flex min-w-0">
74
+ <span className="line-clamp-2 whitespace-pre-wrap break-words text-[13px] leading-5 text-ods-text-secondary">
75
+ {item.preview}
76
+ </span>
77
+ </span>
78
+ ) : null}
79
+ </span>
80
+ {anchorProps?.href ? (
81
+ <span className="flex shrink-0 items-center self-start h-5 text-ods-text-secondary">
82
+ <ExternalLink className="w-3.5 h-3.5" />
83
+ </span>
84
+ ) : null}
85
+ </>
86
+ )
87
+ if (!anchorProps) {
88
+ return (
89
+ <span className={`${COMPACT_CARD_OUTER_STATIC} ${className ?? ''}`} aria-label="No link available">
90
+ {body}
91
+ </span>
92
+ )
93
+ }
94
+ return (
95
+ <a {...anchorProps} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
96
+ {body}
97
+ </a>
98
+ )
99
+ }
100
+
101
+ export function DataRoomDocCardSkeleton({ className }: { className?: string }) {
102
+ return (
103
+ <span className={`${COMPACT_CARD_SKELETON_OUTER} ${className ?? ''}`}>
104
+ <span className={COMPACT_CARD_TEXT_COL}>
105
+ <span className="flex items-center gap-1.5 min-w-0">
106
+ <span className="h-3.5 w-2/3 rounded bg-ods-bg" />
107
+ <span className="h-4 w-16 rounded-full bg-ods-bg/60" />
108
+ </span>
109
+ <span className="h-4 w-1/2 rounded bg-ods-bg/60" />
110
+ <span className="flex flex-col gap-0 min-w-0">
111
+ <span className="h-5 w-5/6 rounded bg-ods-bg/60" />
112
+ <span className="h-5 w-3/4 rounded bg-ods-bg/60" />
113
+ </span>
114
+ </span>
115
+ <span className="flex shrink-0 items-center self-start h-5">
116
+ <span className="h-3.5 w-3.5 rounded bg-ods-bg" />
117
+ </span>
118
+ </span>
119
+ )
120
+ }