@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,193 @@
1
+ import { SquareAvatar } from '../../ui/square-avatar'
2
+ import { formatDate, nameInitials } from '../../../utils/format'
3
+
4
+ /**
5
+ * Author + publication metadata, rendered as the SAME 2-or-N-cell grid pattern
6
+ * the release detail page uses.
7
+ *
8
+ * Each cell sits inside a single bordered/rounded container, separated by
9
+ * `border-r` dividers — byte-identical visual contract to the release page.
10
+ *
11
+ * Cell taxonomy:
12
+ * - `<EntityMetadataValueCell>` — top: large value (`text-h4` uppercase),
13
+ * bottom: small label (`DM_Sans` 14px secondary). Used for Type / Status
14
+ * / Date.
15
+ * - `<EntityMetadataAuthorCell>` — `<SquareAvatar>` + name + label. Used
16
+ * for the Author column.
17
+ *
18
+ * `<EntityAuthorCard>` is the convenience composer for the common
19
+ * "Published + Author" pair. Pass `publishedAt` to get both cells; omit it
20
+ * to get just the Author card (single-cell mode used by surfaces with no
21
+ * separate publication-date concept).
22
+ *
23
+ * Renders null when `author` is null/empty unless `renderEmptyAuthor` is set.
24
+ */
25
+ /**
26
+ * Documented empty-author placeholder. Single source for the visual
27
+ * shape of "author cell with no author".
28
+ */
29
+ export const EMPTY_AUTHOR_PLACEHOLDER = {
30
+ full_name: '—',
31
+ avatar_url: null,
32
+ job_title: 'Unknown',
33
+ } as const
34
+
35
+ export interface EntityAuthorCardProps {
36
+ author: {
37
+ full_name: string | null
38
+ avatar_url: string | null
39
+ job_title: string | null
40
+ } | null | undefined
41
+ /** Role label rendered under the name. Defaults to "Author". Override
42
+ * to e.g. "Presenter" / "Contributor" if semantics differ. */
43
+ roleLabel?: string
44
+ /** Optional publication date. When provided, the component renders as a
45
+ * 2-cell grid (Published | Author). When omitted, only the Author cell
46
+ * renders inside the same bordered container. */
47
+ publishedAt?: string | Date | null
48
+ /** Label for the Published cell. Defaults to "Published". */
49
+ publishedLabel?: string
50
+ /**
51
+ * Extra value cells inserted into the metadata grid BEFORE the
52
+ * Published cell. Each item renders as an `<EntityMetadataValueCell>`
53
+ * with a large `text-h4` value and a small `DM_Sans` 14px label.
54
+ *
55
+ * Use for entity-specific labels (e.g. onboarding-guide section/step,
56
+ * webinar host, customer-interview customer). The grid auto-sizes via
57
+ * `grid-cols-N`.
58
+ */
59
+ extraCells?: Array<{ value: string; label: string; uppercase?: boolean }>
60
+ /** When true, render the author cell even when `author?.full_name` is
61
+ * missing — using the `EMPTY_AUTHOR_PLACEHOLDER` shape above. Used by
62
+ * catalog grids that must keep a fixed shape so skeleton alignment
63
+ * holds. Defaults to false. */
64
+ renderEmptyAuthor?: boolean
65
+ className?: string
66
+ }
67
+
68
+
69
+ /**
70
+ * Single value cell — top: large `text-h4` value (uppercase), bottom: small
71
+ * `DM_Sans` 14px secondary label.
72
+ */
73
+ export function EntityMetadataValueCell({
74
+ value,
75
+ label,
76
+ className,
77
+ uppercase = true,
78
+ }: {
79
+ value: string
80
+ label: string
81
+ className?: string
82
+ uppercase?: boolean
83
+ }) {
84
+ return (
85
+ <div className={`bg-ods-card p-4 flex flex-col gap-3 ${className ?? ''}`}>
86
+ <div className="flex flex-col gap-0">
87
+ <p className="text-h4 text-ods-text-primary">
88
+ {uppercase ? value.toLocaleUpperCase() : value}
89
+ </p>
90
+ <p className="font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary">
91
+ {label}
92
+ </p>
93
+ </div>
94
+ </div>
95
+ )
96
+ }
97
+
98
+ /**
99
+ * Author cell — `<SquareAvatar>` + name + role label. The containing border /
100
+ * divider is the caller's responsibility — this is just the cell content.
101
+ */
102
+ export function EntityMetadataAuthorCell({
103
+ author,
104
+ roleLabel = 'Author',
105
+ className,
106
+ }: {
107
+ author: NonNullable<EntityAuthorCardProps['author']>
108
+ roleLabel?: string
109
+ className?: string
110
+ }) {
111
+ const fullName = author.full_name || 'Unknown Author'
112
+ return (
113
+ <div className={`bg-ods-card p-4 flex items-center gap-3 ${className ?? ''}`}>
114
+ <SquareAvatar
115
+ src={author.avatar_url || ''}
116
+ alt={fullName}
117
+ fallback={nameInitials(fullName, '')}
118
+ size="md"
119
+ variant="round"
120
+ />
121
+ <div className="flex flex-col gap-0 flex-1 min-w-0">
122
+ <p className="text-h3 tracking-[-0.36px] text-ods-text-primary truncate">
123
+ {fullName}
124
+ </p>
125
+ <p className="font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary">
126
+ {author.job_title || roleLabel}
127
+ </p>
128
+ </div>
129
+ </div>
130
+ )
131
+ }
132
+
133
+ export function EntityAuthorCard({
134
+ author,
135
+ roleLabel = 'Author',
136
+ publishedAt,
137
+ publishedLabel = 'Published',
138
+ extraCells,
139
+ renderEmptyAuthor = false,
140
+ className,
141
+ }: EntityAuthorCardProps) {
142
+ const hasAuthor = !!author?.full_name
143
+ if (!hasAuthor && !renderEmptyAuthor) return null
144
+ const effectiveAuthor = hasAuthor ? (author as NonNullable<EntityAuthorCardProps['author']>) : EMPTY_AUTHOR_PLACEHOLDER
145
+
146
+ // Resolve the date label. `formatDate` returns "Invalid Date" for
147
+ // unparseable inputs; collapse that to empty so the cell is hidden, not
148
+ // literal text.
149
+ const formatted = publishedAt ? formatDate(publishedAt as Date | string) : ''
150
+ const dateLabel = formatted === 'Invalid Date' ? '' : formatted
151
+
152
+ const showDateCell = !!dateLabel
153
+ const extras = extraCells ?? []
154
+ // Total cell count = extras + (optional Published) + Author. Map to
155
+ // an explicit tailwind `md:grid-cols-N` class string so JIT picks it
156
+ // up at build time.
157
+ const totalCells = extras.length + (showDateCell ? 1 : 0) + 1
158
+ const gridColsClass =
159
+ totalCells >= 4 ? 'md:grid-cols-4'
160
+ : totalCells === 3 ? 'md:grid-cols-3'
161
+ : totalCells === 2 ? 'md:grid-cols-2'
162
+ : 'md:grid-cols-1'
163
+
164
+ // Helper — every cell EXCEPT the last needs the dividers (bottom on
165
+ // mobile, right on desktop). The last cell (Author) closes the grid
166
+ // without a trailing divider so the rounded corner stays clean.
167
+ const dividerClass = 'border-b md:border-b-0 md:border-r border-ods-border'
168
+
169
+ return (
170
+ <div
171
+ className={`grid grid-cols-1 ${gridColsClass} border border-ods-border rounded-md overflow-hidden w-full ${className ?? ''}`}
172
+ >
173
+ {extras.map((cell, i) => (
174
+ <EntityMetadataValueCell
175
+ key={`${cell.label}-${i}`}
176
+ value={cell.value}
177
+ label={cell.label}
178
+ uppercase={cell.uppercase ?? true}
179
+ className={dividerClass}
180
+ />
181
+ ))}
182
+ {showDateCell && (
183
+ <EntityMetadataValueCell
184
+ value={dateLabel}
185
+ label={publishedLabel}
186
+ uppercase={false}
187
+ className={dividerClass}
188
+ />
189
+ )}
190
+ <EntityMetadataAuthorCell author={effectiveAuthor} roleLabel={roleLabel} />
191
+ </div>
192
+ )
193
+ }
@@ -0,0 +1,144 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * Generic compact entity/document card for any chat type that doesn't
5
+ * warrant a bespoke component.
6
+ *
7
+ * PURE PRESENTATION. Receives pre-composed `<a>` props via `anchorProps`
8
+ * and renders the rest from the item shape.
9
+ */
10
+
11
+ import React from 'react'
12
+ import { ExternalLink } from 'lucide-react'
13
+ import { StatusBadge } from '../../ui/status-badge'
14
+ import {
15
+ COMPACT_CARD_META_ROW,
16
+ COMPACT_CARD_META_ROW_BOX,
17
+ COMPACT_CARD_OUTER,
18
+ COMPACT_CARD_OUTER_STATIC,
19
+ COMPACT_CARD_SKELETON_OUTER,
20
+ COMPACT_CARD_TEXT_COL,
21
+ COMPACT_CARD_TITLE,
22
+ safeHref,
23
+ } from '../utils/compact-card-classes'
24
+ import { formatDateUTC as formatDate } from '../../../utils/format'
25
+
26
+ type BadgeScheme = 'success' | 'error' | 'warning' | 'cyan' | 'default'
27
+
28
+ export interface GenericEntityCardItem {
29
+ id: string
30
+ title: string
31
+ preview?: string | null
32
+ url?: string | null
33
+ subtitle?: string | null
34
+ badge?: { text: string; scheme?: BadgeScheme } | null
35
+ facts?: Array<{ label: string; value: string }> | null
36
+ dateUpdated?: string | number | null
37
+ }
38
+
39
+ export interface GenericEntityCardAnchorProps {
40
+ href: string
41
+ target?: '_blank'
42
+ rel?: 'noopener noreferrer'
43
+ onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void
44
+ }
45
+
46
+ export interface GenericEntityCardProps {
47
+ item: GenericEntityCardItem
48
+ className?: string
49
+ anchorProps?: GenericEntityCardAnchorProps
50
+ }
51
+
52
+ export function GenericEntityCard({ item, className, anchorProps }: GenericEntityCardProps) {
53
+ const href = safeHref(item.url)
54
+ const dateText = formatDate(item.dateUpdated, { fallback: '', timezone: 'local' })
55
+ const body = (
56
+ <>
57
+ <span className={COMPACT_CARD_TEXT_COL}>
58
+ <span className="flex flex-wrap items-center gap-1.5 min-w-0">
59
+ <span className={`${COMPACT_CARD_TITLE} shrink min-w-0`}>{item.title}</span>
60
+ {item.badge ? (
61
+ <StatusBadge
62
+ text={item.badge.text}
63
+ variant="button"
64
+ colorScheme={item.badge.scheme || 'default'}
65
+ className="shrink-0"
66
+ />
67
+ ) : null}
68
+ </span>
69
+ {item.subtitle ? (
70
+ <span className="flex min-w-0 items-center gap-1 text-[11px] leading-4 text-ods-text-secondary">
71
+ <span className="min-w-0 truncate font-mono">{item.subtitle}</span>
72
+ </span>
73
+ ) : null}
74
+ {item.preview ? (
75
+ <span className="flex min-w-0">
76
+ <span className="line-clamp-2 whitespace-pre-wrap break-words text-[13px] leading-5 text-ods-text-secondary">
77
+ {item.preview}
78
+ </span>
79
+ </span>
80
+ ) : null}
81
+ {item.facts && item.facts.length > 0 ? (
82
+ <span className="flex flex-wrap items-center gap-x-3 gap-y-0.5 min-w-0 text-[11px] leading-4">
83
+ {item.facts.map((f, i) => (
84
+ <span key={i} className="inline-flex items-center gap-1 min-w-0 truncate">
85
+ <span className="text-ods-text-secondary/70 shrink-0">{f.label}:</span>
86
+ <span className="text-ods-text-primary font-medium truncate">{f.value}</span>
87
+ </span>
88
+ ))}
89
+ </span>
90
+ ) : null}
91
+ {dateText ? (
92
+ <span className={COMPACT_CARD_META_ROW_BOX}>
93
+ <span className={COMPACT_CARD_META_ROW}>
94
+ <span className="whitespace-nowrap">{dateText}</span>
95
+ </span>
96
+ </span>
97
+ ) : null}
98
+ </span>
99
+ {href ? (
100
+ <span className="flex shrink-0 items-center self-start h-5 text-ods-text-secondary">
101
+ <ExternalLink className="w-3.5 h-3.5" />
102
+ </span>
103
+ ) : null}
104
+ </>
105
+ )
106
+ if (anchorProps) {
107
+ return (
108
+ <a {...anchorProps} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
109
+ {body}
110
+ </a>
111
+ )
112
+ }
113
+ return href ? (
114
+ <a href={href} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
115
+ {body}
116
+ </a>
117
+ ) : (
118
+ <span className={`${COMPACT_CARD_OUTER_STATIC} ${className ?? ''}`} aria-label="No link available">
119
+ {body}
120
+ </span>
121
+ )
122
+ }
123
+
124
+ export function GenericEntityCardSkeleton({ className }: { className?: string }) {
125
+ return (
126
+ <span className={`${COMPACT_CARD_SKELETON_OUTER} ${className ?? ''}`}>
127
+ <span className={COMPACT_CARD_TEXT_COL}>
128
+ <span className="flex items-center gap-1.5 min-w-0">
129
+ <span className="h-3.5 w-2/3 rounded bg-ods-bg" />
130
+ <span className="h-4 w-16 rounded-full bg-ods-bg/60" />
131
+ </span>
132
+ <span className="h-4 w-1/2 rounded bg-ods-bg/60" />
133
+ <span className="flex flex-col gap-0 min-w-0">
134
+ <span className="h-5 w-5/6 rounded bg-ods-bg/60" />
135
+ <span className="h-5 w-3/4 rounded bg-ods-bg/60" />
136
+ </span>
137
+ <span className="h-3 w-1/4 rounded bg-ods-bg/70" />
138
+ </span>
139
+ <span className="flex shrink-0 items-center self-start h-5">
140
+ <span className="h-3.5 w-3.5 rounded bg-ods-bg" />
141
+ </span>
142
+ </span>
143
+ )
144
+ }
@@ -0,0 +1,305 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * GitHub Activity Card — unified visual for commits, PRs, and PR reviews.
5
+ *
6
+ * PURE PRESENTATION (no internal nav, no internal data fetching). The card
7
+ * receives the structured `<a>` prop bundle via `anchorProps` (composed by
8
+ * the caller from a runtime hook) and renders the rest from the
9
+ * `GitHubActivityItem` shape directly.
10
+ *
11
+ * Two consumers share this component:
12
+ * 1. Activity-list row (employee detail / similar) — pass `variant="row"`.
13
+ * 2. Chat-inline `[card://github_commit:<sha>]` markers — `variant="compact"`.
14
+ *
15
+ * Unified data shape `GitHubActivityItem` covers all three GitHub types
16
+ * (commit / PR / review).
17
+ */
18
+
19
+ import React from 'react'
20
+ import { GitHubIcon } from '../../icons/github-icon'
21
+ import { GitPullRequest, Eye, ExternalLink } from 'lucide-react'
22
+ import {
23
+ COMPACT_CARD_ICON_SLOT,
24
+ COMPACT_CARD_META_ROW,
25
+ COMPACT_CARD_META_ROW_BOX,
26
+ COMPACT_CARD_OUTER,
27
+ COMPACT_CARD_OUTER_STATIC,
28
+ COMPACT_CARD_ROW_FILLER,
29
+ COMPACT_CARD_SKELETON_IMAGE_SLOT,
30
+ COMPACT_CARD_SKELETON_OUTER,
31
+ COMPACT_CARD_SUMMARY,
32
+ COMPACT_CARD_TEXT_COL,
33
+ COMPACT_CARD_TITLE,
34
+ COMPACT_CARD_TITLE_ROW,
35
+ safeHref,
36
+ } from '../utils/compact-card-classes'
37
+ import { formatDateUTC as formatDate } from '../../../utils/format'
38
+ import type {
39
+ GitHubActivityItem,
40
+ GitHubActivityKind,
41
+ PrReviewState,
42
+ } from '../types/entities/github-activity'
43
+
44
+ /** Extract owner/repo from a GitHub URL. */
45
+ function parseRepoFromUrl(url: string | null | undefined): string | null {
46
+ if (!url) return null
47
+ try {
48
+ const u = new URL(url)
49
+ if (u.host !== 'github.com') return null
50
+ const parts = u.pathname.split('/').filter(Boolean)
51
+ if (parts.length >= 2) return `${parts[0]}/${parts[1]}`
52
+ } catch {
53
+ /* malformed URL */
54
+ }
55
+ return null
56
+ }
57
+
58
+ function kindIcon(kind: GitHubActivityKind, className = 'h-4 w-4') {
59
+ switch (kind) {
60
+ case 'pull_request':
61
+ return <GitPullRequest className={`${className} shrink-0`} />
62
+ case 'pr_review':
63
+ return <Eye className={`${className} shrink-0`} />
64
+ case 'commit':
65
+ default:
66
+ return <GitHubIcon className={`${className} shrink-0`} />
67
+ }
68
+ }
69
+
70
+ function kindLabel(kind: GitHubActivityKind): string {
71
+ switch (kind) {
72
+ case 'pull_request': return 'PR'
73
+ case 'pr_review': return 'Review'
74
+ case 'commit':
75
+ default: return 'Commit'
76
+ }
77
+ }
78
+
79
+ function formatActivityId(id: string, kind: GitHubActivityKind): string {
80
+ if (!id) return ''
81
+ if (kind === 'pull_request' || kind === 'pr_review') return `#${id}`
82
+ if (/^[0-9a-f]{40}$/i.test(id)) return id.slice(0, 7)
83
+ return id.length > 12 ? id.slice(0, 12) : id
84
+ }
85
+
86
+ function parseGithubTitle(title: string, kind: GitHubActivityKind): { display: string; reviewState: PrReviewState | null } {
87
+ if (!title) return { display: '', reviewState: null }
88
+
89
+ // Split prefix-tag from rest by hand instead of one giant regex.
90
+ // Avoids polynomial-redos on chained `\s*` quantifiers (`\[\s*X\s*\]`),
91
+ // since multiple consecutive `\s*` groups against long whitespace runs
92
+ // trigger exponential backtracking on CodeQL's heuristic.
93
+ //
94
+ // Algorithm: trim; if it starts with `[`, locate the matching `]`,
95
+ // then content[0:closing] is the tag, content[closing+1:] is the
96
+ // remainder. Linear scan — no regex backtracking possible.
97
+ const trimmed = title.trim()
98
+ let tag: string | null = null
99
+ let rest: string = trimmed
100
+ if (trimmed.startsWith('[')) {
101
+ const close = trimmed.indexOf(']')
102
+ if (close > 0) {
103
+ tag = trimmed.slice(1, close).trim().toLowerCase()
104
+ rest = trimmed.slice(close + 1).trim()
105
+ }
106
+ }
107
+
108
+ if (kind === 'pr_review' && tag && tag.startsWith('review:')) {
109
+ const stateRaw = tag.slice('review:'.length).trim().toUpperCase()
110
+ const reviewState = (['APPROVED', 'CHANGES_REQUESTED', 'COMMENTED', 'DISMISSED', 'PENDING'] as PrReviewState[]).includes(stateRaw as PrReviewState)
111
+ ? (stateRaw as PrReviewState)
112
+ : null
113
+ return { display: rest || 'Review', reviewState }
114
+ }
115
+ if (kind === 'pull_request' && tag && tag.startsWith('pr')) {
116
+ // Accept `[PR #123]`, `[PR#123]`, `[ pr # 123 ]` etc. — anything
117
+ // matching `pr` followed by `#?\s*\d+`. Validate the suffix is
118
+ // a numeric PR id, not arbitrary text.
119
+ const after = tag.slice(2).trim().replace(/^#\s*/, '')
120
+ if (after.length > 0 && /^\d+$/.test(after)) {
121
+ return { display: rest || title, reviewState: null }
122
+ }
123
+ }
124
+ if (kind === 'commit' && tag === 'commit') {
125
+ return { display: rest || title, reviewState: null }
126
+ }
127
+ return { display: title.trim(), reviewState: null }
128
+ }
129
+
130
+ const REVIEW_STATE_STYLE: Record<PrReviewState, { label: string; className: string }> = {
131
+ APPROVED: {
132
+ label: 'Approved',
133
+ className: 'bg-[var(--ods-attention-green-success-secondary)] text-[var(--ods-attention-green-success)]',
134
+ },
135
+ CHANGES_REQUESTED: {
136
+ label: 'Changes',
137
+ className: 'bg-[var(--ods-attention-red-error-secondary)] text-[var(--ods-attention-red-error)]',
138
+ },
139
+ COMMENTED: {
140
+ label: 'Comment',
141
+ className: 'bg-ods-bg-secondary text-ods-text-primary',
142
+ },
143
+ DISMISSED: {
144
+ label: 'Dismissed',
145
+ className: 'bg-ods-bg-secondary text-ods-text-secondary',
146
+ },
147
+ PENDING: {
148
+ label: 'Pending',
149
+ className: 'bg-[var(--ods-attention-yellow-warning-secondary)] text-[var(--ods-attention-yellow-warning)]',
150
+ },
151
+ }
152
+
153
+ function ReviewStateBadge({ state, className = '' }: { state: PrReviewState; className?: string }) {
154
+ const { label, className: paint } = REVIEW_STATE_STYLE[state] ?? REVIEW_STATE_STYLE.COMMENTED
155
+ return (
156
+ <span
157
+ className={`inline-flex items-center rounded px-1.5 py-0.5 font-mono text-[10px] font-medium uppercase tracking-wide shrink-0 ${paint} ${className}`}
158
+ >
159
+ {label}
160
+ </span>
161
+ )
162
+ }
163
+
164
+ export interface GitHubActivityCardAnchorProps {
165
+ href: string
166
+ target?: '_blank'
167
+ rel?: 'noopener noreferrer'
168
+ onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void
169
+ }
170
+
171
+ export interface GitHubActivityCardProps {
172
+ item: GitHubActivityItem
173
+ variant?: 'row' | 'compact'
174
+ className?: string
175
+ /** Pre-composed `<a>` prop bundle (typically from a `useNavLink` hook in
176
+ * the consumer). When provided, the outer renders as a real `<a>`. */
177
+ anchorProps?: GitHubActivityCardAnchorProps
178
+ }
179
+
180
+ export function GitHubActivityCard({ item, variant = 'compact', className, anchorProps }: GitHubActivityCardProps) {
181
+ const kind = item.kind ?? 'commit'
182
+ const repo = item.repo ?? parseRepoFromUrl(item.url) ?? ''
183
+ const dateText = formatDate(item.dateUpdated, { fallback: '', timezone: 'local' })
184
+ const idLabel = formatActivityId(item.id, kind)
185
+ const { display: title, reviewState } = parseGithubTitle(item.title, kind)
186
+ const primaryText = kind === 'pr_review'
187
+ ? (title.replace(/^by\s+/i, '').trim() || 'Reviewer')
188
+ : title
189
+
190
+ if (variant === 'row') {
191
+ return (
192
+ <div className={`flex items-center gap-3 min-w-0 ${className ?? ''}`}>
193
+ <span className="flex items-center gap-2 w-28 shrink-0">
194
+ {kindIcon(kind, 'h-3.5 w-3.5')}
195
+ <code className="text-ods-text-secondary font-mono text-xs truncate">{idLabel}</code>
196
+ </span>
197
+ <span className="flex items-center gap-2 text-ods-text-primary text-sm flex-1 min-w-0">
198
+ {reviewState ? <ReviewStateBadge state={reviewState} /> : null}
199
+ <span className="truncate">{primaryText}</span>
200
+ </span>
201
+ {repo ? (
202
+ <span className="font-mono text-[11px] text-ods-text-secondary truncate max-w-[240px] shrink-0">{repo}</span>
203
+ ) : null}
204
+ {dateText ? (
205
+ <span className="text-ods-text-secondary text-xs w-24 shrink-0 text-right">{dateText}</span>
206
+ ) : null}
207
+ </div>
208
+ )
209
+ }
210
+
211
+ const metaParts: React.ReactNode[] = []
212
+ metaParts.push(
213
+ <span key="kind" className="font-medium uppercase tracking-wide text-[10px]">{kindLabel(kind)}</span>,
214
+ )
215
+ if (idLabel) metaParts.push(<code key="id" className="font-mono">{idLabel}</code>)
216
+ if (repo) metaParts.push(<span key="repo" className="font-mono truncate">{repo}</span>)
217
+ if (dateText) metaParts.push(<span key="date" className="whitespace-nowrap">{dateText}</span>)
218
+
219
+ const href = safeHref(item.url)
220
+ const body = (
221
+ <>
222
+ <span className={COMPACT_CARD_ICON_SLOT}>
223
+ {kindIcon(kind, 'h-5 w-5')}
224
+ </span>
225
+ <span className={COMPACT_CARD_TEXT_COL}>
226
+ <span className={`${COMPACT_CARD_TITLE_ROW} flex-nowrap gap-1.5`}>
227
+ {reviewState ? <ReviewStateBadge state={reviewState} /> : null}
228
+ <span className={COMPACT_CARD_TITLE}>{primaryText}</span>
229
+ </span>
230
+ <span className={COMPACT_CARD_META_ROW_BOX}>
231
+ <span className={COMPACT_CARD_META_ROW}>
232
+ {metaParts.map((part, i) => (
233
+ <React.Fragment key={i}>
234
+ {i > 0 ? <span className="text-ods-text-secondary/40 shrink-0">·</span> : null}
235
+ <span className="min-w-0 truncate">{part}</span>
236
+ </React.Fragment>
237
+ ))}
238
+ </span>
239
+ </span>
240
+ <span className={COMPACT_CARD_META_ROW_BOX}>
241
+ <span className={COMPACT_CARD_SUMMARY}>{COMPACT_CARD_ROW_FILLER}</span>
242
+ </span>
243
+ </span>
244
+ {href ? (
245
+ <span className="flex shrink-0 items-center self-start h-5 text-ods-text-secondary">
246
+ <ExternalLink className="w-3.5 h-3.5" />
247
+ </span>
248
+ ) : null}
249
+ </>
250
+ )
251
+ if (anchorProps) {
252
+ return (
253
+ <a {...anchorProps} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
254
+ {body}
255
+ </a>
256
+ )
257
+ }
258
+ return href ? (
259
+ <a
260
+ href={href}
261
+ target="_blank"
262
+ rel="noopener noreferrer"
263
+ className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}
264
+ >
265
+ {body}
266
+ </a>
267
+ ) : (
268
+ <span className={`${COMPACT_CARD_OUTER_STATIC} ${className ?? ''}`} aria-label="No link available">{body}</span>
269
+ )
270
+ }
271
+
272
+ export function GitHubActivityCardSkeleton({ variant = 'compact', className }: { variant?: 'row' | 'compact'; className?: string }) {
273
+ if (variant === 'row') {
274
+ return (
275
+ <div className={`flex items-center gap-3 min-w-0 animate-pulse ${className ?? ''}`}>
276
+ <div className="flex items-center gap-2 w-28 shrink-0">
277
+ <div className="h-3.5 w-3.5 rounded bg-ods-bg" />
278
+ <div className="h-3 w-16 bg-ods-bg rounded" />
279
+ </div>
280
+ <div className="h-3 w-2/3 bg-ods-bg rounded flex-1" />
281
+ <div className="h-3 w-40 bg-ods-bg/60 rounded shrink-0" />
282
+ <div className="h-3 w-20 bg-ods-bg/60 rounded shrink-0" />
283
+ </div>
284
+ )
285
+ }
286
+ return (
287
+ <span className={`${COMPACT_CARD_SKELETON_OUTER} ${className ?? ''}`}>
288
+ <span className={COMPACT_CARD_SKELETON_IMAGE_SLOT} />
289
+ <span className={COMPACT_CARD_TEXT_COL}>
290
+ <span className={COMPACT_CARD_TITLE_ROW}>
291
+ <span className="h-3.5 w-2/3 rounded bg-ods-bg" />
292
+ </span>
293
+ <span className={COMPACT_CARD_META_ROW_BOX}>
294
+ <span className="h-3 w-1/2 rounded bg-ods-bg/70" />
295
+ </span>
296
+ <span className={COMPACT_CARD_META_ROW_BOX}>
297
+ <span className={COMPACT_CARD_SUMMARY}>{COMPACT_CARD_ROW_FILLER}</span>
298
+ </span>
299
+ </span>
300
+ <span className="flex shrink-0 items-center self-start h-5">
301
+ <span className="h-3.5 w-3.5 rounded bg-ods-bg" />
302
+ </span>
303
+ </span>
304
+ )
305
+ }