@flamingo-stack/openframe-frontend-core 0.0.481 → 0.0.482

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 (838) hide show
  1. package/dist/{chunk-H6DFCF44.cjs → chunk-22AED5IC.cjs} +82 -82
  2. package/dist/{chunk-H6DFCF44.cjs.map → chunk-22AED5IC.cjs.map} +1 -1
  3. package/dist/{chunk-MGKCS6KS.js → chunk-3WCARCI4.js} +2 -2
  4. package/dist/{chunk-LNKWY74S.cjs → chunk-4HL6UENH.cjs} +5 -5
  5. package/dist/{chunk-LNKWY74S.cjs.map → chunk-4HL6UENH.cjs.map} +1 -1
  6. package/dist/{chunk-Y3Y2DLNO.js → chunk-6UGYBCEN.js} +3 -3
  7. package/dist/{chunk-BBUEY73L.js → chunk-7I5B5PQ4.js} +6269 -5339
  8. package/dist/chunk-7I5B5PQ4.js.map +1 -0
  9. package/dist/{chunk-PSPWT2Q5.js → chunk-7LWXWXEY.js} +4 -4
  10. package/dist/{chunk-M7O74OWG.cjs → chunk-ACOU5YJI.cjs} +31 -31
  11. package/dist/{chunk-M7O74OWG.cjs.map → chunk-ACOU5YJI.cjs.map} +1 -1
  12. package/dist/{chunk-INDFIVDV.cjs → chunk-AHGSN4AT.cjs} +12 -12
  13. package/dist/{chunk-INDFIVDV.cjs.map → chunk-AHGSN4AT.cjs.map} +1 -1
  14. package/dist/{chunk-VTSRDC4W.js → chunk-CKC3EAYT.js} +2 -2
  15. package/dist/{chunk-SASR7SK5.js → chunk-GZK7FWJJ.js} +20 -4
  16. package/dist/chunk-GZK7FWJJ.js.map +1 -0
  17. package/dist/{chunk-ZRANZNEA.js → chunk-JJE5TUZK.js} +2 -2
  18. package/dist/{chunk-66BNAFO6.js → chunk-JQIUBFHL.js} +4 -4
  19. package/dist/{chunk-MMCBQJKE.cjs → chunk-KUBJHB6I.cjs} +11 -11
  20. package/dist/{chunk-MMCBQJKE.cjs.map → chunk-KUBJHB6I.cjs.map} +1 -1
  21. package/dist/{chunk-ZV6E3U3C.cjs → chunk-MRGTMMJ3.cjs} +30 -30
  22. package/dist/{chunk-ZV6E3U3C.cjs.map → chunk-MRGTMMJ3.cjs.map} +1 -1
  23. package/dist/{chunk-OZJN54R5.cjs → chunk-NWVKG7QC.cjs} +37 -37
  24. package/dist/{chunk-OZJN54R5.cjs.map → chunk-NWVKG7QC.cjs.map} +1 -1
  25. package/dist/{chunk-AN47EIIJ.cjs → chunk-PHTSSHIQ.cjs} +59 -59
  26. package/dist/{chunk-AN47EIIJ.cjs.map → chunk-PHTSSHIQ.cjs.map} +1 -1
  27. package/dist/{chunk-N2JZ33V7.cjs → chunk-RUA3OXSJ.cjs} +26 -26
  28. package/dist/{chunk-N2JZ33V7.cjs.map → chunk-RUA3OXSJ.cjs.map} +1 -1
  29. package/dist/{chunk-LK623WCC.cjs → chunk-RZPF7MJ2.cjs} +9 -9
  30. package/dist/{chunk-LK623WCC.cjs.map → chunk-RZPF7MJ2.cjs.map} +1 -1
  31. package/dist/{chunk-G3UN2DXU.cjs → chunk-STYA77PH.cjs} +20 -4
  32. package/dist/chunk-STYA77PH.cjs.map +1 -0
  33. package/dist/{chunk-JUJY3HQS.cjs → chunk-U37UTLP7.cjs} +19 -19
  34. package/dist/{chunk-JUJY3HQS.cjs.map → chunk-U37UTLP7.cjs.map} +1 -1
  35. package/dist/{chunk-2DIOV7BR.js → chunk-UPN6EFOM.js} +4 -4
  36. package/dist/{chunk-OWMLWJQY.cjs → chunk-VPVOJD5X.cjs} +2432 -1502
  37. package/dist/chunk-VPVOJD5X.cjs.map +1 -0
  38. package/dist/{chunk-4SMRQ4SN.js → chunk-WBL5Y4PS.js} +3 -3
  39. package/dist/{chunk-FP4H6Y5O.js → chunk-WPYPSIY2.js} +3 -3
  40. package/dist/{chunk-R5WJJL4V.js → chunk-X5X43HFV.js} +5 -5
  41. package/dist/{chunk-DEHZ5CTC.js → chunk-XTWKDMCG.js} +2 -2
  42. package/dist/components/case-studies/index.cjs +9 -9
  43. package/dist/components/case-studies/index.js +3 -3
  44. package/dist/components/chat/index.cjs +3 -3
  45. package/dist/components/chat/index.js +2 -2
  46. package/dist/components/contact/index.cjs +4 -4
  47. package/dist/components/contact/index.js +3 -3
  48. package/dist/components/docs/index.cjs +6 -6
  49. package/dist/components/docs/index.js +5 -5
  50. package/dist/components/embeds/index.cjs +4 -4
  51. package/dist/components/embeds/index.js +3 -3
  52. package/dist/components/faq/index.cjs +4 -4
  53. package/dist/components/faq/index.js +3 -3
  54. package/dist/components/features/captions-url.cjs +12 -0
  55. package/dist/components/features/captions-url.cjs.map +1 -0
  56. package/dist/components/features/captions-url.js +10 -0
  57. package/dist/components/features/captions-url.js.map +1 -0
  58. package/dist/components/features/card-hit-layer.d.ts +40 -0
  59. package/dist/components/features/card-hit-layer.d.ts.map +1 -0
  60. package/dist/components/features/floating-walkthrough-video.d.ts +71 -0
  61. package/dist/components/features/floating-walkthrough-video.d.ts.map +1 -0
  62. package/dist/components/features/index.cjs +11 -3
  63. package/dist/components/features/index.cjs.map +1 -1
  64. package/dist/components/features/index.d.ts +4 -0
  65. package/dist/components/features/index.d.ts.map +1 -1
  66. package/dist/components/features/index.js +12 -4
  67. package/dist/components/features/use-walkthrough-video.d.ts +16 -0
  68. package/dist/components/features/use-walkthrough-video.d.ts.map +1 -0
  69. package/dist/components/features/video-bites-strip.d.ts.map +1 -1
  70. package/dist/components/features/video-center-badge.d.ts.map +1 -1
  71. package/dist/components/features/video-hover-preview.d.ts +68 -0
  72. package/dist/components/features/video-hover-preview.d.ts.map +1 -0
  73. package/dist/components/features/video.d.ts +78 -40
  74. package/dist/components/features/video.d.ts.map +1 -1
  75. package/dist/components/form.d.ts +0 -1
  76. package/dist/components/form.d.ts.map +1 -1
  77. package/dist/components/help-center-pages/index.cjs +21 -21
  78. package/dist/components/help-center-pages/index.js +12 -12
  79. package/dist/components/index.cjs +163 -155
  80. package/dist/components/index.cjs.map +1 -1
  81. package/dist/components/index.js +18 -10
  82. package/dist/components/index.js.map +1 -1
  83. package/dist/components/navigation/index.cjs +3 -3
  84. package/dist/components/navigation/index.js +2 -2
  85. package/dist/components/onboarding-guides/index.cjs +6 -6
  86. package/dist/components/onboarding-guides/index.js +5 -5
  87. package/dist/components/related-content/index.cjs +4 -4
  88. package/dist/components/related-content/index.js +3 -3
  89. package/dist/components/tickets/index.cjs +6 -6
  90. package/dist/components/tickets/index.js +5 -5
  91. package/dist/components/ui/button/button-styles.d.ts +2 -0
  92. package/dist/components/ui/button/button-styles.d.ts.map +1 -1
  93. package/dist/components/ui/button/button.d.ts +2 -2
  94. package/dist/components/ui/button/button.d.ts.map +1 -1
  95. package/dist/components/ui/file-manager/index.cjs +50 -50
  96. package/dist/components/ui/file-manager/index.js +1 -1
  97. package/dist/components/ui/index.cjs +3 -3
  98. package/dist/components/ui/index.js +2 -2
  99. package/dist/components/ui/page-actions.d.ts +2 -1
  100. package/dist/components/ui/page-actions.d.ts.map +1 -1
  101. package/dist/index.cjs +27 -3
  102. package/dist/index.cjs.map +1 -1
  103. package/dist/index.js +28 -4
  104. package/dist/types/supabase.d.ts +80 -0
  105. package/dist/types/supabase.d.ts.map +1 -1
  106. package/dist/types/video-processing.d.ts +1 -1
  107. package/dist/types/video-processing.d.ts.map +1 -1
  108. package/dist/utils/announcement-storage.d.ts +1 -1
  109. package/dist/utils/announcement-storage.d.ts.map +1 -1
  110. package/dist/utils/dismiss-cookie.d.ts +27 -0
  111. package/dist/utils/dismiss-cookie.d.ts.map +1 -0
  112. package/dist/utils/dismissal-storage.d.ts +19 -0
  113. package/dist/utils/dismissal-storage.d.ts.map +1 -0
  114. package/dist/utils/index.cjs +48 -10
  115. package/dist/utils/index.cjs.map +1 -1
  116. package/dist/utils/index.d.ts +2 -0
  117. package/dist/utils/index.d.ts.map +1 -1
  118. package/dist/utils/index.js +41 -11
  119. package/dist/utils/index.js.map +1 -1
  120. package/package.json +8 -2
  121. package/src/.index.md +39 -32
  122. package/src/.platform-domains.md +65 -0
  123. package/src/assets/.fae-avatar.md +33 -0
  124. package/src/assets/.index.md +15 -9
  125. package/src/components/.agent-mark.md +31 -0
  126. package/src/components/.announcement-bar.md +47 -35
  127. package/src/components/.calendar.md +19 -15
  128. package/src/components/.categories-cart.md +34 -30
  129. package/src/components/.category-card.md +33 -33
  130. package/src/components/.chart.md +38 -40
  131. package/src/components/.command.md +47 -23
  132. package/src/components/.comment-card.md +31 -26
  133. package/src/components/.content-loading-container.md +45 -20
  134. package/src/components/.context-menu.md +45 -31
  135. package/src/components/.date-time-picker.md +36 -30
  136. package/src/components/.empty-state.md +31 -31
  137. package/src/components/.faq-accordion.md +20 -30
  138. package/src/components/.filter-chip.md +36 -33
  139. package/src/components/.footer-waitlist-button.md +27 -21
  140. package/src/components/.footer.md +39 -24
  141. package/src/components/.form.md +32 -20
  142. package/src/components/.hero-image-uploader.md +35 -31
  143. package/src/components/.icon-display.md +53 -0
  144. package/src/components/.image-cropper.md +34 -33
  145. package/src/components/.index.md +25 -29
  146. package/src/components/.logs-list.md +27 -23
  147. package/src/components/.media-carousel.md +47 -26
  148. package/src/components/.metric-value.md +27 -24
  149. package/src/components/.msp-display.md +29 -23
  150. package/src/components/.open-source-features.md +23 -26
  151. package/src/components/.pagination.md +44 -39
  152. package/src/components/.persistent-filter-controls.md +61 -28
  153. package/src/components/.pricing-display.md +34 -33
  154. package/src/components/.results-count.md +33 -20
  155. package/src/components/.smooth-accordion.md +24 -20
  156. package/src/components/.social-icon-row.md +33 -21
  157. package/src/components/.sonner.md +40 -25
  158. package/src/components/.steps.md +39 -25
  159. package/src/components/.tool-icon.md +34 -21
  160. package/src/components/.unified-filter-logic.md +32 -36
  161. package/src/components/.user-display.md +33 -28
  162. package/src/components/.user-summary-stub.md +40 -33
  163. package/src/components/.vendor-display-button.md +17 -15
  164. package/src/components/.vendor-icon.md +17 -25
  165. package/src/components/.vendor-tag.md +39 -34
  166. package/src/components/.why-it-matters.md +15 -11
  167. package/src/components/.yes-no-display.md +36 -31
  168. package/src/components/authors/.author-detail-view.md +50 -0
  169. package/src/components/case-studies/.index.md +26 -0
  170. package/src/components/case-studies/.share-experience-section.md +45 -0
  171. package/src/components/chat/.approval-batch-message.md +48 -33
  172. package/src/components/chat/.approval-request-message.md +37 -26
  173. package/src/components/chat/.chat-archive-page.md +56 -0
  174. package/src/components/chat/.chat-attachment-bar.md +32 -40
  175. package/src/components/chat/.chat-composer.md +43 -0
  176. package/src/components/chat/.chat-container.md +41 -25
  177. package/src/components/chat/.chat-context-memory-bar.md +53 -0
  178. package/src/components/chat/.chat-context-picker.md +89 -0
  179. package/src/components/chat/.chat-header-icon-button.md +43 -0
  180. package/src/components/chat/.chat-header-search-field.md +51 -0
  181. package/src/components/chat/.chat-input.md +63 -30
  182. package/src/components/chat/.chat-list-empty-state.md +44 -0
  183. package/src/components/chat/.chat-message-enhanced.md +29 -31
  184. package/src/components/chat/.chat-message-list.md +34 -44
  185. package/src/components/chat/.chat-message-row.md +56 -0
  186. package/src/components/chat/.chat-message-skeleton.md +32 -26
  187. package/src/components/chat/.chat-panel-header-mobile.md +46 -0
  188. package/src/components/chat/.chat-panel-header.md +80 -0
  189. package/src/components/chat/.chat-sidebar-skeleton.md +31 -30
  190. package/src/components/chat/.chat-sidebar.md +36 -29
  191. package/src/components/chat/.chat-ticket-list.md +38 -23
  192. package/src/components/chat/.chat-typing-indicator.md +37 -19
  193. package/src/components/chat/.context-compaction-display.md +19 -15
  194. package/src/components/chat/.context-items-list.md +57 -0
  195. package/src/components/chat/.embeddable-chat.md +57 -66
  196. package/src/components/chat/.error-message-display.md +40 -22
  197. package/src/components/chat/.guide-mode-banner.md +41 -0
  198. package/src/components/chat/.guide-welcome.md +43 -0
  199. package/src/components/chat/.index.md +26 -21
  200. package/src/components/chat/.mingo-chat-history.md +63 -0
  201. package/src/components/chat/.mingo-chat-modals.md +44 -0
  202. package/src/components/chat/.mingo-history-rail.md +63 -0
  203. package/src/components/chat/.mingo-info-card.md +59 -0
  204. package/src/components/chat/.mingo-onboarding-card.md +21 -27
  205. package/src/components/chat/.mingo-welcome.md +60 -0
  206. package/src/components/chat/.model-display.md +33 -25
  207. package/src/components/chat/.msp-organization-card-skeleton.md +44 -0
  208. package/src/components/chat/.msp-organization-card.md +51 -0
  209. package/src/components/chat/.nav-link-anchor-via-runtime.md +36 -25
  210. package/src/components/chat/.quick-action-chip.md +60 -0
  211. package/src/components/chat/.quick-action-marquee.md +53 -0
  212. package/src/components/chat/.quick-action-wall.md +68 -0
  213. package/src/components/chat/.remark-mention-chips.md +41 -0
  214. package/src/components/chat/.slash-command-suggestions.md +30 -36
  215. package/src/components/chat/.source-action-button.md +28 -25
  216. package/src/components/chat/.tool-call-blocks.md +18 -30
  217. package/src/components/chat/.tool-execution-display.md +29 -34
  218. package/src/components/chat/entity-cards/.admin-content-card.md +29 -22
  219. package/src/components/chat/entity-cards/.blog-card.md +44 -33
  220. package/src/components/chat/entity-cards/.blog-image-placeholder.md +20 -18
  221. package/src/components/chat/entity-cards/.case-study-card.md +24 -33
  222. package/src/components/chat/entity-cards/.chat-ticket-item.md +39 -22
  223. package/src/components/chat/entity-cards/.customer-interview-card.md +29 -32
  224. package/src/components/chat/entity-cards/.data-room-doc-card.md +21 -22
  225. package/src/components/chat/entity-cards/.dispatch.md +41 -24
  226. package/src/components/chat/entity-cards/.entity-author-card.md +36 -33
  227. package/src/components/chat/entity-cards/.entity-portrait-card.md +47 -0
  228. package/src/components/chat/entity-cards/.generic-entity-card.md +26 -25
  229. package/src/components/chat/entity-cards/.github-activity-card.md +35 -41
  230. package/src/components/chat/entity-cards/.hubspot-ticket-card.md +22 -28
  231. package/src/components/chat/entity-cards/.index.md +33 -44
  232. package/src/components/chat/entity-cards/.investor-update-card.md +36 -25
  233. package/src/components/chat/entity-cards/.onboarding-guide-card.md +20 -29
  234. package/src/components/chat/entity-cards/.product-release-card-defaults.md +26 -19
  235. package/src/components/chat/entity-cards/.program-card.md +30 -33
  236. package/src/components/chat/entity-cards/.roadmap-card.md +40 -31
  237. package/src/components/chat/entity-cards/.roadmap-vote-button.md +33 -36
  238. package/src/components/chat/entity-cards/.slack-message-card.md +31 -32
  239. package/src/components/chat/entity-cards/.use-cover-image-fallback.md +47 -0
  240. package/src/components/chat/entity-cards/.use-entity-card-link.md +51 -0
  241. package/src/components/chat/entity-cards/.use-entity-card-placeholder.md +47 -0
  242. package/src/components/chat/entity-cards/.what-i-shipped-card.md +43 -0
  243. package/src/components/chat/hooks/.index.md +33 -30
  244. package/src/components/chat/hooks/.use-chat-card-item.md +30 -17
  245. package/src/components/chat/hooks/.use-chat-dialog-manager.md +59 -0
  246. package/src/components/chat/hooks/.use-chat-identity.md +37 -25
  247. package/src/components/chat/hooks/.use-chunk-catchup.md +53 -36
  248. package/src/components/chat/hooks/.use-empty-state-config.md +39 -0
  249. package/src/components/chat/hooks/.use-jetstream-dialog-subscription.md +65 -30
  250. package/src/components/chat/hooks/.use-nats-chat-adapter.md +55 -36
  251. package/src/components/chat/hooks/.use-nats-dialog-subscription.md +66 -50
  252. package/src/components/chat/hooks/.use-realtime-chunk-processor.md +58 -31
  253. package/src/components/chat/hooks/.use-scripted-stream.md +46 -0
  254. package/src/components/chat/hooks/.use-slash-commands.md +32 -25
  255. package/src/components/chat/hooks/.use-sse-chat-adapter.md +32 -21
  256. package/src/components/chat/hooks/.use-unified-chat.md +45 -35
  257. package/src/components/chat/types/.api.types.md +49 -41
  258. package/src/components/chat/types/.chat.types.md +56 -34
  259. package/src/components/chat/types/.component.types.md +36 -36
  260. package/src/components/chat/types/.context-item.types.md +61 -0
  261. package/src/components/chat/types/.index.md +32 -17
  262. package/src/components/chat/types/.message.types.md +44 -45
  263. package/src/components/chat/types/.network.types.md +46 -46
  264. package/src/components/chat/types/.processing.types.md +49 -37
  265. package/src/components/chat/types/.unified-chat-state.types.md +41 -26
  266. package/src/components/chat/types/entities/.content-ref.md +20 -31
  267. package/src/components/chat/types/entities/.investor-update.md +14 -16
  268. package/src/components/chat/types/entities/.onboarding-guide.md +35 -34
  269. package/src/components/chat/types/entities/.program-types.md +55 -43
  270. package/src/components/chat/utils/.chip-action-class.md +17 -19
  271. package/src/components/chat/utils/.chip-styles.md +18 -18
  272. package/src/components/chat/utils/.chunk-parser.md +48 -37
  273. package/src/components/chat/utils/.compact-card-classes.md +33 -35
  274. package/src/components/chat/utils/.execute-navigation.md +49 -0
  275. package/src/components/chat/utils/.extract-incomplete-message-state.md +9 -12
  276. package/src/components/chat/utils/.history-merge.md +65 -0
  277. package/src/components/chat/utils/.icon-library.md +33 -31
  278. package/src/components/chat/utils/.icon-registry.md +44 -0
  279. package/src/components/chat/utils/.index.md +37 -33
  280. package/src/components/chat/utils/.is-cross-origin-url.md +26 -22
  281. package/src/components/chat/utils/.message-segment-accumulator.md +46 -25
  282. package/src/components/chat/utils/.nav-anchor-props.md +29 -34
  283. package/src/components/chat/utils/.nav-click-handler.md +29 -33
  284. package/src/components/chat/utils/.process-historical-messages.md +29 -33
  285. package/src/components/chat/utils/.scripted-stream.md +52 -0
  286. package/src/components/chat/utils/.source-row-cta.md +32 -31
  287. package/src/components/chat/utils/.tool-call-helpers.md +25 -17
  288. package/src/components/contact/.contact-form.md +24 -19
  289. package/src/components/docs/.doc-navigation-context.md +49 -0
  290. package/src/components/docs/.doc-viewer.md +64 -0
  291. package/src/components/docs/.docs-hub-page.md +49 -0
  292. package/src/components/docs/.index.md +51 -0
  293. package/src/components/docs/.skeletons.md +47 -0
  294. package/src/components/docs/.use-docs-resolve-link.md +61 -0
  295. package/src/components/docs/.use-document-tree.md +83 -0
  296. package/src/components/docs/.use-scroll-spy.md +58 -0
  297. package/src/components/embeds/.embed-container.md +45 -0
  298. package/src/components/embeds/.embed-iframe.md +51 -0
  299. package/src/components/embeds/.figma-embed.md +43 -0
  300. package/src/components/embeds/.file-download-card.md +47 -0
  301. package/src/components/embeds/.google-sheets-viewer.md +40 -0
  302. package/src/components/embeds/.index.md +58 -0
  303. package/src/components/embeds/.linkedin-embed-client.md +50 -0
  304. package/src/components/embeds/.markdown-image.md +40 -0
  305. package/src/components/embeds/.og-link-preview.md +54 -0
  306. package/src/components/embeds/.pdf-viewer.md +43 -0
  307. package/src/components/embeds/.reddit-embed-client.md +40 -0
  308. package/src/components/embeds/.rich-markdown-runtime.md +53 -0
  309. package/src/components/embeds/.twitter-embed-client.md +44 -0
  310. package/src/components/faq/.faq-document-page.md +68 -0
  311. package/src/components/faq/.faq-section.md +55 -0
  312. package/src/components/faq/.index.md +29 -0
  313. package/src/components/faq/.json-ld.md +48 -0
  314. package/src/components/features/.array-entry-manager.md +32 -24
  315. package/src/components/features/.auth-providers-list.md +33 -32
  316. package/src/components/features/.captions-url.md +43 -0
  317. package/src/components/features/.cards-strip.md +48 -0
  318. package/src/components/features/.changelog-manager.md +17 -20
  319. package/src/components/features/.command-box.md +11 -16
  320. package/src/components/features/.entity-summary-editor.md +20 -15
  321. package/src/components/features/.entity-tag-badges.md +43 -0
  322. package/src/components/features/.entity-video-section.md +31 -41
  323. package/src/components/features/.figma-prototype-viewer.md +55 -37
  324. package/src/components/features/.filters-dropdown.md +14 -13
  325. package/src/components/features/.highlight-config-section.md +19 -16
  326. package/src/components/features/.highlight-video-combined-section.md +28 -19
  327. package/src/components/features/.highlight-video-preview.md +13 -11
  328. package/src/components/features/.highlight-video-section.md +26 -22
  329. package/src/components/features/.index.md +40 -36
  330. package/src/components/features/.media-gallery-manager.md +37 -35
  331. package/src/components/features/.mux-origins.md +46 -0
  332. package/src/components/features/.og-editor-preview.md +29 -24
  333. package/src/components/features/.os-type-badge-group.md +26 -18
  334. package/src/components/features/.os-type-badge.md +41 -24
  335. package/src/components/features/.paths-display.md +42 -25
  336. package/src/components/features/.platform-badge.md +26 -17
  337. package/src/components/features/.policy-configuration-panel.md +33 -31
  338. package/src/components/features/.provider-button.md +29 -20
  339. package/src/components/features/.push-button-selector.md +39 -41
  340. package/src/components/features/.release-media-manager.md +41 -34
  341. package/src/components/features/.section-selector.md +27 -16
  342. package/src/components/features/.select-button.md +21 -32
  343. package/src/components/features/.seo-editor-preview.md +49 -36
  344. package/src/components/features/.social-links-manager.md +40 -18
  345. package/src/components/features/.start-with-openframe-button.md +30 -32
  346. package/src/components/features/.status-filter-component.md +29 -38
  347. package/src/components/features/.tags-selector.md +25 -29
  348. package/src/components/features/.transcript-summary-editor.md +24 -18
  349. package/src/components/features/.use-video-warmup.md +47 -0
  350. package/src/components/features/.video-bites-display.md +36 -37
  351. package/src/components/features/.video-bites-shared.md +44 -0
  352. package/src/components/features/.video-bites-strip.md +63 -0
  353. package/src/components/features/.video-center-badge.md +38 -0
  354. package/src/components/features/.video-ratio-tabs.md +38 -31
  355. package/src/components/features/.video-source-selector.md +24 -27
  356. package/src/components/features/.video.md +35 -27
  357. package/src/components/features/.waitlist-form.md +39 -33
  358. package/src/components/features/.warning-block.md +53 -0
  359. package/src/components/features/ai-enrich/.AIEnrichSection.md +24 -25
  360. package/src/components/features/ai-enrich/.AIRequiredBadge.md +22 -21
  361. package/src/components/features/ai-enrich/.AIStatusIndicator.md +42 -35
  362. package/src/components/features/ai-enrich/.AIWarningsSection.md +23 -20
  363. package/src/components/features/ai-enrich/.ConfidenceBadge.md +35 -20
  364. package/src/components/features/auth/.auth-benefits-panel.md +48 -0
  365. package/src/components/features/auth/.auth-branding.md +51 -0
  366. package/src/components/features/auth/.auth-shell.md +51 -0
  367. package/src/components/features/auth/.back-to-login-link.md +48 -0
  368. package/src/components/features/auth/.complete-account-form.md +45 -0
  369. package/src/components/features/auth/.create-organization-form.md +53 -0
  370. package/src/components/features/auth/.index.md +48 -0
  371. package/src/components/features/auth/.invite-link-invalid-modal.md +42 -0
  372. package/src/components/features/auth/.login-form.md +42 -0
  373. package/src/components/features/auth/.openframe-sso-login-form.md +46 -0
  374. package/src/components/features/auth/.openframe-sso-signup-form.md +51 -0
  375. package/src/components/features/auth/.password-reset-form.md +57 -0
  376. package/src/components/features/auth/.sso-auth-shell.md +35 -0
  377. package/src/components/features/auth/.sso-providers.md +42 -0
  378. package/src/components/features/auth/.terms-agreement-label.md +28 -0
  379. package/src/components/features/board/.board-column-header.md +24 -18
  380. package/src/components/features/board/.board-column.md +32 -32
  381. package/src/components/features/board/.board-ticket-approval.md +42 -0
  382. package/src/components/features/board/.board.md +38 -38
  383. package/src/components/features/board/.index.md +35 -38
  384. package/src/components/features/board/.ticket-card.md +33 -36
  385. package/src/components/features/board/.types.md +38 -31
  386. package/src/components/features/card-hit-layer.tsx +84 -0
  387. package/src/components/features/floating-walkthrough-video.tsx +891 -0
  388. package/src/components/features/index.ts +4 -0
  389. package/src/components/features/notifications/.approval-request-notification-tile.md +45 -0
  390. package/src/components/features/notifications/.index.md +35 -31
  391. package/src/components/features/notifications/.notification-drawer.md +32 -19
  392. package/src/components/features/notifications/.notification-popups.md +51 -0
  393. package/src/components/features/notifications/.notification-tile.md +43 -27
  394. package/src/components/features/notifications/.notifications-context.md +42 -45
  395. package/src/components/features/notifications/.types.md +51 -31
  396. package/src/components/features/ticket-status-config-list/.ticket-status-config-list.md +51 -0
  397. package/src/components/features/time-tracker/.index.md +48 -0
  398. package/src/components/features/time-tracker/.time-tracker-context.md +55 -0
  399. package/src/components/features/time-tracker/.time-tracker-header-button.md +51 -0
  400. package/src/components/features/time-tracker/.time-tracker-panel.md +58 -0
  401. package/src/components/features/time-tracker/.types.md +51 -0
  402. package/src/components/features/time-tracker/.use-tracker-clock.md +32 -0
  403. package/src/components/features/use-walkthrough-video.ts +70 -0
  404. package/src/components/features/video-bites-strip.tsx +46 -146
  405. package/src/components/features/video-center-badge.tsx +11 -2
  406. package/src/components/features/video-hover-preview.tsx +201 -0
  407. package/src/components/features/video.tsx +368 -73
  408. package/src/components/help-center-pages/.delivery-page.md +51 -0
  409. package/src/components/help-center-pages/.index.md +51 -0
  410. package/src/components/help-center-pages/.onboarding-guides-catalog-page.md +53 -0
  411. package/src/components/help-center-pages/.product-releases-list-page.md +51 -0
  412. package/src/components/help-center-pages/.roadmap-page.md +46 -0
  413. package/src/components/icons/.figma-icon.md +13 -7
  414. package/src/components/icons/.index.md +26 -22
  415. package/src/components/icons/.vendor-directory-icon.md +30 -18
  416. package/src/components/icons/.x-logo.md +26 -10
  417. package/src/components/icons-v2-generated/.index.md +30 -41
  418. package/src/components/icons-v2-generated/brand-logos/.index.md +25 -19
  419. package/src/components/icons-v2-generated/communication/.index.md +26 -30
  420. package/src/components/icons-v2-generated/logos/.flamingo-logo-icon.md +41 -0
  421. package/src/components/layout/.article-detail-layout.md +32 -21
  422. package/src/components/layout/.page-container.md +25 -23
  423. package/src/components/layout/.page-heading.md +48 -0
  424. package/src/components/layout/.page-layout.md +30 -25
  425. package/src/components/layout/.title-block.md +43 -24
  426. package/src/components/loading/.card-skeleton.md +28 -35
  427. package/src/components/loading/.category-card-skeleton.md +25 -23
  428. package/src/components/loading/.device-card-skeleton.md +22 -15
  429. package/src/components/loading/.margin-report-skeleton.md +30 -35
  430. package/src/components/loading/.openmsp-heartbeat.md +30 -32
  431. package/src/components/loading/.organization-card-skeleton.md +22 -25
  432. package/src/components/loading/.organization-icon-skeleton.md +39 -27
  433. package/src/components/loading/.page-layout-skeleton.md +50 -28
  434. package/src/components/loading/.unified-skeleton.md +37 -40
  435. package/src/components/loading/.users-grid-skeleton.md +19 -38
  436. package/src/components/navigation/.app-header.md +35 -28
  437. package/src/components/navigation/.app-layout-context.md +48 -0
  438. package/src/components/navigation/.app-layout-drawer.md +56 -0
  439. package/src/components/navigation/.app-layout.md +24 -23
  440. package/src/components/navigation/.header-mingo-button.md +46 -0
  441. package/src/components/navigation/.header-organization-filter.md +32 -18
  442. package/src/components/navigation/.header.md +24 -31
  443. package/src/components/navigation/.index.md +36 -50
  444. package/src/components/navigation/.mingo-ai-button.md +41 -0
  445. package/src/components/navigation/.mobile-burger-menu.md +29 -29
  446. package/src/components/navigation/.mobile-nav-panel.md +41 -49
  447. package/src/components/navigation/.multi-level-navigation.md +76 -0
  448. package/src/components/navigation/.navigation-sidebar-item.md +14 -14
  449. package/src/components/navigation/.navigation-sidebar.md +30 -23
  450. package/src/components/navigation/.sliding-sidebar.md +30 -25
  451. package/src/components/navigation/.sticky-section-nav.md +23 -21
  452. package/src/components/onboarding-guides/.index.md +40 -0
  453. package/src/components/onboarding-guides/.onboarding-guide-detail-view.md +55 -0
  454. package/src/components/onboarding-guides/.onboarding-guides-catalog-skeleton.md +33 -0
  455. package/src/components/onboarding-guides/.onboarding-guides-catalog-view.md +50 -0
  456. package/src/components/onboarding-guides/hooks/.use-onboarding-guides.md +54 -0
  457. package/src/components/platform/.CveLink.md +28 -17
  458. package/src/components/platform/.ScriptArguments.md +18 -23
  459. package/src/components/platform/.ScriptInfoSection.md +27 -21
  460. package/src/components/platform/.ShellTypeBadge.md +34 -18
  461. package/src/components/platform/.SoftwareInfo.md +23 -21
  462. package/src/components/platform/.ToolBadge.md +18 -16
  463. package/src/components/profile/.ProfileLoadingSkeleton.md +24 -23
  464. package/src/components/related-content/.index.md +41 -0
  465. package/src/components/related-content/.related-content-section.md +62 -0
  466. package/src/components/shared/.article-author-byline.md +56 -0
  467. package/src/components/shared/.detail-page-skeleton.md +32 -43
  468. package/src/components/shared/.media-gallery-strip.md +43 -0
  469. package/src/components/shared/delivery/.delivery-lists.md +20 -19
  470. package/src/components/shared/delivery/.delivery-row.md +24 -20
  471. package/src/components/shared/delivery/.delivery-table.md +20 -22
  472. package/src/components/shared/dev-section/.dev-card-row.md +28 -36
  473. package/src/components/shared/dev-section/.dev-section-page.md +36 -25
  474. package/src/components/shared/dev-section/.dev-section-view.md +32 -22
  475. package/src/components/shared/doc-search/.doc-search-bar.md +58 -0
  476. package/src/components/shared/doc-search/.doc-search-result-row.md +50 -0
  477. package/src/components/shared/doc-search/.format-relative-path.md +30 -0
  478. package/src/components/shared/doc-search/.index.md +46 -0
  479. package/src/components/shared/doc-search/.map-doc-search-results.md +44 -0
  480. package/src/components/shared/doc-search/.resolve-search-result-action.md +52 -0
  481. package/src/components/shared/doc-search/.types.md +49 -0
  482. package/src/components/shared/doc-search/.use-doc-search.md +66 -0
  483. package/src/components/shared/legal-document/.legal-document-page.md +26 -20
  484. package/src/components/shared/legal-document/.use-legal-docs.md +36 -30
  485. package/src/components/shared/onboarding/.onboarding-step-card.md +24 -16
  486. package/src/components/shared/onboarding/.onboarding-walkthrough.md +42 -28
  487. package/src/components/shared/product-release/.index.md +33 -24
  488. package/src/components/shared/product-release/.product-release-card-skeleton.md +22 -28
  489. package/src/components/shared/product-release/.product-release-card.md +28 -29
  490. package/src/components/shared/product-release/.product-releases-view.md +49 -0
  491. package/src/components/shared/product-release/.release-detail-page.md +30 -15
  492. package/src/components/shared/roadmap/.index.md +29 -24
  493. package/src/components/shared/roadmap/.roadmap-grid.md +43 -54
  494. package/src/components/shared/roadmap/.roadmap-view.md +41 -0
  495. package/src/components/shared/roadmap/.use-roadmap-voting.md +27 -17
  496. package/src/components/switch.tsx +1 -1
  497. package/src/components/tickets/.help-center-card.md +32 -28
  498. package/src/components/tickets/.help-center-create-form.md +34 -22
  499. package/src/components/tickets/.help-center-list.md +36 -25
  500. package/src/components/tickets/.index.md +30 -45
  501. package/src/components/tickets/.ticket-center.md +31 -38
  502. package/src/components/tickets/.ticket-detail-drawer.md +20 -30
  503. package/src/components/tickets/.ticket-open-form.md +24 -26
  504. package/src/components/tickets/.ticket-reply-composer.md +51 -0
  505. package/src/components/tickets/.ticket-row.md +26 -11
  506. package/src/components/tickets/.types.md +56 -38
  507. package/src/components/tickets/hooks/.use-ticket-actions.md +60 -47
  508. package/src/components/tickets/hooks/.use-ticket-engagements.md +27 -27
  509. package/src/components/tickets/hooks/.use-tickets-list.md +24 -30
  510. package/src/components/ui/.accordion.md +28 -21
  511. package/src/components/ui/.actions-menu.md +36 -54
  512. package/src/components/ui/.ai-generated-badge.md +25 -0
  513. package/src/components/ui/.alert-dialog.md +21 -16
  514. package/src/components/ui/.alert.md +30 -25
  515. package/src/components/ui/.allowed-domains-input.md +26 -15
  516. package/src/components/ui/.announcement-bar-view.md +46 -0
  517. package/src/components/ui/.autocomplete.md +40 -27
  518. package/src/components/ui/.badge.md +34 -31
  519. package/src/components/ui/.brand-association-card.md +22 -18
  520. package/src/components/ui/.breadcrumb.md +18 -14
  521. package/src/components/ui/.bullet-list.md +35 -23
  522. package/src/components/ui/.card.md +47 -30
  523. package/src/components/ui/.checkbox-block.md +34 -22
  524. package/src/components/ui/.checkbox-with-description.md +18 -20
  525. package/src/components/ui/.chevron-button.md +29 -29
  526. package/src/components/ui/.circular-progress.md +30 -41
  527. package/src/components/ui/.color-preset-select.md +54 -0
  528. package/src/components/ui/.color-swatch.md +37 -0
  529. package/src/components/ui/.content-loader.md +34 -27
  530. package/src/components/ui/.crossfade-panels.md +50 -0
  531. package/src/components/ui/.cursor-pagination.md +38 -26
  532. package/src/components/ui/.dashboard-info-card.md +46 -27
  533. package/src/components/ui/.date-picker.md +52 -36
  534. package/src/components/ui/.device-card-compact.md +23 -20
  535. package/src/components/ui/.device-card.md +39 -30
  536. package/src/components/ui/.dialog.md +14 -14
  537. package/src/components/ui/.drawer.md +45 -39
  538. package/src/components/ui/.dropdown-button.md +41 -33
  539. package/src/components/ui/.dropdown-menu.md +40 -23
  540. package/src/components/ui/.duration-input.md +41 -0
  541. package/src/components/ui/.entity-image.md +32 -28
  542. package/src/components/ui/.error-state.md +30 -26
  543. package/src/components/ui/.fade-preview.md +44 -0
  544. package/src/components/ui/.field-wrapper.md +34 -23
  545. package/src/components/ui/.file-upload.md +30 -18
  546. package/src/components/ui/.filter-modal.md +30 -32
  547. package/src/components/ui/.filter-pill-row.md +58 -0
  548. package/src/components/ui/.floating-tooltip.md +27 -32
  549. package/src/components/ui/.hidden-tags-popup.md +18 -20
  550. package/src/components/ui/.highlight-card.md +36 -23
  551. package/src/components/ui/.honeypot-field.md +41 -0
  552. package/src/components/ui/.hover-dropdown.md +44 -31
  553. package/src/components/ui/.image-gallery-modal.md +28 -30
  554. package/src/components/ui/.image-uploader.md +39 -22
  555. package/src/components/ui/.index.md +33 -31
  556. package/src/components/ui/.info-card-row.md +50 -0
  557. package/src/components/ui/.info-card.md +27 -20
  558. package/src/components/ui/.info-row.md +30 -24
  559. package/src/components/ui/.info-section.md +63 -0
  560. package/src/components/ui/.input.md +29 -28
  561. package/src/components/ui/.label.md +34 -26
  562. package/src/components/ui/.markdown-editor.md +26 -25
  563. package/src/components/ui/.marquee-wall.md +64 -0
  564. package/src/components/ui/.menubar.md +50 -16
  565. package/src/components/ui/.modal-v2.md +41 -27
  566. package/src/components/ui/.modal.md +22 -19
  567. package/src/components/ui/.more-actions-menu.md +30 -24
  568. package/src/components/ui/.navigation-menu.md +40 -25
  569. package/src/components/ui/.organization-card.md +46 -27
  570. package/src/components/ui/.page-actions.md +55 -41
  571. package/src/components/ui/.page-loader.md +40 -23
  572. package/src/components/ui/.password-input.md +30 -0
  573. package/src/components/ui/.phone-input.md +20 -22
  574. package/src/components/ui/.portal-container.md +43 -0
  575. package/src/components/ui/.progress-bar.md +40 -27
  576. package/src/components/ui/.release-changelog-section.md +32 -26
  577. package/src/components/ui/.rich-markdown-renderer.md +45 -0
  578. package/src/components/ui/.scroll-fade.md +56 -0
  579. package/src/components/ui/.search-input.md +55 -37
  580. package/src/components/ui/.select.md +25 -26
  581. package/src/components/ui/.service-card.md +25 -19
  582. package/src/components/ui/.sheet.md +21 -21
  583. package/src/components/ui/.simple-markdown-renderer.md +36 -24
  584. package/src/components/ui/.slack-channel-chip.md +49 -0
  585. package/src/components/ui/.square-avatar.md +29 -26
  586. package/src/components/ui/.stacked-rows-panel.md +61 -0
  587. package/src/components/ui/.status-badge.md +30 -24
  588. package/src/components/ui/.status-indicator.md +35 -21
  589. package/src/components/ui/.tab-content.md +34 -22
  590. package/src/components/ui/.tab-navigation.md +40 -50
  591. package/src/components/ui/.tab-selector.md +48 -31
  592. package/src/components/ui/.tabs.md +34 -21
  593. package/src/components/ui/.tag-search-input.md +20 -20
  594. package/src/components/ui/.tag-select-dropdown.md +59 -0
  595. package/src/components/ui/.tag.md +25 -43
  596. package/src/components/ui/.tags-input.md +31 -31
  597. package/src/components/ui/.textarea.md +32 -30
  598. package/src/components/ui/.ticket-attachments-list.md +36 -29
  599. package/src/components/ui/.ticket-info-section.md +37 -42
  600. package/src/components/ui/.ticket-status-config-row.md +66 -0
  601. package/src/components/ui/.ticket-status-tag.md +39 -35
  602. package/src/components/ui/.toaster.md +21 -15
  603. package/src/components/ui/.toggle.md +38 -37
  604. package/src/components/ui/.tooltip.md +16 -13
  605. package/src/components/ui/button/.button-styles.md +17 -18
  606. package/src/components/ui/button/.button.md +30 -37
  607. package/src/components/ui/button/.split-button.md +46 -23
  608. package/src/components/ui/button/button-styles.ts +13 -0
  609. package/src/components/ui/button/button.tsx +5 -0
  610. package/src/components/ui/data-table/.data-table-body.md +50 -35
  611. package/src/components/ui/data-table/.data-table-empty.md +17 -33
  612. package/src/components/ui/data-table/.data-table-header.md +43 -40
  613. package/src/components/ui/data-table/.data-table-row.md +31 -31
  614. package/src/components/ui/data-table/.types.md +23 -28
  615. package/src/components/ui/file-manager/.file-manager-breadcrumb.md +16 -24
  616. package/src/components/ui/file-manager/.file-manager-empty.md +23 -15
  617. package/src/components/ui/file-manager/.file-manager-skeleton.md +34 -36
  618. package/src/components/ui/file-manager/.file-manager-table-row.md +29 -29
  619. package/src/components/ui/file-manager/.file-manager-table.md +39 -24
  620. package/src/components/ui/no-data/.index.md +22 -0
  621. package/src/components/ui/no-data/.no-data-actions.md +29 -0
  622. package/src/components/ui/no-data/.no-data-message.md +37 -0
  623. package/src/components/ui/no-data/.no-data-styles.md +39 -0
  624. package/src/components/ui/no-data/.no-data.md +59 -0
  625. package/src/components/ui/page-actions.tsx +2 -1
  626. package/src/components/ui/query-report-table/.query-report-table-header.md +15 -15
  627. package/src/components/ui/query-report-table/.query-report-table-row.md +16 -16
  628. package/src/components/ui/query-report-table/.query-report-table.md +39 -24
  629. package/src/components/ui/table/.table-column-filter-dropdown.md +15 -9
  630. package/src/components/ui/table/.table-description-cell.md +13 -12
  631. package/src/components/ui/table/.table-empty-state.md +19 -20
  632. package/src/components/ui/table/.table-row.md +30 -20
  633. package/src/components/ui/table/.table-skeleton.md +32 -27
  634. package/src/components/ui/table/.table-timestamp-cell.md +24 -23
  635. package/src/components/ui/table/.table.md +43 -30
  636. package/src/components/ui/table/.types.md +49 -45
  637. package/src/components/ui/table/.use-table-motion.md +45 -0
  638. package/src/contexts/.chat-runtime-context.md +55 -26
  639. package/src/contexts/.endpoints-runtime-context.md +40 -44
  640. package/src/embed-shims/.next-navigation.md +38 -31
  641. package/src/hooks/.api-hooks.md +28 -21
  642. package/src/hooks/.index.md +30 -25
  643. package/src/hooks/.use-authed-image-src.md +38 -0
  644. package/src/hooks/.use-contact-submission.md +35 -36
  645. package/src/hooks/.use-humanity-signals.md +47 -0
  646. package/src/hooks/.use-near-viewport.md +30 -30
  647. package/src/hooks/.use-og-placeholder-url.md +57 -0
  648. package/src/hooks/.use-scroll-to-hash.md +46 -0
  649. package/src/hooks/.use-self-fetch.md +52 -0
  650. package/src/hooks/state/.flatten-schema.md +37 -29
  651. package/src/hooks/ui/.index.md +37 -25
  652. package/src/hooks/ui/.use-auto-limit-tags.md +55 -38
  653. package/src/hooks/ui/.use-deferred-error.md +44 -0
  654. package/src/hooks/ui/.use-focus-trap.md +59 -0
  655. package/src/hooks/ui/.use-header-height.md +37 -0
  656. package/src/hooks/ui/.use-horizontal-scrollbar.md +25 -34
  657. package/src/hooks/ui/.use-marquee-engine.md +73 -0
  658. package/src/hooks/ui/.use-notification-permission.md +49 -0
  659. package/src/hooks/ui/.use-reset-on-page-hidden.md +40 -0
  660. package/src/hooks/ui/.use-suppress-clone-focus.md +41 -0
  661. package/src/nats/.index.md +39 -0
  662. package/src/nats/.nats-provider.md +46 -0
  663. package/src/nats/.nats.md +38 -28
  664. package/src/nats/.shared-connection.md +56 -0
  665. package/src/nats/.use-nats-subscription.md +57 -0
  666. package/src/stories/.ActionsMenu.stories.md +57 -0
  667. package/src/stories/.Alert.stories.md +46 -0
  668. package/src/stories/.AnnouncementBar.stories.md +59 -32
  669. package/src/stories/.AppLayoutDrawer.stories.md +60 -0
  670. package/src/stories/.AppLayoutSidebar.stories.md +45 -0
  671. package/src/stories/.ApprovalBatchMessage.stories.md +46 -0
  672. package/src/stories/.ApprovalBatchMessageClient.stories.md +55 -0
  673. package/src/stories/.ApprovalRequestMessage.stories.md +50 -0
  674. package/src/stories/.ApprovalRequestMessageClient.stories.md +41 -0
  675. package/src/stories/.BlogCard.stories.md +52 -0
  676. package/src/stories/.Board.stories.md +25 -20
  677. package/src/stories/.Button.stories.md +35 -40
  678. package/src/stories/.CampaignCardAdmin.stories.md +38 -0
  679. package/src/stories/.CardsStrip.stories.md +39 -0
  680. package/src/stories/.CaseStudyCard.stories.md +41 -0
  681. package/src/stories/.ChatContainer.stories.md +41 -0
  682. package/src/stories/.ChatInlineVideoPill.stories.md +36 -0
  683. package/src/stories/.ChatMessageEnhanced.stories.md +51 -0
  684. package/src/stories/.ChatMingoInfoCards.stories.md +30 -0
  685. package/src/stories/.ChatTicketList.stories.md +38 -22
  686. package/src/stories/.ChatTypingIndicator.stories.md +47 -0
  687. package/src/stories/.CheckboxBlock.stories.md +34 -35
  688. package/src/stories/.ContextCompactionDisplay.stories.md +28 -0
  689. package/src/stories/.CustomerInterviewCard.stories.md +36 -0
  690. package/src/stories/.DashboardInfoCard.stories.md +40 -33
  691. package/src/stories/.DataRoomDocCard.stories.md +42 -0
  692. package/src/stories/.DataTable.stories.md +37 -32
  693. package/src/stories/.DatePicker.stories.md +34 -30
  694. package/src/stories/.EmbeddableChat.stories.md +45 -28
  695. package/src/stories/.EmptyState.stories.md +55 -0
  696. package/src/stories/.ErrorMessageDisplay.stories.md +45 -0
  697. package/src/stories/.FilterModal.stories.md +28 -22
  698. package/src/stories/.GenericEntityCard.stories.md +50 -0
  699. package/src/stories/.GitHubActivityCard.stories.md +41 -0
  700. package/src/stories/.GuideWelcome.stories.md +38 -0
  701. package/src/stories/.Header.stories.md +32 -22
  702. package/src/stories/.HubspotTicketCard.stories.md +41 -0
  703. package/src/stories/.InfoCard.stories.md +37 -26
  704. package/src/stories/.InfoCardRow.stories.md +48 -0
  705. package/src/stories/.InfoSection.stories.md +55 -0
  706. package/src/stories/.Input.stories.md +45 -35
  707. package/src/stories/.InvestorUpdateCard.stories.md +41 -0
  708. package/src/stories/.MarqueeWall.stories.md +53 -0
  709. package/src/stories/.MingoAiButton.stories.md +31 -0
  710. package/src/stories/.MingoChatModals.stories.md +47 -0
  711. package/src/stories/.MingoInfoCard.stories.md +50 -0
  712. package/src/stories/.MingoOnboardingCard.stories.md +19 -19
  713. package/src/stories/.MingoWelcome.stories.md +41 -0
  714. package/src/stories/.MobileNavPanel.stories.md +52 -0
  715. package/src/stories/.Modal.stories.md +19 -16
  716. package/src/stories/.MspOrganizationCard.stories.md +45 -0
  717. package/src/stories/.NotificationDrawer.stories.md +39 -28
  718. package/src/stories/.OSTypeBadge.stories.md +34 -25
  719. package/src/stories/.OnboardingGuideCard.stories.md +41 -0
  720. package/src/stories/.PageActions.stories.md +21 -21
  721. package/src/stories/.PageContainer.stories.md +29 -24
  722. package/src/stories/.PageLayout.stories.md +18 -35
  723. package/src/stories/.PolicyConfigurationPanel.stories.md +58 -0
  724. package/src/stories/.ProductReleaseCard.stories.md +39 -0
  725. package/src/stories/.ProgramCard.stories.md +51 -0
  726. package/src/stories/.QuickActionChip.stories.md +59 -0
  727. package/src/stories/.QuickActionMarquee.stories.md +51 -0
  728. package/src/stories/.QuickActionWall.stories.md +58 -0
  729. package/src/stories/.RoadmapCard.stories.md +41 -0
  730. package/src/stories/.ShellTypeBadge.stories.md +42 -22
  731. package/src/stories/.SlackMessageCard.stories.md +42 -0
  732. package/src/stories/.SlashCommandSuggestions.stories.md +21 -31
  733. package/src/stories/.SplitButton.stories.md +23 -25
  734. package/src/stories/.StackedRowsPanel.stories.md +65 -0
  735. package/src/stories/.TabSelector.stories.md +26 -38
  736. package/src/stories/.Tag.stories.md +32 -27
  737. package/src/stories/.ThinkingDisplay.stories.md +43 -0
  738. package/src/stories/.TicketCard.stories.md +60 -0
  739. package/src/stories/.TicketInfoSection.stories.md +28 -20
  740. package/src/stories/.TimeTracker.stories.md +35 -0
  741. package/src/stories/.Toaster.stories.md +26 -20
  742. package/src/stories/.ToolBadge.stories.md +34 -24
  743. package/src/stories/.ToolExecutionDisplay.stories.md +22 -20
  744. package/src/stories/.ToolExecutionDisplayClient.stories.md +33 -0
  745. package/src/stories/.VideoBitesStrip.stories.md +37 -0
  746. package/src/stories/.WarningBlock.stories.md +51 -0
  747. package/src/stories/__fixtures__/.chat-card-decorator.md +39 -0
  748. package/src/stories/__fixtures__/.chat-cards.md +57 -0
  749. package/src/stories/auth/.CompleteAccount.stories.md +36 -0
  750. package/src/stories/auth/.CreateOrganization.stories.md +52 -0
  751. package/src/stories/auth/.InviteLinkInvalid.stories.md +21 -0
  752. package/src/stories/auth/.Login.stories.md +32 -0
  753. package/src/stories/auth/.OpenFrameSso.stories.md +58 -0
  754. package/src/stories/auth/.PasswordReset.stories.md +49 -0
  755. package/src/styles/ods-interaction-states.css +32 -0
  756. package/src/types/.announcement.md +67 -35
  757. package/src/types/.blog.md +44 -41
  758. package/src/types/.case-study.md +31 -17
  759. package/src/types/.content-ref.md +37 -0
  760. package/src/types/.customer-interview.md +38 -38
  761. package/src/types/.doc-source.md +87 -0
  762. package/src/types/.entity-author.md +53 -0
  763. package/src/types/.entity-platform.md +40 -0
  764. package/src/types/.index.md +23 -17
  765. package/src/types/.marketing.md +32 -35
  766. package/src/types/.navigation.md +31 -19
  767. package/src/types/.os.types.md +30 -31
  768. package/src/types/.permissions.md +49 -35
  769. package/src/types/.platform.md +44 -28
  770. package/src/types/.product-release.md +59 -42
  771. package/src/types/.shell.types.md +46 -30
  772. package/src/types/.supabase.md +43 -29
  773. package/src/types/.tool.types.md +43 -23
  774. package/src/types/.video-processing.md +40 -31
  775. package/src/types/supabase.ts +80 -0
  776. package/src/types/video-processing.ts +1 -0
  777. package/src/utils/.announcement-storage.md +49 -17
  778. package/src/utils/.app-config.md +22 -18
  779. package/src/utils/.brand-marks.md +46 -0
  780. package/src/utils/.cn.md +40 -29
  781. package/src/utils/.color-analysis.md +34 -25
  782. package/src/utils/.common.md +43 -23
  783. package/src/utils/.content-href.md +64 -0
  784. package/src/utils/.content-ref-groups.md +51 -0
  785. package/src/utils/.date-utils.md +46 -35
  786. package/src/utils/.doc-path-utils.md +38 -0
  787. package/src/utils/.doc-tree-nav.md +51 -0
  788. package/src/utils/.embed-authed-fetch.md +48 -32
  789. package/src/utils/.embed-content-fetch.md +36 -0
  790. package/src/utils/.embed-url-converters.md +52 -0
  791. package/src/utils/.extract-items.md +49 -0
  792. package/src/utils/.faq-anchor.md +48 -0
  793. package/src/utils/.format.md +73 -55
  794. package/src/utils/.humanity-signals.md +59 -0
  795. package/src/utils/.index.md +73 -31
  796. package/src/utils/.list-url.md +43 -0
  797. package/src/utils/.markdown-section-extractor.md +57 -0
  798. package/src/utils/.markdown-to-plain.md +51 -0
  799. package/src/utils/.media-carousel-utils-stub.md +42 -31
  800. package/src/utils/.ods-color-utils.md +84 -43
  801. package/src/utils/.og-placeholder.md +45 -0
  802. package/src/utils/.page-header-constants.md +26 -0
  803. package/src/utils/.platform-config.md +34 -34
  804. package/src/utils/.release-badge.md +47 -0
  805. package/src/utils/.release-cover.md +45 -0
  806. package/src/utils/.same-page-hash-nav.md +45 -0
  807. package/src/utils/.scroll-into-view.md +32 -25
  808. package/src/utils/.seo-description.md +37 -0
  809. package/src/utils/.seo-title.md +25 -0
  810. package/src/utils/.social-embed-cache.md +37 -0
  811. package/src/utils/.source-icons.md +30 -34
  812. package/src/utils/.suggestion-url.md +46 -0
  813. package/src/utils/.tool-utils.md +39 -24
  814. package/src/utils/.tree-builder.md +64 -0
  815. package/src/utils/.video-bite-id.md +42 -0
  816. package/src/utils/announcement-storage.ts +9 -18
  817. package/src/utils/dev-sections/.dev-section-param-keys.md +51 -0
  818. package/src/utils/dev-sections/.openframe-dev-sections.md +40 -28
  819. package/src/utils/dismiss-cookie.ts +55 -0
  820. package/src/utils/dismissal-storage.ts +38 -0
  821. package/src/utils/index.ts +3 -0
  822. package/dist/chunk-BBUEY73L.js.map +0 -1
  823. package/dist/chunk-G3UN2DXU.cjs.map +0 -1
  824. package/dist/chunk-OWMLWJQY.cjs.map +0 -1
  825. package/dist/chunk-SASR7SK5.js.map +0 -1
  826. package/src/components/chat/utils/.onboarding-icons.md +0 -28
  827. package/src/hooks/.use-og-placeholder.md +0 -51
  828. /package/dist/{chunk-MGKCS6KS.js.map → chunk-3WCARCI4.js.map} +0 -0
  829. /package/dist/{chunk-Y3Y2DLNO.js.map → chunk-6UGYBCEN.js.map} +0 -0
  830. /package/dist/{chunk-PSPWT2Q5.js.map → chunk-7LWXWXEY.js.map} +0 -0
  831. /package/dist/{chunk-VTSRDC4W.js.map → chunk-CKC3EAYT.js.map} +0 -0
  832. /package/dist/{chunk-ZRANZNEA.js.map → chunk-JJE5TUZK.js.map} +0 -0
  833. /package/dist/{chunk-66BNAFO6.js.map → chunk-JQIUBFHL.js.map} +0 -0
  834. /package/dist/{chunk-2DIOV7BR.js.map → chunk-UPN6EFOM.js.map} +0 -0
  835. /package/dist/{chunk-4SMRQ4SN.js.map → chunk-WBL5Y4PS.js.map} +0 -0
  836. /package/dist/{chunk-FP4H6Y5O.js.map → chunk-WPYPSIY2.js.map} +0 -0
  837. /package/dist/{chunk-R5WJJL4V.js.map → chunk-X5X43HFV.js.map} +0 -0
  838. /package/dist/{chunk-DEHZ5CTC.js.map → chunk-XTWKDMCG.js.map} +0 -0
