@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.
- package/dist/{chunk-H6DFCF44.cjs → chunk-22AED5IC.cjs} +82 -82
- package/dist/{chunk-H6DFCF44.cjs.map → chunk-22AED5IC.cjs.map} +1 -1
- package/dist/{chunk-MGKCS6KS.js → chunk-3WCARCI4.js} +2 -2
- package/dist/{chunk-LNKWY74S.cjs → chunk-4HL6UENH.cjs} +5 -5
- package/dist/{chunk-LNKWY74S.cjs.map → chunk-4HL6UENH.cjs.map} +1 -1
- package/dist/{chunk-Y3Y2DLNO.js → chunk-6UGYBCEN.js} +3 -3
- package/dist/{chunk-BBUEY73L.js → chunk-7I5B5PQ4.js} +6269 -5339
- package/dist/chunk-7I5B5PQ4.js.map +1 -0
- package/dist/{chunk-PSPWT2Q5.js → chunk-7LWXWXEY.js} +4 -4
- package/dist/{chunk-M7O74OWG.cjs → chunk-ACOU5YJI.cjs} +31 -31
- package/dist/{chunk-M7O74OWG.cjs.map → chunk-ACOU5YJI.cjs.map} +1 -1
- package/dist/{chunk-INDFIVDV.cjs → chunk-AHGSN4AT.cjs} +12 -12
- package/dist/{chunk-INDFIVDV.cjs.map → chunk-AHGSN4AT.cjs.map} +1 -1
- package/dist/{chunk-VTSRDC4W.js → chunk-CKC3EAYT.js} +2 -2
- package/dist/{chunk-SASR7SK5.js → chunk-GZK7FWJJ.js} +20 -4
- package/dist/chunk-GZK7FWJJ.js.map +1 -0
- package/dist/{chunk-ZRANZNEA.js → chunk-JJE5TUZK.js} +2 -2
- package/dist/{chunk-66BNAFO6.js → chunk-JQIUBFHL.js} +4 -4
- package/dist/{chunk-MMCBQJKE.cjs → chunk-KUBJHB6I.cjs} +11 -11
- package/dist/{chunk-MMCBQJKE.cjs.map → chunk-KUBJHB6I.cjs.map} +1 -1
- package/dist/{chunk-ZV6E3U3C.cjs → chunk-MRGTMMJ3.cjs} +30 -30
- package/dist/{chunk-ZV6E3U3C.cjs.map → chunk-MRGTMMJ3.cjs.map} +1 -1
- package/dist/{chunk-OZJN54R5.cjs → chunk-NWVKG7QC.cjs} +37 -37
- package/dist/{chunk-OZJN54R5.cjs.map → chunk-NWVKG7QC.cjs.map} +1 -1
- package/dist/{chunk-AN47EIIJ.cjs → chunk-PHTSSHIQ.cjs} +59 -59
- package/dist/{chunk-AN47EIIJ.cjs.map → chunk-PHTSSHIQ.cjs.map} +1 -1
- package/dist/{chunk-N2JZ33V7.cjs → chunk-RUA3OXSJ.cjs} +26 -26
- package/dist/{chunk-N2JZ33V7.cjs.map → chunk-RUA3OXSJ.cjs.map} +1 -1
- package/dist/{chunk-LK623WCC.cjs → chunk-RZPF7MJ2.cjs} +9 -9
- package/dist/{chunk-LK623WCC.cjs.map → chunk-RZPF7MJ2.cjs.map} +1 -1
- package/dist/{chunk-G3UN2DXU.cjs → chunk-STYA77PH.cjs} +20 -4
- package/dist/chunk-STYA77PH.cjs.map +1 -0
- package/dist/{chunk-JUJY3HQS.cjs → chunk-U37UTLP7.cjs} +19 -19
- package/dist/{chunk-JUJY3HQS.cjs.map → chunk-U37UTLP7.cjs.map} +1 -1
- package/dist/{chunk-2DIOV7BR.js → chunk-UPN6EFOM.js} +4 -4
- package/dist/{chunk-OWMLWJQY.cjs → chunk-VPVOJD5X.cjs} +2432 -1502
- package/dist/chunk-VPVOJD5X.cjs.map +1 -0
- package/dist/{chunk-4SMRQ4SN.js → chunk-WBL5Y4PS.js} +3 -3
- package/dist/{chunk-FP4H6Y5O.js → chunk-WPYPSIY2.js} +3 -3
- package/dist/{chunk-R5WJJL4V.js → chunk-X5X43HFV.js} +5 -5
- package/dist/{chunk-DEHZ5CTC.js → chunk-XTWKDMCG.js} +2 -2
- package/dist/components/case-studies/index.cjs +9 -9
- package/dist/components/case-studies/index.js +3 -3
- package/dist/components/chat/index.cjs +3 -3
- package/dist/components/chat/index.js +2 -2
- package/dist/components/contact/index.cjs +4 -4
- package/dist/components/contact/index.js +3 -3
- package/dist/components/docs/index.cjs +6 -6
- package/dist/components/docs/index.js +5 -5
- package/dist/components/embeds/index.cjs +4 -4
- package/dist/components/embeds/index.js +3 -3
- package/dist/components/faq/index.cjs +4 -4
- package/dist/components/faq/index.js +3 -3
- package/dist/components/features/captions-url.cjs +12 -0
- package/dist/components/features/captions-url.cjs.map +1 -0
- package/dist/components/features/captions-url.js +10 -0
- package/dist/components/features/captions-url.js.map +1 -0
- package/dist/components/features/card-hit-layer.d.ts +40 -0
- package/dist/components/features/card-hit-layer.d.ts.map +1 -0
- package/dist/components/features/floating-walkthrough-video.d.ts +71 -0
- package/dist/components/features/floating-walkthrough-video.d.ts.map +1 -0
- package/dist/components/features/index.cjs +11 -3
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.d.ts +4 -0
- package/dist/components/features/index.d.ts.map +1 -1
- package/dist/components/features/index.js +12 -4
- package/dist/components/features/use-walkthrough-video.d.ts +16 -0
- package/dist/components/features/use-walkthrough-video.d.ts.map +1 -0
- package/dist/components/features/video-bites-strip.d.ts.map +1 -1
- package/dist/components/features/video-center-badge.d.ts.map +1 -1
- package/dist/components/features/video-hover-preview.d.ts +68 -0
- package/dist/components/features/video-hover-preview.d.ts.map +1 -0
- package/dist/components/features/video.d.ts +78 -40
- package/dist/components/features/video.d.ts.map +1 -1
- package/dist/components/form.d.ts +0 -1
- package/dist/components/form.d.ts.map +1 -1
- package/dist/components/help-center-pages/index.cjs +21 -21
- package/dist/components/help-center-pages/index.js +12 -12
- package/dist/components/index.cjs +163 -155
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +18 -10
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/index.cjs +3 -3
- package/dist/components/navigation/index.js +2 -2
- package/dist/components/onboarding-guides/index.cjs +6 -6
- package/dist/components/onboarding-guides/index.js +5 -5
- package/dist/components/related-content/index.cjs +4 -4
- package/dist/components/related-content/index.js +3 -3
- package/dist/components/tickets/index.cjs +6 -6
- package/dist/components/tickets/index.js +5 -5
- package/dist/components/ui/button/button-styles.d.ts +2 -0
- package/dist/components/ui/button/button-styles.d.ts.map +1 -1
- package/dist/components/ui/button/button.d.ts +2 -2
- package/dist/components/ui/button/button.d.ts.map +1 -1
- package/dist/components/ui/file-manager/index.cjs +50 -50
- package/dist/components/ui/file-manager/index.js +1 -1
- package/dist/components/ui/index.cjs +3 -3
- package/dist/components/ui/index.js +2 -2
- package/dist/components/ui/page-actions.d.ts +2 -1
- package/dist/components/ui/page-actions.d.ts.map +1 -1
- package/dist/index.cjs +27 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +28 -4
- package/dist/types/supabase.d.ts +80 -0
- package/dist/types/supabase.d.ts.map +1 -1
- package/dist/types/video-processing.d.ts +1 -1
- package/dist/types/video-processing.d.ts.map +1 -1
- package/dist/utils/announcement-storage.d.ts +1 -1
- package/dist/utils/announcement-storage.d.ts.map +1 -1
- package/dist/utils/dismiss-cookie.d.ts +27 -0
- package/dist/utils/dismiss-cookie.d.ts.map +1 -0
- package/dist/utils/dismissal-storage.d.ts +19 -0
- package/dist/utils/dismissal-storage.d.ts.map +1 -0
- package/dist/utils/index.cjs +48 -10
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +41 -11
- package/dist/utils/index.js.map +1 -1
- package/package.json +8 -2
- package/src/.index.md +39 -32
- package/src/.platform-domains.md +65 -0
- package/src/assets/.fae-avatar.md +33 -0
- package/src/assets/.index.md +15 -9
- package/src/components/.agent-mark.md +31 -0
- package/src/components/.announcement-bar.md +47 -35
- package/src/components/.calendar.md +19 -15
- package/src/components/.categories-cart.md +34 -30
- package/src/components/.category-card.md +33 -33
- package/src/components/.chart.md +38 -40
- package/src/components/.command.md +47 -23
- package/src/components/.comment-card.md +31 -26
- package/src/components/.content-loading-container.md +45 -20
- package/src/components/.context-menu.md +45 -31
- package/src/components/.date-time-picker.md +36 -30
- package/src/components/.empty-state.md +31 -31
- package/src/components/.faq-accordion.md +20 -30
- package/src/components/.filter-chip.md +36 -33
- package/src/components/.footer-waitlist-button.md +27 -21
- package/src/components/.footer.md +39 -24
- package/src/components/.form.md +32 -20
- package/src/components/.hero-image-uploader.md +35 -31
- package/src/components/.icon-display.md +53 -0
- package/src/components/.image-cropper.md +34 -33
- package/src/components/.index.md +25 -29
- package/src/components/.logs-list.md +27 -23
- package/src/components/.media-carousel.md +47 -26
- package/src/components/.metric-value.md +27 -24
- package/src/components/.msp-display.md +29 -23
- package/src/components/.open-source-features.md +23 -26
- package/src/components/.pagination.md +44 -39
- package/src/components/.persistent-filter-controls.md +61 -28
- package/src/components/.pricing-display.md +34 -33
- package/src/components/.results-count.md +33 -20
- package/src/components/.smooth-accordion.md +24 -20
- package/src/components/.social-icon-row.md +33 -21
- package/src/components/.sonner.md +40 -25
- package/src/components/.steps.md +39 -25
- package/src/components/.tool-icon.md +34 -21
- package/src/components/.unified-filter-logic.md +32 -36
- package/src/components/.user-display.md +33 -28
- package/src/components/.user-summary-stub.md +40 -33
- package/src/components/.vendor-display-button.md +17 -15
- package/src/components/.vendor-icon.md +17 -25
- package/src/components/.vendor-tag.md +39 -34
- package/src/components/.why-it-matters.md +15 -11
- package/src/components/.yes-no-display.md +36 -31
- package/src/components/authors/.author-detail-view.md +50 -0
- package/src/components/case-studies/.index.md +26 -0
- package/src/components/case-studies/.share-experience-section.md +45 -0
- package/src/components/chat/.approval-batch-message.md +48 -33
- package/src/components/chat/.approval-request-message.md +37 -26
- package/src/components/chat/.chat-archive-page.md +56 -0
- package/src/components/chat/.chat-attachment-bar.md +32 -40
- package/src/components/chat/.chat-composer.md +43 -0
- package/src/components/chat/.chat-container.md +41 -25
- package/src/components/chat/.chat-context-memory-bar.md +53 -0
- package/src/components/chat/.chat-context-picker.md +89 -0
- package/src/components/chat/.chat-header-icon-button.md +43 -0
- package/src/components/chat/.chat-header-search-field.md +51 -0
- package/src/components/chat/.chat-input.md +63 -30
- package/src/components/chat/.chat-list-empty-state.md +44 -0
- package/src/components/chat/.chat-message-enhanced.md +29 -31
- package/src/components/chat/.chat-message-list.md +34 -44
- package/src/components/chat/.chat-message-row.md +56 -0
- package/src/components/chat/.chat-message-skeleton.md +32 -26
- package/src/components/chat/.chat-panel-header-mobile.md +46 -0
- package/src/components/chat/.chat-panel-header.md +80 -0
- package/src/components/chat/.chat-sidebar-skeleton.md +31 -30
- package/src/components/chat/.chat-sidebar.md +36 -29
- package/src/components/chat/.chat-ticket-list.md +38 -23
- package/src/components/chat/.chat-typing-indicator.md +37 -19
- package/src/components/chat/.context-compaction-display.md +19 -15
- package/src/components/chat/.context-items-list.md +57 -0
- package/src/components/chat/.embeddable-chat.md +57 -66
- package/src/components/chat/.error-message-display.md +40 -22
- package/src/components/chat/.guide-mode-banner.md +41 -0
- package/src/components/chat/.guide-welcome.md +43 -0
- package/src/components/chat/.index.md +26 -21
- package/src/components/chat/.mingo-chat-history.md +63 -0
- package/src/components/chat/.mingo-chat-modals.md +44 -0
- package/src/components/chat/.mingo-history-rail.md +63 -0
- package/src/components/chat/.mingo-info-card.md +59 -0
- package/src/components/chat/.mingo-onboarding-card.md +21 -27
- package/src/components/chat/.mingo-welcome.md +60 -0
- package/src/components/chat/.model-display.md +33 -25
- package/src/components/chat/.msp-organization-card-skeleton.md +44 -0
- package/src/components/chat/.msp-organization-card.md +51 -0
- package/src/components/chat/.nav-link-anchor-via-runtime.md +36 -25
- package/src/components/chat/.quick-action-chip.md +60 -0
- package/src/components/chat/.quick-action-marquee.md +53 -0
- package/src/components/chat/.quick-action-wall.md +68 -0
- package/src/components/chat/.remark-mention-chips.md +41 -0
- package/src/components/chat/.slash-command-suggestions.md +30 -36
- package/src/components/chat/.source-action-button.md +28 -25
- package/src/components/chat/.tool-call-blocks.md +18 -30
- package/src/components/chat/.tool-execution-display.md +29 -34
- package/src/components/chat/entity-cards/.admin-content-card.md +29 -22
- package/src/components/chat/entity-cards/.blog-card.md +44 -33
- package/src/components/chat/entity-cards/.blog-image-placeholder.md +20 -18
- package/src/components/chat/entity-cards/.case-study-card.md +24 -33
- package/src/components/chat/entity-cards/.chat-ticket-item.md +39 -22
- package/src/components/chat/entity-cards/.customer-interview-card.md +29 -32
- package/src/components/chat/entity-cards/.data-room-doc-card.md +21 -22
- package/src/components/chat/entity-cards/.dispatch.md +41 -24
- package/src/components/chat/entity-cards/.entity-author-card.md +36 -33
- package/src/components/chat/entity-cards/.entity-portrait-card.md +47 -0
- package/src/components/chat/entity-cards/.generic-entity-card.md +26 -25
- package/src/components/chat/entity-cards/.github-activity-card.md +35 -41
- package/src/components/chat/entity-cards/.hubspot-ticket-card.md +22 -28
- package/src/components/chat/entity-cards/.index.md +33 -44
- package/src/components/chat/entity-cards/.investor-update-card.md +36 -25
- package/src/components/chat/entity-cards/.onboarding-guide-card.md +20 -29
- package/src/components/chat/entity-cards/.product-release-card-defaults.md +26 -19
- package/src/components/chat/entity-cards/.program-card.md +30 -33
- package/src/components/chat/entity-cards/.roadmap-card.md +40 -31
- package/src/components/chat/entity-cards/.roadmap-vote-button.md +33 -36
- package/src/components/chat/entity-cards/.slack-message-card.md +31 -32
- package/src/components/chat/entity-cards/.use-cover-image-fallback.md +47 -0
- package/src/components/chat/entity-cards/.use-entity-card-link.md +51 -0
- package/src/components/chat/entity-cards/.use-entity-card-placeholder.md +47 -0
- package/src/components/chat/entity-cards/.what-i-shipped-card.md +43 -0
- package/src/components/chat/hooks/.index.md +33 -30
- package/src/components/chat/hooks/.use-chat-card-item.md +30 -17
- package/src/components/chat/hooks/.use-chat-dialog-manager.md +59 -0
- package/src/components/chat/hooks/.use-chat-identity.md +37 -25
- package/src/components/chat/hooks/.use-chunk-catchup.md +53 -36
- package/src/components/chat/hooks/.use-empty-state-config.md +39 -0
- package/src/components/chat/hooks/.use-jetstream-dialog-subscription.md +65 -30
- package/src/components/chat/hooks/.use-nats-chat-adapter.md +55 -36
- package/src/components/chat/hooks/.use-nats-dialog-subscription.md +66 -50
- package/src/components/chat/hooks/.use-realtime-chunk-processor.md +58 -31
- package/src/components/chat/hooks/.use-scripted-stream.md +46 -0
- package/src/components/chat/hooks/.use-slash-commands.md +32 -25
- package/src/components/chat/hooks/.use-sse-chat-adapter.md +32 -21
- package/src/components/chat/hooks/.use-unified-chat.md +45 -35
- package/src/components/chat/types/.api.types.md +49 -41
- package/src/components/chat/types/.chat.types.md +56 -34
- package/src/components/chat/types/.component.types.md +36 -36
- package/src/components/chat/types/.context-item.types.md +61 -0
- package/src/components/chat/types/.index.md +32 -17
- package/src/components/chat/types/.message.types.md +44 -45
- package/src/components/chat/types/.network.types.md +46 -46
- package/src/components/chat/types/.processing.types.md +49 -37
- package/src/components/chat/types/.unified-chat-state.types.md +41 -26
- package/src/components/chat/types/entities/.content-ref.md +20 -31
- package/src/components/chat/types/entities/.investor-update.md +14 -16
- package/src/components/chat/types/entities/.onboarding-guide.md +35 -34
- package/src/components/chat/types/entities/.program-types.md +55 -43
- package/src/components/chat/utils/.chip-action-class.md +17 -19
- package/src/components/chat/utils/.chip-styles.md +18 -18
- package/src/components/chat/utils/.chunk-parser.md +48 -37
- package/src/components/chat/utils/.compact-card-classes.md +33 -35
- package/src/components/chat/utils/.execute-navigation.md +49 -0
- package/src/components/chat/utils/.extract-incomplete-message-state.md +9 -12
- package/src/components/chat/utils/.history-merge.md +65 -0
- package/src/components/chat/utils/.icon-library.md +33 -31
- package/src/components/chat/utils/.icon-registry.md +44 -0
- package/src/components/chat/utils/.index.md +37 -33
- package/src/components/chat/utils/.is-cross-origin-url.md +26 -22
- package/src/components/chat/utils/.message-segment-accumulator.md +46 -25
- package/src/components/chat/utils/.nav-anchor-props.md +29 -34
- package/src/components/chat/utils/.nav-click-handler.md +29 -33
- package/src/components/chat/utils/.process-historical-messages.md +29 -33
- package/src/components/chat/utils/.scripted-stream.md +52 -0
- package/src/components/chat/utils/.source-row-cta.md +32 -31
- package/src/components/chat/utils/.tool-call-helpers.md +25 -17
- package/src/components/contact/.contact-form.md +24 -19
- package/src/components/docs/.doc-navigation-context.md +49 -0
- package/src/components/docs/.doc-viewer.md +64 -0
- package/src/components/docs/.docs-hub-page.md +49 -0
- package/src/components/docs/.index.md +51 -0
- package/src/components/docs/.skeletons.md +47 -0
- package/src/components/docs/.use-docs-resolve-link.md +61 -0
- package/src/components/docs/.use-document-tree.md +83 -0
- package/src/components/docs/.use-scroll-spy.md +58 -0
- package/src/components/embeds/.embed-container.md +45 -0
- package/src/components/embeds/.embed-iframe.md +51 -0
- package/src/components/embeds/.figma-embed.md +43 -0
- package/src/components/embeds/.file-download-card.md +47 -0
- package/src/components/embeds/.google-sheets-viewer.md +40 -0
- package/src/components/embeds/.index.md +58 -0
- package/src/components/embeds/.linkedin-embed-client.md +50 -0
- package/src/components/embeds/.markdown-image.md +40 -0
- package/src/components/embeds/.og-link-preview.md +54 -0
- package/src/components/embeds/.pdf-viewer.md +43 -0
- package/src/components/embeds/.reddit-embed-client.md +40 -0
- package/src/components/embeds/.rich-markdown-runtime.md +53 -0
- package/src/components/embeds/.twitter-embed-client.md +44 -0
- package/src/components/faq/.faq-document-page.md +68 -0
- package/src/components/faq/.faq-section.md +55 -0
- package/src/components/faq/.index.md +29 -0
- package/src/components/faq/.json-ld.md +48 -0
- package/src/components/features/.array-entry-manager.md +32 -24
- package/src/components/features/.auth-providers-list.md +33 -32
- package/src/components/features/.captions-url.md +43 -0
- package/src/components/features/.cards-strip.md +48 -0
- package/src/components/features/.changelog-manager.md +17 -20
- package/src/components/features/.command-box.md +11 -16
- package/src/components/features/.entity-summary-editor.md +20 -15
- package/src/components/features/.entity-tag-badges.md +43 -0
- package/src/components/features/.entity-video-section.md +31 -41
- package/src/components/features/.figma-prototype-viewer.md +55 -37
- package/src/components/features/.filters-dropdown.md +14 -13
- package/src/components/features/.highlight-config-section.md +19 -16
- package/src/components/features/.highlight-video-combined-section.md +28 -19
- package/src/components/features/.highlight-video-preview.md +13 -11
- package/src/components/features/.highlight-video-section.md +26 -22
- package/src/components/features/.index.md +40 -36
- package/src/components/features/.media-gallery-manager.md +37 -35
- package/src/components/features/.mux-origins.md +46 -0
- package/src/components/features/.og-editor-preview.md +29 -24
- package/src/components/features/.os-type-badge-group.md +26 -18
- package/src/components/features/.os-type-badge.md +41 -24
- package/src/components/features/.paths-display.md +42 -25
- package/src/components/features/.platform-badge.md +26 -17
- package/src/components/features/.policy-configuration-panel.md +33 -31
- package/src/components/features/.provider-button.md +29 -20
- package/src/components/features/.push-button-selector.md +39 -41
- package/src/components/features/.release-media-manager.md +41 -34
- package/src/components/features/.section-selector.md +27 -16
- package/src/components/features/.select-button.md +21 -32
- package/src/components/features/.seo-editor-preview.md +49 -36
- package/src/components/features/.social-links-manager.md +40 -18
- package/src/components/features/.start-with-openframe-button.md +30 -32
- package/src/components/features/.status-filter-component.md +29 -38
- package/src/components/features/.tags-selector.md +25 -29
- package/src/components/features/.transcript-summary-editor.md +24 -18
- package/src/components/features/.use-video-warmup.md +47 -0
- package/src/components/features/.video-bites-display.md +36 -37
- package/src/components/features/.video-bites-shared.md +44 -0
- package/src/components/features/.video-bites-strip.md +63 -0
- package/src/components/features/.video-center-badge.md +38 -0
- package/src/components/features/.video-ratio-tabs.md +38 -31
- package/src/components/features/.video-source-selector.md +24 -27
- package/src/components/features/.video.md +35 -27
- package/src/components/features/.waitlist-form.md +39 -33
- package/src/components/features/.warning-block.md +53 -0
- package/src/components/features/ai-enrich/.AIEnrichSection.md +24 -25
- package/src/components/features/ai-enrich/.AIRequiredBadge.md +22 -21
- package/src/components/features/ai-enrich/.AIStatusIndicator.md +42 -35
- package/src/components/features/ai-enrich/.AIWarningsSection.md +23 -20
- package/src/components/features/ai-enrich/.ConfidenceBadge.md +35 -20
- package/src/components/features/auth/.auth-benefits-panel.md +48 -0
- package/src/components/features/auth/.auth-branding.md +51 -0
- package/src/components/features/auth/.auth-shell.md +51 -0
- package/src/components/features/auth/.back-to-login-link.md +48 -0
- package/src/components/features/auth/.complete-account-form.md +45 -0
- package/src/components/features/auth/.create-organization-form.md +53 -0
- package/src/components/features/auth/.index.md +48 -0
- package/src/components/features/auth/.invite-link-invalid-modal.md +42 -0
- package/src/components/features/auth/.login-form.md +42 -0
- package/src/components/features/auth/.openframe-sso-login-form.md +46 -0
- package/src/components/features/auth/.openframe-sso-signup-form.md +51 -0
- package/src/components/features/auth/.password-reset-form.md +57 -0
- package/src/components/features/auth/.sso-auth-shell.md +35 -0
- package/src/components/features/auth/.sso-providers.md +42 -0
- package/src/components/features/auth/.terms-agreement-label.md +28 -0
- package/src/components/features/board/.board-column-header.md +24 -18
- package/src/components/features/board/.board-column.md +32 -32
- package/src/components/features/board/.board-ticket-approval.md +42 -0
- package/src/components/features/board/.board.md +38 -38
- package/src/components/features/board/.index.md +35 -38
- package/src/components/features/board/.ticket-card.md +33 -36
- package/src/components/features/board/.types.md +38 -31
- package/src/components/features/card-hit-layer.tsx +84 -0
- package/src/components/features/floating-walkthrough-video.tsx +891 -0
- package/src/components/features/index.ts +4 -0
- package/src/components/features/notifications/.approval-request-notification-tile.md +45 -0
- package/src/components/features/notifications/.index.md +35 -31
- package/src/components/features/notifications/.notification-drawer.md +32 -19
- package/src/components/features/notifications/.notification-popups.md +51 -0
- package/src/components/features/notifications/.notification-tile.md +43 -27
- package/src/components/features/notifications/.notifications-context.md +42 -45
- package/src/components/features/notifications/.types.md +51 -31
- package/src/components/features/ticket-status-config-list/.ticket-status-config-list.md +51 -0
- package/src/components/features/time-tracker/.index.md +48 -0
- package/src/components/features/time-tracker/.time-tracker-context.md +55 -0
- package/src/components/features/time-tracker/.time-tracker-header-button.md +51 -0
- package/src/components/features/time-tracker/.time-tracker-panel.md +58 -0
- package/src/components/features/time-tracker/.types.md +51 -0
- package/src/components/features/time-tracker/.use-tracker-clock.md +32 -0
- package/src/components/features/use-walkthrough-video.ts +70 -0
- package/src/components/features/video-bites-strip.tsx +46 -146
- package/src/components/features/video-center-badge.tsx +11 -2
- package/src/components/features/video-hover-preview.tsx +201 -0
- package/src/components/features/video.tsx +368 -73
- package/src/components/help-center-pages/.delivery-page.md +51 -0
- package/src/components/help-center-pages/.index.md +51 -0
- package/src/components/help-center-pages/.onboarding-guides-catalog-page.md +53 -0
- package/src/components/help-center-pages/.product-releases-list-page.md +51 -0
- package/src/components/help-center-pages/.roadmap-page.md +46 -0
- package/src/components/icons/.figma-icon.md +13 -7
- package/src/components/icons/.index.md +26 -22
- package/src/components/icons/.vendor-directory-icon.md +30 -18
- package/src/components/icons/.x-logo.md +26 -10
- package/src/components/icons-v2-generated/.index.md +30 -41
- package/src/components/icons-v2-generated/brand-logos/.index.md +25 -19
- package/src/components/icons-v2-generated/communication/.index.md +26 -30
- package/src/components/icons-v2-generated/logos/.flamingo-logo-icon.md +41 -0
- package/src/components/layout/.article-detail-layout.md +32 -21
- package/src/components/layout/.page-container.md +25 -23
- package/src/components/layout/.page-heading.md +48 -0
- package/src/components/layout/.page-layout.md +30 -25
- package/src/components/layout/.title-block.md +43 -24
- package/src/components/loading/.card-skeleton.md +28 -35
- package/src/components/loading/.category-card-skeleton.md +25 -23
- package/src/components/loading/.device-card-skeleton.md +22 -15
- package/src/components/loading/.margin-report-skeleton.md +30 -35
- package/src/components/loading/.openmsp-heartbeat.md +30 -32
- package/src/components/loading/.organization-card-skeleton.md +22 -25
- package/src/components/loading/.organization-icon-skeleton.md +39 -27
- package/src/components/loading/.page-layout-skeleton.md +50 -28
- package/src/components/loading/.unified-skeleton.md +37 -40
- package/src/components/loading/.users-grid-skeleton.md +19 -38
- package/src/components/navigation/.app-header.md +35 -28
- package/src/components/navigation/.app-layout-context.md +48 -0
- package/src/components/navigation/.app-layout-drawer.md +56 -0
- package/src/components/navigation/.app-layout.md +24 -23
- package/src/components/navigation/.header-mingo-button.md +46 -0
- package/src/components/navigation/.header-organization-filter.md +32 -18
- package/src/components/navigation/.header.md +24 -31
- package/src/components/navigation/.index.md +36 -50
- package/src/components/navigation/.mingo-ai-button.md +41 -0
- package/src/components/navigation/.mobile-burger-menu.md +29 -29
- package/src/components/navigation/.mobile-nav-panel.md +41 -49
- package/src/components/navigation/.multi-level-navigation.md +76 -0
- package/src/components/navigation/.navigation-sidebar-item.md +14 -14
- package/src/components/navigation/.navigation-sidebar.md +30 -23
- package/src/components/navigation/.sliding-sidebar.md +30 -25
- package/src/components/navigation/.sticky-section-nav.md +23 -21
- package/src/components/onboarding-guides/.index.md +40 -0
- package/src/components/onboarding-guides/.onboarding-guide-detail-view.md +55 -0
- package/src/components/onboarding-guides/.onboarding-guides-catalog-skeleton.md +33 -0
- package/src/components/onboarding-guides/.onboarding-guides-catalog-view.md +50 -0
- package/src/components/onboarding-guides/hooks/.use-onboarding-guides.md +54 -0
- package/src/components/platform/.CveLink.md +28 -17
- package/src/components/platform/.ScriptArguments.md +18 -23
- package/src/components/platform/.ScriptInfoSection.md +27 -21
- package/src/components/platform/.ShellTypeBadge.md +34 -18
- package/src/components/platform/.SoftwareInfo.md +23 -21
- package/src/components/platform/.ToolBadge.md +18 -16
- package/src/components/profile/.ProfileLoadingSkeleton.md +24 -23
- package/src/components/related-content/.index.md +41 -0
- package/src/components/related-content/.related-content-section.md +62 -0
- package/src/components/shared/.article-author-byline.md +56 -0
- package/src/components/shared/.detail-page-skeleton.md +32 -43
- package/src/components/shared/.media-gallery-strip.md +43 -0
- package/src/components/shared/delivery/.delivery-lists.md +20 -19
- package/src/components/shared/delivery/.delivery-row.md +24 -20
- package/src/components/shared/delivery/.delivery-table.md +20 -22
- package/src/components/shared/dev-section/.dev-card-row.md +28 -36
- package/src/components/shared/dev-section/.dev-section-page.md +36 -25
- package/src/components/shared/dev-section/.dev-section-view.md +32 -22
- package/src/components/shared/doc-search/.doc-search-bar.md +58 -0
- package/src/components/shared/doc-search/.doc-search-result-row.md +50 -0
- package/src/components/shared/doc-search/.format-relative-path.md +30 -0
- package/src/components/shared/doc-search/.index.md +46 -0
- package/src/components/shared/doc-search/.map-doc-search-results.md +44 -0
- package/src/components/shared/doc-search/.resolve-search-result-action.md +52 -0
- package/src/components/shared/doc-search/.types.md +49 -0
- package/src/components/shared/doc-search/.use-doc-search.md +66 -0
- package/src/components/shared/legal-document/.legal-document-page.md +26 -20
- package/src/components/shared/legal-document/.use-legal-docs.md +36 -30
- package/src/components/shared/onboarding/.onboarding-step-card.md +24 -16
- package/src/components/shared/onboarding/.onboarding-walkthrough.md +42 -28
- package/src/components/shared/product-release/.index.md +33 -24
- package/src/components/shared/product-release/.product-release-card-skeleton.md +22 -28
- package/src/components/shared/product-release/.product-release-card.md +28 -29
- package/src/components/shared/product-release/.product-releases-view.md +49 -0
- package/src/components/shared/product-release/.release-detail-page.md +30 -15
- package/src/components/shared/roadmap/.index.md +29 -24
- package/src/components/shared/roadmap/.roadmap-grid.md +43 -54
- package/src/components/shared/roadmap/.roadmap-view.md +41 -0
- package/src/components/shared/roadmap/.use-roadmap-voting.md +27 -17
- package/src/components/switch.tsx +1 -1
- package/src/components/tickets/.help-center-card.md +32 -28
- package/src/components/tickets/.help-center-create-form.md +34 -22
- package/src/components/tickets/.help-center-list.md +36 -25
- package/src/components/tickets/.index.md +30 -45
- package/src/components/tickets/.ticket-center.md +31 -38
- package/src/components/tickets/.ticket-detail-drawer.md +20 -30
- package/src/components/tickets/.ticket-open-form.md +24 -26
- package/src/components/tickets/.ticket-reply-composer.md +51 -0
- package/src/components/tickets/.ticket-row.md +26 -11
- package/src/components/tickets/.types.md +56 -38
- package/src/components/tickets/hooks/.use-ticket-actions.md +60 -47
- package/src/components/tickets/hooks/.use-ticket-engagements.md +27 -27
- package/src/components/tickets/hooks/.use-tickets-list.md +24 -30
- package/src/components/ui/.accordion.md +28 -21
- package/src/components/ui/.actions-menu.md +36 -54
- package/src/components/ui/.ai-generated-badge.md +25 -0
- package/src/components/ui/.alert-dialog.md +21 -16
- package/src/components/ui/.alert.md +30 -25
- package/src/components/ui/.allowed-domains-input.md +26 -15
- package/src/components/ui/.announcement-bar-view.md +46 -0
- package/src/components/ui/.autocomplete.md +40 -27
- package/src/components/ui/.badge.md +34 -31
- package/src/components/ui/.brand-association-card.md +22 -18
- package/src/components/ui/.breadcrumb.md +18 -14
- package/src/components/ui/.bullet-list.md +35 -23
- package/src/components/ui/.card.md +47 -30
- package/src/components/ui/.checkbox-block.md +34 -22
- package/src/components/ui/.checkbox-with-description.md +18 -20
- package/src/components/ui/.chevron-button.md +29 -29
- package/src/components/ui/.circular-progress.md +30 -41
- package/src/components/ui/.color-preset-select.md +54 -0
- package/src/components/ui/.color-swatch.md +37 -0
- package/src/components/ui/.content-loader.md +34 -27
- package/src/components/ui/.crossfade-panels.md +50 -0
- package/src/components/ui/.cursor-pagination.md +38 -26
- package/src/components/ui/.dashboard-info-card.md +46 -27
- package/src/components/ui/.date-picker.md +52 -36
- package/src/components/ui/.device-card-compact.md +23 -20
- package/src/components/ui/.device-card.md +39 -30
- package/src/components/ui/.dialog.md +14 -14
- package/src/components/ui/.drawer.md +45 -39
- package/src/components/ui/.dropdown-button.md +41 -33
- package/src/components/ui/.dropdown-menu.md +40 -23
- package/src/components/ui/.duration-input.md +41 -0
- package/src/components/ui/.entity-image.md +32 -28
- package/src/components/ui/.error-state.md +30 -26
- package/src/components/ui/.fade-preview.md +44 -0
- package/src/components/ui/.field-wrapper.md +34 -23
- package/src/components/ui/.file-upload.md +30 -18
- package/src/components/ui/.filter-modal.md +30 -32
- package/src/components/ui/.filter-pill-row.md +58 -0
- package/src/components/ui/.floating-tooltip.md +27 -32
- package/src/components/ui/.hidden-tags-popup.md +18 -20
- package/src/components/ui/.highlight-card.md +36 -23
- package/src/components/ui/.honeypot-field.md +41 -0
- package/src/components/ui/.hover-dropdown.md +44 -31
- package/src/components/ui/.image-gallery-modal.md +28 -30
- package/src/components/ui/.image-uploader.md +39 -22
- package/src/components/ui/.index.md +33 -31
- package/src/components/ui/.info-card-row.md +50 -0
- package/src/components/ui/.info-card.md +27 -20
- package/src/components/ui/.info-row.md +30 -24
- package/src/components/ui/.info-section.md +63 -0
- package/src/components/ui/.input.md +29 -28
- package/src/components/ui/.label.md +34 -26
- package/src/components/ui/.markdown-editor.md +26 -25
- package/src/components/ui/.marquee-wall.md +64 -0
- package/src/components/ui/.menubar.md +50 -16
- package/src/components/ui/.modal-v2.md +41 -27
- package/src/components/ui/.modal.md +22 -19
- package/src/components/ui/.more-actions-menu.md +30 -24
- package/src/components/ui/.navigation-menu.md +40 -25
- package/src/components/ui/.organization-card.md +46 -27
- package/src/components/ui/.page-actions.md +55 -41
- package/src/components/ui/.page-loader.md +40 -23
- package/src/components/ui/.password-input.md +30 -0
- package/src/components/ui/.phone-input.md +20 -22
- package/src/components/ui/.portal-container.md +43 -0
- package/src/components/ui/.progress-bar.md +40 -27
- package/src/components/ui/.release-changelog-section.md +32 -26
- package/src/components/ui/.rich-markdown-renderer.md +45 -0
- package/src/components/ui/.scroll-fade.md +56 -0
- package/src/components/ui/.search-input.md +55 -37
- package/src/components/ui/.select.md +25 -26
- package/src/components/ui/.service-card.md +25 -19
- package/src/components/ui/.sheet.md +21 -21
- package/src/components/ui/.simple-markdown-renderer.md +36 -24
- package/src/components/ui/.slack-channel-chip.md +49 -0
- package/src/components/ui/.square-avatar.md +29 -26
- package/src/components/ui/.stacked-rows-panel.md +61 -0
- package/src/components/ui/.status-badge.md +30 -24
- package/src/components/ui/.status-indicator.md +35 -21
- package/src/components/ui/.tab-content.md +34 -22
- package/src/components/ui/.tab-navigation.md +40 -50
- package/src/components/ui/.tab-selector.md +48 -31
- package/src/components/ui/.tabs.md +34 -21
- package/src/components/ui/.tag-search-input.md +20 -20
- package/src/components/ui/.tag-select-dropdown.md +59 -0
- package/src/components/ui/.tag.md +25 -43
- package/src/components/ui/.tags-input.md +31 -31
- package/src/components/ui/.textarea.md +32 -30
- package/src/components/ui/.ticket-attachments-list.md +36 -29
- package/src/components/ui/.ticket-info-section.md +37 -42
- package/src/components/ui/.ticket-status-config-row.md +66 -0
- package/src/components/ui/.ticket-status-tag.md +39 -35
- package/src/components/ui/.toaster.md +21 -15
- package/src/components/ui/.toggle.md +38 -37
- package/src/components/ui/.tooltip.md +16 -13
- package/src/components/ui/button/.button-styles.md +17 -18
- package/src/components/ui/button/.button.md +30 -37
- package/src/components/ui/button/.split-button.md +46 -23
- package/src/components/ui/button/button-styles.ts +13 -0
- package/src/components/ui/button/button.tsx +5 -0
- package/src/components/ui/data-table/.data-table-body.md +50 -35
- package/src/components/ui/data-table/.data-table-empty.md +17 -33
- package/src/components/ui/data-table/.data-table-header.md +43 -40
- package/src/components/ui/data-table/.data-table-row.md +31 -31
- package/src/components/ui/data-table/.types.md +23 -28
- package/src/components/ui/file-manager/.file-manager-breadcrumb.md +16 -24
- package/src/components/ui/file-manager/.file-manager-empty.md +23 -15
- package/src/components/ui/file-manager/.file-manager-skeleton.md +34 -36
- package/src/components/ui/file-manager/.file-manager-table-row.md +29 -29
- package/src/components/ui/file-manager/.file-manager-table.md +39 -24
- package/src/components/ui/no-data/.index.md +22 -0
- package/src/components/ui/no-data/.no-data-actions.md +29 -0
- package/src/components/ui/no-data/.no-data-message.md +37 -0
- package/src/components/ui/no-data/.no-data-styles.md +39 -0
- package/src/components/ui/no-data/.no-data.md +59 -0
- package/src/components/ui/page-actions.tsx +2 -1
- package/src/components/ui/query-report-table/.query-report-table-header.md +15 -15
- package/src/components/ui/query-report-table/.query-report-table-row.md +16 -16
- package/src/components/ui/query-report-table/.query-report-table.md +39 -24
- package/src/components/ui/table/.table-column-filter-dropdown.md +15 -9
- package/src/components/ui/table/.table-description-cell.md +13 -12
- package/src/components/ui/table/.table-empty-state.md +19 -20
- package/src/components/ui/table/.table-row.md +30 -20
- package/src/components/ui/table/.table-skeleton.md +32 -27
- package/src/components/ui/table/.table-timestamp-cell.md +24 -23
- package/src/components/ui/table/.table.md +43 -30
- package/src/components/ui/table/.types.md +49 -45
- package/src/components/ui/table/.use-table-motion.md +45 -0
- package/src/contexts/.chat-runtime-context.md +55 -26
- package/src/contexts/.endpoints-runtime-context.md +40 -44
- package/src/embed-shims/.next-navigation.md +38 -31
- package/src/hooks/.api-hooks.md +28 -21
- package/src/hooks/.index.md +30 -25
- package/src/hooks/.use-authed-image-src.md +38 -0
- package/src/hooks/.use-contact-submission.md +35 -36
- package/src/hooks/.use-humanity-signals.md +47 -0
- package/src/hooks/.use-near-viewport.md +30 -30
- package/src/hooks/.use-og-placeholder-url.md +57 -0
- package/src/hooks/.use-scroll-to-hash.md +46 -0
- package/src/hooks/.use-self-fetch.md +52 -0
- package/src/hooks/state/.flatten-schema.md +37 -29
- package/src/hooks/ui/.index.md +37 -25
- package/src/hooks/ui/.use-auto-limit-tags.md +55 -38
- package/src/hooks/ui/.use-deferred-error.md +44 -0
- package/src/hooks/ui/.use-focus-trap.md +59 -0
- package/src/hooks/ui/.use-header-height.md +37 -0
- package/src/hooks/ui/.use-horizontal-scrollbar.md +25 -34
- package/src/hooks/ui/.use-marquee-engine.md +73 -0
- package/src/hooks/ui/.use-notification-permission.md +49 -0
- package/src/hooks/ui/.use-reset-on-page-hidden.md +40 -0
- package/src/hooks/ui/.use-suppress-clone-focus.md +41 -0
- package/src/nats/.index.md +39 -0
- package/src/nats/.nats-provider.md +46 -0
- package/src/nats/.nats.md +38 -28
- package/src/nats/.shared-connection.md +56 -0
- package/src/nats/.use-nats-subscription.md +57 -0
- package/src/stories/.ActionsMenu.stories.md +57 -0
- package/src/stories/.Alert.stories.md +46 -0
- package/src/stories/.AnnouncementBar.stories.md +59 -32
- package/src/stories/.AppLayoutDrawer.stories.md +60 -0
- package/src/stories/.AppLayoutSidebar.stories.md +45 -0
- package/src/stories/.ApprovalBatchMessage.stories.md +46 -0
- package/src/stories/.ApprovalBatchMessageClient.stories.md +55 -0
- package/src/stories/.ApprovalRequestMessage.stories.md +50 -0
- package/src/stories/.ApprovalRequestMessageClient.stories.md +41 -0
- package/src/stories/.BlogCard.stories.md +52 -0
- package/src/stories/.Board.stories.md +25 -20
- package/src/stories/.Button.stories.md +35 -40
- package/src/stories/.CampaignCardAdmin.stories.md +38 -0
- package/src/stories/.CardsStrip.stories.md +39 -0
- package/src/stories/.CaseStudyCard.stories.md +41 -0
- package/src/stories/.ChatContainer.stories.md +41 -0
- package/src/stories/.ChatInlineVideoPill.stories.md +36 -0
- package/src/stories/.ChatMessageEnhanced.stories.md +51 -0
- package/src/stories/.ChatMingoInfoCards.stories.md +30 -0
- package/src/stories/.ChatTicketList.stories.md +38 -22
- package/src/stories/.ChatTypingIndicator.stories.md +47 -0
- package/src/stories/.CheckboxBlock.stories.md +34 -35
- package/src/stories/.ContextCompactionDisplay.stories.md +28 -0
- package/src/stories/.CustomerInterviewCard.stories.md +36 -0
- package/src/stories/.DashboardInfoCard.stories.md +40 -33
- package/src/stories/.DataRoomDocCard.stories.md +42 -0
- package/src/stories/.DataTable.stories.md +37 -32
- package/src/stories/.DatePicker.stories.md +34 -30
- package/src/stories/.EmbeddableChat.stories.md +45 -28
- package/src/stories/.EmptyState.stories.md +55 -0
- package/src/stories/.ErrorMessageDisplay.stories.md +45 -0
- package/src/stories/.FilterModal.stories.md +28 -22
- package/src/stories/.GenericEntityCard.stories.md +50 -0
- package/src/stories/.GitHubActivityCard.stories.md +41 -0
- package/src/stories/.GuideWelcome.stories.md +38 -0
- package/src/stories/.Header.stories.md +32 -22
- package/src/stories/.HubspotTicketCard.stories.md +41 -0
- package/src/stories/.InfoCard.stories.md +37 -26
- package/src/stories/.InfoCardRow.stories.md +48 -0
- package/src/stories/.InfoSection.stories.md +55 -0
- package/src/stories/.Input.stories.md +45 -35
- package/src/stories/.InvestorUpdateCard.stories.md +41 -0
- package/src/stories/.MarqueeWall.stories.md +53 -0
- package/src/stories/.MingoAiButton.stories.md +31 -0
- package/src/stories/.MingoChatModals.stories.md +47 -0
- package/src/stories/.MingoInfoCard.stories.md +50 -0
- package/src/stories/.MingoOnboardingCard.stories.md +19 -19
- package/src/stories/.MingoWelcome.stories.md +41 -0
- package/src/stories/.MobileNavPanel.stories.md +52 -0
- package/src/stories/.Modal.stories.md +19 -16
- package/src/stories/.MspOrganizationCard.stories.md +45 -0
- package/src/stories/.NotificationDrawer.stories.md +39 -28
- package/src/stories/.OSTypeBadge.stories.md +34 -25
- package/src/stories/.OnboardingGuideCard.stories.md +41 -0
- package/src/stories/.PageActions.stories.md +21 -21
- package/src/stories/.PageContainer.stories.md +29 -24
- package/src/stories/.PageLayout.stories.md +18 -35
- package/src/stories/.PolicyConfigurationPanel.stories.md +58 -0
- package/src/stories/.ProductReleaseCard.stories.md +39 -0
- package/src/stories/.ProgramCard.stories.md +51 -0
- package/src/stories/.QuickActionChip.stories.md +59 -0
- package/src/stories/.QuickActionMarquee.stories.md +51 -0
- package/src/stories/.QuickActionWall.stories.md +58 -0
- package/src/stories/.RoadmapCard.stories.md +41 -0
- package/src/stories/.ShellTypeBadge.stories.md +42 -22
- package/src/stories/.SlackMessageCard.stories.md +42 -0
- package/src/stories/.SlashCommandSuggestions.stories.md +21 -31
- package/src/stories/.SplitButton.stories.md +23 -25
- package/src/stories/.StackedRowsPanel.stories.md +65 -0
- package/src/stories/.TabSelector.stories.md +26 -38
- package/src/stories/.Tag.stories.md +32 -27
- package/src/stories/.ThinkingDisplay.stories.md +43 -0
- package/src/stories/.TicketCard.stories.md +60 -0
- package/src/stories/.TicketInfoSection.stories.md +28 -20
- package/src/stories/.TimeTracker.stories.md +35 -0
- package/src/stories/.Toaster.stories.md +26 -20
- package/src/stories/.ToolBadge.stories.md +34 -24
- package/src/stories/.ToolExecutionDisplay.stories.md +22 -20
- package/src/stories/.ToolExecutionDisplayClient.stories.md +33 -0
- package/src/stories/.VideoBitesStrip.stories.md +37 -0
- package/src/stories/.WarningBlock.stories.md +51 -0
- package/src/stories/__fixtures__/.chat-card-decorator.md +39 -0
- package/src/stories/__fixtures__/.chat-cards.md +57 -0
- package/src/stories/auth/.CompleteAccount.stories.md +36 -0
- package/src/stories/auth/.CreateOrganization.stories.md +52 -0
- package/src/stories/auth/.InviteLinkInvalid.stories.md +21 -0
- package/src/stories/auth/.Login.stories.md +32 -0
- package/src/stories/auth/.OpenFrameSso.stories.md +58 -0
- package/src/stories/auth/.PasswordReset.stories.md +49 -0
- package/src/styles/ods-interaction-states.css +32 -0
- package/src/types/.announcement.md +67 -35
- package/src/types/.blog.md +44 -41
- package/src/types/.case-study.md +31 -17
- package/src/types/.content-ref.md +37 -0
- package/src/types/.customer-interview.md +38 -38
- package/src/types/.doc-source.md +87 -0
- package/src/types/.entity-author.md +53 -0
- package/src/types/.entity-platform.md +40 -0
- package/src/types/.index.md +23 -17
- package/src/types/.marketing.md +32 -35
- package/src/types/.navigation.md +31 -19
- package/src/types/.os.types.md +30 -31
- package/src/types/.permissions.md +49 -35
- package/src/types/.platform.md +44 -28
- package/src/types/.product-release.md +59 -42
- package/src/types/.shell.types.md +46 -30
- package/src/types/.supabase.md +43 -29
- package/src/types/.tool.types.md +43 -23
- package/src/types/.video-processing.md +40 -31
- package/src/types/supabase.ts +80 -0
- package/src/types/video-processing.ts +1 -0
- package/src/utils/.announcement-storage.md +49 -17
- package/src/utils/.app-config.md +22 -18
- package/src/utils/.brand-marks.md +46 -0
- package/src/utils/.cn.md +40 -29
- package/src/utils/.color-analysis.md +34 -25
- package/src/utils/.common.md +43 -23
- package/src/utils/.content-href.md +64 -0
- package/src/utils/.content-ref-groups.md +51 -0
- package/src/utils/.date-utils.md +46 -35
- package/src/utils/.doc-path-utils.md +38 -0
- package/src/utils/.doc-tree-nav.md +51 -0
- package/src/utils/.embed-authed-fetch.md +48 -32
- package/src/utils/.embed-content-fetch.md +36 -0
- package/src/utils/.embed-url-converters.md +52 -0
- package/src/utils/.extract-items.md +49 -0
- package/src/utils/.faq-anchor.md +48 -0
- package/src/utils/.format.md +73 -55
- package/src/utils/.humanity-signals.md +59 -0
- package/src/utils/.index.md +73 -31
- package/src/utils/.list-url.md +43 -0
- package/src/utils/.markdown-section-extractor.md +57 -0
- package/src/utils/.markdown-to-plain.md +51 -0
- package/src/utils/.media-carousel-utils-stub.md +42 -31
- package/src/utils/.ods-color-utils.md +84 -43
- package/src/utils/.og-placeholder.md +45 -0
- package/src/utils/.page-header-constants.md +26 -0
- package/src/utils/.platform-config.md +34 -34
- package/src/utils/.release-badge.md +47 -0
- package/src/utils/.release-cover.md +45 -0
- package/src/utils/.same-page-hash-nav.md +45 -0
- package/src/utils/.scroll-into-view.md +32 -25
- package/src/utils/.seo-description.md +37 -0
- package/src/utils/.seo-title.md +25 -0
- package/src/utils/.social-embed-cache.md +37 -0
- package/src/utils/.source-icons.md +30 -34
- package/src/utils/.suggestion-url.md +46 -0
- package/src/utils/.tool-utils.md +39 -24
- package/src/utils/.tree-builder.md +64 -0
- package/src/utils/.video-bite-id.md +42 -0
- package/src/utils/announcement-storage.ts +9 -18
- package/src/utils/dev-sections/.dev-section-param-keys.md +51 -0
- package/src/utils/dev-sections/.openframe-dev-sections.md +40 -28
- package/src/utils/dismiss-cookie.ts +55 -0
- package/src/utils/dismissal-storage.ts +38 -0
- package/src/utils/index.ts +3 -0
- package/dist/chunk-BBUEY73L.js.map +0 -1
- package/dist/chunk-G3UN2DXU.cjs.map +0 -1
- package/dist/chunk-OWMLWJQY.cjs.map +0 -1
- package/dist/chunk-SASR7SK5.js.map +0 -1
- package/src/components/chat/utils/.onboarding-icons.md +0 -28
- package/src/hooks/.use-og-placeholder.md +0 -51
- /package/dist/{chunk-MGKCS6KS.js.map → chunk-3WCARCI4.js.map} +0 -0
- /package/dist/{chunk-Y3Y2DLNO.js.map → chunk-6UGYBCEN.js.map} +0 -0
- /package/dist/{chunk-PSPWT2Q5.js.map → chunk-7LWXWXEY.js.map} +0 -0
- /package/dist/{chunk-VTSRDC4W.js.map → chunk-CKC3EAYT.js.map} +0 -0
- /package/dist/{chunk-ZRANZNEA.js.map → chunk-JJE5TUZK.js.map} +0 -0
- /package/dist/{chunk-66BNAFO6.js.map → chunk-JQIUBFHL.js.map} +0 -0
- /package/dist/{chunk-2DIOV7BR.js.map → chunk-UPN6EFOM.js.map} +0 -0
- /package/dist/{chunk-4SMRQ4SN.js.map → chunk-WBL5Y4PS.js.map} +0 -0
- /package/dist/{chunk-FP4H6Y5O.js.map → chunk-WPYPSIY2.js.map} +0 -0
- /package/dist/{chunk-R5WJJL4V.js.map → chunk-X5X43HFV.js.map} +0 -0
- /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,
|
|
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 {
|
|
33
|
-
import {
|
|
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 —
|
|
233
|
-
// the rendition
|
|
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
|
|
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
|
-
{
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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 && !
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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(
|
|
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
|
)
|