@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
|
@@ -1,35 +1,44 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 49fcc1fc36872594f424bdbdc5b66d78 -->
|
|
2
|
+
Client-side color analysis utilities for extracting dominant colors from images and selecting accessible badge/background colors based on WCAG contrast ratios.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|--------|------|-------------|
|
|
8
|
-
| `ColorPalette` | Interface | Color descriptor with `name`, `hex`, and `rgb` tuple |
|
|
9
|
-
| `DESIGN_PALETTE` | Constant | Three-color palette: yellow `#FFC008`, black `#161616`, gray `#888888` |
|
|
10
|
-
| `hexToRgb` | Function | Converts a hex string to an RGB tuple |
|
|
11
|
-
| `getContrastRatio` | Function | Returns WCAG contrast ratio between two RGB colors |
|
|
12
|
-
| `extractDominantColor` | Function | Samples a canvas to find the most frequent bucketed color |
|
|
13
|
-
| `getBestContrastColor` | Function | Picks the palette color with highest contrast (≥ 3:1 minimum) |
|
|
14
|
-
| `analyzeImageColor` | Function | Loads an image URL, extracts dominant color, returns best palette match |
|
|
15
|
-
| `extractImageEdgeColorAsync` | Function | Samples edge pixels of an image and returns the dominant hex color for background fills |
|
|
6
|
+
### Types & Constants
|
|
16
7
|
|
|
17
|
-
|
|
8
|
+
- **`ColorPalette`** — Interface representing a named color with `hex` and `rgb` tuple fields.
|
|
9
|
+
- **`DESIGN_PALETTE`** — Three-entry design system palette: `yellow`, `black`, and `gray`.
|
|
18
10
|
|
|
19
|
-
|
|
20
|
-
import { analyzeImageColor, extractImageEdgeColorAsync, getContrastRatio, hexToRgb } from './color-analysis';
|
|
11
|
+
### Functions
|
|
21
12
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
13
|
+
| Function | Description |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `hexToRgb(hex)` | Converts a hex color string (with shorthand support) to an RGB tuple. |
|
|
16
|
+
| `getContrastRatio(color1, color2)` | Returns the WCAG contrast ratio between two RGB colors. |
|
|
17
|
+
| `pickReadableTextColor(bgHex)` | Returns `'dark'` or `'light'` based on which foreground has better contrast against the given background hex. |
|
|
18
|
+
| `extractDominantColor(canvas)` | Samples ~1000 pixels in a grid pattern and bucket-quantizes (step 32) to find the most frequent color. |
|
|
19
|
+
| `getBestContrastColor(imageColor)` | Picks the `DESIGN_PALETTE` entry with the highest contrast against a given RGB color; falls back to `black` if no entry meets 3:1. |
|
|
20
|
+
| `analyzeImageColor(imageSrc)` | Loads an image via canvas (scaled to max 100px), extracts its dominant color, and resolves with the best-contrast palette entry. |
|
|
21
|
+
| `extractImageEdgeColorAsync(imageUrl)` | Samples a 15% edge band of an image (scaled to max 50px) and returns the average dominant edge color as a hex string. Used for email/card background fills. |
|
|
25
22
|
|
|
26
|
-
|
|
27
|
-
const bgColor = await extractImageEdgeColorAsync('https://example.com/hero.jpg');
|
|
28
|
-
console.log(bgColor); // '#1a2b3c'
|
|
23
|
+
## Usage Example
|
|
29
24
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
```typescript
|
|
26
|
+
import {
|
|
27
|
+
pickReadableTextColor,
|
|
28
|
+
analyzeImageColor,
|
|
29
|
+
extractImageEdgeColorAsync,
|
|
30
|
+
} from './color-analysis';
|
|
31
|
+
|
|
32
|
+
// Choose a text theme for a dynamic banner background
|
|
33
|
+
const theme = pickReadableTextColor('#FFC008'); // → 'dark'
|
|
34
|
+
|
|
35
|
+
// Resolve a badge color from a product image
|
|
36
|
+
const paletteColor = await analyzeImageColor('https://cdn.example.com/product.png');
|
|
37
|
+
console.log(paletteColor.name); // e.g. 'yellow'
|
|
38
|
+
|
|
39
|
+
// Fill background color behind an image in an email template
|
|
40
|
+
const edgeHex = await extractImageEdgeColorAsync('https://cdn.example.com/hero.jpg');
|
|
41
|
+
console.log(edgeHex); // e.g. '#1a1a1a'
|
|
33
42
|
```
|
|
34
43
|
|
|
35
|
-
> **Note:** `
|
|
44
|
+
> **Note:** `analyzeImageColor` and `extractImageEdgeColorAsync` are browser-only (they depend on `HTMLCanvasElement` and `document`). `extractImageEdgeColorAsync` returns `#000000` in SSR/Node environments.
|
package/src/utils/.common.md
CHANGED
|
@@ -1,36 +1,56 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: dd0dfcce5e3006e1d50e924c7a9379a7 -->
|
|
2
|
+
General-purpose utility functions for class name merging, async delays, string manipulation, JSON-LD serialization, object cloning, and environment-based Slack URL resolution.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
| Export | Signature | Description |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| `cn` | `(...inputs: ClassValue[]) => string` | Merges Tailwind CSS class names using `clsx` + `tailwind-merge` |
|
|
9
|
+
| `delay` | `(ms: number) => Promise<void>` | Async sleep helper |
|
|
10
|
+
| `generateRandomString` | `(length?: number) => string` | Alphanumeric random string generator (default length: 8) |
|
|
11
|
+
| `truncateString` | `(str, maxLength, suffix?) => string` | Truncates with configurable suffix (default: `"..."`) |
|
|
12
|
+
| `serializeJsonLd` | `(schema: unknown) => string` | XSS-safe JSON-LD serializer — escapes `<` as `\u003c` |
|
|
13
|
+
| `deepClone` | `<T>(obj: T) => T` | Structural clone via JSON round-trip |
|
|
14
|
+
| `getSlackCommunityJoinUrl` | `() => string` | Reads `NEXT_PUBLIC_SLACK_COMMUNITY_JOIN_URL` with fallback to OpenMSP invite |
|
|
12
15
|
|
|
13
16
|
## Usage Example
|
|
14
17
|
|
|
15
18
|
```typescript
|
|
16
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
cn,
|
|
21
|
+
delay,
|
|
22
|
+
generateRandomString,
|
|
23
|
+
truncateString,
|
|
24
|
+
serializeJsonLd,
|
|
25
|
+
deepClone,
|
|
26
|
+
getSlackCommunityJoinUrl,
|
|
27
|
+
} from "@/lib/utils/common"
|
|
17
28
|
|
|
18
|
-
// Merge Tailwind classes (
|
|
19
|
-
const
|
|
29
|
+
// Merge Tailwind classes (handles conflicts)
|
|
30
|
+
const cls = cn("px-4 py-2", isActive && "bg-blue-500", "px-6") // "py-2 bg-blue-500 px-6"
|
|
20
31
|
|
|
21
|
-
// Async delay
|
|
22
|
-
await delay(
|
|
32
|
+
// Async delay in an async function
|
|
33
|
+
await delay(1500) // waits 1.5 seconds
|
|
23
34
|
|
|
24
|
-
//
|
|
25
|
-
const
|
|
35
|
+
// Random token generation
|
|
36
|
+
const token = generateRandomString(16) // e.g. "aZ3kR8mQpL2nWx7T"
|
|
26
37
|
|
|
27
|
-
//
|
|
28
|
-
|
|
38
|
+
// Safe truncation
|
|
39
|
+
truncateString("OpenFrame AI Platform", 14) // "OpenFrame AI..."
|
|
29
40
|
|
|
30
|
-
//
|
|
31
|
-
const
|
|
32
|
-
|
|
41
|
+
// Safe JSON-LD for <script type="application/ld+json">
|
|
42
|
+
const jsonLd = serializeJsonLd({ "@type": "WebSite", name: "</script>attack" })
|
|
43
|
+
// → '{"@type":"WebSite","name":"\\u003c/script>attack"}'
|
|
33
44
|
|
|
34
|
-
//
|
|
35
|
-
const
|
|
36
|
-
|
|
45
|
+
// Deep clone without reference sharing
|
|
46
|
+
const copy = deepClone({ nested: { value: 42 } })
|
|
47
|
+
|
|
48
|
+
// Slack community URL (set via env or uses OpenMSP fallback)
|
|
49
|
+
const slackUrl = getSlackCommunityJoinUrl()
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
> **Security note:** `serializeJsonLd` must be used for all `<script type="application/ld+json">` blocks. Raw `JSON.stringify` does not HTML-escape `<`, leaving stored XSS vectors open if user-entered data reaches the schema object.
|
|
53
|
+
|
|
54
|
+
## Source
|
|
55
|
+
|
|
56
|
+
[`common.ts` on GitHub](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/common.ts)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
<!-- source-hash: 235fea62f64e91dc73029934b22d60cc -->
|
|
2
|
+
Unified content-href authority for all embeddable surfaces — resolves content links consistently across both page views and chat surfaces using a single configurable seam.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### Constants
|
|
7
|
+
|
|
8
|
+
- **`DEFAULT_CONTENT_SUFFIXES`** — Maps content `documentType` strings (e.g. `'product_release'`, `'blog_post'`) to their URL path segments. Mirrors the hub's `PUBLIC_URL_PATHS`; kept in sync manually across the cross-repo boundary.
|
|
9
|
+
|
|
10
|
+
### Types
|
|
11
|
+
|
|
12
|
+
- **`ComposeContentUrlInput`** — Unified input for both page views (slug-based) and chat rows (ID + `externalUrl`-based).
|
|
13
|
+
- **`ContentHrefOptions`** — Configuration for `makeComposeContentUrl`: hosted types set, hub origin fallback, optional suffix/override maps.
|
|
14
|
+
- **`ComposeContentUrl`** — The seam function signature on `ChatRuntime`; always returns `{ href, targetPlatform }`, never null.
|
|
15
|
+
|
|
16
|
+
### Functions
|
|
17
|
+
|
|
18
|
+
- **`makeComposeContentUrl(opts)`** — Factory that builds the embedder's `composeContentUrl`. Resolution order: explicit `overrides` → hosted in-app route → verbatim `externalUrl` → hub-origin fallback.
|
|
19
|
+
- **`buildDefaultHref(basePath, slug)`** — Fallback href when no `composeContentUrl` is wired (single-platform embedders).
|
|
20
|
+
- **`resolveContentHref(composeContentUrl, args)`** — Ternary helper used by catalog/detail views: delegates to `composeContentUrl` when wired, otherwise calls `buildDefaultHref`.
|
|
21
|
+
|
|
22
|
+
## Usage Example
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import {
|
|
26
|
+
makeComposeContentUrl,
|
|
27
|
+
resolveContentHref,
|
|
28
|
+
} from './content-href'
|
|
29
|
+
|
|
30
|
+
// Build the embedder's composer
|
|
31
|
+
const composeContentUrl = makeComposeContentUrl({
|
|
32
|
+
hostedTypes: new Set(['onboarding_guide', 'product_release']),
|
|
33
|
+
contentOrigin: 'https://openframe.app',
|
|
34
|
+
overrides: {
|
|
35
|
+
author: (id) => ({ href: `/team/${id}`, targetPlatform: null }),
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
// Page view — slug passed directly as identifier
|
|
40
|
+
composeContentUrl({ type: 'product_release', identifier: 'my-release-v2' })
|
|
41
|
+
// → { href: '/releases/my-release-v2', targetPlatform: null }
|
|
42
|
+
|
|
43
|
+
// Chat row — id as identifier, slug recovered from externalUrl
|
|
44
|
+
composeContentUrl({
|
|
45
|
+
type: 'product_release',
|
|
46
|
+
identifier: 'abc123',
|
|
47
|
+
externalUrl: 'https://openframe.app/releases/my-release-v2',
|
|
48
|
+
})
|
|
49
|
+
// → { href: '/releases/my-release-v2', targetPlatform: null }
|
|
50
|
+
|
|
51
|
+
// Non-hosted type — opens out to hub
|
|
52
|
+
composeContentUrl({ type: 'blog_post', identifier: 'my-post' })
|
|
53
|
+
// → { href: 'https://openframe.app/blog/my-post', targetPlatform: null }
|
|
54
|
+
|
|
55
|
+
// Catalog/detail view helper
|
|
56
|
+
resolveContentHref(composeContentUrl, {
|
|
57
|
+
type: 'onboarding_guide',
|
|
58
|
+
slug: 'getting-started',
|
|
59
|
+
basePath: '/onboarding-guides',
|
|
60
|
+
})
|
|
61
|
+
// → { href: '/onboarding-guides/getting-started', targetPlatform: null }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Source:** [`content-href.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/content-href.ts)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!-- source-hash: 0fe0f3b3b32e9874a82e09c286bf0512 -->
|
|
2
|
+
Single source of truth for grouping `content_ref` types with display metadata (label, render order, layout, and card size). Consumed by the `RelatedContentSection` component and the hub's investor email builder to ensure consistent rendering and ordering across surfaces.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### Types
|
|
7
|
+
|
|
8
|
+
- **`ContentRefLayout`** — `'list' | 'grid'`; controls whether a group renders as full-width cards or a responsive column grid.
|
|
9
|
+
- **`ContentRefGridSize`** — `'lg' | 'default' | 'sm'`; card size variant forwarded to the entity-card dispatch. Kept in lockstep with `EntityCardSize` to avoid a config→component import cycle.
|
|
10
|
+
- **`ContentRefGroupConfig`** — shape of each entry: `label`, `order`, `layout`, `gridSize`.
|
|
11
|
+
|
|
12
|
+
### Constants
|
|
13
|
+
|
|
14
|
+
- **`CONTENT_REF_GROUPS`** — registry of all known `content_ref` types (`investor_update`, `product_release`, `podcast`, `webinar`, `case_study`, `event`, `blog_post_existing`, `customer_interview`, `onboarding_guide`, `what_i_shipped`). Adding one entry here auto-registers the type in `RelatedContentSection` and makes it a hub suggestion candidate (if resolvable via `TYPE_TO_ENTITY` → RAG config).
|
|
15
|
+
|
|
16
|
+
### Functions
|
|
17
|
+
|
|
18
|
+
| Function | Description |
|
|
19
|
+
|---|---|
|
|
20
|
+
| `getContentRefLabel(type)` | Returns the registered label or `null` for unknown types. |
|
|
21
|
+
| `getContentRefLabelOrTitleCase(type)` | Returns the registered label or a title-cased fallback (e.g. `"podcast_guest"` → `"Podcast Guest"`). |
|
|
22
|
+
| `orderContentRefTypes(present)` | Sorts a set of present types into canonical `order` sequence; unregistered types are appended in insertion order. |
|
|
23
|
+
|
|
24
|
+
## Usage Example
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import {
|
|
28
|
+
CONTENT_REF_GROUPS,
|
|
29
|
+
getContentRefLabelOrTitleCase,
|
|
30
|
+
orderContentRefTypes,
|
|
31
|
+
} from '@openframe-oss-lib/utils/content-ref-groups'
|
|
32
|
+
|
|
33
|
+
// Render groups in canonical order
|
|
34
|
+
const types = ['blog_post_existing', 'podcast', 'custom_type']
|
|
35
|
+
const sorted = orderContentRefTypes(types)
|
|
36
|
+
// → ['podcast', 'blog_post_existing', 'custom_type']
|
|
37
|
+
|
|
38
|
+
for (const type of sorted) {
|
|
39
|
+
const config = CONTENT_REF_GROUPS[type]
|
|
40
|
+
const label = getContentRefLabelOrTitleCase(type)
|
|
41
|
+
// config?.layout === 'list' | 'grid' | undefined for unregistered
|
|
42
|
+
console.log(label, config?.layout)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Adding a new content type — one entry is all that's needed:
|
|
46
|
+
// CONTENT_REF_GROUPS['press_release'] = {
|
|
47
|
+
// label: 'Press Releases', order: 11, layout: 'list', gridSize: 'lg'
|
|
48
|
+
// }
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
> **Extending:** Add new content types directly to `CONTENT_REF_GROUPS`. Prefer `gridSize: 'lg'` for types whose card component has a large variant. No other file needs updating for `RelatedContentSection` to pick up the new group.
|
package/src/utils/.date-utils.md
CHANGED
|
@@ -1,45 +1,56 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
Unified date formatting utilities
|
|
1
|
+
<!-- source-hash: c0ca2308274869b5506bb1e4854c772e -->
|
|
2
|
+
Unified date formatting utilities for the OpenMSP platform, providing consistent timestamp display across all components with built-in SSR/hydration safety (React #418) via UTC-pinned date operations.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
| Function | Description |
|
|
7
|
+
|---|---|
|
|
8
|
+
| `formatTicketRelativeTime(iso)` | Ticket-specific relative label: "Just now" / "X min ago" / "X hour(s) ago" / "MM/DD/YYYY" |
|
|
9
|
+
| `formatTicketFullTimestamp(iso)` | Full tooltip timestamp in `MM/DD/YYYY, H:MM AM/PM` format |
|
|
10
|
+
| `formatRelativeTime(timestamp)` | General-purpose relative time: "Just now" → "Xm/h/d/w ago" → localized date (source of truth) |
|
|
11
|
+
| `formatAbsoluteDate(timestamp, options?)` | Localized absolute date via `Intl.DateTimeFormatOptions`, UTC-pinned |
|
|
12
|
+
| `formatDateTime(timestamp, options?)` | Localized date + time via `Intl.DateTimeFormatOptions`, UTC-pinned |
|
|
13
|
+
| `getDetailedTimeDifference(timestamp)` | Verbose elapsed time: "X seconds/minutes/hours/days/months/years ago" |
|
|
14
|
+
| `isToday(timestamp)` | Returns `true` if the timestamp falls on today's local date |
|
|
15
|
+
| `isWithinMinutes(timestamp, minutes)` | Returns `true` if the timestamp is within the last N minutes |
|
|
16
|
+
| `createUTCTimestamp()` | Returns current UTC time as an ISO string for database insertion |
|
|
13
17
|
|
|
14
18
|
## Usage Example
|
|
15
19
|
|
|
16
20
|
```typescript
|
|
17
|
-
import {
|
|
18
|
-
formatRelativeTime,
|
|
19
|
-
formatAbsoluteDate,
|
|
21
|
+
import {
|
|
22
|
+
formatRelativeTime,
|
|
23
|
+
formatAbsoluteDate,
|
|
20
24
|
formatDateTime,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
//
|
|
33
|
-
|
|
34
|
-
//
|
|
35
|
-
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
25
|
+
formatTicketRelativeTime,
|
|
26
|
+
formatTicketFullTimestamp,
|
|
27
|
+
getDetailedTimeDifference,
|
|
28
|
+
isToday,
|
|
29
|
+
isWithinMinutes,
|
|
30
|
+
createUTCTimestamp,
|
|
31
|
+
} from './date-utils'
|
|
32
|
+
|
|
33
|
+
// Relative time (general use)
|
|
34
|
+
formatRelativeTime('2024-01-01T12:00:00Z') // 'Jan 1, 2024'
|
|
35
|
+
formatRelativeTime(new Date()) // 'Just now'
|
|
36
|
+
formatRelativeTime('2024-06-15T10:30:00Z') // '3h ago'
|
|
37
|
+
|
|
38
|
+
// Ticket timestamps (UI list / tooltip)
|
|
39
|
+
formatTicketRelativeTime('2024-06-15T10:30:00Z') // '3 hours ago' or '06/15/2024'
|
|
40
|
+
formatTicketFullTimestamp('2024-06-15T10:30:00Z') // '06/15/2024, 10:30 AM'
|
|
41
|
+
|
|
42
|
+
// Absolute and datetime formatting
|
|
43
|
+
formatAbsoluteDate('2024-06-15T10:30:00Z') // 'Jun 15, 2024'
|
|
44
|
+
formatAbsoluteDate('2024-06-15T10:30:00Z', { month: 'long' }) // 'June 15, 2024'
|
|
45
|
+
formatDateTime('2024-06-15T10:30:00Z') // 'Jun 15, 2024, 10:30 AM'
|
|
46
|
+
|
|
47
|
+
// Verbose elapsed time
|
|
48
|
+
getDetailedTimeDifference('2024-06-14T08:00:00Z') // '2 days ago'
|
|
49
|
+
|
|
50
|
+
// Guards and utilities
|
|
51
|
+
isToday(new Date()) // true
|
|
52
|
+
isWithinMinutes('2024-06-15T10:29:00Z', 5) // true (if within 5 min)
|
|
53
|
+
createUTCTimestamp() // '2024-06-15T10:30:00.000Z'
|
|
43
54
|
```
|
|
44
55
|
|
|
45
|
-
|
|
56
|
+
> **SSR Safety:** All functions use UTC getters or `timeZone: 'UTC'` to ensure server-rendered output matches client hydration and avoids React hydration mismatch [#418](https://github.com/flamingo-stack/openframe-oss-lib/issues/418).
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<!-- source-hash: 522b22b251e1243bc131056859525baa -->
|
|
2
|
+
Shared utility module providing path and slug operations for document source viewers (knowledge base, data room, etc.), serving as the single source of truth for path normalization across route handlers.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Signature | Purpose |
|
|
7
|
+
|--------|-----------|---------|
|
|
8
|
+
| `toDocSlug` | `(name: string) => string` | Converts a display name to a URL-safe slug |
|
|
9
|
+
| `pathToNodeId` | `(path: string) => string` | Converts a file path to a DOM-safe node ID |
|
|
10
|
+
| `normalizeDocPath` | `(segments: string[], folderIndexFile?: string) => string` | Normalizes URL path segments, stripping folder-index suffixes |
|
|
11
|
+
|
|
12
|
+
## Usage Example
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import { toDocSlug, pathToNodeId, normalizeDocPath } from './doc-path-utils'
|
|
16
|
+
|
|
17
|
+
// Convert document name to URL slug
|
|
18
|
+
toDocSlug('Investor Thesis') // → "investor-thesis"
|
|
19
|
+
toDocSlug(' Cap Table ') // → "cap-table"
|
|
20
|
+
|
|
21
|
+
// Convert file path to a DOM-safe tree node ID
|
|
22
|
+
pathToNodeId('legal/cap-table/safe.md') // → "legal-cap-table-safe.md"
|
|
23
|
+
|
|
24
|
+
// Normalize route segments, stripping README.md index suffixes
|
|
25
|
+
normalizeDocPath(['legal', 'cap-table']) // → "legal/cap-table"
|
|
26
|
+
normalizeDocPath(['legal', 'cap-table', 'README.md']) // → "legal/cap-table"
|
|
27
|
+
normalizeDocPath(['README.md']) // → ""
|
|
28
|
+
|
|
29
|
+
// Override the default folder-index filename
|
|
30
|
+
normalizeDocPath(['docs', 'index.md'], 'index.md') // → "docs"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Notes
|
|
34
|
+
|
|
35
|
+
- `normalizeDocPath` lowercases **both** the input segments and the `folderIndexFile` constant before comparison, ensuring URLs like `readme.md` and `README.md` strip uniformly.
|
|
36
|
+
- `DEFAULT_FOLDER_INDEX_FILE` is imported from `doc-tree-nav` and used as the default `folderIndexFile` argument.
|
|
37
|
+
|
|
38
|
+
**Source:** [`doc-path-utils.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/doc-path-utils.ts)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!-- source-hash: 8886b4928afb072c5436308281384b36 -->
|
|
2
|
+
Pure navigation helpers for traversing and resolving paths within a `DocNode` tree — shared between client-side hooks and server-side RSC rendering.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| `DEFAULT_FOLDER_INDEX_FILE` | `const` | Canonical folder-index filename (`'README.md'`); single source of truth across navigation, SEO, and fetch logic |
|
|
9
|
+
| `stripFolderIndexFromPath` | function | Normalizes a file path by removing the trailing folder-index filename, returning the logical folder path |
|
|
10
|
+
| `findDocNodeByPath` | function | Recursively searches a `DocNode[]` tree for a node matching the given path |
|
|
11
|
+
| `getDocAncestorNodeIds` | function | Converts a slash-delimited node path into DOM-style IDs for each ancestor segment (used to pre-open accordion sidebar) |
|
|
12
|
+
| `resolveContentFetchPath` | function | Determines the actual storage path to fetch for a selected node, handling folder README resolution and no-content folders |
|
|
13
|
+
| `getInitialExpandedNodeIds` | function | Derives the set of accordion node IDs that should be expanded on initial load for a given path |
|
|
14
|
+
| `getDocSourceDefaultPath` | function | Finds the first root-level folder with a README when the tree root itself has no index file |
|
|
15
|
+
|
|
16
|
+
## Usage Example
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
import {
|
|
20
|
+
stripFolderIndexFromPath,
|
|
21
|
+
findDocNodeByPath,
|
|
22
|
+
resolveContentFetchPath,
|
|
23
|
+
getInitialExpandedNodeIds,
|
|
24
|
+
getDocSourceDefaultPath,
|
|
25
|
+
} from './doc-tree-nav'
|
|
26
|
+
|
|
27
|
+
// Normalize a path for display or URL routing
|
|
28
|
+
stripFolderIndexFromPath('guides/README.md') // → 'guides'
|
|
29
|
+
stripFolderIndexFromPath('README.md') // → ''
|
|
30
|
+
|
|
31
|
+
// Find a node in the tree
|
|
32
|
+
const node = findDocNodeByPath('guides/quickstart', docStructure)
|
|
33
|
+
|
|
34
|
+
// Resolve what to actually fetch from storage
|
|
35
|
+
const fetchPath = resolveContentFetchPath('guides', docStructure)
|
|
36
|
+
// → 'guides/README.md' if the folder has hasReadme: true
|
|
37
|
+
|
|
38
|
+
// Expand ancestor accordions for a deep initial path
|
|
39
|
+
const openIds = getInitialExpandedNodeIds('guides/setup/install.md')
|
|
40
|
+
// → ['guides', 'guides-setup']
|
|
41
|
+
|
|
42
|
+
// Jump to the first meaningful default when root has no README
|
|
43
|
+
const defaultPath = getDocSourceDefaultPath(docStructure)
|
|
44
|
+
// → 'guides' (first folder with hasReadme: true)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Notes
|
|
48
|
+
|
|
49
|
+
- All functions accept an optional `folderIndexFile` parameter (defaults to `DEFAULT_FOLDER_INDEX_FILE`) to support non-standard folder-index conventions.
|
|
50
|
+
- `DEFAULT_FOLDER_INDEX` is exported as a deprecated alias — migrate consumers to `DEFAULT_FOLDER_INDEX_FILE`.
|
|
51
|
+
- `resolveContentFetchPath` returns `null` for folders with no README, signaling the UI to suppress a fetch attempt.
|
|
@@ -1,46 +1,62 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 136c109b7bdd3302447f1c154892d2e4 -->
|
|
2
|
+
Shared `fetch` wrapper for embedded surfaces (chat, ticket center, widgets) that attaches bearer-act-as identity headers (`Authorization` + `X-Chat-Act-As`) from proxy auth storage, with support for host-supplied auth adapters, cross-origin defense, and 401 self-healing.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
###
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- `
|
|
18
|
-
- `refresh()` — `Promise<boolean>` 401 self-heal hook (see above). This lifts the openframe `apiClient`'s refresh-then-retry behaviour into the lib so embedded surfaces no longer need a host-side `window.fetch` monkey-patch to survive an expired token mid-session.
|
|
19
|
-
|
|
20
|
-
### `assertSameOrigin(url)` *(internal)*
|
|
21
|
-
Defense-in-depth guard that:
|
|
22
|
-
- Resolves all URL forms (relative, absolute, protocol-relative, whitespace-prefixed) against `window.location.href` via the WHATWG `URL` constructor — bypasses regex shortcuts vulnerable to `\t`/`\n` prefix tricks
|
|
23
|
-
- Blocks non-`http(s):` schemes explicitly (`javascript:`, `data:`, `blob:`, etc.)
|
|
24
|
-
- Throws on cross-origin destinations before any bearer token leaves the page
|
|
25
|
-
- Skips silently during SSR (`typeof window === 'undefined'`)
|
|
6
|
+
### Interfaces
|
|
7
|
+
|
|
8
|
+
- **`EmbedAuthAdapter`** — Interface for host-supplied auth overrides. Supports `getHeaders()`, `credentials`, `refresh` (401 self-heal), and `allowedOrigins` (native-shell hatch for cross-origin allowlisting).
|
|
9
|
+
|
|
10
|
+
### Functions
|
|
11
|
+
|
|
12
|
+
| Function | Description |
|
|
13
|
+
|---|---|
|
|
14
|
+
| `setEmbedAuthAdapter(adapter)` | Registers (or clears) a host-owned auth adapter at the `globalThis` slot `__embedAuthedFetchAdapter__`. Warns on overwrite in non-production. |
|
|
15
|
+
| `hasEmbedAuthAdapter()` | Returns `true` when an adapter is currently registered; used by sibling helpers to route through `embedAuthedFetch` only when embedded auth is active. |
|
|
16
|
+
| `needsBearerAssetFetch(url)` | Returns `true` when the URL's origin is in the adapter's `allowedOrigins` AND the adapter is supplying an `Authorization` header — signals that native asset loads (`<img src>`) must use fetch + blob object-URL instead. |
|
|
17
|
+
| `embedAuthedFetch(url, init?)` | Drop-in `fetch` replacement. Merges proxy auth headers, enforces same-origin (or `allowedOrigins`) guard synchronously, and performs a single 401 refresh + retry when `adapter.refresh` is registered. |
|
|
26
18
|
|
|
27
19
|
## Usage Example
|
|
28
20
|
|
|
29
21
|
```typescript
|
|
30
|
-
|
|
31
|
-
|
|
22
|
+
import {
|
|
23
|
+
setEmbedAuthAdapter,
|
|
24
|
+
embedAuthedFetch,
|
|
25
|
+
needsBearerAssetFetch,
|
|
26
|
+
} from './embed-authed-fetch'
|
|
27
|
+
|
|
28
|
+
// Register a host adapter on provider mount
|
|
29
|
+
setEmbedAuthAdapter({
|
|
30
|
+
getHeaders: () => ({
|
|
31
|
+
Authorization: token ? `Bearer ${token}` : undefined,
|
|
32
|
+
}),
|
|
33
|
+
credentials: 'include',
|
|
34
|
+
refresh: async () => {
|
|
35
|
+
const refreshed = await refreshAccessToken()
|
|
36
|
+
return refreshed
|
|
37
|
+
},
|
|
38
|
+
allowedOrigins: ['https://gateway.example.com'],
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
// Use as a drop-in fetch replacement for /api/chat/* routes
|
|
42
|
+
const response = await embedAuthedFetch('/api/chat/messages', {
|
|
32
43
|
method: 'POST',
|
|
33
44
|
body: JSON.stringify({ message: 'Hello' }),
|
|
34
45
|
})
|
|
35
46
|
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
// Route asset loads through fetch when bearer is required
|
|
48
|
+
if (needsBearerAssetFetch(imageUrl)) {
|
|
49
|
+
const res = await embedAuthedFetch(imageUrl)
|
|
50
|
+
const blob = await res.blob()
|
|
51
|
+
imgElement.src = URL.createObjectURL(blob)
|
|
52
|
+
}
|
|
41
53
|
|
|
42
|
-
//
|
|
43
|
-
|
|
54
|
+
// Clear adapter on provider unmount
|
|
55
|
+
setEmbedAuthAdapter(null)
|
|
44
56
|
```
|
|
45
57
|
|
|
46
|
-
>
|
|
58
|
+
> **Note:** The adapter is stored on `globalThis` (key `__embedAuthedFetchAdapter__`) rather than module scope to survive bundler code-splitting across multiple entry points. Routes that do not need bearer-act-as (e.g. `/api/profile/me`) should continue using vanilla `fetch`.
|
|
59
|
+
|
|
60
|
+
## Source
|
|
61
|
+
|
|
62
|
+
[`embed-authed-fetch.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/embed-authed-fetch.ts)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<!-- source-hash: 62e7c52af0777cb746a6d452c7225669 -->
|
|
2
|
+
Thin routing shim that directs content-surface HTTP requests through the embed auth adapter when one is registered, or falls back to a plain `fetch` otherwise.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `contentFetch`
|
|
7
|
+
|
|
8
|
+
A `typeof fetch`-compatible function used by all self-fetching content surfaces (roadmap, delivery, product releases, onboarding guides, legal docs, release-detail injected sections). Routes requests based on adapter presence:
|
|
9
|
+
|
|
10
|
+
- **Adapter registered** → delegates to `embedAuthedFetch`, which attaches bearer tokens/cookies and handles 401 refresh — the same auth path used by the embedded chat.
|
|
11
|
+
- **No adapter** → returns a plain, unmodified `fetch` call.
|
|
12
|
+
|
|
13
|
+
Internally coerces the full `RequestInfo | URL` input shape down to a plain string URL, since `embedAuthedFetch` accepts only strings. Handles all three input variants (`string`, `URL`, `Request`) defensively, even though content surfaces always pass strings in practice.
|
|
14
|
+
|
|
15
|
+
## Usage Example
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
// After wiring the embed auth adapter once for the chat surface,
|
|
19
|
+
// all content fetches automatically inherit the same auth:
|
|
20
|
+
|
|
21
|
+
import { contentFetch } from './embed-content-fetch'
|
|
22
|
+
|
|
23
|
+
// Used internally by content surfaces — no configuration needed
|
|
24
|
+
const response = await contentFetch('/api/roadmap/items', {
|
|
25
|
+
method: 'GET',
|
|
26
|
+
headers: { 'Content-Type': 'application/json' },
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const data = await response.json()
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
> Hosts register auth **once** via `EmbedAuthAdapter` for the chat surface; `contentFetch` inherits it automatically with no additional setup required.
|
|
33
|
+
|
|
34
|
+
## Source
|
|
35
|
+
|
|
36
|
+
[`embed-content-fetch.ts`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/embed-content-fetch.ts)
|