@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,326 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * OnboardingGuideCard (pure presentation).
5
+ *
6
+ * Three variants:
7
+ * - `catalog`: rich detail card (hero + author grid) for the public catalog
8
+ * page.
9
+ * - `default`: horizontal step-numbered card for "More in {section}" rail.
10
+ * - `sm`: compact horizontal card for chat-inline rendering.
11
+ *
12
+ * The card writes NO click logic — callers wrap with their own anchor and
13
+ * pass the resolved detail URL via `href`.
14
+ */
15
+
16
+ import React from 'react'
17
+ import Image from '../../../embed-shims/next-image'
18
+ import { Clock, ExternalLink, GraduationCap, Play } from 'lucide-react'
19
+ import { cn } from '../../../utils/cn'
20
+ import { BlogImagePlaceholder } from './blog-image-placeholder'
21
+ import { EntityAuthorCard } from './entity-author-card'
22
+ import { formatDurationMMSS } from '../../../utils/format'
23
+ import type { OnboardingGuide } from '../types/entities/onboarding-guide'
24
+ import {
25
+ COMPACT_CARD_OUTER,
26
+ COMPACT_CARD_IMAGE_SLOT,
27
+ COMPACT_CARD_SKELETON_IMAGE_SLOT,
28
+ COMPACT_CARD_SKELETON_OUTER,
29
+ COMPACT_CARD_TEXT_COL,
30
+ COMPACT_CARD_TITLE_ROW,
31
+ COMPACT_CARD_TITLE,
32
+ COMPACT_CARD_META_ROW_BOX,
33
+ COMPACT_CARD_SUMMARY,
34
+ COMPACT_CARD_ROW_FILLER,
35
+ } from '../utils/compact-card-classes'
36
+
37
+ export interface OnboardingGuideCardProps {
38
+ guide: OnboardingGuide
39
+ /** Detail URL resolved by the caller. */
40
+ href: string
41
+ /** When `_blank`, opens in a new tab. Set by chat dispatch via
42
+ * `computeIsNewTab`. Defaults to same-tab. */
43
+ target?: '_blank'
44
+ rel?: 'noopener noreferrer'
45
+ targetPlatform?: string | null
46
+ /** OG placeholder URL used by the catalog + sm variants when no cover. */
47
+ placeholderUrl?: string | null
48
+ size?: 'catalog' | 'default' | 'sm'
49
+ className?: string
50
+ }
51
+
52
+ const HORIZONTAL_SIZE_TOKENS = {
53
+ default: {
54
+ padding: 'p-4',
55
+ step: 'w-8 h-8 text-sm',
56
+ title: 'text-h5',
57
+ summaryClamp: 'line-clamp-2',
58
+ },
59
+ } as const
60
+
61
+ export function OnboardingGuideCardSkeleton({ size = 'default' }: { size?: 'catalog' | 'default' | 'sm' }) {
62
+ if (size === 'catalog') {
63
+ return (
64
+ <div className="bg-ods-system-greys-black border border-ods-border rounded-lg overflow-hidden flex flex-col p-6 gap-4 animate-pulse">
65
+ <div className="flex flex-col md:flex-row gap-4 md:gap-6">
66
+ <div className="w-full md:w-[256px] aspect-[16/9] bg-ods-border rounded-lg flex-shrink-0" />
67
+ <div className="flex-1 min-w-0 flex flex-col">
68
+ <div className="min-h-[60px] md:min-h-[72px] flex flex-col gap-1.5 justify-start mb-3">
69
+ <div className="h-[25px] md:h-[30px] w-3/4 bg-ods-border rounded" />
70
+ <div className="h-[25px] md:h-[30px] w-1/2 bg-ods-border rounded" />
71
+ </div>
72
+ <div className="min-h-[46px] md:min-h-[52px] flex flex-col gap-2 justify-start">
73
+ <div className="h-3 w-full bg-ods-border/70 rounded" />
74
+ <div className="h-3 w-5/6 bg-ods-border/70 rounded" />
75
+ </div>
76
+ </div>
77
+ </div>
78
+ <div className="grid grid-cols-1 md:grid-cols-3 border border-ods-border rounded-md overflow-hidden w-full">
79
+ {[0, 1].map((i) => (
80
+ <div
81
+ key={`cell-${i}`}
82
+ className="bg-ods-card p-4 flex flex-col gap-3 border-b md:border-b-0 md:border-r border-ods-border"
83
+ >
84
+ <div className="flex flex-col gap-2">
85
+ <div className="h-6 w-32 bg-ods-bg rounded" />
86
+ <div className="h-3 w-20 bg-ods-bg/60 rounded" />
87
+ </div>
88
+ </div>
89
+ ))}
90
+ <div className="bg-ods-card p-4 flex items-center gap-3">
91
+ <div className="h-10 w-10 rounded-full bg-ods-bg shrink-0" />
92
+ <div className="flex flex-col gap-2 flex-1 min-w-0">
93
+ <div className="h-4 w-3/4 bg-ods-bg rounded" />
94
+ <div className="h-3 w-1/2 bg-ods-bg/60 rounded" />
95
+ </div>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ )
100
+ }
101
+ if (size === 'sm') {
102
+ return (
103
+ <span className={COMPACT_CARD_SKELETON_OUTER}>
104
+ <span className={COMPACT_CARD_SKELETON_IMAGE_SLOT} />
105
+ <span className={COMPACT_CARD_TEXT_COL}>
106
+ <span className={COMPACT_CARD_TITLE_ROW}>
107
+ <span className="h-3.5 w-3/5 rounded bg-ods-bg" />
108
+ </span>
109
+ <span className={COMPACT_CARD_META_ROW_BOX}>
110
+ <span className="h-3 w-2/5 rounded bg-ods-bg/70" />
111
+ </span>
112
+ <span className={COMPACT_CARD_META_ROW_BOX}>
113
+ <span className="h-3 w-11/12 rounded bg-ods-bg/40" />
114
+ </span>
115
+ </span>
116
+ <span className="flex shrink-0 items-center self-start h-5">
117
+ <span className="h-3.5 w-3.5 rounded bg-ods-bg" />
118
+ </span>
119
+ </span>
120
+ )
121
+ }
122
+ const t = HORIZONTAL_SIZE_TOKENS.default
123
+ return (
124
+ <span
125
+ className={`flex items-start gap-3 rounded-md border border-ods-border bg-ods-card ${t.padding} animate-pulse`}
126
+ >
127
+ <span className={`shrink-0 inline-flex items-center justify-center rounded-full bg-ods-bg ${t.step}`} />
128
+ <span className="flex flex-col gap-2 flex-1 min-w-0">
129
+ <span className="block h-4 w-2/3 rounded bg-ods-bg" />
130
+ <span className="block h-3 w-1/3 rounded bg-ods-bg/70" />
131
+ <span className="block h-3 w-full rounded bg-ods-bg/40" />
132
+ </span>
133
+ </span>
134
+ )
135
+ }
136
+
137
+ export function OnboardingGuideCard({ guide, href, target, rel, placeholderUrl, size = 'default', className }: OnboardingGuideCardProps) {
138
+ if (size === 'catalog') {
139
+ const coverImage =
140
+ guide.featured_image ||
141
+ guide.main_video_thumbnail ||
142
+ guide.og_image_url ||
143
+ null
144
+ const hasVideoCover = !!(guide.main_video_thumbnail || guide.highlight_video_thumbnail)
145
+ const stepLabel =
146
+ typeof guide.step_order === 'number'
147
+ ? String(guide.step_order).padStart(2, '0')
148
+ : '—'
149
+ const durationLabel =
150
+ typeof guide.highlight_video_duration_ms === 'number' && guide.highlight_video_duration_ms > 0
151
+ ? formatDurationMMSS(Math.floor(guide.highlight_video_duration_ms / 1000))
152
+ : ''
153
+
154
+ return (
155
+ <a
156
+ href={href}
157
+ target={target}
158
+ rel={rel}
159
+ className={cn(
160
+ 'group block no-underline bg-ods-system-greys-black',
161
+ 'border border-ods-border rounded-lg overflow-hidden',
162
+ 'transition-all duration-300 ease-out',
163
+ 'transform hover:translate-y-[-2px]',
164
+ 'hover:border-ods-accent hover:shadow-lg hover:shadow-ods-accent/[0.08]',
165
+ className,
166
+ )}
167
+ aria-label={`Open ${guide.title}`}
168
+ >
169
+ <div className="flex flex-col p-6 gap-4">
170
+ <div className="flex flex-col md:flex-row gap-4 md:gap-6">
171
+ <div className="w-full md:w-[256px] flex-shrink-0">
172
+ <div className="relative rounded-lg overflow-hidden w-full aspect-[16/9] bg-ods-bg">
173
+ {coverImage ? (
174
+ <Image
175
+ src={coverImage}
176
+ alt={guide.title}
177
+ fill
178
+ sizes="(max-width: 768px) 100vw, 256px"
179
+ className="object-cover"
180
+ unoptimized
181
+ />
182
+ ) : (
183
+ <BlogImagePlaceholder
184
+ title={guide.title}
185
+ imageUrl={placeholderUrl ?? null}
186
+ className="absolute inset-0"
187
+ />
188
+ )}
189
+ {hasVideoCover && coverImage && (
190
+ <span className="absolute inset-0 flex items-center justify-center bg-black/30">
191
+ <Play className="w-10 h-10 text-white" fill="white" />
192
+ </span>
193
+ )}
194
+ {durationLabel && (
195
+ <span className="absolute bottom-2 right-2 inline-flex items-center gap-1 px-2 py-1 rounded bg-black/60 text-white text-xs font-medium font-mono">
196
+ <Clock className="w-3 h-3" />
197
+ {durationLabel}
198
+ </span>
199
+ )}
200
+ </div>
201
+ </div>
202
+
203
+ <div className="flex-1 min-w-0 flex flex-col">
204
+ <div className="min-h-[60px] md:min-h-[72px] flex items-start mb-3">
205
+ <h3 className="font-['Azeret_Mono'] font-semibold text-xl md:text-2xl text-ods-text-primary leading-tight line-clamp-2">
206
+ {guide.title}
207
+ </h3>
208
+ </div>
209
+ <div className="min-h-[46px] md:min-h-[52px]">
210
+ <p className="font-['DM_Sans'] text-sm md:text-base text-ods-text-secondary leading-relaxed line-clamp-2">
211
+ {(guide.video_summary || guide.content || '').trim()}
212
+ </p>
213
+ </div>
214
+ </div>
215
+ </div>
216
+
217
+ <EntityAuthorCard
218
+ author={guide.author}
219
+ publishedAt={guide.published_at}
220
+ renderEmptyAuthor
221
+ extraCells={[
222
+ {
223
+ value: `${guide.section} · Step ${stepLabel}`,
224
+ label: 'Section',
225
+ uppercase: false,
226
+ },
227
+ ]}
228
+ />
229
+ </div>
230
+ </a>
231
+ )
232
+ }
233
+
234
+ if (size === 'sm') {
235
+ const coverImage = guide.featured_image || guide.main_video_thumbnail || guide.og_image_url || null
236
+ const compactCover = coverImage || placeholderUrl || null
237
+ const hasVideoCover = !guide.featured_image && !!guide.main_video_thumbnail
238
+ const summary = (guide.video_summary || guide.content || '').trim()
239
+ const author = guide.author?.full_name?.trim() || ''
240
+ const subtitleParts = [
241
+ `Step ${guide.step_order}`,
242
+ guide.section,
243
+ author,
244
+ ].filter((s): s is string => typeof s === 'string' && s.length > 0)
245
+ return (
246
+ <a href={href} target={target} rel={rel} className={cn(COMPACT_CARD_OUTER, className)}>
247
+ <span className={COMPACT_CARD_IMAGE_SLOT}>
248
+ {compactCover ? (
249
+ <Image
250
+ src={compactCover}
251
+ alt={guide.title}
252
+ fill
253
+ sizes="56px"
254
+ className="object-contain"
255
+ unoptimized
256
+ />
257
+ ) : (
258
+ <span className="flex h-full w-full items-center justify-center text-ods-accent">
259
+ <GraduationCap className="w-4 h-4" />
260
+ </span>
261
+ )}
262
+ {hasVideoCover && compactCover && (
263
+ <span className="absolute inset-0 flex items-center justify-center bg-black/30">
264
+ <Play className="h-4 w-4 text-white" fill="white" />
265
+ </span>
266
+ )}
267
+ </span>
268
+ <span className={COMPACT_CARD_TEXT_COL}>
269
+ <span className={COMPACT_CARD_TITLE_ROW}>
270
+ <span className={cn(COMPACT_CARD_TITLE, "font-['Azeret_Mono']")}>
271
+ {guide.title}
272
+ </span>
273
+ </span>
274
+ <span className={COMPACT_CARD_META_ROW_BOX}>
275
+ <span className="truncate text-[11px] leading-4 text-[var(--color-accent-primary)]">
276
+ {subtitleParts.join(' · ')}
277
+ </span>
278
+ </span>
279
+ <span className={COMPACT_CARD_META_ROW_BOX}>
280
+ <span className={COMPACT_CARD_SUMMARY}>
281
+ {summary || COMPACT_CARD_ROW_FILLER}
282
+ </span>
283
+ </span>
284
+ </span>
285
+ <span className="flex shrink-0 items-center self-start h-5 text-ods-text-secondary">
286
+ <ExternalLink className="w-3.5 h-3.5" />
287
+ </span>
288
+ </a>
289
+ )
290
+ }
291
+
292
+ // size === 'default' — horizontal step-numbered card for related-rail.
293
+ const t = HORIZONTAL_SIZE_TOKENS.default
294
+ const summary = (guide.video_summary || guide.content || '').trim()
295
+
296
+ return (
297
+ <a
298
+ href={href}
299
+ target={target}
300
+ rel={rel}
301
+ className={cn(
302
+ `flex items-start gap-3 rounded-md border border-ods-border bg-ods-card hover:border-ods-accent transition-colors ${t.padding}`,
303
+ className,
304
+ )}
305
+ >
306
+ <span
307
+ className={`shrink-0 inline-flex items-center justify-center rounded-full bg-ods-accent/10 text-ods-accent font-semibold ${t.step}`}
308
+ aria-hidden="true"
309
+ >
310
+ {guide.step_order}
311
+ </span>
312
+ <span className="flex flex-col gap-0.5 flex-1 min-w-0">
313
+ <span className={`block ${t.title} text-ods-text-primary truncate`}>{guide.title}</span>
314
+ <span className="inline-flex items-center gap-1 font-['DM_Sans'] text-[12px] leading-[16px] text-ods-text-secondary">
315
+ <GraduationCap className="h-3 w-3 shrink-0" />
316
+ <span className="truncate">{guide.section}</span>
317
+ </span>
318
+ {summary && (
319
+ <span className={`block font-['DM_Sans'] text-[14px] leading-[20px] text-ods-text-secondary ${t.summaryClamp}`}>
320
+ {summary}
321
+ </span>
322
+ )}
323
+ </span>
324
+ </a>
325
+ )
326
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Lib-side default `buildProductReleaseCardProps` for the chat dispatch.
3
+ *
4
+ * The compact (`size='sm'`) branch of `<ProductReleaseCard>` only reads
5
+ * `coverImage`, `hasVideoCover`, and `formattedDate` — the rest of the
6
+ * derived prop bundle is catalog-page (`size='lg'`) metadata. This
7
+ * default builder satisfies the three sm-relevant fields with row data
8
+ * the list-API already returns, so embedders that don't supply
9
+ * `opts.extras.buildProductReleaseCardProps` still get a rendered card
10
+ * instead of a bare text chip. Hub-side embedders pass their richer
11
+ * builder via `extras` to get the lg-only fields (changelogCounts,
12
+ * badge color, view count, etc.).
13
+ */
14
+
15
+ import { formatReleaseDate } from '../../../utils/date-formatters'
16
+
17
+ interface ReleaseLike {
18
+ release_date?: string | null
19
+ featured_image?: string | null
20
+ og_image_url?: string | null
21
+ main_video_thumbnail?: string | null
22
+ highlight_video_thumbnail?: string | null
23
+ main_video_url?: string | null
24
+ youtube_url?: string | null
25
+ }
26
+
27
+ interface DerivedSmProps {
28
+ coverImage: string | null
29
+ hasVideoCover: boolean
30
+ formattedDate: string
31
+ }
32
+
33
+ /** Pick the first usable image URL from the row's cover-candidate
34
+ * fields. Order mirrors the hub's `resolveReleaseCover` precedence
35
+ * (video thumbnail wins when a video is set, then featured/og). */
36
+ function pickCover(item: ReleaseLike): string | null {
37
+ const hasVideo = Boolean(item.main_video_url || item.youtube_url)
38
+ if (hasVideo) {
39
+ if (item.main_video_thumbnail) return item.main_video_thumbnail
40
+ if (item.highlight_video_thumbnail) return item.highlight_video_thumbnail
41
+ }
42
+ return item.featured_image ?? item.og_image_url ?? null
43
+ }
44
+
45
+ export function defaultBuildProductReleaseCardProps(item: unknown): DerivedSmProps {
46
+ const row = (item ?? {}) as ReleaseLike
47
+ return {
48
+ coverImage: pickCover(row),
49
+ hasVideoCover: Boolean(row.main_video_url || row.youtube_url),
50
+ // `formatReleaseDate` is TZ-safe (splits the `YYYY-MM-DD` head before
51
+ // constructing the Date). Using `new Date(input).toLocaleDateString`
52
+ // here would shift the date by one day west of UTC for date-only
53
+ // inputs — the hub's own `buildProductReleaseCardProps` already uses
54
+ // this helper, so the chat-default + hub builder agree.
55
+ formattedDate: row.release_date ? formatReleaseDate(row.release_date) : '',
56
+ }
57
+ }
@@ -0,0 +1,19 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * ProductReleaseCard — chat entity-card re-export of the canonical
5
+ * `<ProductReleaseCard>` already in `src/components/shared/product-release/`.
6
+ *
7
+ * The shared module is the SOURCE OF TRUTH (lg + sm variants live there).
8
+ * This file just re-exports under `entity-cards/` so the chat barrel
9
+ * (`components/chat/index.ts`) groups every entity card under one path
10
+ * — consumers don't notice the indirection.
11
+ */
12
+
13
+ export {
14
+ ProductReleaseCard,
15
+ type ProductReleaseCardProps,
16
+ type ProductReleaseCardSize,
17
+ type ProductReleaseCardAnchorProps,
18
+ } from '../../shared/product-release/product-release-card'
19
+ export { ProductReleaseCardSkeleton } from '../../shared/product-release/product-release-card-skeleton'
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Lib-side default ProgramConfig values for the chat dispatch.
3
+ *
4
+ * `<ProgramCard size='sm'>` (the compact chat card) only consumes
5
+ * `config.type` (for branching on podcast vs webinar vs event presentation
6
+ * details) and `config.labels?.singular` (rendered as the subtitle's
7
+ * type label, e.g. "Episode" / "Webinar" / "Event"). Everything else on
8
+ * `ProgramConfig` — `dateField`, `table`, `apiEndpoint`, `icon`,
9
+ * `detailRoute`, `externalLinkLabel`, etc. — is catalog-page metadata,
10
+ * not used by the inline chat card.
11
+ *
12
+ * Previously the chat dispatch REQUIRED `opts.extras.programConfigs.X`
13
+ * to be provided by the embedder; if it was missing the dispatch
14
+ * returned `null` and the chat fell back to a bare text chip ("Ask" +
15
+ * id). That tightly coupled every embedder to the hub-side
16
+ * `program-configs.ts` (which transitively imports `currentPlatform()`
17
+ * + `buildContentURL` — hub-internal). The validation app + any
18
+ * non-hub embedder couldn't render podcast/webinar/event cards at all.
19
+ *
20
+ * These defaults satisfy the compact-card render contract with
21
+ * minimal hard-coded labels. Embedders that need richer catalog
22
+ * configs (full icon, externalLinkLabel, etc.) can still override per
23
+ * type via `opts.extras.programConfigs.X` — the dispatch reads
24
+ * `extras.programConfigs.X ?? DEFAULT_PROGRAM_CONFIGS.X`.
25
+ */
26
+ import type { ProgramConfig, BaseProgramItem } from '../types/entities/program-types'
27
+
28
+ /** Minimal config — fields the compact card actually reads + safe
29
+ * placeholders for the others so type-checking passes. */
30
+ function makeDefault<T extends BaseProgramItem>(
31
+ type: 'podcast' | 'webinar' | 'event',
32
+ singular: string,
33
+ plural: string,
34
+ ): ProgramConfig<T> {
35
+ return {
36
+ type,
37
+ labels: {
38
+ singular,
39
+ plural,
40
+ upcoming: `Latest ${singular}:`,
41
+ upcomingSection: `Upcoming ${plural}`,
42
+ archive: `Past ${plural}`,
43
+ empty: `No ${plural.toLowerCase()} yet`,
44
+ },
45
+ // dateField / table / apiEndpoint / icon / detailRoute /
46
+ // externalLinkLabel are NOT read by the compact chat card — set to
47
+ // empty / null so the embedder doesn't have to think about catalog
48
+ // page concerns when all they want is the inline chat card.
49
+ dateField: 'date' as keyof T,
50
+ table: '',
51
+ apiEndpoint: '',
52
+ icon: null,
53
+ externalLinkLabel: '',
54
+ detailRoute: '',
55
+ }
56
+ }
57
+
58
+ export const DEFAULT_PROGRAM_CONFIGS = {
59
+ podcast: makeDefault<BaseProgramItem>('podcast', 'Episode', 'Episodes'),
60
+ webinar: makeDefault<BaseProgramItem>('webinar', 'Webinar', 'Webinars'),
61
+ event: makeDefault<BaseProgramItem>('event', 'Event', 'Events'),
62
+ } as const