@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,59 @@
|
|
|
1
|
+
<!-- source-hash: 5a28579d80860450719a15e80835fea5 -->
|
|
2
|
+
Provides a React hook for managing keyboard focus within overlay UI surfaces (modals, sidebars, nav panels), handling initial focus, Tab cycling, Escape key handling, and guarded focus restoration on close.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `useFocusTrap(containerRef, active, options)`
|
|
7
|
+
|
|
8
|
+
The primary export. Attaches a container-scoped `keydown` listener when `active` is `true` and cleans up on deactivate.
|
|
9
|
+
|
|
10
|
+
| Parameter | Type | Description |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| `containerRef` | `RefObject<HTMLElement \| null>` | Ref to the overlay container element |
|
|
13
|
+
| `active` | `boolean` | Enables/disables the trap |
|
|
14
|
+
| `options` | `UseFocusTrapOptions` | Optional configuration |
|
|
15
|
+
|
|
16
|
+
### `UseFocusTrapOptions`
|
|
17
|
+
|
|
18
|
+
| Option | Type | Default | Description |
|
|
19
|
+
|---|---|---|---|
|
|
20
|
+
| `onEscape` | `() => void` | — | Called on Escape keypress; passes through without `stopPropagation` |
|
|
21
|
+
| `contain` | `boolean` | `true` | When `false`, disables Tab cycling (for non-modal surfaces like sliding sidebars) |
|
|
22
|
+
|
|
23
|
+
### `FOCUSABLE_SELECTOR`
|
|
24
|
+
|
|
25
|
+
Internal CSS selector matching all interactive, non-disabled, visible elements eligible for Tab focus.
|
|
26
|
+
|
|
27
|
+
## Usage Example
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { useRef } from 'react'
|
|
31
|
+
import { useFocusTrap } from './use-focus-trap'
|
|
32
|
+
|
|
33
|
+
function MobileNavPanel({ isOpen, onClose }: { isOpen: boolean; onClose: () => void }) {
|
|
34
|
+
const panelRef = useRef<HTMLDivElement>(null)
|
|
35
|
+
|
|
36
|
+
// Tab cycles within the panel; Escape triggers onClose
|
|
37
|
+
useFocusTrap(panelRef, isOpen, { onEscape: onClose })
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
// tabIndex={-1} is required — see hook CONTRACT
|
|
41
|
+
<div ref={panelRef} tabIndex={-1}>
|
|
42
|
+
<a href="/home">Home</a>
|
|
43
|
+
<button onClick={onClose}>Close</button>
|
|
44
|
+
</div>
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
> **Contract:** The container element **must** have `tabIndex={-1}`. Without it, clicking non-focusable areas inside the surface moves focus to `body`, causing the trap to stop receiving keyboard events.
|
|
50
|
+
|
|
51
|
+
## Behavior Notes
|
|
52
|
+
|
|
53
|
+
- **Stacking-safe:** Listener is container-scoped, so a modal opened above a sidebar will not leak its Escape event downward.
|
|
54
|
+
- **Stable callback:** `onEscape` is stored in a `useRef` to prevent the effect from re-running on every inline function re-render.
|
|
55
|
+
- **Guarded restore:** On deactivate, focus returns to the previously focused element only if focus has not moved to another intentional target (e.g. a dialog that opened during the overlay's lifetime).
|
|
56
|
+
|
|
57
|
+
## Source
|
|
58
|
+
|
|
59
|
+
[`use-focus-trap.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/use-focus-trap.ts)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<!-- source-hash: 542d3494c008ba1da83803f8b2a5a8bc -->
|
|
2
|
+
React hook that measures and tracks the combined pixel height of the sticky page header and optional announcement bar in real time, using `ResizeObserver` and `MutationObserver`.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
- **`useHeaderHeight(defaultHeight?, options?)`** — Main export. Queries `<header>` and `[data-announcement-bar]` elements, sums their `offsetHeight` values, and re-measures whenever either element resizes or the DOM changes.
|
|
7
|
+
- **`enabled` option** — Gates all observer setup. When `false`, skips measurement and returns `defaultHeight` immediately, avoiding document-wide observers for components that are always mounted but only need the value while an overlay is open.
|
|
8
|
+
- **`ResizeObserver`** — Watches both the header and announcement bar for size changes.
|
|
9
|
+
- **`MutationObserver`** — Watches `document.body` for child list changes or `data-announcement-bar` attribute mutations (e.g., bar appearing/disappearing dynamically), then re-observes the bar if it's newly added.
|
|
10
|
+
|
|
11
|
+
## Usage Example
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { useHeaderHeight } from './use-header-height'
|
|
15
|
+
|
|
16
|
+
// Basic usage — offsets a fixed panel below the header
|
|
17
|
+
function SearchOverlay({ isOpen }: { isOpen: boolean }) {
|
|
18
|
+
const headerHeight = useHeaderHeight(64, { enabled: isOpen })
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<div
|
|
22
|
+
style={{ top: headerHeight }}
|
|
23
|
+
className="fixed inset-x-0 bottom-0 z-50"
|
|
24
|
+
>
|
|
25
|
+
{/* panel content */}
|
|
26
|
+
</div>
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
> Pass `enabled: isOpen` to avoid attaching document-wide observers when the overlay is closed.
|
|
32
|
+
|
|
33
|
+
## Notes
|
|
34
|
+
|
|
35
|
+
- Falls back to `defaultHeight` (default `64`) when no matching elements are found or when `enabled` is `false`.
|
|
36
|
+
- Observers are fully disconnected on unmount or when `enabled` changes to `false`.
|
|
37
|
+
- Source: [`use-header-height.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/use-header-height.ts)
|
|
@@ -1,28 +1,24 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: a8097b26f77c0c63a9b433f937ece2a5 -->
|
|
2
|
+
A React hook that manages a custom horizontal scrollbar with thumb sizing, position syncing, drag interaction, edge-fade indicators, and RAF-throttled scroll handling — all driven directly against the DOM for performance.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|--------|------|-------------|
|
|
8
|
-
| `useHorizontalScrollbar` | Hook | Main hook returning all refs, state, and event handlers |
|
|
9
|
-
| `scrollRef` | Callback ref | Attach to the scrollable container; auto-sets up `ResizeObserver` |
|
|
10
|
-
| `trackRef` | `RefObject<HTMLDivElement>` | Attach to the scrollbar track element |
|
|
11
|
-
| `thumbRef` | `RefObject<HTMLDivElement>` | Attach to the draggable thumb element |
|
|
12
|
-
| `thumbRatio` | `number` | Thumb width as a fraction of track width (`0` = hidden) |
|
|
13
|
-
| `canScrollLeft` | `boolean` | Whether content can scroll further left (for edge fades) |
|
|
14
|
-
| `canScrollRight` | `boolean` | Whether content can scroll further right (for edge fades) |
|
|
6
|
+
**`useHorizontalScrollbar()`** — the single export; returns everything needed to wire up a scrollable container and its custom scrollbar UI.
|
|
15
7
|
|
|
16
|
-
|
|
8
|
+
### Returned Values
|
|
17
9
|
|
|
18
|
-
|
|
|
19
|
-
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `
|
|
25
|
-
| `
|
|
10
|
+
| Name | Type | Description |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| `scrollRef` | callback ref | Attach to the scrollable container; sets up `ResizeObserver` + `MutationObserver` automatically |
|
|
13
|
+
| `trackRef` | `RefObject<HTMLDivElement>` | Attach to the scrollbar track element |
|
|
14
|
+
| `thumbRef` | `RefObject<HTMLDivElement>` | Attach to the scrollbar thumb element |
|
|
15
|
+
| `thumbRatio` | `number` | Thumb width as a fraction of track width (`0` when no overflow) |
|
|
16
|
+
| `canScrollLeft` | `boolean` | `true` when content is scrolled past the left edge |
|
|
17
|
+
| `canScrollRight` | `boolean` | `true` when more content exists to the right |
|
|
18
|
+
| `onScroll` | handler | RAF-throttled; attach to the container's `onScroll` |
|
|
19
|
+
| `onTrackClick` | handler | Scrolls to clicked position on the track |
|
|
20
|
+
| `onTrackWheel` | handler | Forwards wheel events from the track to the scroll container |
|
|
21
|
+
| `onThumbPointerDown/Move/Up` | handlers | Full pointer-capture drag implementation |
|
|
26
22
|
|
|
27
23
|
## Usage Example
|
|
28
24
|
|
|
@@ -40,29 +36,20 @@ function ScrollableTable() {
|
|
|
40
36
|
return (
|
|
41
37
|
<div>
|
|
42
38
|
{canScrollLeft && <div className="fade-left" />}
|
|
43
|
-
|
|
44
|
-
{/* Scrollable content */}
|
|
45
39
|
<div ref={scrollRef} onScroll={onScroll} style={{ overflowX: 'auto' }}>
|
|
46
|
-
|
|
40
|
+
{/* wide content */}
|
|
47
41
|
</div>
|
|
48
|
-
|
|
49
42
|
{canScrollRight && <div className="fade-right" />}
|
|
50
43
|
|
|
51
|
-
{
|
|
52
|
-
|
|
53
|
-
<div
|
|
54
|
-
ref={trackRef}
|
|
55
|
-
onClick={onTrackClick}
|
|
56
|
-
onWheel={onTrackWheel}
|
|
57
|
-
style={{ position: 'relative', height: 8 }}
|
|
58
|
-
>
|
|
44
|
+
{thumbRatio > 0 && thumbRatio < 1 && (
|
|
45
|
+
<div ref={trackRef} onClick={onTrackClick} onWheel={onTrackWheel}>
|
|
59
46
|
<div
|
|
60
47
|
ref={thumbRef}
|
|
61
48
|
data-scrollbar-thumb
|
|
49
|
+
style={{ width: `${thumbRatio * 100}%`, position: 'absolute' }}
|
|
62
50
|
onPointerDown={onThumbPointerDown}
|
|
63
51
|
onPointerMove={onThumbPointerMove}
|
|
64
52
|
onPointerUp={onThumbPointerUp}
|
|
65
|
-
style={{ position: 'absolute', width: `${thumbRatio * 100}%`, cursor: 'grab' }}
|
|
66
53
|
/>
|
|
67
54
|
</div>
|
|
68
55
|
)}
|
|
@@ -71,4 +58,8 @@ function ScrollableTable() {
|
|
|
71
58
|
}
|
|
72
59
|
```
|
|
73
60
|
|
|
74
|
-
|
|
61
|
+
## Notes
|
|
62
|
+
|
|
63
|
+
- `scrollRef` is a **callback ref**, so observer setup runs correctly even when the container mounts asynchronously (e.g. after data loads).
|
|
64
|
+
- Thumb position is updated **directly on the DOM** (`thumb.style.left`) during scroll and drag to avoid React re-render overhead.
|
|
65
|
+
- `ResizeObserver` watches both the container and its children; a `MutationObserver` re-observes when children change, keeping thumb size accurate after dynamic content updates.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<!-- source-hash: d8118aab70c3c6c9b39223ea34e7dd94 -->
|
|
2
|
+
Provides a reusable `requestAnimationFrame` position engine for endless-scroll marquee animations, decoupled from any specific DOM strategy (scroll position or CSS transform).
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `MarqueeEngineOptions` (interface)
|
|
7
|
+
|
|
8
|
+
Configuration object passed to the hook:
|
|
9
|
+
|
|
10
|
+
| Option | Description |
|
|
11
|
+
|---|---|
|
|
12
|
+
| `active` | Master switch; enables/disables the rAF loop |
|
|
13
|
+
| `speed` | Cruise speed in px/s |
|
|
14
|
+
| `isPaused` | Per-frame pause verdict function (caller-owned reason set) |
|
|
15
|
+
| `getWrapSize` | Returns the single-copy width/height for seam wrapping |
|
|
16
|
+
| `getWrapMin` | Optional lower bound of the wrap range (default `0`) |
|
|
17
|
+
| `apply` | Writes position to the DOM (`scrollLeft` or `transform`) |
|
|
18
|
+
| `readBack` | Reads externally mutated position (user drag, native scroll) |
|
|
19
|
+
| `onAfterFrame` | Called after each frame (e.g. hover re-resolution) |
|
|
20
|
+
|
|
21
|
+
### `MarqueeEngineHandle` (interface)
|
|
22
|
+
|
|
23
|
+
Returned by the hook:
|
|
24
|
+
|
|
25
|
+
| Member | Description |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `posRef` | Float position ref in px; callers may write during seam warps |
|
|
28
|
+
| `glideBy(px)` | Accumulates a signed glide distance for chevron navigation |
|
|
29
|
+
| `wrap(pos)` | Utility to normalize any position into `[0, wrapSize)` |
|
|
30
|
+
|
|
31
|
+
### `useMarqueeEngine(options)` (hook)
|
|
32
|
+
|
|
33
|
+
Core export. Manages three internal refs (`posRef`, `glideRemainingRef`, `speedEnvRef`), a latest-options ref to avoid restarting the rAF loop on every render, and the main `tick` function handling:
|
|
34
|
+
|
|
35
|
+
- **Velocity envelope** — ~250ms ease between `0` and `speed` (smooth pause/resume)
|
|
36
|
+
- **Glide mode** — proportional ease-out for chevron navigation, wrapping modulo copy size
|
|
37
|
+
- **Cruise mode** — steady advance at enveloped speed with external resync
|
|
38
|
+
- **Idle mode** — follows external scroll position so resume starts from current location
|
|
39
|
+
|
|
40
|
+
## Usage Example
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
// CardsStrip (horizontal scroller driver)
|
|
44
|
+
const engine = useMarqueeEngine({
|
|
45
|
+
active: isVisible,
|
|
46
|
+
speed: 80,
|
|
47
|
+
isPaused: (now) => pauseReasons.size > 0 || suppressUntil > now,
|
|
48
|
+
getWrapSize: () => trackRef.current?.scrollWidth / 2 ?? 0,
|
|
49
|
+
getWrapMin: () => SEAM_BUFFER,
|
|
50
|
+
apply: (pos) => { if (trackRef.current) trackRef.current.scrollLeft = pos },
|
|
51
|
+
readBack: () => trackRef.current?.scrollLeft ?? 0,
|
|
52
|
+
onAfterFrame: resolveHover,
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
// Chevron navigation
|
|
56
|
+
engine.glideBy(cardWidth)
|
|
57
|
+
|
|
58
|
+
// MarqueeWall (transform driver — no readBack needed)
|
|
59
|
+
const engine = useMarqueeEngine({
|
|
60
|
+
active: true,
|
|
61
|
+
speed: 50,
|
|
62
|
+
isPaused: () => !isVisible,
|
|
63
|
+
getWrapSize: () => trackRef.current?.offsetWidth / 2 ?? 0,
|
|
64
|
+
apply: (pos) => {
|
|
65
|
+
if (trackRef.current)
|
|
66
|
+
trackRef.current.style.transform = `translateX(${-pos}px)`
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Source
|
|
72
|
+
|
|
73
|
+
[`use-marquee-engine.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/use-marquee-engine.ts)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<!-- source-hash: d6766f600f05a52d295b880209627895 -->
|
|
2
|
+
React hook that tracks and requests browser desktop notification permission, with cross-browser support including a Safari compatibility fallback.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `UseNotificationPermissionResult` (interface)
|
|
7
|
+
|
|
8
|
+
| Property | Type | Description |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| `supported` | `boolean` | Whether the Notification API is available (false during SSR or on iOS Safari) |
|
|
11
|
+
| `permission` | `NotificationPermission` | Current permission state: `"default"`, `"granted"`, or `"denied"` |
|
|
12
|
+
| `request` | `() => Promise<NotificationPermission>` | Prompts the user for permission; must be triggered by a user gesture |
|
|
13
|
+
|
|
14
|
+
### `useNotificationPermission()` (hook)
|
|
15
|
+
|
|
16
|
+
Initializes permission state and registers three sync strategies to stay current:
|
|
17
|
+
|
|
18
|
+
1. **Permissions API** — `navigator.permissions.query({ name: 'notifications' })` change event (Chrome, Firefox)
|
|
19
|
+
2. **Visibility change** — re-reads `Notification.permission` when the tab becomes visible (Safari fallback)
|
|
20
|
+
3. **Window focus** — re-reads on focus for cases where the user changed site settings in a browser panel
|
|
21
|
+
|
|
22
|
+
Cleans up all listeners on unmount via a `cancelled` flag guard to prevent attaching listeners after the effect tears down.
|
|
23
|
+
|
|
24
|
+
## Usage Example
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { useNotificationPermission } from './use-notification-permission'
|
|
28
|
+
|
|
29
|
+
function NotificationToggle() {
|
|
30
|
+
const { supported, permission, request } = useNotificationPermission()
|
|
31
|
+
|
|
32
|
+
if (!supported) return null
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<button
|
|
36
|
+
onClick={request}
|
|
37
|
+
disabled={permission === 'granted' || permission === 'denied'}
|
|
38
|
+
>
|
|
39
|
+
{permission === 'granted'
|
|
40
|
+
? 'Notifications enabled'
|
|
41
|
+
: permission === 'denied'
|
|
42
|
+
? 'Notifications blocked'
|
|
43
|
+
: 'Enable notifications'}
|
|
44
|
+
</button>
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
> **Note:** Call `request()` only inside a user gesture handler (click, keydown, etc.). Browsers silently deny programmatic calls made outside a gesture context.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!-- source-hash: 9b85f4bd4fed063a86a9725221200835 -->
|
|
2
|
+
Resets a callback whenever the browser tab is hidden or the window loses focus, guarding against `pointerleave`/`pointercancel` events being swallowed during tab switches or overlay interruptions.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
- **`useResetOnPageHidden(reset)`** — React hook that attaches `blur` (on `window`) and `visibilitychange` (on `document`) listeners; invokes `reset` when either fires (visibility only on `'hidden'`). Cleans up both listeners on unmount or when `reset` identity changes.
|
|
7
|
+
|
|
8
|
+
## Usage Example
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
import { useCallback, useState } from 'react'
|
|
12
|
+
import { useResetOnPageHidden } from './use-reset-on-page-hidden'
|
|
13
|
+
|
|
14
|
+
function MarqueeWall() {
|
|
15
|
+
const [isHovered, setIsHovered] = useState(false)
|
|
16
|
+
|
|
17
|
+
// Must be stable — memoize with useCallback to avoid re-attaching listeners
|
|
18
|
+
const resetHover = useCallback(() => setIsHovered(false), [])
|
|
19
|
+
|
|
20
|
+
useResetOnPageHidden(resetHover)
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<div
|
|
24
|
+
onPointerEnter={() => setIsHovered(true)}
|
|
25
|
+
onPointerLeave={() => setIsHovered(false)}
|
|
26
|
+
>
|
|
27
|
+
{/* marquee pauses when isHovered is true */}
|
|
28
|
+
</div>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Notes
|
|
34
|
+
|
|
35
|
+
- Pass a **stable** `reset` reference (via `useCallback`) — the hook re-attaches listeners whenever `reset`'s identity changes.
|
|
36
|
+
- `blur` fires even when `visibilitychange` does not (e.g., a second window focused alongside this tab), making both listeners necessary.
|
|
37
|
+
- On `blur` without tab hiding, the marquee may briefly resume under a stationary cursor in the unfocused window; it re-pauses on the next `pointermove`/`pointerenter`.
|
|
38
|
+
- Intended as the single wiring point (SSOT) for all marquee surfaces (`MarqueeWall`, `CardsStrip`).
|
|
39
|
+
|
|
40
|
+
**Source:** [`use-reset-on-page-hidden.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/use-reset-on-page-hidden.ts)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<!-- source-hash: 6043e94056db9c7b4cc50fc1680e236a -->
|
|
2
|
+
Keeps a marquee clone's interactive elements clickable while removing them from keyboard tab order and the accessibility tree — solving the "clone cards swallow clicks" bug caused by using `inert`.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
**`CLONE_FOCUSABLE_SELECTOR`** — Comprehensive CSS selector covering all natively focusable elements: anchors, form controls, `iframe`, `summary`, media with `controls`, `[tabindex]`, and editable content regions.
|
|
7
|
+
|
|
8
|
+
**`useSuppressCloneFocus(active: boolean)`** — React hook that returns a `ref` to attach to a clone wrapper `<div>`. When `active`, it:
|
|
9
|
+
- Sets `tabindex="-1"` on every focusable descendant (removes duplicate tab stops)
|
|
10
|
+
- Watches for DOM mutations that could re-introduce tabbable elements via `MutationObserver`
|
|
11
|
+
- Leaves click/pointer behavior fully intact (unlike `inert`, which blocks all interaction)
|
|
12
|
+
- Re-applies suppression only when `tabindex` hasn't already been stamped, preventing infinite observer loops
|
|
13
|
+
|
|
14
|
+
## Usage Example
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { useSuppressCloneFocus } from './use-suppress-clone-focus'
|
|
18
|
+
|
|
19
|
+
function MarqueeClone({ isClone }: { isClone: boolean }) {
|
|
20
|
+
const cloneRef = useSuppressCloneFocus(isClone)
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
// aria-hidden keeps clone out of a11y tree;
|
|
24
|
+
// hook keeps it out of tab order while staying clickable
|
|
25
|
+
<div ref={cloneRef} aria-hidden={isClone}>
|
|
26
|
+
<a href="/article-1">Card One</a>
|
|
27
|
+
<a href="/article-2">Card Two</a>
|
|
28
|
+
</div>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Accessibility Contract
|
|
34
|
+
|
|
35
|
+
| Mechanism | Handled by |
|
|
36
|
+
|---|---|
|
|
37
|
+
| Out of a11y tree | `aria-hidden` on clone wrapper (caller's responsibility) |
|
|
38
|
+
| Out of tab order | This hook (`tabindex="-1"` on all focusable descendants) |
|
|
39
|
+
| Clickable / pointer events | Preserved — clone anchors handle mouse, <kbd>⌘</kbd>-click, middle-click, and context menu natively |
|
|
40
|
+
|
|
41
|
+
> **Why not `inert`?** The `inert` attribute also disables pointer events, causing clone cards near the seam of an endless-loop scroll to silently swallow all clicks — the core bug this hook is designed to prevent.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<!-- source-hash: c277685d024b3565e47f9f7688345fba -->
|
|
2
|
+
Barrel export file that re-exports all public API symbols from the NATS messaging module's submodules into a single entry point.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export Source | Description |
|
|
7
|
+
|---|---|
|
|
8
|
+
| `./nats` | Core NATS client utilities and types |
|
|
9
|
+
| `./shared-connection` | Shared/singleton NATS connection management |
|
|
10
|
+
| `./nats-provider` | NATS provider setup and configuration |
|
|
11
|
+
| `./use-nats-subscription` | Composable for subscribing to NATS subjects |
|
|
12
|
+
|
|
13
|
+
## Usage Example
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
// Import everything from a single entry point
|
|
17
|
+
import {
|
|
18
|
+
createNatsConnection,
|
|
19
|
+
sharedConnection,
|
|
20
|
+
NatsProvider,
|
|
21
|
+
useNatsSubscription,
|
|
22
|
+
} from '@openframe/nats'
|
|
23
|
+
|
|
24
|
+
// Subscribe to a subject using the composable
|
|
25
|
+
const { messages, unsubscribe } = useNatsSubscription('msp.tickets.>')
|
|
26
|
+
|
|
27
|
+
// Use the shared connection directly
|
|
28
|
+
const nc = await sharedConnection()
|
|
29
|
+
await nc.publish('msp.events.created', JSON.stringify({ id: 42 }))
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Notes
|
|
33
|
+
|
|
34
|
+
- Import from this index rather than individual submodules to avoid internal path coupling.
|
|
35
|
+
- Tree-shaking remains effective — bundlers resolve each `export *` to its originating module.
|
|
36
|
+
|
|
37
|
+
## Source
|
|
38
|
+
|
|
39
|
+
[`index.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/index.ts)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<!-- source-hash: ab1964ccd3e26ab6a9f1caf2c64d5367 -->
|
|
2
|
+
Manages a shared NATS WebSocket connection within a React component tree, exposing connection state and client access via context.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| `NatsProvider` | Component | Establishes and maintains a NATS connection lifecycle; handles connect, reconnect, and teardown |
|
|
9
|
+
| `useNats` | Hook | Returns `NatsContextValue`; throws if used outside `<NatsProvider>` |
|
|
10
|
+
| `useOptionalNats` | Hook | Returns `NatsContextValue | null`; safe to call outside a provider |
|
|
11
|
+
| `NatsProviderProps` | Interface | Props for `NatsProvider`, including `getWsUrl`, `onBeforeReconnect`, `clientConfig`, `reconnectionBackoff`, and `urlRevision` |
|
|
12
|
+
| `NatsContextValue` | Interface | `{ client, status, isReady, reconnectionCount }` available to consumers |
|
|
13
|
+
| `NatsReconnectionBackoff` | Re-export | Backoff configuration type from `shared-connection` |
|
|
14
|
+
|
|
15
|
+
**`urlRevision`** is the primary mechanism to trigger URL re-evaluation (e.g., after an auth state change). Increment or change it to restart the connection lifecycle.
|
|
16
|
+
|
|
17
|
+
## Usage Example
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { NatsProvider, useNats } from './nats-provider'
|
|
21
|
+
|
|
22
|
+
function App() {
|
|
23
|
+
const [revision, setRevision] = React.useState(0)
|
|
24
|
+
const getWsUrl = () => session ? `wss://nats.example.com?token=${session.token}` : null
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<NatsProvider
|
|
28
|
+
getWsUrl={getWsUrl}
|
|
29
|
+
urlRevision={revision}
|
|
30
|
+
onBeforeReconnect={async () => { await refreshSession() }}
|
|
31
|
+
reconnectionBackoff={{ initialDelayMs: 500, maxDelayMs: 10_000 }}
|
|
32
|
+
>
|
|
33
|
+
<MyComponent />
|
|
34
|
+
</NatsProvider>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function MyComponent() {
|
|
39
|
+
const { client, status, isReady, reconnectionCount } = useNats()
|
|
40
|
+
|
|
41
|
+
if (!isReady) return <p>Connecting… ({status})</p>
|
|
42
|
+
return <p>Connected — reconnections: {reconnectionCount}</p>
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Source:** [`nats-provider.tsx`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/nats-provider.tsx)
|
package/src/nats/.nats.md
CHANGED
|
@@ -1,25 +1,32 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 67f40ff2bcded544220309f5fd1f87ad -->
|
|
2
|
+
Browser/Tauri-compatible NATS client factory built on `nats.ws`, providing typed publish, subscribe, request-reply, and JetStream ordered consumer support with connection lifecycle management.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
6
|
### Interfaces & Types
|
|
7
|
+
|
|
7
8
|
| Export | Description |
|
|
8
|
-
|
|
9
|
-
| `NatsClient` | Core client interface with
|
|
10
|
-
| `NatsClientOptions` | Connection config
|
|
9
|
+
|---|---|
|
|
10
|
+
| `NatsClient` | Core client interface with connect/close/publish/subscribe/request methods |
|
|
11
|
+
| `NatsClientOptions` | Connection config including servers, auth, reconnect, and exponential backoff |
|
|
11
12
|
| `NatsSubscribeOptions` | Per-subscription options: queue group, max messages, abort signal |
|
|
12
|
-
| `NatsPublishOptions` / `NatsRequestOptions` | Optional headers and timeout
|
|
13
|
-
| `JetStreamOrderedSubscribeOptions` | JetStream ephemeral consumer config
|
|
14
|
-
| `NatsStatus` / `NatsStatusEvent` |
|
|
13
|
+
| `NatsPublishOptions` / `NatsRequestOptions` | Optional headers and timeout for publish/request operations |
|
|
14
|
+
| `JetStreamOrderedSubscribeOptions` | JetStream ephemeral consumer config with deliver policy and idle threshold |
|
|
15
|
+
| `NatsStatus` / `NatsStatusEvent` | Union type and event shape for connection lifecycle events |
|
|
16
|
+
| `JetStreamDeliverPolicy` | `'new'` or `'byStartSequence'` for ordered consumer replay |
|
|
17
|
+
|
|
18
|
+
### Functions
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
| Export | Description |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `createNatsClient(options)` | Factory function — returns a fully-implemented `NatsClient` instance |
|
|
18
23
|
|
|
19
24
|
### Internal Helpers
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
25
|
+
|
|
26
|
+
- `createExponentialBackoffHandler` — configurable backoff with optional jitter using `crypto.getRandomValues`
|
|
27
|
+
- `mapOptionsToConnectionOptions` — maps `NatsClientOptions` to `nats.ws` `ConnectionOptions`
|
|
28
|
+
- `toNatsHeaders` — converts `Record<string, string>` or existing `NatsHeaders` into a `nats.ws` headers object
|
|
29
|
+
- `assertClientSide` — throws if called outside a browser/WebSocket-capable runtime
|
|
23
30
|
|
|
24
31
|
## Usage Example
|
|
25
32
|
|
|
@@ -28,36 +35,36 @@ import { createNatsClient } from './nats'
|
|
|
28
35
|
|
|
29
36
|
const client = createNatsClient({
|
|
30
37
|
servers: 'wss://nats.example.com:443',
|
|
31
|
-
name: 'flamingo-ui',
|
|
32
38
|
token: 'my-token',
|
|
33
39
|
exponentialBackoff: {
|
|
34
40
|
initialDelayMs: 500,
|
|
35
41
|
maxDelayMs: 15_000,
|
|
36
|
-
multiplier: 2,
|
|
37
42
|
jitter: true,
|
|
38
43
|
},
|
|
39
44
|
})
|
|
40
45
|
|
|
41
|
-
|
|
42
|
-
const off = client.onStatus((event) => {
|
|
43
|
-
console.log('NATS status:', event.status)
|
|
44
|
-
})
|
|
46
|
+
client.onStatus(({ status }) => console.log('NATS status:', status))
|
|
45
47
|
|
|
46
48
|
await client.connect()
|
|
47
49
|
|
|
48
|
-
//
|
|
49
|
-
client.publishJson('
|
|
50
|
+
// Publish JSON
|
|
51
|
+
client.publishJson('events.user.created', { id: '123', name: 'Alice' })
|
|
50
52
|
|
|
51
|
-
//
|
|
53
|
+
// Request-reply
|
|
52
54
|
const response = await client.requestJson<{ ok: boolean }>(
|
|
53
|
-
'
|
|
54
|
-
{
|
|
55
|
+
'rpc.user.create',
|
|
56
|
+
{ name: 'Bob' },
|
|
55
57
|
{ timeoutMs: 3000 },
|
|
56
58
|
)
|
|
57
59
|
|
|
58
|
-
//
|
|
60
|
+
// Core subscribe
|
|
61
|
+
client.subscribeJson<{ id: string }>('events.user.*', (payload, msg) => {
|
|
62
|
+
console.log('Received:', payload)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
// JetStream ordered (live-tail)
|
|
59
66
|
const handle = await client.subscribeJetStreamOrdered(
|
|
60
|
-
(msg) => console.log('JetStream
|
|
67
|
+
(msg) => console.log('JetStream:', msg.subject),
|
|
61
68
|
{
|
|
62
69
|
streamName: 'EVENTS',
|
|
63
70
|
filterSubject: 'events.>',
|
|
@@ -67,6 +74,9 @@ const handle = await client.subscribeJetStreamOrdered(
|
|
|
67
74
|
|
|
68
75
|
// Cleanup
|
|
69
76
|
handle.unsubscribe()
|
|
70
|
-
off()
|
|
71
77
|
await client.close()
|
|
72
|
-
```
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Source
|
|
81
|
+
|
|
82
|
+
[`nats.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/nats.ts)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<!-- source-hash: 4006bdcdcf2f95808859b2ac679a5c98 -->
|
|
2
|
+
Manages a per-URL pool of shared NATS WebSocket connections, providing reference-counted acquire/release lifecycle and a coordinated reconnection loop with exponential backoff.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### Constants
|
|
7
|
+
|
|
8
|
+
- **`NATS_DEFAULTS`** — Tuning knobs for timeouts, ping intervals, and retry backoff used as defaults throughout the module.
|
|
9
|
+
|
|
10
|
+
### Interfaces
|
|
11
|
+
|
|
12
|
+
- **`SharedConnection`** — Internal state for a single URL slot: client handle, reference count, active timers, connect promise, and retry ownership token.
|
|
13
|
+
- **`NatsReconnectionBackoff`** — Optional backoff configuration (fast retries, exponential phase, jitter cap).
|
|
14
|
+
- **`AcquireClientOptions`** — Client identity/auth and transport settings passed at acquire time.
|
|
15
|
+
- **`ReleaseClientOptions`** — Allows callers to override the default 3-second close grace period.
|
|
16
|
+
- **`ConnectionLifecycleOptions`** / **`ConnectionLifecycleHandle`** — Input and output for `startConnectionLifecycle`.
|
|
17
|
+
|
|
18
|
+
### Functions
|
|
19
|
+
|
|
20
|
+
| Function | Description |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `acquireClient(url, opts?)` | Returns (or creates) the `SharedConnection` for a URL, increments `refCount`, cancels any pending close timer. |
|
|
23
|
+
| `releaseClient(url, opts?)` | Decrements `refCount`; schedules connection teardown after a grace period if count reaches zero. |
|
|
24
|
+
| `getSharedConnectionFor(url)` | Direct per-URL lookup; preferred over the legacy accessor. |
|
|
25
|
+
| `getSharedConnection()` | Legacy single-slot accessor — returns the first live connection. Avoid in new code. |
|
|
26
|
+
| `startConnectionLifecycle(options)` | Attaches a status observer and manages reconnect scheduling via a single `retryOwner` token. Returns a `stop()` handle. |
|
|
27
|
+
|
|
28
|
+
## Usage Example
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import {
|
|
32
|
+
acquireClient,
|
|
33
|
+
releaseClient,
|
|
34
|
+
startConnectionLifecycle,
|
|
35
|
+
} from './shared-connection'
|
|
36
|
+
|
|
37
|
+
const conn = acquireClient('wss://nats.example.com', {
|
|
38
|
+
name: 'my-service',
|
|
39
|
+
user: 'machine',
|
|
40
|
+
pass: 'secret',
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const lifecycle = startConnectionLifecycle({
|
|
44
|
+
conn,
|
|
45
|
+
wsUrl: 'wss://nats.example.com',
|
|
46
|
+
getFreshUrl: () => 'wss://nats.example.com',
|
|
47
|
+
backoff: { fastRetries: 2, fastRetryDelayMs: 500, maxDelayMs: 15_000 },
|
|
48
|
+
onStatusChange: (status) => console.log('NATS status:', status),
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
// On component unmount:
|
|
52
|
+
lifecycle.stop()
|
|
53
|
+
releaseClient('wss://nats.example.com', { delayMs: 5000 })
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> **Retry ownership:** only one lifecycle instance drives `scheduleRetry` per URL at a time. The `retryOwner` token prevents concurrent reconnect races when multiple consumers share the same connection — remaining consumers re-claim ownership opportunistically on the next status event after the owner stops.
|