@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,356 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * RoadmapCard (pure presentation). Two densities — `default` (rich
5
+ * /roadmap page card with vote buttons + figma/screenshots controls)
6
+ * and `sm` (compact horizontal for chat-inline).
7
+ *
8
+ * The card writes NO click logic — the parent wraps with its own
9
+ * anchor for the compact branch and supplies vote handlers for the
10
+ * default branch.
11
+ */
12
+
13
+ import React, { useState } from 'react'
14
+ import Image from '../../../embed-shims/next-image'
15
+ import { ThumbsUp, ThumbsDown } from 'lucide-react'
16
+ import { RoadmapVoteButton } from './roadmap-vote-button'
17
+ import { FigmaIcon } from '../../icons/figma-icon'
18
+ import { ImageIcon } from '../../icons/image-icon'
19
+ import { Button } from '../../ui/button/button'
20
+ import { StatusBadge } from '../../ui/status-badge'
21
+ import { ImageGalleryModal } from '../../ui/image-gallery-modal'
22
+ import { getProxiedImageUrl } from '../../../utils/image-proxy'
23
+ import {
24
+ COMPACT_CARD_META_ROW_BOX,
25
+ COMPACT_CARD_OUTER,
26
+ COMPACT_CARD_OUTER_STATIC,
27
+ COMPACT_CARD_ROW_FILLER,
28
+ COMPACT_CARD_SKELETON_OUTER,
29
+ COMPACT_CARD_SUMMARY,
30
+ COMPACT_CARD_TEXT_COL,
31
+ COMPACT_CARD_TITLE,
32
+ COMPACT_CARD_TITLE_ROW,
33
+ safeHref,
34
+ } from '../utils/compact-card-classes'
35
+ import { getStatusColorScheme } from '../utils/agent-status-message'
36
+ import { getTaskTypeLabel } from '../utils/clickup-task-type-utils'
37
+ import { TaskTypeIcon } from './task-type-icon'
38
+ import type { RoadmapItem } from '../types/entities/roadmap-item'
39
+
40
+ type CardSize = 'default' | 'sm'
41
+ export type VoteType = 'up' | 'down' | null
42
+
43
+ export function RoadmapCardSkeleton({ size = 'default' }: { size?: CardSize }) {
44
+ if (size === 'sm') {
45
+ return (
46
+ <span className={COMPACT_CARD_SKELETON_OUTER}>
47
+ <span className="block h-12 w-12 aspect-square shrink-0 self-start rounded-md bg-ods-bg border border-ods-border p-1.5" />
48
+ <span className={COMPACT_CARD_TEXT_COL}>
49
+ <span className={`${COMPACT_CARD_TITLE_ROW} flex-nowrap gap-2`}>
50
+ <span className="h-3.5 w-1/2 rounded bg-ods-bg" />
51
+ <span className="h-4 w-12 rounded bg-ods-bg/70 shrink-0" />
52
+ </span>
53
+ <span className={`${COMPACT_CARD_META_ROW_BOX} flex-nowrap gap-2`}>
54
+ <span className="h-3 w-2/5 rounded bg-ods-bg/60 flex-1" />
55
+ <span className="h-3 w-10 rounded bg-ods-bg/40 shrink-0" />
56
+ </span>
57
+ <span className={COMPACT_CARD_META_ROW_BOX}>
58
+ <span className="h-3 w-5/6 rounded bg-ods-bg/40" />
59
+ </span>
60
+ </span>
61
+ </span>
62
+ )
63
+ }
64
+ return (
65
+ <div className="bg-ods-card border border-ods-border rounded-[6px] p-[24px] flex flex-col gap-4 h-full animate-pulse">
66
+ <div className="flex gap-4 items-center">
67
+ <div className="w-16 h-16 rounded-lg bg-ods-bg flex-shrink-0" />
68
+ <div className="flex-1 space-y-2">
69
+ <div className="h-5 w-3/4 bg-ods-bg rounded" />
70
+ <div className="h-3 w-1/2 bg-ods-bg/60 rounded" />
71
+ </div>
72
+ <div className="h-6 w-16 bg-ods-bg rounded" />
73
+ </div>
74
+ <div className="space-y-2">
75
+ <div className="h-3 w-full bg-ods-bg/60 rounded" />
76
+ <div className="h-3 w-5/6 bg-ods-bg/60 rounded" />
77
+ <div className="h-3 w-4/5 bg-ods-bg/60 rounded" />
78
+ </div>
79
+ <div className="flex-1" />
80
+ <div className="flex items-center justify-between">
81
+ <div className="h-12 w-32 bg-ods-bg rounded" />
82
+ <div className="h-8 w-20 bg-ods-bg rounded" />
83
+ </div>
84
+ </div>
85
+ )
86
+ }
87
+
88
+ export interface RoadmapCardProps {
89
+ item: RoadmapItem
90
+ /** Detail URL for the compact branch (`sm`). Used by the parent
91
+ * wrapper to drive nav. Default-branch cards don't need href —
92
+ * voting + screenshot UI is the entire action surface. */
93
+ href?: string
94
+ /** When `_blank`, opens in a new tab. Set by chat dispatch via
95
+ * `computeIsNewTab`. Defaults to same-tab. */
96
+ target?: '_blank'
97
+ rel?: 'noopener noreferrer'
98
+ targetPlatform?: string | null
99
+ /** Compact-branch variant — drives the icon-slot fallback rule. */
100
+ cardType?: 'roadmap_item' | 'delivery_item' | 'internal_task'
101
+ size?: CardSize
102
+ className?: string
103
+ // Default-branch vote controls (ignored in `sm`):
104
+ userVote?: VoteType | null
105
+ onVote?: (voteType: 'up' | 'down') => void
106
+ isVoting?: boolean
107
+ }
108
+
109
+ export function RoadmapCard({
110
+ item,
111
+ href,
112
+
113
+ target,
114
+
115
+ rel,
116
+ size = 'default',
117
+ cardType = 'roadmap_item',
118
+ className,
119
+ userVote,
120
+ onVote,
121
+ isVoting = false,
122
+ }: RoadmapCardProps) {
123
+ const [showScreenshots, setShowScreenshots] = useState(false)
124
+
125
+ const logoUrl = item.icon && item.icon.startsWith('http') ? item.icon : null
126
+ const iconSrc = logoUrl
127
+ ? getProxiedImageUrl(logoUrl, { directHttps: true }) || logoUrl
128
+ : null
129
+
130
+ if (size === 'sm') {
131
+ const compactHref = safeHref(href ?? null)
132
+ const hasVotes = (item.upvotes ?? 0) > 0 || (item.downvotes ?? 0) > 0
133
+ const hasFigma = !!item.figmaUrl
134
+ const hasScreenshots = (item.screenshots?.length ?? 0) > 0
135
+ const typeLabel = getTaskTypeLabel(item.customItemId)
136
+ const useTypeIcon = cardType === 'internal_task' || (!iconSrc && item.customItemId != null)
137
+ const body = (
138
+ <>
139
+ <span
140
+ className="flex h-12 w-12 aspect-square shrink-0 self-start items-center justify-center rounded-md overflow-hidden bg-ods-bg border border-ods-border p-1.5 text-ods-accent"
141
+ title={typeLabel ?? undefined}
142
+ >
143
+ {useTypeIcon ? (
144
+ <TaskTypeIcon customItemId={item.customItemId} className="h-6 w-6" />
145
+ ) : iconSrc ? (
146
+ <Image
147
+ src={iconSrc}
148
+ alt={`${item.title} logo`}
149
+ width={32}
150
+ height={32}
151
+ unoptimized
152
+ className="h-8 w-8 object-contain"
153
+ />
154
+ ) : (
155
+ <span className="text-[10px] font-medium uppercase text-ods-text-secondary">
156
+ {item.title?.substring(0, 2) || '??'}
157
+ </span>
158
+ )}
159
+ </span>
160
+ <span className={COMPACT_CARD_TEXT_COL}>
161
+ <span className={`${COMPACT_CARD_TITLE_ROW} gap-2`}>
162
+ <span className={`${COMPACT_CARD_TITLE} min-w-0`}>{item.title}</span>
163
+ {item.status && item.status.trim().length > 0 ? (
164
+ <StatusBadge
165
+ text={item.status.toUpperCase()}
166
+ colorScheme={getStatusColorScheme(item.status)}
167
+ variant="button"
168
+ singleLine
169
+ className="border border-ods-border shrink-0 max-w-[60%] truncate whitespace-nowrap"
170
+ />
171
+ ) : null}
172
+ </span>
173
+ <span className={`${COMPACT_CARD_META_ROW_BOX} gap-2 text-ods-text-secondary`}>
174
+ <span className="truncate text-[11px] leading-4 min-w-0 flex-1">
175
+ {(() => {
176
+ const parts = [
177
+ item.quarter,
178
+ item.targetVersion ? `${item.targetVersion} version` : null,
179
+ ].filter(Boolean)
180
+ if (parts.length > 0) return parts.join(' · ')
181
+ if (cardType === 'delivery_item') {
182
+ return typeLabel ? `Delivery · ${typeLabel}` : 'Delivery'
183
+ }
184
+ if (cardType === 'internal_task') {
185
+ return typeLabel ?? 'Internal task'
186
+ }
187
+ return 'Roadmap item'
188
+ })()}
189
+ </span>
190
+ {hasVotes ? (
191
+ <span className="hidden sm:flex items-center gap-2 shrink-0 text-[11px] leading-4 text-ods-text-secondary">
192
+ <span className="flex items-center gap-0.5">
193
+ <ThumbsUp className="h-3 w-3" />
194
+ <span>{item.upvotes ?? 0}</span>
195
+ </span>
196
+ <span className="flex items-center gap-0.5">
197
+ <ThumbsDown className="h-3 w-3" />
198
+ <span>{item.downvotes ?? 0}</span>
199
+ </span>
200
+ </span>
201
+ ) : null}
202
+ {hasFigma ? (
203
+ <span className="hidden sm:flex shrink-0 items-center" title="Has Figma prototype">
204
+ <FigmaIcon className="h-3 w-3" />
205
+ </span>
206
+ ) : null}
207
+ {hasScreenshots ? (
208
+ <span
209
+ className="hidden sm:flex shrink-0 items-center gap-0.5 text-[11px] leading-4"
210
+ title={`${item.screenshots.length} screenshot${item.screenshots.length === 1 ? '' : 's'}`}
211
+ >
212
+ <ImageIcon className="h-3 w-3" />
213
+ <span>{item.screenshots.length}</span>
214
+ </span>
215
+ ) : null}
216
+ </span>
217
+ <span className={COMPACT_CARD_META_ROW_BOX}>
218
+ <span className={COMPACT_CARD_SUMMARY}>
219
+ {item.description || COMPACT_CARD_ROW_FILLER}
220
+ </span>
221
+ </span>
222
+ </span>
223
+ </>
224
+ )
225
+ if (!compactHref) {
226
+ return <span className={`${COMPACT_CARD_OUTER_STATIC} ${className ?? ''}`} aria-label="No link available">{body}</span>
227
+ }
228
+ return (
229
+ <a href={compactHref} target={target} rel={rel} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
230
+ {body}
231
+ </a>
232
+ )
233
+ }
234
+
235
+ return (
236
+ <div className={`bg-ods-card border border-ods-border rounded-[6px] p-[24px] flex flex-col gap-[16px] hover:border-ods-accent transition-all h-full ${className ?? ''}`}>
237
+ <div className="flex gap-[16px] items-center w-full">
238
+ <div className="w-16 h-16 rounded-lg flex items-center justify-center flex-shrink-0 bg-ods-bg border border-ods-border">
239
+ {iconSrc ? (
240
+ <Image
241
+ src={iconSrc}
242
+ alt={`${item.title} logo`}
243
+ width={40}
244
+ height={40}
245
+ unoptimized
246
+ className="object-contain p-1"
247
+ />
248
+ ) : (
249
+ <span className="text-xs font-medium uppercase text-ods-text-secondary">
250
+ {item.title?.substring(0, 2) || '??'}
251
+ </span>
252
+ )}
253
+ </div>
254
+
255
+ <div className="flex-1 min-w-0 flex flex-col">
256
+ <div className="min-h-[48px] flex items-center">
257
+ <h3 className="text-h3 text-ods-text-primary tracking-[-0.36px] flex-1 line-clamp-2">
258
+ {item.title}
259
+ </h3>
260
+ </div>
261
+ <div className="min-h-[20px] flex items-center">
262
+ <p className="text-h5 text-ods-text-secondary uppercase tracking-[-0.28px] truncate">
263
+ {item.quarter}, {item.id}
264
+ </p>
265
+ </div>
266
+ </div>
267
+
268
+ <div className="hidden md:block">
269
+ <StatusBadge
270
+ text={item.status.toUpperCase()}
271
+ colorScheme={getStatusColorScheme(item.status)}
272
+ className="border border-ods-border"
273
+ />
274
+ </div>
275
+ </div>
276
+
277
+ <div className="md:hidden">
278
+ <StatusBadge
279
+ text={item.status.toUpperCase()}
280
+ colorScheme={getStatusColorScheme(item.status)}
281
+ className="border border-ods-border"
282
+ />
283
+ </div>
284
+
285
+ <div className="min-h-[72px] flex items-center">
286
+ <p className="text-h4 text-ods-text-secondary line-clamp-3">
287
+ {item.description || ''}
288
+ </p>
289
+ </div>
290
+
291
+ <div className="flex-1" />
292
+
293
+ <div className="flex items-center justify-between w-full">
294
+ {onVote && (
295
+ <div className="bg-ods-card border border-ods-border h-[48px] rounded-[6px] flex overflow-hidden">
296
+ <RoadmapVoteButton
297
+ voteType="up"
298
+ count={item.upvotes}
299
+ color="var(--color-text-secondary)"
300
+ className="rounded-none"
301
+ isActive={userVote === 'up'}
302
+ onClick={() => onVote('up')}
303
+ disabled={isVoting}
304
+ />
305
+ <RoadmapVoteButton
306
+ voteType="down"
307
+ count={item.downvotes}
308
+ className="rounded-none"
309
+ color="var(--color-text-secondary)"
310
+ isActive={userVote === 'down'}
311
+ onClick={() => onVote('down')}
312
+ disabled={isVoting}
313
+ />
314
+ </div>
315
+ )}
316
+
317
+ <div className="flex items-center gap-2">
318
+ {item.screenshots && item.screenshots.length > 0 && (
319
+ <Button
320
+ variant="outline"
321
+ size="small-legacy"
322
+ onClick={() => setShowScreenshots(true)}
323
+ leftIcon={<ImageIcon className="w-5 h-5" />}
324
+ />
325
+ )}
326
+ {(() => {
327
+ const figmaSafe = safeHref(item.figmaUrl)
328
+ return figmaSafe ? (
329
+ <Button
330
+ variant="outline"
331
+ size="small-legacy"
332
+ openInNewTab
333
+ href={figmaSafe}
334
+ leftIcon={<FigmaIcon className="w-5 h-5" />}
335
+ />
336
+ ) : null
337
+ })()}
338
+ {item.targetVersion && (
339
+ <StatusBadge
340
+ text={`${item.targetVersion} VERSION`}
341
+ className="border border-ods-border"
342
+ />
343
+ )}
344
+ </div>
345
+ </div>
346
+
347
+ {item.screenshots && item.screenshots.length > 0 && (
348
+ <ImageGalleryModal
349
+ images={item.screenshots}
350
+ isOpen={showScreenshots}
351
+ onClose={() => setShowScreenshots(false)}
352
+ />
353
+ )}
354
+ </div>
355
+ )
356
+ }
@@ -0,0 +1,54 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * RoadmapVoteButton — small thumbs-up / thumbs-down vote button used by
5
+ * `RoadmapCard`'s `default` variant. Pure presentation; click handler
6
+ * comes from the parent (typically a `useRoadmapVoting` hook).
7
+ */
8
+
9
+ import React from 'react'
10
+ import { ThumbsUpIcon } from '../../icons/thumbs-up-icon'
11
+ import { ThumbsDownIcon } from '../../icons/thumbs-down-icon'
12
+ import { Button } from '../../ui/button/button'
13
+ import { cn } from '../../../utils/cn'
14
+
15
+ export interface RoadmapVoteButtonProps {
16
+ voteType: 'up' | 'down'
17
+ count: number
18
+ isActive: boolean
19
+ onClick: () => void
20
+ disabled?: boolean
21
+ showCount?: boolean
22
+ color?: string
23
+ className?: string
24
+ }
25
+
26
+ export function RoadmapVoteButton({
27
+ voteType,
28
+ count,
29
+ isActive,
30
+ onClick,
31
+ disabled = false,
32
+ showCount = true,
33
+ color,
34
+ className,
35
+ }: RoadmapVoteButtonProps) {
36
+ const Icon = voteType === 'up' ? ThumbsUpIcon : ThumbsDownIcon
37
+ return (
38
+ <Button
39
+ variant="outline"
40
+ onClick={onClick}
41
+ disabled={disabled}
42
+ leftIcon={<Icon className="w-5 h-5" color={color} />}
43
+ className={cn(
44
+ className,
45
+ 'bg-ods-bg border-0 border-ods-border flex gap-[2px] items-center justify-center p-[12px] h-full',
46
+ 'disabled:cursor-not-allowed disabled:opacity-50',
47
+ 'hover:bg-ods-border transition-all',
48
+ isActive && 'bg-ods-border',
49
+ )}
50
+ >
51
+ {showCount && <span className="text-sm">{count}</span>}
52
+ </Button>
53
+ )
54
+ }
@@ -0,0 +1,182 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * Slack Message Card — unified visual for slack-messages markers.
5
+ *
6
+ * PURE PRESENTATION (no internal nav). The card receives the structured
7
+ * `<a>` prop bundle via `anchorProps` (composed by the caller from a
8
+ * runtime hook) and renders the rest from the `SlackMessageItem` shape
9
+ * directly.
10
+ */
11
+
12
+ import React from 'react'
13
+ import { SlackIcon } from '../../icons/slack-icon'
14
+ import { ExternalLink, Hash } from 'lucide-react'
15
+ import {
16
+ COMPACT_CARD_ICON_SLOT,
17
+ COMPACT_CARD_META_ROW,
18
+ COMPACT_CARD_META_ROW_BOX,
19
+ COMPACT_CARD_OUTER,
20
+ COMPACT_CARD_OUTER_STATIC,
21
+ COMPACT_CARD_ROW_FILLER,
22
+ COMPACT_CARD_SKELETON_IMAGE_SLOT,
23
+ COMPACT_CARD_SKELETON_OUTER,
24
+ COMPACT_CARD_SUMMARY,
25
+ COMPACT_CARD_TEXT_COL,
26
+ COMPACT_CARD_TITLE,
27
+ COMPACT_CARD_TITLE_ROW,
28
+ safeHref,
29
+ } from '../utils/compact-card-classes'
30
+ import { formatDateUTC as formatDate } from '../../../utils/format'
31
+ import type { SlackMessageItem } from '../types/entities/slack-message'
32
+
33
+ export interface SlackMessageCardAnchorProps {
34
+ href: string
35
+ target?: '_blank'
36
+ rel?: 'noopener noreferrer'
37
+ onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void
38
+ }
39
+
40
+ export interface SlackMessageCardProps {
41
+ item: SlackMessageItem
42
+ variant?: 'row' | 'compact'
43
+ className?: string
44
+ anchorProps?: SlackMessageCardAnchorProps
45
+ }
46
+
47
+ function parseChannelFromUrl(url: string | null | undefined): string | null {
48
+ if (!url) return null
49
+ try {
50
+ const u = new URL(url)
51
+ if (!u.host.endsWith('.slack.com')) return null
52
+ const parts = u.pathname.split('/').filter(Boolean)
53
+ const archivesIdx = parts.indexOf('archives')
54
+ if (archivesIdx !== -1 && parts.length > archivesIdx + 1) return parts[archivesIdx + 1]
55
+ } catch {
56
+ /* malformed URL */
57
+ }
58
+ return null
59
+ }
60
+
61
+ export function SlackMessageCard({ item, variant = 'compact', className, anchorProps }: SlackMessageCardProps) {
62
+ const channel = item.channel ?? parseChannelFromUrl(item.url) ?? null
63
+ const dateText = formatDate(item.dateUpdated, { fallback: '', timezone: 'local' })
64
+
65
+ if (variant === 'row') {
66
+ return (
67
+ <div className={`flex items-center gap-3 min-w-0 ${className ?? ''}`}>
68
+ <SlackIcon className="h-3.5 w-3.5 shrink-0" />
69
+ <span className="text-ods-text-primary text-sm font-medium truncate max-w-[180px] shrink-0">{item.title}</span>
70
+ {item.preview ? (
71
+ <span className="text-ods-text-secondary text-sm flex-1 min-w-0 truncate">{item.preview}</span>
72
+ ) : null}
73
+ {channel ? (
74
+ <span className="font-mono text-[11px] text-ods-text-secondary truncate max-w-[140px] shrink-0">
75
+ <Hash className="inline h-3 w-3" />
76
+ {channel}
77
+ </span>
78
+ ) : null}
79
+ {dateText ? (
80
+ <span className="text-ods-text-secondary text-xs w-24 shrink-0 text-right">{dateText}</span>
81
+ ) : null}
82
+ </div>
83
+ )
84
+ }
85
+
86
+ const metaParts: React.ReactNode[] = []
87
+ if (channel) {
88
+ metaParts.push(
89
+ <span key="channel" className="flex items-center gap-0.5 min-w-0">
90
+ <Hash className="h-3 w-3 shrink-0" />
91
+ <span className="truncate font-mono">{channel}</span>
92
+ </span>,
93
+ )
94
+ }
95
+ if (dateText) metaParts.push(<span key="date" className="whitespace-nowrap">{dateText}</span>)
96
+
97
+ const href = safeHref(item.url)
98
+ const body = (
99
+ <>
100
+ <span className={COMPACT_CARD_ICON_SLOT}>
101
+ <SlackIcon className="h-5 w-5" />
102
+ </span>
103
+ <span className={COMPACT_CARD_TEXT_COL}>
104
+ <span className={COMPACT_CARD_TITLE_ROW}>
105
+ <span className={COMPACT_CARD_TITLE}>{item.title}</span>
106
+ </span>
107
+ <span className={COMPACT_CARD_META_ROW_BOX}>
108
+ <span className={COMPACT_CARD_SUMMARY}>
109
+ {item.preview || COMPACT_CARD_ROW_FILLER}
110
+ </span>
111
+ </span>
112
+ <span className={COMPACT_CARD_META_ROW_BOX}>
113
+ <span className={COMPACT_CARD_META_ROW}>
114
+ {metaParts.length > 0 ? metaParts.map((part, i) => (
115
+ <React.Fragment key={i}>
116
+ {i > 0 ? <span className="text-ods-text-secondary/40 shrink-0">·</span> : null}
117
+ <span className="min-w-0 truncate">{part}</span>
118
+ </React.Fragment>
119
+ )) : <span className={COMPACT_CARD_SUMMARY}>{COMPACT_CARD_ROW_FILLER}</span>}
120
+ </span>
121
+ </span>
122
+ </span>
123
+ {href ? (
124
+ <span className="flex shrink-0 items-center self-start h-5 text-ods-text-secondary">
125
+ <ExternalLink className="w-3.5 h-3.5" />
126
+ </span>
127
+ ) : null}
128
+ </>
129
+ )
130
+ if (anchorProps) {
131
+ return (
132
+ <a {...anchorProps} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
133
+ {body}
134
+ </a>
135
+ )
136
+ }
137
+ return href ? (
138
+ <a
139
+ href={href}
140
+ target="_blank"
141
+ rel="noopener noreferrer"
142
+ className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}
143
+ >
144
+ {body}
145
+ </a>
146
+ ) : (
147
+ <span className={`${COMPACT_CARD_OUTER_STATIC} ${className ?? ''}`} aria-label="No link available">{body}</span>
148
+ )
149
+ }
150
+
151
+ export function SlackMessageCardSkeleton({ variant = 'compact', className }: { variant?: 'row' | 'compact'; className?: string }) {
152
+ if (variant === 'row') {
153
+ return (
154
+ <div className={`flex items-center gap-3 min-w-0 animate-pulse ${className ?? ''}`}>
155
+ <div className="h-3.5 w-3.5 rounded bg-ods-bg shrink-0" />
156
+ <div className="h-3 w-32 bg-ods-bg rounded shrink-0" />
157
+ <div className="h-3 w-2/3 bg-ods-bg/60 rounded flex-1" />
158
+ <div className="h-3 w-24 bg-ods-bg/60 rounded shrink-0" />
159
+ <div className="h-3 w-20 bg-ods-bg/60 rounded shrink-0" />
160
+ </div>
161
+ )
162
+ }
163
+ return (
164
+ <span className={`${COMPACT_CARD_SKELETON_OUTER} ${className ?? ''}`}>
165
+ <span className={COMPACT_CARD_SKELETON_IMAGE_SLOT} />
166
+ <span className={COMPACT_CARD_TEXT_COL}>
167
+ <span className={COMPACT_CARD_TITLE_ROW}>
168
+ <span className="h-3.5 w-2/3 rounded bg-ods-bg" />
169
+ </span>
170
+ <span className={COMPACT_CARD_META_ROW_BOX}>
171
+ <span className="h-3 w-5/6 rounded bg-ods-bg/60" />
172
+ </span>
173
+ <span className={COMPACT_CARD_META_ROW_BOX}>
174
+ <span className="h-3 w-1/3 rounded bg-ods-bg/70" />
175
+ </span>
176
+ </span>
177
+ <span className="flex shrink-0 items-center self-start h-5">
178
+ <span className="h-3.5 w-3.5 rounded bg-ods-bg" />
179
+ </span>
180
+ </span>
181
+ )
182
+ }
@@ -0,0 +1,60 @@
1
+ 'use client'
2
+
3
+ /**
4
+ * Per-type icon for a ClickUp task — driven by `custom_item_id` via the
5
+ * canonical `CUSTOM_ITEM_ID` map in `../utils/clickup-task-type-utils`.
6
+ *
7
+ * Used by the roadmap entity card so the icon slot communicates the
8
+ * task TYPE (Bug, Feature, Story, …) at a glance instead of falling
9
+ * back to a generic logo / two-letter placeholder.
10
+ */
11
+
12
+ import React from 'react'
13
+ import {
14
+ Bug,
15
+ Inbox,
16
+ Sparkles,
17
+ BookOpen,
18
+ Trophy,
19
+ Component,
20
+ Flag,
21
+ Goal,
22
+ ListTodo,
23
+ CheckSquare,
24
+ FileText,
25
+ Repeat,
26
+ Compass,
27
+ type LucideIcon,
28
+ } from 'lucide-react'
29
+ import { CUSTOM_ITEM_ID } from '../utils/clickup-task-type-utils'
30
+
31
+ function iconFor(customItemId: number | null | undefined): LucideIcon {
32
+ switch (customItemId) {
33
+ case CUSTOM_ITEM_ID.BUG: return Bug
34
+ case CUSTOM_ITEM_ID.REQUEST: return Inbox
35
+ case CUSTOM_ITEM_ID.FEATURE: return Sparkles
36
+ case CUSTOM_ITEM_ID.STORY: return BookOpen
37
+ case CUSTOM_ITEM_ID.EPIC: return Trophy
38
+ case CUSTOM_ITEM_ID.COMPONENT: return Component
39
+ case CUSTOM_ITEM_ID.INITIATIVE: return Flag
40
+ case CUSTOM_ITEM_ID.MILESTONE: return Goal
41
+ case CUSTOM_ITEM_ID.SUBTASK: return ListTodo
42
+ case CUSTOM_ITEM_ID.FORM: return FileText
43
+ case CUSTOM_ITEM_ID.RECURRING: return Repeat
44
+ case CUSTOM_ITEM_ID.PLAN: return Compass
45
+ case CUSTOM_ITEM_ID.STRATEGY: return Compass
46
+ case CUSTOM_ITEM_ID.TASK:
47
+ default:
48
+ return CheckSquare
49
+ }
50
+ }
51
+
52
+ export interface TaskTypeIconProps {
53
+ customItemId: number | null | undefined
54
+ className?: string
55
+ }
56
+
57
+ export function TaskTypeIcon({ customItemId, className = 'h-5 w-5' }: TaskTypeIconProps) {
58
+ const Icon = iconFor(customItemId)
59
+ return <Icon className={className} aria-hidden="true" />
60
+ }
@@ -5,3 +5,25 @@ export * from './use-collapsible'
5
5
  export * from './use-jetstream-dialog-subscription'
6
6
  export * from './use-nats-dialog-subscription'
7
7
  export * from './use-realtime-chunk-processor'
8
+
9
+ // Chat hooks migrated from hub `hooks/*` (Task #7).
10
+ export * from './use-slash-commands'
11
+ export * from './use-chat-attachments'
12
+ export * from './use-chat-attachment-image-gallery'
13
+ export * from './use-chat-identity'
14
+ export * from './use-chat-card-item'
15
+ export * from './use-close-on-navigation'
16
+
17
+ // useChat + useSSE — ported from hub `hooks/useChat.ts` + `hooks/useSSE.ts`
18
+ // minus the MockChatService + useChatConfig dependencies (which stay in
19
+ // hub-only code). `useEmbeddedChat` is the runtime-driven refactor of
20
+ // the hub's `useDocChat`.
21
+ export * from './use-chat'
22
+ export * from './use-sse'
23
+ export * from './use-embedded-chat'
24
+
25
+ // useProxiedImageUrl — runtime-driven hook wrapping pure
26
+ // `getProxiedImageUrl`. Reads proxy prefix + skip-domain list from
27
+ // `ChatRuntime.endpoints`, so hub vs. embedders share one image-proxy
28
+ // resolver.
29
+ export * from './use-proxied-image-url'