@@ -0,0 +1,48 @@
1
+ <!-- source-hash: 6ba79861ed85e1a6c5f821680137cd97 -->
2
+ Public API barrel file for the Time Tracker feature module, re-exporting all components, hooks, context utilities, and TypeScript types from their respective source files.
3
+
4
+ ## Key Components
5
+
6
+ | Export | Source | Description |
7
+ |---|---|---|
8
+ | `TimeTrackerProvider` | `time-tracker-context` | Context provider for time tracker state |
9
+ | `useTimeTracker` | `time-tracker-context` | Hook to consume time tracker context (throws if missing) |
10
+ | `useOptionalTimeTracker` | `time-tracker-context` | Hook to consume time tracker context (returns `undefined` if missing) |
11
+ | `TimeTrackerPanel` | `time-tracker-panel` | UI panel component for the tracker interface |
12
+ | `TimeTrackerHeaderButton` | `time-tracker-header-button` | Header button component to open/control the tracker |
13
+ | `useTrackerClock` | `use-tracker-clock` | Hook managing the running clock/tick logic |
14
+
15
+ ## Types
16
+
17
+ - `TimeTrackerProviderProps`, `TimeTrackerPanelProps`, `TimeTrackerHeaderButtonProps`, `UseTrackerClockArgs` — component and hook prop shapes
18
+ - `TimeTrackerStatus`, `TimeTrackerEntry`, `TimeTrackerData` — core tracker state types
19
+ - `TimeTrackerTicketOption`, `TimeTrackerCustomerOption` — dropdown option types for ticket and customer selectors
20
+
21
+ ## Usage Example
22
+
23
+ ```typescript
24
+ import {
25
+ TimeTrackerProvider,
26
+ TimeTrackerPanel,
27
+ TimeTrackerHeaderButton,
28
+ useTimeTracker,
29
+ } from '@openframe-oss-lib/time-tracker'
30
+
31
+ function App() {
32
+ return (
33
+ <TimeTrackerProvider>
34
+ <TimeTrackerHeaderButton />
35
+ <TimeTrackerPanel />
36
+ </TimeTrackerProvider>
37
+ )
38
+ }
39
+
40
+ function TrackerStatus() {
41
+ const tracker = useTimeTracker()
42
+ return <span>Status: {tracker.status}</span>
43
+ }
44
+ ```
45
+
46
+ ## Source
47
+
48
+ [`index.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/src/time-tracker/index.ts)
@@ -0,0 +1,55 @@
1
+ <!-- source-hash: de71ebaf1faea406a5249b912fbf10b9 -->
2
+ React context module that provides time tracker state and panel visibility controls to the component tree.
3
+
4
+ ## Key Components
5
+
6
+ | Export | Type | Description |
7
+ |--------|------|-------------|
8
+ | `TimeTrackerProvider` | Component | Context provider wrapping the time tracker feature; accepts `TimeTrackerData` props plus optional `defaultOpen` |
9
+ | `useTimeTracker` | Hook | Consumes context and throws if called outside a provider |
10
+ | `useOptionalTimeTracker` | Hook | Consumes context and returns `null` if no provider is present |
11
+ | `TimeTrackerProviderProps` | Interface | Props for the provider: `TimeTrackerData` fields, `children`, and `defaultOpen` |
12
+ | `TimeTrackerContextValue` | Interface (internal) | Extends `TimeTrackerData` with `isOpen`, `open`, `close`, and `toggle` |
13
+
14
+ ## Usage Example
15
+
16
+ ```typescript
17
+ // Wrap your feature tree with the provider
18
+ import { TimeTrackerProvider, useTimeTracker } from './time-tracker-context'
19
+
20
+ function App() {
21
+ const data: TimeTrackerData = { /* ...tracker fields */ }
22
+
23
+ return (
24
+ <TimeTrackerProvider {...data} defaultOpen={false}>
25
+ <TrackerPanel />
26
+ </TimeTrackerProvider>
27
+ )
28
+ }
29
+
30
+ // Consume in any child component
31
+ function TrackerPanel() {
32
+ const { isOpen, open, close, toggle } = useTimeTracker()
33
+
34
+ return (
35
+ <div>
36
+ <button onClick={toggle}>
37
+ {isOpen ? 'Hide Tracker' : 'Show Tracker'}
38
+ </button>
39
+ {isOpen && <TrackerContent />}
40
+ </div>
41
+ )
42
+ }
43
+
44
+ // Safe consumption where the provider may be absent
45
+ function MaybeTracker() {
46
+ const tracker = useOptionalTimeTracker()
47
+ if (!tracker) return null
48
+ return <span>{tracker.isOpen ? 'Tracking…' : 'Idle'}</span>
49
+ }
50
+ ```
51
+
52
+ ## Notes
53
+
54
+ - The per-second clock tick is intentionally kept in a separate `useTrackerClock` hook rather than in context, preventing global re-renders on every tick.
55
+ - `data` spreads from the host's render, so context value identity updates only when the parent re-renders — not on timer ticks.
@@ -0,0 +1,51 @@
1
+ <!-- source-hash: 33a141db20f759f37da3df0e0eb5aa99 -->
2
+ A client-side React component that renders a time-tracking affordance in the application header, integrating a Radix UI Popover with live elapsed time display and AppLayout drawer coordination.
3
+
4
+ ## Key Components
5
+
6
+ | Export | Type | Description |
7
+ |---|---|---|
8
+ | `TimeTrackerHeaderButton` | Component | Main header button with popover panel for time tracking |
9
+ | `TimeTrackerHeaderButtonProps` | Interface | Props: `className` and `disabled` passthrough |
10
+
11
+ **Internal dependencies:**
12
+
13
+ - `useOptionalTimeTracker` — Reads tracker context; returns `null` if no `<TimeTrackerProvider>` is present (component renders nothing)
14
+ - `useTrackerClock` — Provides live elapsed time label while a session is running
15
+ - `useAppLayoutDrawerCoordination` — Coordinates mutual exclusion with other in-layout drawers/panels
16
+ - `useAppLayoutDrawerContainer` — Resolves the portal target for the backdrop overlay
17
+
18
+ ## Behavior Notes
19
+
20
+ - **No provider → no render:** If `TimeTrackerContext` is absent, the component returns `null`
21
+ - **Live clock:** While tracking, the elapsed time renders inline in the `HeaderButton` trigger
22
+ - **Visual states:** Icon color shifts to `ods-accent` (tracking) or `ods-text-secondary` (paused)
23
+ - **Backdrop scoping:** Inside `AppLayout`, the dim overlay is portaled into the main-content container so header and sidebar remain interactive; outside `AppLayout` it falls back to a full-viewport overlay
24
+ - **Drawer coordination:** Registers a stable `AppLayoutDrawerHandle` so opening the time tracker closes other panels and vice versa
25
+
26
+ ## Usage Example
27
+
28
+ ```typescript
29
+ // Wrap your app with TimeTrackerProvider, then drop the button into your header
30
+ import { TimeTrackerProvider } from './time-tracker-context'
31
+ import { TimeTrackerHeaderButton } from './time-tracker-header-button'
32
+
33
+ function AppHeader() {
34
+ return (
35
+ <TimeTrackerProvider>
36
+ <header>
37
+ <TimeTrackerHeaderButton />
38
+ </header>
39
+ </TimeTrackerProvider>
40
+ )
41
+ }
42
+
43
+ // Outside a provider, the component renders nothing — safe to include unconditionally
44
+ function MinimalHeader() {
45
+ return (
46
+ <header>
47
+ <TimeTrackerHeaderButton disabled={false} />
48
+ </header>
49
+ )
50
+ }
51
+ ```
@@ -0,0 +1,58 @@
1
+ <!-- source-hash: f9c7f4b630216f5355a492cdd085052d -->
2
+ A floating time-tracking panel component that renders a real-time timer, ticket/customer assignment fields, notes input, and a recent-entries list for MSP technicians to log billable time.
3
+
4
+ ## Key Components
5
+
6
+ ### `TimeTrackerPanel` (main export)
7
+ The primary panel component consuming all `TimeTrackerData` props plus `onClose` and optional `className`. Handles:
8
+ - **Timer controls** – start, pause, resume, and finish/save actions driven by `status` (`ready | tracking | paused`)
9
+ - **Live clock** – formatted elapsed time via the `useTrackerClock` hook
10
+ - **Ticket & customer selection** – searchable `Autocomplete` fields with server-side filtering support
11
+ - **Notes textarea** – optional when a ticket is selected; required otherwise
12
+ - **Validation** – inline field errors shown only after a submit attempt, reset when status returns to `ready`
13
+ - **Last entries list** – up to 3 recent `TimeTrackerEntry` rows; empty state shown when none exist
14
+ - **Footer actions** – Manual Entry button and a `SplitButton` to open "My Time"
15
+
16
+ ### `StatusTag` (internal)
17
+ Renders a styled `Tag` reflecting current tracker status: `tracking` (success + animated loader), `paused` (warning + pause icon), or `ready` (grey).
18
+
19
+ ### `LastEntryRow` (internal)
20
+ Displays a single time entry row with duration, date, title, and optional description.
21
+
22
+ ## Usage Example
23
+
24
+ ```typescript
25
+ import { TimeTrackerPanel } from '@openframe/ui'
26
+
27
+ <TimeTrackerPanel
28
+ status="ready"
29
+ runningSince={null}
30
+ accumulatedMs={0}
31
+ ticketOptions={[{ id: 'T-1', label: 'Ticket #1' }]}
32
+ selectedTicketId={null}
33
+ onSelectedTicketChange={(id) => setTicket(id)}
34
+ onTicketSearch={(q) => fetchTickets(q)}
35
+ ticketsLoading={false}
36
+ customerOptions={[{ id: 'C-1', label: 'Acme Corp', imageUrl: '/acme.png' }]}
37
+ selectedCustomerId={null}
38
+ onSelectedCustomerChange={(id) => setCustomer(id)}
39
+ onCustomerSearch={(q) => fetchCustomers(q)}
40
+ customersLoading={false}
41
+ customerLocked={false}
42
+ notes=""
43
+ onNotesChange={setNotes}
44
+ lastEntries={[]}
45
+ onStart={startTimer}
46
+ onPause={pauseTimer}
47
+ onResume={resumeTimer}
48
+ onCancel={cancelTimer}
49
+ onSubmit={submitEntry}
50
+ isStarting={false}
51
+ isSubmitting={false}
52
+ onClose={() => setOpen(false)}
53
+ />
54
+ ```
55
+
56
+ ## Source
57
+
58
+ [`time-tracker-panel.tsx`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/time-tracker-panel.tsx)
@@ -0,0 +1,51 @@
1
+ <!-- source-hash: 3997f1f6adad59896ed8ceba4767a157 -->
2
+ Defines the complete TypeScript contract for the OpenFrame time tracker UI component, including status states, option shapes, entry records, and the full host-provided data interface.
3
+
4
+ ## Key Components
5
+
6
+ | Export | Kind | Description |
7
+ |---|---|---|
8
+ | `TimeTrackerStatus` | Type | Union of tracker states: `'ready'`, `'tracking'`, `'paused'` |
9
+ | `TimeTrackerTicketOption` | Interface | `id` + `label` pair for ticket autocomplete options |
10
+ | `TimeTrackerCustomerOption` | Interface | `id` + `label` + optional `imageUrl` for customer autocomplete |
11
+ | `TimeTrackerEntry` | Interface | A previous session record with pre-formatted `durationLabel` and `dateLabel` |
12
+ | `TimeTrackerData` | Interface | The complete prop contract fed by the host into the UI component |
13
+
14
+ ### `TimeTrackerData` Notable Fields
15
+
16
+ - **`status` / `runningSince` / `accumulatedMs`** — Drives the live timer; UI ticks locally from `runningSince`, backend stays source of truth
17
+ - **`ticketOptions` / `selectedTicketId` / `onTicketSearch`** — Ticket autocomplete wiring (host handles search)
18
+ - **`customerOptions` / `onSelectedCustomerChange`** — Optional customer panel; rendered only when `onSelectedCustomerChange` is provided
19
+ - **`customerLocked`** — Prevents customer edits when derived from the selected ticket
20
+ - **`lastEntries`** — Up to three recent sessions displayed in the panel
21
+ - **`isStarting` / `isSubmitting`** — Loading guards for async host actions
22
+
23
+ ## Usage Example
24
+
25
+ ```typescript
26
+ const data: TimeTrackerData = {
27
+ status: 'ready',
28
+ accumulatedMs: 0,
29
+ ticketOptions: [{ id: 'TKT-42', label: '#42 – Replace firewall' }],
30
+ selectedTicketId: null,
31
+ onSelectedTicketChange: (id) => dispatch(selectTicket(id)),
32
+ onTicketSearch: (query) => dispatch(searchTickets(query)),
33
+ customerOptions: [{ id: 'cust-1', label: 'Acme Corp', imageUrl: 'https://cdn.example.com/acme.png' }],
34
+ selectedCustomerId: null,
35
+ onSelectedCustomerChange: (id) => dispatch(selectCustomer(id)),
36
+ notes: '',
37
+ onNotesChange: (value) => dispatch(setNotes(value)),
38
+ lastEntries: [
39
+ { id: 'e1', durationLabel: '00:08:17', dateLabel: '07/12/25', title: 'Network audit' },
40
+ ],
41
+ onStart: () => dispatch(startTimer()),
42
+ onPause: () => dispatch(pauseTimer()),
43
+ onResume: () => dispatch(resumeTimer()),
44
+ onCancel: () => dispatch(cancelTimer()),
45
+ onSubmit: () => dispatch(submitTimer()),
46
+ };
47
+ ```
48
+
49
+ ## Source
50
+
51
+ [`types.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/types.ts)
@@ -0,0 +1,32 @@
1
+ <!-- source-hash: 348c9778f1a385757c49446a815eb860 -->
2
+ Display-only React hook that ticks a `HH:MM:SS` clock once per second while time tracking is active, and shows a static elapsed time otherwise.
3
+
4
+ ## Key Components
5
+
6
+ - **`useTrackerClock`** — Main hook. Returns a formatted `HH:MM:SS` string derived from `accumulatedMs` plus live elapsed time since `runningSince`. The interval runs only when `status === 'tracking'`; it clears automatically on pause/stop or unmount.
7
+ - **`formatElapsed`** — Internal utility. Converts a total millisecond value to a zero-padded `HH:MM:SS` string, clamping negative values to `0`.
8
+ - **`UseTrackerClockArgs`** — Input interface describing the tracker state needed to drive the clock.
9
+
10
+ ## Usage Example
11
+
12
+ ```typescript
13
+ import { useTrackerClock } from './use-tracker-clock'
14
+
15
+ function TimerDisplay({ entry }) {
16
+ const elapsed = useTrackerClock({
17
+ status: entry.status, // 'tracking' | 'paused' | 'stopped'
18
+ runningSince: entry.startedAt, // epoch ms when current segment began
19
+ accumulatedMs: entry.totalMs, // ms logged before current segment
20
+ })
21
+
22
+ return <span>{elapsed}</span> // e.g. "01:23:45"
23
+ }
24
+ ```
25
+
26
+ ## Notes
27
+
28
+ - `runningSince` is only meaningful when `status === 'tracking'`; passing it in other states has no effect.
29
+ - The interval resets whenever `status` or `runningSince` changes, preventing drift when a session is paused and resumed.
30
+ - `accumulatedMs` defaults to `0`, so the hook works for brand-new sessions with no prior logged time.
31
+
32
+ **Source:** [`use-tracker-clock.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/use-tracker-clock.ts)
@@ -0,0 +1,70 @@
1
+ "use client";
2
+
3
+ /**
4
+ * useWalkthroughVideo — client read hook for the per-platform walkthrough video.
5
+ *
6
+ * SSOT for fetching + shaping the widget's data on the CLIENT (any embedder
7
+ * reuses it). The public endpoint returns the RAW body `{ walkthroughVideo }`
8
+ * (no {success,data} wrapper). The video's `captionsUrl` is a RELATIVE
9
+ * `/api/captions/...` path; pass `transformCaptionsUrl` to route it through a
10
+ * proxy (embedders) — omit it for same-origin hosts.
11
+ *
12
+ * SSR hosts (the hub) resolve the video server-side and pass it to the widget
13
+ * directly; they don't need this hook. It exists for client-only embedders.
14
+ */
15
+
16
+ import { useQuery } from '@tanstack/react-query';
17
+ import type { WalkthroughVideoData } from './floating-walkthrough-video';
18
+
19
+ export interface UseWalkthroughVideoOptions {
20
+ /** Absolute or proxied URL of the public GET route. */
21
+ endpoint: string;
22
+ /** SSR/initial seed to avoid a loading flash. */
23
+ initialData?: WalkthroughVideoData | null;
24
+ enabled?: boolean;
25
+ /** Rewrite the RELATIVE captionsUrl (e.g. prefix a `/content` proxy base). */
26
+ transformCaptionsUrl?: (relativeUrl: string) => string;
27
+ }
28
+
29
+ export interface UseWalkthroughVideoResult {
30
+ video: WalkthroughVideoData | null;
31
+ isLoading: boolean;
32
+ }
33
+
34
+ export function useWalkthroughVideo(opts: UseWalkthroughVideoOptions): UseWalkthroughVideoResult {
35
+ const { endpoint, initialData, enabled = true, transformCaptionsUrl } = opts;
36
+
37
+ const query = useQuery<WalkthroughVideoData | null>({
38
+ queryKey: ['walkthrough-video', endpoint],
39
+ enabled,
40
+ initialData: initialData ?? undefined,
41
+ // `null` is a legitimate cached VALUE to React Query, so an embedder
42
+ // passing `initialData={null}` to mean "no seed" got status:'success' and
43
+ // no fetch for the whole staleTime window. Treat null as absent.
44
+ staleTime: 5 * 60 * 1000,
45
+ // Returns the RAW video, cached under the endpoint key. A real HTTP
46
+ // failure THROWS so React Query retries and surfaces isError, instead of
47
+ // caching a fake "no video" for the whole stale window. The hub route
48
+ // answers "no walkthrough for this platform" as 200 + null, not 404; the
49
+ // 404 arm is kept for embedders whose proxy 404s a missing resource.
50
+ queryFn: async () => {
51
+ const res = await fetch(endpoint);
52
+ if (res.status === 404) return null;
53
+ if (!res.ok) throw new Error(`Walkthrough video request failed (${res.status})`);
54
+ const body = (await res.json()) as { walkthroughVideo: WalkthroughVideoData | null };
55
+ return body?.walkthroughVideo ?? null;
56
+ },
57
+ // Per-observer transform — NEVER mutate the cached data. `select` also runs
58
+ // over `initialData`, so the SSR seed is rewritten too. Keeping the proxy
59
+ // rewrite here (not in queryFn) means a second consumer of the same
60
+ // endpoint can't inherit this observer's proxied captionsUrl from the cache.
61
+ select: (video) => {
62
+ if (video?.captionsUrl && transformCaptionsUrl && video.captionsUrl.startsWith('/')) {
63
+ return { ...video, captionsUrl: transformCaptionsUrl(video.captionsUrl) };
64
+ }
65
+ return video;
66
+ },
67
+ });
68
+
69
+ return { video: query.data ?? null, isLoading: query.isLoading };
70
+ }
@@ -25,12 +25,11 @@
25
25
  * starts only on hover (`<Video playOnHover>` — sound at 50%, muted fallback).
26
26
  */
27
27
 
28
- import React, { useMemo, useRef, useState, useEffect } from 'react';
28
+ import React, { useMemo, useState } from 'react';
29
29
  import { cn } from '../../utils/cn';
30
- import { Video } from './video';
31
30
  import { useVideoWarmup } from './use-video-warmup';
32
- import { toMuxPreviewUrl } from './mux-origins';
33
- import { NEAR_VIEWPORT_ROOT_MARGIN } from '../../hooks/use-near-viewport';
31
+ import { VideoHoverPreviewSurface } from './video-hover-preview';
32
+ import { CardHitLayer } from './card-hit-layer';
34
33
  import { detectAspectRatio, RATIO_TO_CSS_ASPECT, ratioToCategory } from './video-ratio-tabs';
35
34
  import type { VideoTeaserWithRatio } from './video-ratio-tabs';
36
35
  import {
@@ -38,12 +37,9 @@ import {
38
37
  sortBitesByCreatedAtDesc,
39
38
  type VideoBiteStripProfile,
40
39
  } from './video-bites-shared';
41
- import Image from '../../embed-shims/next-image';
42
40
  import { CardsStrip, STRIP_CELL_MAX_WIDTH } from './cards-strip';
43
- import { useCoverImageFallback } from '../chat/entity-cards/use-cover-image-fallback';
44
41
  import { UserDisplay } from '../user-display';
45
42
  import { Chevron02RightIcon } from '../icons-v2-generated/arrows/chevron-02-right-icon';
46
- import { VideoPlayBadge } from './video-center-badge';
47
43
 
48
44
  // NOTE: the title constant / profile adapter / sort comparator live in the
49
45
  // server-safe leaf `video-bites-shared.ts` (its own published subpath). The
@@ -229,16 +225,9 @@ export function VideoBiteCard({
229
225
  const cssAspect = RATIO_TO_CSS_ASPECT[ratioToCategory(detectAspectRatio(bite.aspect_ratio))];
230
226
  const targetHref = bite.href ?? sectionHref;
231
227
  const hasTarget = !!(targetHref || bite.onNavigate || onBiteNavigate);
232
- // Strip keys and navigation stay on the RAW bite.url — only playback gets
233
- // the rendition-capped preview URL below, so keys are stable regardless of
234
- // the cap and original + clone share one HTTP cache entry per URL.
228
+ // Strip keys and navigation stay on the RAW bite.url — the surface applies
229
+ // the rendition cap internally, so keys are stable regardless of the cap.
235
230
  const key = cardKey ?? `${bite.url}__${index}`;
236
- // Rendition-capped playback URL for this ~234px preview card: public Mux
237
- // HLS manifests get `?max_resolution=720p` (the only Safari-side cap —
238
- // native HLS ignores hls.js's player-size capping); everything else passes
239
- // through unchanged. Used by BOTH the first-frame facade and the hover
240
- // player so the two layers share the manifest fetch.
241
- const previewUrl = toMuxPreviewUrl(bite.url);
242
231
 
243
232
  // Hover activation: controlled by the strip (activeKey) or self-managed
244
233
  // when rendered standalone (admin editor).
@@ -248,42 +237,6 @@ export function VideoBiteCard({
248
237
  const activate = () => (controlled ? onActivate?.(key) : setSelfActive(true));
249
238
  const deactivate = () => (controlled ? onDeactivate?.(key) : setSelfActive(false));
250
239
 
251
- // Player mount: controlled (strip's shared-by-index gate) or an internal
252
- // TWO-WAY near-viewport observer (standalone). Two-way — NOT the fire-once
253
- // `useNearViewport` — so players unmount again >500px away and live
254
- // MuxPlayer instances stay bounded.
255
- const gateControlled = playerMounted !== undefined;
256
- const rootElRef = useRef<HTMLDivElement | null>(null);
257
- const [isNear, setIsNear] = useState(false);
258
- useEffect(() => {
259
- if (gateControlled) return;
260
- const el = rootElRef.current;
261
- if (!el || typeof IntersectionObserver === 'undefined') return;
262
- const io = new IntersectionObserver(
263
- entries => setIsNear(entries[0]?.isIntersecting ?? false),
264
- { rootMargin: NEAR_VIEWPORT_ROOT_MARGIN },
265
- );
266
- io.observe(el);
267
- return () => io.disconnect();
268
- }, [gateControlled]);
269
- const showMedia = gateControlled ? playerMounted : isNear;
270
-
271
- // Player mounts at NEAR-VIEWPORT (not on first hover) so hover playback is
272
- // INSTANT for any card the user can reach — mounting on activation made
273
- // freshly-scrolled cards stall for seconds while MuxPlayer initialized and
274
- // buffered. Always-mounted players are visually safe now that every bite
275
- // carries a poster: the player renders with a transparent media background
276
- // over the card's poster layer, so a not-yet-decoded player never shows as
277
- // a black rectangle (the original wrap-seam flash came from POSTERLESS
278
- // mounted players, not from mounting itself).
279
- const showPlayer = showMedia;
280
-
281
- // Poster resolution — THE shared entity-card cover fallback chain
282
- // (use-cover-image-fallback): the bite's real thumbnail_url, dropped on
283
- // load error. When it resolves to null (no thumbnail yet, or it failed)
284
- // the media zone falls back to the first-frame <video> facade below.
285
- const { src: posterSrc, onError: onPosterError } = useCoverImageFallback(bite.thumbnail_url);
286
-
287
240
  const navigate = () => {
288
241
  if (bite.onNavigate) bite.onNavigate();
289
242
  else onBiteNavigate?.(bite, index);
@@ -362,9 +315,22 @@ export function VideoBiteCard({
362
315
  isActive ? 'opacity-100' : 'opacity-0 group-hover/card:opacity-100 group-focus-within/card:opacity-100',
363
316
  // Non-interactive while invisible so it never swallows clicks on the
364
317
  // resting card / player controls.
365
- isActive ? 'pointer-events-auto' : 'pointer-events-none group-hover/card:pointer-events-auto group-focus-within/card:pointer-events-auto',
318
+ isActive ? 'pointer-events-auto' : 'pointer-events-none',
366
319
  );
367
320
 
321
+ // Full-card click target (above the visual overlay (z-[5] vs its auto), below the surface's own z-10 children (play badge, unmute button) which must stay clickable). Mirrors
322
+ // the walkthrough card: a hit layer owns the click, the overlay owns the look.
323
+ // ALWAYS interactive. The old overlay was hover-gated because it was a
324
+ // visible panel that would otherwise swallow clicks while invisible; a
325
+ // contentless hit layer has no such problem, and gating it meant the media
326
+ // element received the pointer instead — so a resting card showed `cursor:
327
+ // auto` over the play glyph even though the glyph accented on hover.
328
+ // Touch keeps the deliberate two-tap model (tap 1 previews, tap 2 opens), so
329
+ // the layer stays inert until the card is active — making it unconditionally
330
+ // clickable meant a phone tap navigated instantly and bites could no longer
331
+ // be previewed on mobile. Mouse/keyboard get it immediately.
332
+ const hitLayerClass = cn('z-[5]', isTouch && !isActive ? 'pointer-events-none' : 'pointer-events-auto');
333
+
368
334
  const media = (
369
335
  <div
370
336
  className="relative w-full"
@@ -372,96 +338,33 @@ export function VideoBiteCard({
372
338
  // same as the old single-box layout). Editor mode: width-driven.
373
339
  style={{ aspectRatio: cssAspect, ...(height !== undefined ? { height, maxWidth: STRIP_CELL_MAX_WIDTH } : {}) }}
374
340
  >
375
- {showMedia ? (
376
- // Clones: `inert` (not just the wrapper's aria-hidden) the player's
377
- // shadow-DOM center control is otherwise still tab-reachable inside a
378
- // hidden subtree (axe aria-hidden-focus). Hover preview on clones
379
- // keeps working: playback is driven imperatively from the CARD's own
380
- // pointer handlers, never from focus/clicks on the player chrome.
381
- <div className="absolute inset-0" inert={isClone || undefined}>
382
- {/* Poster layer. Preferred: the bite's REAL thumbnail (generated at
383
- Vizard-ingestion time by vizard-persistence-utils via Shotstack
384
- capture — the provider sends no cover), resolved through the
385
- shared cover fallback chain. Fallback when it's absent or fails
386
- to load: the <Video> component's `firstFrameOnly` facade paints
387
- the `#t=0.1` frame. Either way the box is never a black
388
- rectangle, and original + clone paint the IDENTICAL image so the
389
- marquee's wrap seam stays pixel-invisible. */}
390
- {posterSrc ? (
391
- <Image
392
- src={posterSrc}
393
- alt=""
394
- fill
395
- // Bite cards are portrait 9:16 at ~234px wide (Figma: 416px tall).
396
- // Without `sizes`, `fill` makes the Supabase-optimizing <Image>
397
- // assume a full-viewport width and request a ~2500px render for a
398
- // 234px slot. Pin it to the card width so the render endpoint
399
- // returns a ~2x-retina image instead of the near-full-res poster.
400
- sizes="234px"
401
- unoptimized
402
- onError={onPosterError}
403
- className="object-cover"
404
- />
405
- ) : (
406
- <Video kind="file" url={previewUrl} firstFrameOnly layout="fill" />
407
- )}
408
-
409
- {/* Play affordance for every non-playing state (resting poster,
410
- facade, mounted-but-paused): <VideoPlayBadge> — a pixel replica
411
- of MuxPlayer's pre-play center button (media-chrome's own PAUSED
412
- center control is a different, smaller bare glyph, so the
413
- mounted player runs chromeless and the replica keeps all states
414
- identical to the mux button). Hidden while playing. */}
415
- {!isActive && <VideoPlayBadge className="absolute inset-0 z-10 m-auto" />}
416
- {showPlayer && (
417
- // `--media-background-color: transparent` (inherited into
418
- // media-chrome) — the freshly-mounted player must not blank the
419
- // facade behind it with its default black fill while it loads.
420
- <div
421
- className="absolute inset-0"
422
- style={{ '--media-background-color': 'transparent' } as React.CSSProperties}
423
- >
424
- {/* CONTROLLED hover playback keyed to CARD hover (`isActive`): the
425
- detail overlay is part of the card, so moving the pointer onto
426
- it keeps playing. Sound at 50% (pre-activation: muted start +
427
- live unmute on the user's first gesture); CHROMELESS — the
428
- card's mux-replica badge above is the play affordance for
429
- every non-playing state.
430
-
431
- INVARIANTS (do not regress):
432
- - No explicit `preload` — the SSOT default ('metadata',
433
- 'none' under Save-Data) buffers manifest + ~1 segment on
434
- mount, which is exactly what makes hover start instant.
435
- - The poster <Image> layer above stays mounted UNDER this
436
- player permanently, and play() is imperative — never gated
437
- on poster load — so there is no black flash and no
438
- loading state between hover and first frame. */}
439
- <Video
440
- kind="file"
441
- url={previewUrl}
442
- poster={bite.thumbnail_url}
443
- playWhenHovered={isActive}
444
- chromeless
445
- layout="fill"
446
- />
447
- </div>
448
- )}
449
- </div>
450
- ) : (
451
- // Aspect-matched placeholder until the card nears the viewport (CLS-free).
452
- <div className="absolute inset-0 bg-ods-card" />
453
- )}
341
+ {/* THE shared hover-preview media zone (poster → facade → badge →
342
+ controlled hover playback + near-viewport mount gate). The bite strip
343
+ keeps the internal unmute badge (no overlaying activation button). */}
344
+ <VideoHoverPreviewSurface
345
+ url={bite.url}
346
+ posterUrl={bite.thumbnail_url}
347
+ active={isActive}
348
+ playerMounted={playerMounted}
349
+ isClone={isClone}
350
+ />
454
351
 
455
- {hasTarget && !isClone && !titleEditable ? (
456
- targetHref ? (
457
- <a href={targetHref} aria-label={`Open ${bite.title || 'source content'}`} className={overlayClass}>
458
- {overlayContent}
459
- </a>
460
- ) : (
461
- <button type="button" onClick={navigate} aria-label={`Open ${bite.title || 'source content'}`} className={cn(overlayClass, 'text-left w-full')}>
462
- {overlayContent}
463
- </button>
464
- )
352
+ {hasTarget && !titleEditable ? (
353
+ // CONTENTLESS full-bleed hit layer + a purely visual overlay — the same
354
+ // grammar the walkthrough card uses. Previously the anchor/button WAS
355
+ // the bottom strip, so the card centre (where the play glyph sits) was
356
+ // not clickable and showed no pointer cursor even though the glyph
357
+ // accented on hover. One interactive element, no a11y duplication.
358
+ <>
359
+ <CardHitLayer
360
+ label={`Open ${bite.title || 'source content'}`}
361
+ href={targetHref || undefined}
362
+ onClick={targetHref ? undefined : navigate}
363
+ className={hitLayerClass}
364
+ decorative={isClone}
365
+ />
366
+ <div className={cn(overlayClass, 'pointer-events-none')}>{overlayContent}</div>
367
+ </>
465
368
  ) : (
466
369
  <div className={overlayClass}>{overlayContent}</div>
467
370
  )}
@@ -470,10 +373,7 @@ export function VideoBiteCard({
470
373
 
471
374
  return (
472
375
  <div
473
- ref={node => {
474
- rootElRef.current = node;
475
- return rootRef?.(node);
476
- }}
376
+ ref={node => rootRef?.(node)}
477
377
  aria-hidden={isClone || undefined}
478
378
  // Hit-test marker for the strip engine's pointer-tracked hover re-sync
479
379
  // (cards move under a stationary pointer — see cards-strip.tsx). The
@@ -49,7 +49,16 @@ export interface VideoPlayBadgeProps {
49
49
  export function VideoPlayBadge({ size = 'md', className }: VideoPlayBadgeProps): React.ReactElement {
50
50
  return (
51
51
  <div
52
- className={cn('pointer-events-none flex items-center justify-center text-ods-text-primary transition-colors', className)}
52
+ className={cn(
53
+ 'pointer-events-none flex items-center justify-center text-ods-text-primary transition-colors',
54
+ // Accent on card hover. These glyphs are pointer-events-none by design,
55
+ // so they can never resolve their own :hover — they key off the host
56
+ // card's `group/card` marker. Living HERE (not at each call site) is
57
+ // what makes bites, the walkthrough card and every future surface
58
+ // behave identically from one definition.
59
+ 'group-hover/card:text-ods-accent',
60
+ className,
61
+ )}
53
62
  style={{ filter: GLYPH_SHADOW }}
54
63
  >
55
64
  <PlayFilledIcon size={SIZES[size]} color="currentColor" />
@@ -70,7 +79,7 @@ export function VideoUnmuteGlyph({ size = 'md', className }: VideoUnmuteGlyphPro
70
79
  <VolumeOffFilledIcon
71
80
  size={SIZES[size]}
72
81
  color="currentColor"
73
- className={className}
82
+ className={cn('transition-colors group-hover/card:text-ods-accent', className)}
74
83
  style={{ filter: GLYPH_SHADOW }}
75
84
  />
76
85
  )