@flamingo-stack/openframe-frontend-core 0.0.213 → 0.0.214-snapshot.20260528192313
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-35XIT2CF.cjs → chunk-2G3NXF6J.cjs} +17 -17
- package/dist/{chunk-35XIT2CF.cjs.map → chunk-2G3NXF6J.cjs.map} +1 -1
- package/dist/{chunk-IK2X5YJU.js → chunk-7PCP7YQR.js} +2 -2
- package/dist/{chunk-ZDF6F7ED.cjs → chunk-D4MNFY67.cjs} +4 -3
- package/dist/chunk-D4MNFY67.cjs.map +1 -0
- package/dist/{chunk-OTKJASSX.cjs → chunk-NGFP4RVL.cjs} +24 -24
- package/dist/{chunk-OTKJASSX.cjs.map → chunk-NGFP4RVL.cjs.map} +1 -1
- package/dist/{chunk-3JWIJJ44.js → chunk-R6MLPU4A.js} +2 -2
- package/dist/{chunk-ZTJVRSN5.js → chunk-WQZP3JIZ.js} +4 -3
- package/dist/chunk-WQZP3JIZ.js.map +1 -0
- package/dist/components/chat/index.cjs +2 -2
- package/dist/components/chat/index.js +1 -1
- package/dist/components/contact/index.cjs +3 -3
- package/dist/components/contact/index.js +2 -2
- package/dist/components/features/index.cjs +2 -2
- package/dist/components/features/index.js +1 -1
- package/dist/components/index.cjs +49 -49
- package/dist/components/index.js +2 -2
- package/dist/components/navigation/index.cjs +2 -2
- package/dist/components/navigation/index.js +1 -1
- package/dist/components/tickets/index.cjs +61 -61
- package/dist/components/tickets/index.js +3 -3
- package/dist/components/ui/index.cjs +2 -2
- package/dist/components/ui/index.js +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/.index.md +36 -34
- package/src/components/.alert-dialog.md +27 -23
- package/src/components/.announcement-bar.md +26 -21
- package/src/components/.breadcrumb.md +19 -15
- package/src/components/.calendar.md +24 -19
- package/src/components/.categories-cart.md +29 -24
- package/src/components/.checkbox.md +23 -25
- package/src/components/.chevron-button.md +37 -32
- package/src/components/.comment-card.md +32 -62
- package/src/components/.dialog.md +26 -26
- package/src/components/.dynamic-skeleton.md +54 -57
- package/src/components/.empty-state.md +42 -51
- package/src/components/.faq-accordion.md +27 -21
- package/src/components/.filter-chip.md +41 -24
- package/src/components/.flamingo-logo.md +20 -23
- package/src/components/.footer-waitlist-button.md +29 -22
- package/src/components/.footer.md +32 -32
- package/src/components/.icons-block.md +27 -17
- package/src/components/.image-cropper.md +41 -32
- package/src/components/.index.md +33 -39
- package/src/components/.input.md +31 -35
- package/src/components/.logs-list.md +31 -20
- package/src/components/.media-carousel.md +35 -36
- package/src/components/.open-source-features.md +33 -16
- package/src/components/.pagination.md +52 -51
- package/src/components/.provider-button.md +21 -23
- package/src/components/.select.md +31 -20
- package/src/components/.sidebar.md +34 -24
- package/src/components/.smooth-accordion.md +29 -24
- package/src/components/.social-icon-row.md +36 -32
- package/src/components/.textarea.md +25 -31
- package/src/components/.tool-icon.md +24 -26
- package/src/components/.unified-filter-logic.md +37 -30
- package/src/components/.unified-pagination.md +23 -22
- package/src/components/.user-summary-stub.md +38 -22
- package/src/components/.vendor-display-button.md +25 -25
- package/src/components/.vendor-icon.md +33 -25
- package/src/components/.why-it-matters.md +28 -25
- package/src/components/chat/.approval-batch-message.md +51 -0
- package/src/components/chat/.approval-request-message.md +35 -34
- package/src/components/chat/.chat-attachment-bar.md +64 -0
- package/src/components/chat/.chat-container.md +36 -18
- package/src/components/chat/.chat-input.md +37 -20
- package/src/components/chat/.chat-message-enhanced.md +30 -49
- package/src/components/chat/.chat-message-list.md +45 -32
- package/src/components/chat/.chat-message-skeleton.md +26 -22
- package/src/components/chat/.chat-panel-context.md +52 -0
- package/src/components/chat/.chat-ref.types.md +42 -0
- package/src/components/chat/.chat-sidebar-skeleton.md +34 -25
- package/src/components/chat/.chat-sidebar.md +31 -26
- package/src/components/chat/.chat-ticket-list.md +39 -0
- package/src/components/chat/.context-compaction-display.md +36 -0
- package/src/components/chat/.cycling-phrase.md +52 -0
- package/src/components/chat/.embeddable-chat.md +48 -0
- package/src/components/chat/.expand-chevron.md +24 -0
- package/src/components/chat/.index.md +31 -35
- package/src/components/chat/.mingo-onboarding-card-skeleton.md +44 -0
- package/src/components/chat/.mingo-onboarding-card.md +62 -0
- package/src/components/chat/.model-display.md +32 -30
- package/src/components/chat/.nav-link-anchor-via-runtime.md +40 -0
- package/src/components/chat/.remark-card-links.md +38 -0
- package/src/components/chat/.slash-command-suggestions.md +47 -0
- package/src/components/chat/.source-action-button.md +48 -0
- package/src/components/chat/.thinking-display.md +42 -0
- package/src/components/chat/.tool-call-blocks.md +45 -0
- package/src/components/chat/.tool-execution-display.md +44 -36
- package/src/components/chat/chat-container.tsx +1 -1
- package/src/components/chat/entity-cards/.admin-content-card.md +43 -0
- package/src/components/chat/entity-cards/.block-card.md +47 -0
- package/src/components/chat/entity-cards/.blog-card.md +52 -0
- package/src/components/chat/entity-cards/.blog-image-placeholder.md +39 -0
- package/src/components/chat/entity-cards/.campaign-card-admin.md +47 -0
- package/src/components/chat/entity-cards/.case-study-card.md +58 -0
- package/src/components/chat/entity-cards/.chat-ticket-item.md +40 -0
- package/src/components/chat/entity-cards/.chat-video-entity-card.md +43 -0
- package/src/components/chat/entity-cards/.customer-interview-card.md +53 -0
- package/src/components/chat/entity-cards/.data-room-doc-card.md +47 -0
- package/src/components/chat/entity-cards/.dispatch.md +39 -0
- package/src/components/chat/entity-cards/.entity-author-card.md +51 -0
- package/src/components/chat/entity-cards/.generic-entity-card.md +62 -0
- package/src/components/chat/entity-cards/.github-activity-card.md +61 -0
- package/src/components/chat/entity-cards/.hubspot-ticket-card.md +53 -0
- package/src/components/chat/entity-cards/.index.md +66 -0
- package/src/components/chat/entity-cards/.investor-update-card.md +47 -0
- package/src/components/chat/entity-cards/.onboarding-guide-card.md +58 -0
- package/src/components/chat/entity-cards/.product-release-card-defaults.md +31 -0
- package/src/components/chat/entity-cards/.product-release-card.md +29 -0
- package/src/components/chat/entity-cards/.program-card-defaults.md +41 -0
- package/src/components/chat/entity-cards/.program-card.md +59 -0
- package/src/components/chat/entity-cards/.roadmap-card.md +46 -0
- package/src/components/chat/entity-cards/.roadmap-vote-button.md +52 -0
- package/src/components/chat/entity-cards/.slack-message-card.md +48 -0
- package/src/components/chat/entity-cards/.task-type-icon.md +47 -0
- package/src/components/chat/hooks/.index.md +36 -21
- package/src/components/chat/hooks/.use-chat-attachment-image-gallery.md +51 -0
- package/src/components/chat/hooks/.use-chat-attachments.md +48 -0
- package/src/components/chat/hooks/.use-chat-card-item.md +39 -0
- package/src/components/chat/hooks/.use-chat-identity.md +45 -0
- package/src/components/chat/hooks/.use-chat.md +58 -0
- package/src/components/chat/hooks/.use-chunk-catchup.md +46 -48
- package/src/components/chat/hooks/.use-close-on-navigation.md +44 -0
- package/src/components/chat/hooks/.use-collapsible.md +48 -0
- package/src/components/chat/hooks/.use-embedded-chat.md +32 -0
- package/src/components/chat/hooks/.use-jetstream-dialog-subscription.md +40 -0
- package/src/components/chat/hooks/.use-nats-chat-adapter.md +52 -0
- package/src/components/chat/hooks/.use-nats-dialog-subscription.md +49 -30
- package/src/components/chat/hooks/.use-proxied-image-url.md +40 -0
- package/src/components/chat/hooks/.use-realtime-chunk-processor.md +43 -40
- package/src/components/chat/hooks/.use-slash-commands.md +46 -0
- package/src/components/chat/hooks/.use-sse-chat-adapter.md +34 -0
- package/src/components/chat/hooks/.use-sse.md +60 -0
- package/src/components/chat/hooks/.use-unified-chat.md +57 -0
- package/src/components/chat/types/.api.types.md +52 -38
- package/src/components/chat/types/.chat.types.md +43 -34
- package/src/components/chat/types/.component.types.md +47 -48
- package/src/components/chat/types/.index.md +20 -27
- package/src/components/chat/types/.message.types.md +58 -48
- package/src/components/chat/types/.network.types.md +57 -31
- package/src/components/chat/types/.processing.types.md +49 -31
- package/src/components/chat/types/.unified-chat-state.types.md +41 -0
- package/src/components/chat/types/entities/.blog.md +43 -0
- package/src/components/chat/types/entities/.case-study.md +26 -0
- package/src/components/chat/types/entities/.content-ref.md +41 -0
- package/src/components/chat/types/entities/.customer-interview.md +28 -0
- package/src/components/chat/types/entities/.data-room-doc.md +36 -0
- package/src/components/chat/types/entities/.github-activity.md +43 -0
- package/src/components/chat/types/entities/.hubspot-ticket.md +53 -0
- package/src/components/chat/types/entities/.index.md +42 -0
- package/src/components/chat/types/entities/.investor-update.md +45 -0
- package/src/components/chat/types/entities/.onboarding-guide.md +50 -0
- package/src/components/chat/types/entities/.program-types.md +57 -0
- package/src/components/chat/types/entities/.roadmap-item.md +58 -0
- package/src/components/chat/types/entities/.slack-message.md +35 -0
- package/src/components/chat/utils/.agent-status-message.md +45 -0
- package/src/components/chat/utils/.auto-continuation-directive.md +58 -0
- package/src/components/chat/utils/.chat-attachment-markdown.md +54 -0
- package/src/components/chat/utils/.chat-authed-fetch.md +25 -0
- package/src/components/chat/utils/.chat-nav-resolution.md +46 -0
- package/src/components/chat/utils/.chat-proxy-auth-storage.md +38 -0
- package/src/components/chat/utils/.chip-action-class.md +34 -0
- package/src/components/chat/utils/.chip-styles.md +46 -0
- package/src/components/chat/utils/.chunk-parser.md +38 -28
- package/src/components/chat/utils/.clickup-task-type-utils.md +48 -0
- package/src/components/chat/utils/.compact-card-classes.md +62 -0
- package/src/components/chat/utils/.decide-new-tab.md +51 -0
- package/src/components/chat/utils/.external-app-urls.md +29 -0
- package/src/components/chat/utils/.extract-incomplete-message-state.md +25 -29
- package/src/components/chat/utils/.flatten-assistant-content.md +34 -0
- package/src/components/chat/utils/.icon-registry.md +46 -0
- package/src/components/chat/utils/.index.md +37 -32
- package/src/components/chat/utils/.is-cross-origin-url.md +35 -0
- package/src/components/chat/utils/.message-segment-accumulator.md +25 -34
- package/src/components/chat/utils/.nav-anchor-props.md +44 -0
- package/src/components/chat/utils/.nav-click-handler.md +47 -0
- package/src/components/chat/utils/.onboarding-icons.md +28 -0
- package/src/components/chat/utils/.process-historical-messages.md +46 -35
- package/src/components/chat/utils/.scroll-anchor.md +40 -0
- package/src/components/chat/utils/.slash-dispatch-utils.md +44 -0
- package/src/components/chat/utils/.source-icons.md +35 -0
- package/src/components/chat/utils/.source-row-cta.md +54 -0
- package/src/components/chat/utils/.tool-call-helpers.md +42 -0
- package/src/components/contact/.contact-form.md +43 -0
- package/src/components/contact/.index.md +27 -0
- package/src/components/features/.array-entry-manager.md +36 -45
- package/src/components/features/.changelog-manager.md +47 -21
- package/src/components/features/.changelog-sections-manager.md +21 -26
- package/src/components/features/.command-box.md +31 -28
- package/src/components/features/.entity-summary-editor.md +46 -0
- package/src/components/features/.entity-video-section.md +51 -0
- package/src/components/features/.figma-prototype-viewer.md +48 -29
- package/src/components/features/.filters-dropdown.md +33 -46
- package/src/components/features/.highlight-config-section.md +42 -0
- package/src/components/features/.highlight-generation-section.md +46 -0
- package/src/components/features/.highlight-video-combined-section.md +47 -0
- package/src/components/features/.highlight-video-preview.md +44 -0
- package/src/components/features/.highlight-video-section.md +47 -0
- package/src/components/features/.index.md +40 -66
- package/src/components/features/.media-gallery-manager.md +48 -38
- package/src/components/features/.more-about-button.md +22 -19
- package/src/components/features/.og-editor-preview.md +40 -36
- package/src/components/features/.parallax-image-showcase.md +33 -26
- package/src/components/features/.paths-display.md +42 -43
- package/src/components/features/.platform-badge.md +37 -36
- package/src/components/features/.platform-filter.md +23 -16
- package/src/components/features/.policy-configuration-panel.md +48 -56
- package/src/components/features/.provider-button.md +33 -36
- package/src/components/features/.push-button-selector.md +40 -29
- package/src/components/features/.release-media-manager.md +46 -31
- package/src/components/features/.section-selector.md +26 -31
- package/src/components/features/.select-button.md +35 -25
- package/src/components/features/.seo-editor-preview.md +41 -44
- package/src/components/features/.social-links-manager.md +25 -19
- package/src/components/features/.start-with-openframe-button.md +37 -29
- package/src/components/features/.status-filter-component.md +36 -20
- package/src/components/features/.tags-selector.md +40 -24
- package/src/components/features/.transcribe-and-summarize-combined-section.md +45 -0
- package/src/components/features/.transcribe-summarize-section.md +48 -0
- package/src/components/features/.transcript-summary-editor.md +53 -0
- package/src/components/features/.video-bites-display.md +46 -0
- package/src/components/features/.video-clips-section.md +41 -0
- package/src/components/features/.video-ratio-tabs.md +56 -0
- package/src/components/features/.video-source-selector.md +60 -0
- package/src/components/features/.video.md +44 -0
- package/src/components/features/.waitlist-form.md +60 -0
- package/src/components/features/ai-enrich/.AIEnrichButton.md +30 -27
- package/src/components/features/ai-enrich/.AIEnrichSection.md +46 -42
- package/src/components/features/board/.board-column-header.md +38 -0
- package/src/components/features/board/.board-column.md +43 -0
- package/src/components/features/board/.board.md +51 -0
- package/src/components/features/board/.color-utils.md +26 -0
- package/src/components/features/board/.index.md +56 -0
- package/src/components/features/board/.ticket-card-skeleton.md +38 -0
- package/src/components/features/board/.ticket-card.md +47 -0
- package/src/components/features/board/.types.md +45 -0
- package/src/components/features/board/.use-board-collapse.md +34 -0
- package/src/components/features/notifications/.index.md +57 -0
- package/src/components/features/notifications/.notification-drawer.md +34 -0
- package/src/components/features/notifications/.notification-tile.md +39 -0
- package/src/components/features/notifications/.notifications-context.md +73 -0
- package/src/components/features/notifications/.types.md +45 -0
- package/src/components/icons/.about-icon.md +20 -28
- package/src/components/icons/.ai-robot-icon.md +15 -17
- package/src/components/icons/.bash-icon.md +16 -23
- package/src/components/icons/.buildings-icon.md +10 -24
- package/src/components/icons/.capterra-icon.md +30 -26
- package/src/components/icons/.carta-icon.md +29 -0
- package/src/components/icons/.clickup-icon.md +26 -0
- package/src/components/icons/.cmd-icon.md +15 -22
- package/src/components/icons/.coins-icon.md +17 -25
- package/src/components/icons/.community-hub-icon.md +19 -25
- package/src/components/icons/.community-icon.md +24 -21
- package/src/components/icons/.compare-icon.md +32 -19
- package/src/components/icons/.copy-icon.md +29 -15
- package/src/components/icons/.custom-external-link-icon.md +19 -17
- package/src/components/icons/.custom-fork-icon.md +32 -21
- package/src/components/icons/.custom-license-icon.md +29 -25
- package/src/components/icons/.custom-star-icon.md +20 -28
- package/src/components/icons/.custom-time-icon.md +21 -22
- package/src/components/icons/.cut-vendor-costs-icon.md +6 -19
- package/src/components/icons/.dashboard-icon.md +13 -18
- package/src/components/icons/.deno-icon.md +16 -23
- package/src/components/icons/.donut-icon.md +12 -23
- package/src/components/icons/.double-chevron-icon.md +28 -36
- package/src/components/icons/.elestio-logo.md +13 -23
- package/src/components/icons/.empty-vendor-icon.md +16 -18
- package/src/components/icons/.explore-categories-icon.md +18 -29
- package/src/components/icons/.eye-icon.md +16 -26
- package/src/components/icons/.facebook-icon.md +9 -20
- package/src/components/icons/.figma-icon.md +8 -17
- package/src/components/icons/.filter-icon.md +15 -17
- package/src/components/icons/.flamingo-logo.md +28 -27
- package/src/components/icons/.folder-shield-icon.md +28 -19
- package/src/components/icons/.g2-icon.md +22 -21
- package/src/components/icons/.getapp-icon.md +25 -21
- package/src/components/icons/.github-icon.md +13 -25
- package/src/components/icons/.globe-icon.md +14 -19
- package/src/components/icons/.google-gemini-icon.md +16 -19
- package/src/components/icons/.google-logo.md +15 -21
- package/src/components/icons/.grid-view-icon.md +30 -19
- package/src/components/icons/.hamburger-icon.md +22 -20
- package/src/components/icons/.hand-dollar-icon.md +24 -34
- package/src/components/icons/.hotel-icon.md +27 -21
- package/src/components/icons/.icon-utils.md +28 -29
- package/src/components/icons/.image-icon.md +15 -22
- package/src/components/icons/.index.md +25 -28
- package/src/components/icons/.info-circle-icon.md +29 -30
- package/src/components/icons/.instagram-icon.md +10 -24
- package/src/components/icons/.jump-in-icon.md +18 -18
- package/src/components/icons/.linux-icon.md +18 -18
- package/src/components/icons/.log-out-icon.md +15 -23
- package/src/components/icons/.logs-icon.md +14 -23
- package/src/components/icons/.margin-crisis-icon.md +21 -20
- package/src/components/icons/.menu-icon.md +18 -19
- package/src/components/icons/.miami-cyber-gang-logo-face-only.md +18 -21
- package/src/components/icons/.miami-cyber-gang-logo.md +22 -14
- package/src/components/icons/.mlg-logo.md +18 -16
- package/src/components/icons/.moon-icon.md +32 -22
- package/src/components/icons/.ms-icon.md +30 -19
- package/src/components/icons/.nushell-icon.md +7 -21
- package/src/components/icons/.open-source-icon.md +19 -23
- package/src/components/icons/.openai-icon.md +9 -24
- package/src/components/icons/.openframe-ai-icons.md +25 -26
- package/src/components/icons/.openframe-logo.md +28 -22
- package/src/components/icons/.openframe-text.md +24 -27
- package/src/components/icons/.openmsp-logo.md +26 -23
- package/src/components/icons/.pilot-icon.md +23 -0
- package/src/components/icons/.powershell-icon.md +17 -22
- package/src/components/icons/.python-icon.md +16 -23
- package/src/components/icons/.queries-icon.md +13 -21
- package/src/components/icons/.reddit-icon.md +28 -24
- package/src/components/icons/.remote-control-icon.md +13 -17
- package/src/components/icons/.script-icon.md +27 -19
- package/src/components/icons/.search-icon.md +21 -21
- package/src/components/icons/.send-icon.md +14 -16
- package/src/components/icons/.settings-icon.md +30 -19
- package/src/components/icons/.shape-circle-dash-icon.md +16 -21
- package/src/components/icons/.shell-icon.md +15 -19
- package/src/components/icons/.shield-check-icon.md +18 -31
- package/src/components/icons/.shield-key-icon.md +25 -25
- package/src/components/icons/.shield-lock-icon.md +8 -18
- package/src/components/icons/.slack-icon.md +28 -32
- package/src/components/icons/.sparkles-icon.md +18 -23
- package/src/components/icons/.sso-configuration-icon.md +29 -16
- package/src/components/icons/.sun-icon.md +20 -18
- package/src/components/icons/.table-view-icon.md +17 -19
- package/src/components/icons/.telegram-icon.md +8 -22
- package/src/components/icons/.thumbs-down-icon.md +10 -19
- package/src/components/icons/.thumbs-up-icon.md +8 -17
- package/src/components/icons/.tool-directory-icons.md +24 -28
- package/src/components/icons/.trustpilot-icon.md +25 -22
- package/src/components/icons/.user-icon.md +26 -28
- package/src/components/icons/.users-group-icon.md +28 -24
- package/src/components/icons/.vendor-showcase-icons.md +21 -29
- package/src/components/icons/.vendors-icon.md +18 -22
- package/src/components/icons/.whatsapp-icon.md +30 -14
- package/src/components/icons/.x-icon.md +18 -23
- package/src/components/icons/.x-logo.md +13 -38
- package/src/components/icons/.youtube-icon.md +8 -19
- package/src/components/icons/device-type-icons/.get-device-type-icon.md +26 -34
- package/src/components/icons-v2-generated/.index.md +52 -0
- package/src/components/icons-v2-generated/alphabet/.index.md +33 -0
- package/src/components/icons-v2-generated/arrows/.index.md +39 -0
- package/src/components/icons-v2-generated/audio-and-visual/.index.md +40 -0
- package/src/components/icons-v2-generated/brand-logos/.elestio-logo-icon.md +40 -0
- package/src/components/icons-v2-generated/brand-logos/.gemini-logo-icon.md +37 -0
- package/src/components/icons-v2-generated/brand-logos/.google-gemini-logo-icon.md +33 -0
- package/src/components/icons-v2-generated/brand-logos/.index.md +38 -0
- package/src/components/icons-v2-generated/brand-logos/.meshcentral-logo-grey-icon.md +35 -0
- package/src/components/icons-v2-generated/brand-logos/.meshcentral-logo-icon.md +36 -0
- package/src/components/icons-v2-generated/buildings/.index.md +48 -0
- package/src/components/icons-v2-generated/charts/.index.md +40 -0
- package/src/components/icons-v2-generated/clothes/.index.md +48 -0
- package/src/components/icons-v2-generated/coding/.index.md +42 -0
- package/src/components/icons-v2-generated/communication/.index.md +39 -0
- package/src/components/icons-v2-generated/date-and-time/.index.md +29 -0
- package/src/components/icons-v2-generated/design/.index.md +39 -0
- package/src/components/icons-v2-generated/devices/.index.md +38 -0
- package/src/components/icons-v2-generated/documents/.index.md +38 -0
- package/src/components/icons-v2-generated/finance/.index.md +34 -0
- package/src/components/icons-v2-generated/food-and-drinks/.index.md +34 -0
- package/src/components/icons-v2-generated/food-and-drinks/.leafy-green-icon.md +36 -0
- package/src/components/icons-v2-generated/food-and-drinks/.strawberry-icon.md +39 -0
- package/src/components/icons-v2-generated/health/.index.md +40 -0
- package/src/components/icons-v2-generated/household/.index.md +45 -0
- package/src/components/icons-v2-generated/interface/.index.md +36 -0
- package/src/components/icons-v2-generated/map-and-travel/.index.md +41 -0
- package/src/components/icons-v2-generated/media-playback/.index.md +51 -0
- package/src/components/icons-v2-generated/number/.index.md +41 -0
- package/src/components/icons-v2-generated/school/.index.md +37 -0
- package/src/components/icons-v2-generated/security/.fingerprint-icon.md +38 -0
- package/src/components/icons-v2-generated/security/.index.md +39 -0
- package/src/components/icons-v2-generated/shopping/.index.md +42 -0
- package/src/components/icons-v2-generated/signs-and-symbols/.index.md +32 -0
- package/src/components/icons-v2-generated/sort-and-filter/.index.md +35 -0
- package/src/components/icons-v2-generated/sport/.index.md +41 -0
- package/src/components/icons-v2-generated/text-editor/.index.md +44 -0
- package/src/components/icons-v2-generated/users/.index.md +45 -0
- package/src/components/icons-v2-generated/vehicles-and-delivery/.index.md +36 -0
- package/src/components/icons-v2-generated/weather-and-nature/.flower-sakura-icon.md +36 -0
- package/src/components/icons-v2-generated/weather-and-nature/.index.md +34 -0
- package/src/components/layout/.article-detail-layout.md +43 -0
- package/src/components/layout/.back-button.md +40 -0
- package/src/components/layout/.list-page-layout.md +35 -26
- package/src/components/layout/.page-container.md +27 -38
- package/src/components/layout/.page-layout.md +50 -0
- package/src/components/layout/.title-block.md +42 -0
- package/src/components/loading/.card-skeleton.md +38 -29
- package/src/components/loading/.device-card-skeleton.md +29 -25
- package/src/components/loading/.index.md +39 -46
- package/src/components/loading/.margin-report-skeleton.md +45 -34
- package/src/components/loading/.organization-card-skeleton.md +39 -44
- package/src/components/loading/.page-layout-skeleton.md +34 -45
- package/src/components/loading/.unified-skeleton.md +62 -36
- package/src/components/navigation/.app-header.md +40 -29
- package/src/components/navigation/.app-layout.md +25 -26
- package/src/components/navigation/.header-global-search.md +34 -37
- package/src/components/navigation/.header-organization-filter.md +23 -22
- package/src/components/navigation/.header.md +31 -35
- package/src/components/navigation/.mobile-burger-menu.md +39 -47
- package/src/components/navigation/.mobile-nav-panel.md +51 -32
- package/src/components/navigation/.navigation-sidebar-header.md +36 -0
- package/src/components/navigation/.navigation-sidebar-item.md +45 -0
- package/src/components/navigation/.navigation-sidebar-toggle.md +38 -0
- package/src/components/navigation/.navigation-sidebar.md +33 -34
- package/src/components/navigation/.sliding-sidebar.md +52 -41
- package/src/components/navigation/.sticky-section-nav.md +56 -48
- package/src/components/platform/.ScriptArguments.md +39 -25
- package/src/components/platform/.ScriptInfoSection.md +30 -26
- package/src/components/platform/.ShellTypeBadge.md +18 -13
- package/src/components/platform/.SoftwareInfo.md +23 -27
- package/src/components/platform/.SoftwareSourceBadge.md +28 -19
- package/src/components/platform/.ToolBadge.md +25 -26
- package/src/components/platform/ShellTypeBadge.tsx +2 -2
- package/src/components/providers/.theme-provider.md +52 -0
- package/src/components/shared/delivery/.delivery-lists.md +39 -0
- package/src/components/shared/delivery/.delivery-row.md +41 -0
- package/src/components/shared/delivery/.delivery-table.md +41 -0
- package/src/components/shared/delivery/.index.md +38 -0
- package/src/components/shared/dev-section/.dev-card-row.md +60 -0
- package/src/components/shared/dev-section/.dev-section-page.md +48 -0
- package/src/components/shared/dev-section/.dev-section-view.md +43 -0
- package/src/components/shared/dev-section/.index.md +38 -0
- package/src/components/shared/legal-document/.index.md +40 -0
- package/src/components/shared/legal-document/.legal-document-page.md +50 -0
- package/src/components/shared/legal-document/.use-legal-docs.md +42 -0
- package/src/components/shared/onboarding/.onboarding-step-card.md +32 -31
- package/src/components/shared/onboarding/.onboarding-walkthrough.md +39 -43
- package/src/components/shared/product-release/.index.md +28 -30
- package/src/components/shared/product-release/.product-release-card-skeleton.md +28 -28
- package/src/components/shared/product-release/.product-release-card.md +45 -27
- package/src/components/shared/product-release/.release-detail-page.md +23 -24
- package/src/components/shared/roadmap/.index.md +37 -0
- package/src/components/shared/roadmap/.roadmap-grid-skeleton.md +39 -0
- package/src/components/shared/roadmap/.roadmap-grid.md +66 -0
- package/src/components/shared/roadmap/.use-roadmap-voting.md +68 -0
- package/src/components/tickets/.help-center-card.md +51 -0
- package/src/components/tickets/.help-center-create-form.md +38 -0
- package/src/components/tickets/.help-center-list.md +40 -0
- package/src/components/tickets/.index.md +65 -0
- package/src/components/tickets/.ticket-center.md +51 -0
- package/src/components/tickets/.ticket-detail-drawer.md +48 -0
- package/src/components/tickets/.ticket-linked-delivery-card.md +36 -0
- package/src/components/tickets/.ticket-open-form.md +50 -0
- package/src/components/tickets/.ticket-row.md +30 -0
- package/src/components/tickets/.types.md +57 -0
- package/src/components/tickets/hooks/.use-ticket-actions.md +77 -0
- package/src/components/tickets/hooks/.use-ticket-engagements.md +42 -0
- package/src/components/tickets/hooks/.use-tickets-list.md +54 -0
- package/src/components/ui/.actions-menu.md +66 -41
- package/src/components/ui/.alert-dialog.md +29 -26
- package/src/components/ui/.allowed-domains-input.md +29 -21
- package/src/components/ui/.assignee-dropdown.md +45 -0
- package/src/components/ui/.autocomplete.md +47 -41
- package/src/components/ui/.benefit-card.md +51 -36
- package/src/components/ui/.brand-association-card.md +30 -27
- package/src/components/ui/.breadcrumb.md +17 -15
- package/src/components/ui/.checkbox-block.md +39 -35
- package/src/components/ui/.checkbox-with-description.md +23 -16
- package/src/components/ui/.checkbox.md +31 -23
- package/src/components/ui/.circular-progress.md +49 -19
- package/src/components/ui/.content-loader.md +32 -20
- package/src/components/ui/.cursor-pagination.md +41 -52
- package/src/components/ui/.dashboard-info-card.md +33 -26
- package/src/components/ui/.date-picker.md +27 -25
- package/src/components/ui/.device-card-compact.md +28 -29
- package/src/components/ui/.device-card.md +27 -27
- package/src/components/ui/.dialog.md +25 -16
- package/src/components/ui/.drawer.md +86 -0
- package/src/components/ui/.dropdown-button.md +45 -0
- package/src/components/ui/.entity-image.md +46 -0
- package/src/components/ui/.error-state.md +41 -28
- package/src/components/ui/.feature-card.md +35 -31
- package/src/components/ui/.feature-list.md +48 -0
- package/src/components/ui/.field-wrapper.md +47 -0
- package/src/components/ui/.file-upload.md +42 -0
- package/src/components/ui/.filter-checkbox-item.md +43 -0
- package/src/components/ui/.filter-list.md +57 -0
- package/src/components/ui/.filter-modal.md +59 -0
- package/src/components/ui/.floating-tooltip.md +43 -26
- package/src/components/ui/.hidden-tags-popup.md +49 -0
- package/src/components/ui/.hover-dropdown.md +54 -0
- package/src/components/ui/.image-gallery-modal.md +41 -34
- package/src/components/ui/.image-uploader.md +53 -0
- package/src/components/ui/.index.md +40 -34
- package/src/components/ui/.info-card.md +31 -31
- package/src/components/ui/.info-row.md +31 -27
- package/src/components/ui/.input-trigger.md +44 -0
- package/src/components/ui/.input.md +37 -31
- package/src/components/ui/.markdown-editor.md +57 -0
- package/src/components/ui/.modal-v2.md +51 -0
- package/src/components/ui/.modal.md +32 -31
- package/src/components/ui/.more-actions-menu.md +45 -38
- package/src/components/ui/.organization-card.md +31 -37
- package/src/components/ui/.page-actions.md +44 -54
- package/src/components/ui/.phone-input.md +54 -0
- package/src/components/ui/.progress-bar.md +35 -27
- package/src/components/ui/.radio-group.md +39 -27
- package/src/components/ui/.release-changelog-section.md +34 -34
- package/src/components/ui/.search-input.md +48 -0
- package/src/components/ui/.select.md +54 -34
- package/src/components/ui/.service-card.md +42 -40
- package/src/components/ui/.sheet.md +27 -18
- package/src/components/ui/.simple-markdown-renderer.md +29 -31
- package/src/components/ui/.sort-column-item.md +42 -0
- package/src/components/ui/.square-avatar.md +34 -24
- package/src/components/ui/.status-badge.md +26 -38
- package/src/components/ui/.switch.md +22 -35
- package/src/components/ui/.tab-navigation.md +56 -53
- package/src/components/ui/.tab-selector.md +40 -0
- package/src/components/ui/.tag-key-value-filter.md +56 -0
- package/src/components/ui/.tag-search-input.md +53 -0
- package/src/components/ui/.tag.md +49 -31
- package/src/components/ui/.tags-manager.md +60 -0
- package/src/components/ui/.textarea.md +44 -34
- package/src/components/ui/.ticket-attachments-list.md +45 -0
- package/src/components/ui/.ticket-detail-section.md +29 -0
- package/src/components/ui/.ticket-info-section.md +56 -0
- package/src/components/ui/.ticket-note-card.md +53 -0
- package/src/components/ui/.ticket-notes-section.md +54 -0
- package/src/components/ui/.ticket-status-tag.md +49 -0
- package/src/components/ui/.title-content-block.md +25 -26
- package/src/components/ui/.toaster.md +40 -28
- package/src/components/ui/.tooltip.md +22 -11
- package/src/components/ui/.truncate-text.md +39 -0
- package/src/components/ui/button/.button-styles.md +35 -0
- package/src/components/ui/button/.button.md +53 -0
- package/src/components/ui/button/.split-button.md +48 -0
- package/src/components/ui/data-table/.data-table-body.md +48 -0
- package/src/components/ui/data-table/.data-table-column-filter.md +45 -0
- package/src/components/ui/data-table/.data-table-cursor-footer.md +45 -0
- package/src/components/ui/data-table/.data-table-empty.md +43 -0
- package/src/components/ui/data-table/.data-table-header.md +55 -0
- package/src/components/ui/data-table/.data-table-infinite-footer.md +44 -0
- package/src/components/ui/data-table/.data-table-row-count.md +43 -0
- package/src/components/ui/data-table/.data-table-row.md +47 -0
- package/src/components/ui/data-table/.data-table-skeleton.md +42 -0
- package/src/components/ui/data-table/.data-table.md +47 -0
- package/src/components/ui/data-table/.index.md +55 -0
- package/src/components/ui/data-table/.types.md +54 -0
- package/src/components/ui/data-table/.use-data-table.md +45 -0
- package/src/components/ui/data-table/.utils.md +38 -0
- package/src/components/ui/file-manager/.file-manager-action-bar.md +39 -30
- package/src/components/ui/file-manager/.file-manager-breadcrumb.md +29 -27
- package/src/components/ui/file-manager/.file-manager-context-menu.md +38 -42
- package/src/components/ui/file-manager/.file-manager-empty.md +26 -39
- package/src/components/ui/file-manager/.file-manager-table-row.md +33 -41
- package/src/components/ui/file-manager/.file-manager.md +35 -31
- package/src/components/ui/query-report-table/.index.md +43 -0
- package/src/components/ui/query-report-table/.query-report-table-header.md +36 -0
- package/src/components/ui/query-report-table/.query-report-table-row.md +40 -0
- package/src/components/ui/query-report-table/.query-report-table-skeleton.md +44 -0
- package/src/components/ui/query-report-table/.query-report-table.md +47 -0
- package/src/components/ui/query-report-table/.types.md +41 -0
- package/src/components/ui/query-report-table/.utils.md +35 -0
- package/src/components/ui/table/.index.md +27 -48
- package/src/components/ui/table/.table-cell.md +18 -27
- package/src/components/ui/table/.table-column-filter-dropdown.md +40 -0
- package/src/components/ui/table/.table-description-cell.md +24 -14
- package/src/components/ui/table/.table-empty-state.md +21 -22
- package/src/components/ui/table/.table-header.md +25 -40
- package/src/components/ui/table/.table-row.md +22 -40
- package/src/components/ui/table/.table-skeleton.md +33 -26
- package/src/components/ui/table/.table-timestamp-cell.md +26 -16
- package/src/components/ui/table/.table.md +39 -59
- package/src/components/ui/table/.types.md +44 -36
- package/src/components/ui/table/.utils.md +18 -20
- package/src/contexts/.chat-runtime-context.md +54 -0
- package/src/contexts/.endpoints-runtime-context.md +58 -0
- package/src/contexts/.index.md +53 -0
- package/src/contexts/.use-outer-or-default.md +36 -0
- package/src/embed-shims/.index.md +45 -0
- package/src/embed-shims/.next-dynamic.md +43 -0
- package/src/embed-shims/.next-image.md +45 -0
- package/src/embed-shims/.next-link.md +59 -0
- package/src/embed-shims/.next-navigation.md +59 -0
- package/src/hooks/.index.md +34 -29
- package/src/hooks/.use-access-code-integration.md +49 -0
- package/src/hooks/.use-contact-submission.md +37 -26
- package/src/hooks/.use-copy-to-clipboard.md +42 -0
- package/src/hooks/.use-near-viewport.md +44 -0
- package/src/hooks/.use-og-placeholder.md +51 -0
- package/src/hooks/.use-toast.md +36 -35
- package/src/hooks/state/.use-api-params.md +29 -46
- package/src/hooks/state/.use-query-params.md +37 -33
- package/src/hooks/ui/.index.md +33 -32
- package/src/hooks/ui/.use-auto-limit-tags.md +54 -0
- package/src/hooks/ui/.use-horizontal-scrollbar.md +74 -0
- package/src/hooks/ui/.use-image-edge-color.md +42 -0
- package/src/hooks/ui/.use-media-query.md +33 -25
- package/src/hooks/ui/.use-search.md +51 -0
- package/src/nats/.nats.md +49 -28
- package/src/schemas/.contact-schema.md +45 -0
- package/src/stories/.AnnouncementBar.stories.md +45 -0
- package/src/stories/.AppLayout.stories.md +20 -21
- package/src/stories/.Autocomplete.stories.md +48 -34
- package/src/stories/.Board.stories.md +35 -0
- package/src/stories/.Button.stories.md +36 -33
- package/src/stories/.ChatTicketList.stories.md +33 -0
- package/src/stories/.CheckboxBlock.stories.md +40 -28
- package/src/stories/.ContentLoader.stories.md +47 -0
- package/src/stories/.DashboardInfoCard.stories.md +57 -0
- package/src/stories/.DataTable.stories.md +41 -0
- package/src/stories/.DatePicker.stories.md +66 -52
- package/src/stories/.DeviceCard.stories.md +41 -40
- package/src/stories/.DeviceCardCompact.stories.md +41 -0
- package/src/stories/.DotsLoaderIcon.stories.md +36 -0
- package/src/stories/.Drawer.stories.md +58 -0
- package/src/stories/.EmbeddableChat.stories.md +41 -0
- package/src/stories/.FileManager.stories.md +41 -0
- package/src/stories/.FileManagerActionBar.stories.md +38 -0
- package/src/stories/.FileUpload.stories.md +53 -0
- package/src/stories/.FilterList.stories.md +54 -0
- package/src/stories/.FilterModal.stories.md +72 -0
- package/src/stories/.FiltersDropdown.stories.md +57 -0
- package/src/stories/.Header.stories.md +48 -0
- package/src/stories/.ImageUploader.stories.md +49 -0
- package/src/stories/.InfoCard.stories.md +54 -0
- package/src/stories/.Input.stories.md +48 -30
- package/src/stories/.ListPageLayout.stories.md +56 -43
- package/src/stories/.MingoOnboardingCard.stories.md +42 -0
- package/src/stories/.MingoOnboardingCardSkeleton.stories.md +35 -0
- package/src/stories/.Modal.stories.md +40 -31
- package/src/stories/.NotificationDrawer.stories.md +55 -0
- package/src/stories/.OnboardingStepCard.stories.md +41 -0
- package/src/stories/.OrganizationCard.stories.md +61 -0
- package/src/stories/.PageActions.stories.md +52 -49
- package/src/stories/.PageContainer.stories.md +41 -35
- package/src/stories/.PageLayout.stories.md +60 -0
- package/src/stories/.ParallaxImageShowcase.stories.md +49 -0
- package/src/stories/.PhoneInput.stories.md +53 -0
- package/src/stories/.QueryReportTable.stories.md +44 -0
- package/src/stories/.RadioGroup.stories.md +46 -0
- package/src/stories/.RadioGroupBlock.stories.md +45 -0
- package/src/stories/.Select.stories.md +29 -15
- package/src/stories/.SlashCommandSuggestions.stories.md +41 -0
- package/src/stories/.SplitButton.stories.md +62 -0
- package/src/stories/.TabNavigation.stories.md +47 -38
- package/src/stories/.TabSelector.stories.md +65 -0
- package/src/stories/.Table.stories.md +38 -46
- package/src/stories/.TableColumnFilterDropdown.stories.md +46 -0
- package/src/stories/.Tag.stories.md +43 -32
- package/src/stories/.TagKeyValueFilter.stories.md +44 -0
- package/src/stories/.TagSearchInput.stories.md +61 -0
- package/src/stories/.Textarea.stories.md +49 -26
- package/src/stories/.Theme.stories.md +41 -0
- package/src/stories/.TicketAttachmentsList.stories.md +39 -0
- package/src/stories/.TicketDescriptionViewer.stories.md +39 -0
- package/src/stories/.TicketInfoSection.stories.md +40 -0
- package/src/stories/.TicketKnowledgeBaseList.stories.md +36 -0
- package/src/stories/.TicketNotesSection.stories.md +50 -0
- package/src/stories/.Toaster.stories.md +40 -0
- package/src/stories/.ToolExecutionDisplay.stories.md +41 -0
- package/src/stories/.Tooltip.stories.md +41 -0
- package/src/stories/.UserSummary.stories.md +41 -0
- package/src/stories/.WaitlistForm.stories.md +42 -0
- package/src/stories/BlogCard.stories.tsx +61 -0
- package/src/stories/CampaignCardAdmin.stories.tsx +52 -0
- package/src/stories/CaseStudyCard.stories.tsx +42 -0
- package/src/stories/ChatContainer.stories.tsx +186 -0
- package/src/stories/ChatInlineVideoPill.stories.tsx +63 -0
- package/src/stories/CustomerInterviewCard.stories.tsx +42 -0
- package/src/stories/DataRoomDocCard.stories.tsx +52 -0
- package/src/stories/GenericEntityCard.stories.tsx +66 -0
- package/src/stories/GitHubActivityCard.stories.tsx +61 -0
- package/src/stories/HubspotTicketCard.stories.tsx +98 -0
- package/src/stories/InvestorUpdateCard.stories.tsx +42 -0
- package/src/stories/OnboardingGuideCard.stories.tsx +52 -0
- package/src/stories/ProductReleaseCard.stories.tsx +61 -0
- package/src/stories/ProgramCard.stories.tsx +79 -0
- package/src/stories/RoadmapCard.stories.tsx +75 -0
- package/src/stories/SlackMessageCard.stories.tsx +41 -0
- package/src/stories/__fixtures__/chat-cards.ts +604 -0
- package/src/types/.blog.md +53 -29
- package/src/types/.case-study.md +44 -27
- package/src/types/.customer-interview.md +66 -44
- package/src/types/.delivery.md +40 -0
- package/src/types/.employee.md +24 -30
- package/src/types/.index.md +33 -47
- package/src/types/.marketing.md +49 -44
- package/src/types/.navigation.md +33 -25
- package/src/types/.os.types.md +32 -27
- package/src/types/.platform.md +31 -28
- package/src/types/.product-release.md +65 -38
- package/src/types/.supabase.md +37 -29
- package/src/types/.team.md +41 -33
- package/src/types/.video-processing.md +54 -0
- package/src/types/.waitlist.md +40 -36
- package/src/utils/.access-code-client.md +37 -36
- package/src/utils/.cn.md +31 -23
- package/src/utils/.color-analysis.md +35 -0
- package/src/utils/.country-phone-utils.md +39 -0
- package/src/utils/.date-formatters.md +19 -18
- package/src/utils/.embed-authed-fetch.md +39 -0
- package/src/utils/.embed-proxy-auth-storage.md +38 -0
- package/src/utils/.fetch-priority.md +41 -0
- package/src/utils/.format.md +74 -25
- package/src/utils/.generic-domain-utils.md +42 -0
- package/src/utils/.image-proxy.md +59 -23
- package/src/utils/.index.md +42 -49
- package/src/utils/.local-storage-adapter.md +50 -0
- package/src/utils/.ods-color-utils.md +55 -38
- package/src/utils/.platform-config.md +45 -25
- package/src/utils/.scroll-into-view.md +40 -0
- package/src/utils/.source-icons.md +53 -0
- package/src/utils/.sse-decision-frame.md +46 -0
- package/src/utils/dev-sections/.index.md +34 -0
- package/src/utils/dev-sections/.openframe-dev-sections.md +49 -0
- package/dist/chunk-ZDF6F7ED.cjs.map +0 -1
- package/dist/chunk-ZTJVRSN5.js.map +0 -1
- package/src/components/.card.md +0 -42
- package/src/components/.contact-button.md +0 -30
- package/src/components/.drawer.md +0 -46
- package/src/components/.fixed-layout-container.md +0 -47
- package/src/components/.footer-waitlist-card.md +0 -29
- package/src/components/.join-waitlist-cta.md +0 -29
- package/src/components/.sheet.md +0 -47
- package/src/components/.sliding-panel.md +0 -48
- package/src/components/.tooltip.md +0 -48
- package/src/components/.use-mobile.md +0 -42
- package/src/components/.vendor-compact-card.md +0 -66
- package/src/components/.x-button.md +0 -42
- package/src/components/features/.github-repo-button.md +0 -40
- package/src/components/features/.organization-icon.md +0 -47
- package/src/components/features/.organization-selector.md +0 -45
- package/src/components/icons/.fleet-icon.md +0 -39
- package/src/components/icons/.meshcentral-icon.md +0 -35
- package/src/components/icons/.refresh-icon.md +0 -34
- package/src/components/icons/.tactical-icon.md +0 -35
- package/src/components/ui/.button.md +0 -69
- package/src/components/ui/.log-table-row.md +0 -47
- package/src/components/ui/.selectable-device-card.md +0 -46
- package/src/hooks/.api-hooks-stub.md +0 -45
- package/src/hooks/api/.use-product-releases.md +0 -53
- package/src/stories/.OrganizationSelector.stories.md +0 -42
- package/src/stories/.SelectableDeviceCard.stories.md +0 -30
- package/src/utils/.lite-youtube-embed-stub.md +0 -37
- package/src/utils/.lite-youtube-embed.md +0 -33
- /package/dist/{chunk-IK2X5YJU.js.map → chunk-7PCP7YQR.js.map} +0 -0
- /package/dist/{chunk-3JWIJJ44.js.map → chunk-R6MLPU4A.js.map} +0 -0
package/src/types/.waitlist.md
CHANGED
|
@@ -1,46 +1,50 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: f7e2eb6ca28207daca5b3bc5bf7ad178 -->
|
|
2
|
+
Defines TypeScript interfaces for managing waitlist entries in the Flamingo/OpenFrame platform, covering creation, retrieval, and API response shapes.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
| Interface | Description |
|
|
7
|
+
|-----------|-------------|
|
|
8
|
+
| `WaitlistEntry` | Full waitlist record as returned from the database, including tracking, HubSpot integration metadata, enriched data, and cohort membership |
|
|
9
|
+
| `CreateWaitlistEntry` | Payload shape for submitting a new waitlist entry (subset of `WaitlistEntry`, no server-generated fields) |
|
|
10
|
+
| `WaitlistResponse` | Standard API response wrapper with `success` flag, optional `data`, and optional `error` |
|
|
9
11
|
|
|
10
12
|
## Usage Example
|
|
11
13
|
|
|
12
14
|
```typescript
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
import type {
|
|
16
|
+
WaitlistEntry,
|
|
17
|
+
CreateWaitlistEntry,
|
|
18
|
+
WaitlistResponse,
|
|
19
|
+
} from './waitlist';
|
|
20
|
+
|
|
21
|
+
// Submitting a new waitlist signup
|
|
22
|
+
const payload: CreateWaitlistEntry = {
|
|
23
|
+
email: 'dev@example.com',
|
|
24
|
+
name: 'Jane Dev',
|
|
25
|
+
company: 'Acme MSP',
|
|
26
|
+
platform_id: 'openframe',
|
|
27
|
+
referral_source: 'organic',
|
|
28
|
+
utm_source: 'google',
|
|
29
|
+
utm_medium: 'cpc',
|
|
30
|
+
utm_campaign: 'launch-2025',
|
|
24
31
|
};
|
|
25
32
|
|
|
26
|
-
// API response
|
|
27
|
-
const response: WaitlistResponse =
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
access_code: "BETA2024",
|
|
40
|
-
access_code_used: false,
|
|
41
|
-
membership_status: "active",
|
|
42
|
-
// ...other cohort fields
|
|
43
|
-
}
|
|
33
|
+
// Handling the API response
|
|
34
|
+
const response: WaitlistResponse = await submitWaitlist(payload);
|
|
35
|
+
|
|
36
|
+
if (response.success && response.data) {
|
|
37
|
+
const entry: WaitlistEntry = response.data;
|
|
38
|
+
|
|
39
|
+
// Access HubSpot sync status
|
|
40
|
+
console.log(entry.hubspot_sync_status); // 'success' | 'error' | 'missing' | null
|
|
41
|
+
|
|
42
|
+
// Access enriched cohort info (server-side populated)
|
|
43
|
+
if (entry.cohort) {
|
|
44
|
+
console.log(entry.cohort.cohort_name);
|
|
45
|
+
console.log(entry.cohort.access_code_used);
|
|
44
46
|
}
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
> **Note:** `WaitlistEntry.cohort_memberships` may contain multiple records from the join, but business rules enforce a maximum of one active cohort per entry. Use the server-populated `cohort` shorthand field for clean access.
|
|
@@ -1,45 +1,46 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 1d5aefc0169fc550dd115556a5cdbf7e -->
|
|
2
|
+
Pure standalone utility functions for validating and consuming access codes via HTTP, designed to be React-free and SSR-safe by requiring explicit endpoint URLs rather than reading from context.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
6
|
+
### `AccessCodeEndpoints` (interface)
|
|
7
|
+
Defines the two endpoint URLs required by all client functions:
|
|
8
|
+
- `validateUrl` — POST endpoint for code validation
|
|
9
|
+
- `consumeUrl` — POST endpoint for code consumption
|
|
10
|
+
|
|
11
|
+
### `validateAccessCode(email, code, endpoints)`
|
|
12
|
+
POSTs credentials to `validateUrl` and returns an `AccessCodeValidationResponse`. On HTTP or network errors, returns `{ valid: false, message }` rather than throwing.
|
|
13
|
+
|
|
14
|
+
### `consumeAccessCode(email, code, endpoints)`
|
|
15
|
+
POSTs credentials to `consumeUrl` to mark a code as used. Should only be called **after** successful registration. On failure returns `{ success: false, consumed: false, message }`.
|
|
16
|
+
|
|
17
|
+
### `validateAndConsumeAccessCode(email, code, endpoints)`
|
|
18
|
+
Convenience wrapper that sequentially calls validate → consume. Short-circuits and returns the validation failure immediately if the code is invalid. Returns a merged `AccessCodeValidationResponse & { consumed? }`.
|
|
10
19
|
|
|
11
20
|
## Usage Example
|
|
12
21
|
|
|
13
22
|
```typescript
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
if (validation.valid) {
|
|
19
|
-
console.log(`Welcome to ${validation.cohort_name}!`);
|
|
20
|
-
|
|
21
|
-
// After successful registration, consume the code
|
|
22
|
-
await consumeAccessCode('user@example.com', 'ABC123XY');
|
|
23
|
-
}
|
|
23
|
+
import {
|
|
24
|
+
validateAndConsumeAccessCode,
|
|
25
|
+
AccessCodeEndpoints
|
|
26
|
+
} from './access-code-client';
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
{/* form fields */}
|
|
41
|
-
<button disabled={isValidating}>Register</button>
|
|
42
|
-
</form>
|
|
43
|
-
);
|
|
28
|
+
const endpoints: AccessCodeEndpoints = {
|
|
29
|
+
validateUrl: '/api/access-codes/validate',
|
|
30
|
+
consumeUrl: '/api/access-codes/consume',
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const result = await validateAndConsumeAccessCode(
|
|
34
|
+
'user@example.com',
|
|
35
|
+
'ABC123XY',
|
|
36
|
+
endpoints,
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
if (result.valid && result.consumed) {
|
|
40
|
+
console.log(`Welcome to ${result.cohort_name}!`);
|
|
41
|
+
} else {
|
|
42
|
+
console.error(result.message);
|
|
44
43
|
}
|
|
45
|
-
```
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
> **Note:** Endpoint binding from `EndpointsRuntimeContext` is handled by the React-side hook `hooks/use-access-code-integration.ts` (`useAccessCodeIntegration`). Keeping this file React-free allows it to be safely bundled in the server-side `utils/index` tsup build without crashing SSR.
|
package/src/utils/.cn.md
CHANGED
|
@@ -1,36 +1,44 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: c1693a304ddf9b29bde0ca02b6f6b8ea -->
|
|
2
|
+
Utility module providing class name merging with extended Tailwind support, and platform URL resolution helpers for multi-tenant Flamingo/OpenFrame deployments.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
- **`getAllPlatformBaseDomains()`** - Extracts all unique base domains for cross-platform cookie sharing
|
|
13
|
-
- **`getPlatformProductionUrl(platform)`** - Maps platform identifiers to their production URLs
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `cn` | Function | Merges class names using `clsx` + `tailwind-merge`, extended with custom ODS typography classes (`text-h1`–`text-h6`) |
|
|
9
|
+
| `getPlatformProductionUrl` | Function | Returns the production URL for a named platform, with `NEXT_PUBLIC_*` env var override support |
|
|
10
|
+
| `getAllPlatformBaseDomains` | Function | Extracts all unique base domains across platforms; handles localhost, Vercel preview, and production cases (useful for cross-domain cookie scope) |
|
|
11
|
+
| `getBaseUrl` | Function | Resolves the current app's base URL using a priority chain: env override → platform URL → Vercel domain → production fallback → `localhost:3000` |
|
|
14
12
|
|
|
15
13
|
## Usage Example
|
|
16
14
|
|
|
17
15
|
```typescript
|
|
18
|
-
import { cn,
|
|
16
|
+
import { cn, getBaseUrl, getPlatformProductionUrl, getAllPlatformBaseDomains } from '@/lib/cn'
|
|
19
17
|
|
|
20
|
-
// Merge
|
|
21
|
-
const
|
|
18
|
+
// Merge Tailwind classes (including custom ODS typography)
|
|
19
|
+
const className = cn('text-h1 font-bold', isActive && 'text-yellow-400')
|
|
22
20
|
|
|
23
|
-
//
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
const price = formatPrice(99.99, 'USD') // "$99.99"
|
|
21
|
+
// Resolve current app base URL
|
|
22
|
+
const apiBase = getBaseUrl() // http://localhost:3000 (dev)
|
|
23
|
+
// https://www.openmsp.ai (prod fallback)
|
|
27
24
|
|
|
28
|
-
//
|
|
29
|
-
const flamingoUrl = getBaseUrl('flamingo')
|
|
30
|
-
const
|
|
25
|
+
// Resolve a specific platform URL (respects NEXT_PUBLIC_* overrides)
|
|
26
|
+
const flamingoUrl = getBaseUrl('flamingo') // https://www.flamingo.run
|
|
27
|
+
const openframeUrl = getPlatformProductionUrl('openframe') // https://openframe.ai
|
|
31
28
|
|
|
32
|
-
// Get all domains for cookie
|
|
33
|
-
const domains = getAllPlatformBaseDomains()
|
|
29
|
+
// Get all cookie-scoped base domains (e.g. for document.cookie domain=)
|
|
30
|
+
const domains = getAllPlatformBaseDomains()
|
|
31
|
+
// Production: ['.flamingo.run', 'flamingo.run', '.openmsp.ai', 'openmsp.ai', ...]
|
|
32
|
+
// Vercel preview: ['.vercel.app', 'vercel.app']
|
|
33
|
+
// Localhost: []
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
## Environment Variables
|
|
37
|
+
|
|
38
|
+
| Variable | Platform | Default |
|
|
39
|
+
|----------|----------|---------|
|
|
40
|
+
| `NEXT_PUBLIC_FLAMINGO_URL` | `flamingo`, `universal` | `https://www.flamingo.run` |
|
|
41
|
+
| `NEXT_PUBLIC_OPENMSP_URL` | `openmsp` | `https://www.openmsp.ai` |
|
|
42
|
+
| `NEXT_PUBLIC_OPENFRAME_URL` | `openframe` | `https://openframe.ai` |
|
|
43
|
+
| `NEXT_PUBLIC_MARKETING_HUB_URL` | `marketing-hub` | `https://marketing-hub.flamingo.so` |
|
|
44
|
+
| `NEXT_PUBLIC_DEV_URL` | all (dev only) | `http://localhost:3000` |
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<!-- source-hash: 320c7ab088203622f31bd929824e3767 -->
|
|
2
|
+
Provides color analysis utilities for extracting dominant colors from images and selecting accessible contrast colors from the Flamingo design palette, primarily used for dynamic badge and card styling.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
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 |
|
|
16
|
+
|
|
17
|
+
## Usage Example
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { analyzeImageColor, extractImageEdgeColorAsync, getContrastRatio, hexToRgb } from './color-analysis';
|
|
21
|
+
|
|
22
|
+
// Get the best badge text color for a logo image
|
|
23
|
+
const badgeColor = await analyzeImageColor('https://example.com/logo.png');
|
|
24
|
+
console.log(badgeColor.hex); // '#161616'
|
|
25
|
+
|
|
26
|
+
// Extract edge color for email/card background fill
|
|
27
|
+
const bgColor = await extractImageEdgeColorAsync('https://example.com/hero.jpg');
|
|
28
|
+
console.log(bgColor); // '#1a2b3c'
|
|
29
|
+
|
|
30
|
+
// Manual contrast check between two hex colors
|
|
31
|
+
const ratio = getContrastRatio(hexToRgb('#FFC008'), hexToRgb('#161616'));
|
|
32
|
+
console.log(ratio); // ~11.5 (passes WCAG AA and AAA)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
> **Note:** `extractDominantColor` and `analyzeImageColor` are client-side only and require `document`/`canvas` APIs. `extractImageEdgeColorAsync` also guards against SSR with a `typeof window` check, resolving to `#000000` on the server.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<!-- source-hash: 2a8a74c3b98ef6150c8b43768d8c2035 -->
|
|
2
|
+
Utility module for working with international phone numbers and country data, combining `libphonenumber-js` metadata with the `Intl.DisplayNames` API to provide country selection, validation, and formatting helpers.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `CountryPhoneData` | Interface | Shape of a country entry: ISO code, display name, dial code, and flag emoji |
|
|
9
|
+
| `getCountryPhoneData()` | Function | Returns all countries split into `priority` (US, CA, GB, AU) and `others` (alphabetically sorted), lazily cached |
|
|
10
|
+
| `getCountryByCode(code)` | Function | Looks up a single `CountryPhoneData` entry by ISO 3166-1 alpha-2 code |
|
|
11
|
+
| `validatePhoneNumber(phone, code)` | Function | Returns `true` if the number is valid for the given country (empty strings pass as optional) |
|
|
12
|
+
| `formatPhoneE164(phone, code)` | Function | Formats a number to E.164 (e.g., `+14155552671`), falling back to digit-only concatenation on parse failure |
|
|
13
|
+
|
|
14
|
+
## Usage Example
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import {
|
|
18
|
+
getCountryPhoneData,
|
|
19
|
+
getCountryByCode,
|
|
20
|
+
validatePhoneNumber,
|
|
21
|
+
formatPhoneE164,
|
|
22
|
+
} from './country-phone-utils'
|
|
23
|
+
|
|
24
|
+
// Populate a country selector
|
|
25
|
+
const { priority, others } = getCountryPhoneData()
|
|
26
|
+
// priority → [{ code: 'US', name: 'United States', dialCode: '+1', flag: '🇺🇸' }, ...]
|
|
27
|
+
|
|
28
|
+
// Look up a specific country
|
|
29
|
+
const canada = getCountryByCode('CA')
|
|
30
|
+
// → { code: 'CA', name: 'Canada', dialCode: '+1', flag: '🇨🇦' }
|
|
31
|
+
|
|
32
|
+
// Validate user input
|
|
33
|
+
const isValid = validatePhoneNumber('(415) 555-2671', 'US') // true
|
|
34
|
+
|
|
35
|
+
// Normalize to E.164 before storing/sending
|
|
36
|
+
const e164 = formatPhoneE164('(415) 555-2671', 'US') // '+14155552671'
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
> **Note:** `getCountryPhoneData()` builds and caches the full country list on first call. Priority countries (US, CA, GB, AU) are always surfaced at the top of the list, making them convenient as default options in phone-number input components.
|
|
@@ -1,27 +1,28 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: bdbe45fc465896066574c96cffcccb6f -->
|
|
2
|
+
Timezone-safe date formatting utilities providing a single source of truth for consistent date display across the application. All functions parse ISO date strings via string splitting to avoid `new Date()` UTC-to-local timezone shifts.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
| Export | Output Example | Use Case |
|
|
7
|
+
|--------|---------------|----------|
|
|
8
|
+
| `formatReleaseDate` | `"November 11, 2025"` | Release dates, long-form display |
|
|
9
|
+
| `formatDateShort` | `"Jan 5, 2025"` | Admin cards (waitlist, publication, media, investor, campaign) |
|
|
10
|
+
| `formatDateSlashUTC` | `"11/11/2025"` | Product release & customer interview cards |
|
|
11
|
+
|
|
12
|
+
**Internal helper:** `splitYmd(dateString)` — splits ISO date/datetime strings into `[year, month, day]` without constructing a `Date` object, preventing the off-by-one day bug west of UTC.
|
|
7
13
|
|
|
8
14
|
## Usage Example
|
|
9
15
|
|
|
10
16
|
```typescript
|
|
11
|
-
import { formatReleaseDate } from './date-formatters'
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
<div>
|
|
21
|
-
<h3>{release.name}</h3>
|
|
22
|
-
<p>Released: {formatReleaseDate(release.date)}</p>
|
|
23
|
-
</div>
|
|
24
|
-
);
|
|
17
|
+
import { formatReleaseDate, formatDateShort, formatDateSlashUTC } from './date-formatters'
|
|
18
|
+
|
|
19
|
+
// ISO date-only string
|
|
20
|
+
formatReleaseDate('2025-11-11') // → "November 11, 2025"
|
|
21
|
+
formatDateShort('2025-01-05') // → "Jan 5, 2025"
|
|
22
|
+
formatDateSlashUTC('2025-11-11') // → "11/11/2025"
|
|
23
|
+
|
|
24
|
+
// ISO datetime strings also work (time component is ignored)
|
|
25
|
+
formatDateShort('2025-06-20T14:30:00Z') // → "Jun 20, 2025"
|
|
25
26
|
```
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
> **Why not `new Date()`?** Passing `"2025-11-11"` to `new Date()` creates a UTC midnight timestamp. In timezones west of UTC, `.getMonth()` / `.getDate()` resolve to the *previous* day. String splitting eliminates this class of bug entirely.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<!-- source-hash: 585108e1683f75548fc4f177781fa0c8 -->
|
|
2
|
+
A client-side `fetch` wrapper for embedded surfaces (chat, ticket center, widgets) that automatically attaches bearer-act-as proxy authentication headers from `sessionStorage` while enforcing same-origin security.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `embedAuthedFetch(url, init?)`
|
|
7
|
+
Drop-in replacement for `fetch()` that:
|
|
8
|
+
- Normalizes `RequestInit.headers` (handles `Headers` instance, tuple arrays, or plain objects) into `Record<string, string>`
|
|
9
|
+
- Delegates to `applyProxyAuth` to merge `Authorization` and `X-Chat-Act-As` headers — **proxy credentials always win** over caller-supplied headers
|
|
10
|
+
- Defaults `Content-Type: application/json` when no headers are provided
|
|
11
|
+
- Forces `credentials: 'same-origin'` to ensure Supabase auth cookies are included alongside bearer tokens
|
|
12
|
+
|
|
13
|
+
### `assertSameOrigin(url)` *(internal)*
|
|
14
|
+
Defense-in-depth guard that:
|
|
15
|
+
- 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
|
|
16
|
+
- Blocks non-`http(s):` schemes explicitly (`javascript:`, `data:`, `blob:`, etc.)
|
|
17
|
+
- Throws on cross-origin destinations before any bearer token leaves the page
|
|
18
|
+
- Skips silently during SSR (`typeof window === 'undefined'`)
|
|
19
|
+
|
|
20
|
+
## Usage Example
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// JSON POST to chat API — proxy headers attached automatically
|
|
24
|
+
const res = await embedAuthedFetch('/api/chat/messages', {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
body: JSON.stringify({ message: 'Hello' }),
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
// GET with explicit empty headers — skips Content-Type default
|
|
30
|
+
const upload = await embedAuthedFetch('/api/storage/generate-upload-url', {
|
|
31
|
+
method: 'GET',
|
|
32
|
+
headers: {},
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
// Vanilla fetch — use for routes that don't need bearer-act-as
|
|
36
|
+
const profile = await fetch('/api/profile/me', { credentials: 'same-origin' })
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
> Routes outside the `/api/chat/*`, `/api/docs/chat/*`, or `/api/storage/generate-upload-url` surfaces should use vanilla `fetch` — this wrapper is scoped to embedded auth contexts only.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<!-- source-hash: 4f6996d4ad0ba284b64e13807891eb62 -->
|
|
2
|
+
Manages client-side persistence of embed-surface proxy credentials (`CHAT_PROXY_SECRET` + impersonation email) in `localStorage`, enabling embedded surfaces (chat widget, ticket center, etc.) to authenticate as a proxied customer across sessions.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `EmbedProxyAuth` | Interface | Shape of persisted credentials: `secret`, `email`, and optional identity fields (`firstName`, `lastName`, `avatarUrl`) |
|
|
9
|
+
| `getEmbedProxyAuth()` | Function | Returns full normalized credentials or `null` (falls back to cookie auth) |
|
|
10
|
+
| `getPersistedProxyEmail()` | Function | Returns only the last saved email, used to pre-fill the creds bar on mount |
|
|
11
|
+
| `setEmbedProxyAuth()` | Function | Persists credentials with normalization; trims/lowercases email, strips whitespace-only optional fields |
|
|
12
|
+
| `clearEmbedProxyAuth()` | Function | Removes credentials from `localStorage` |
|
|
13
|
+
| `applyProxyAuth()` | Function | Attaches `Authorization: Bearer` + `X-Chat-Act-As` (and optional identity headers) to any fetch call |
|
|
14
|
+
|
|
15
|
+
Storage key `<appType>.chat.proxy-auth.v1` is intentionally frozen — renaming it would silently log out all existing admin sessions.
|
|
16
|
+
|
|
17
|
+
## Usage Example
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { setEmbedProxyAuth, applyProxyAuth, clearEmbedProxyAuth } from './embed-proxy-auth-storage'
|
|
21
|
+
|
|
22
|
+
// Save credentials (e.g. from the /debug creds bar)
|
|
23
|
+
setEmbedProxyAuth({
|
|
24
|
+
secret: 'my-proxy-secret',
|
|
25
|
+
email: 'customer@example.com',
|
|
26
|
+
firstName: 'Jane',
|
|
27
|
+
lastName: 'Doe',
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
// Apply to a fetch call — no-op when no creds are stored
|
|
31
|
+
const { url, headers } = applyProxyAuth('/api/chat/stream')
|
|
32
|
+
const response = await fetch(url, { method: 'POST', headers })
|
|
33
|
+
|
|
34
|
+
// Admin logout / "Clear" button
|
|
35
|
+
clearEmbedProxyAuth()
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
> **Security note:** Credentials persist in `localStorage` (survives tab close and browser restart). This is intentional — re-pasting on every tab was rejected as a dev-experience tradeoff. The `/debug` entry point is admin-gated, and all headers are server-validated against `CHAT_PROXY_SECRET`.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<!-- source-hash: 786a6c83f7b7be019293590b300def02 -->
|
|
2
|
+
Provides a React-version-aware helper that returns the correct prop shape for the HTML `fetchpriority` attribute, avoiding console warnings across React 18 and React 19+.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `FetchPriorityValue` | `type` | Union of valid HTML fetch-priority strings: `'high' \| 'low' \| 'auto'` |
|
|
9
|
+
| `fetchPriorityProp()` | `function` | Returns `{ fetchpriority: value }` (React 18) or `{ fetchPriority: value }` (React 19+) |
|
|
10
|
+
| `REACT_MAJOR` | internal `const` | Major version parsed from `React.version` at module load |
|
|
11
|
+
| `USE_CAMEL_CASE_FETCH_PRIORITY` | internal `const` | `true` when React major ≥ 19 |
|
|
12
|
+
|
|
13
|
+
## Behavior
|
|
14
|
+
|
|
15
|
+
- **`undefined`** → resolves to `'auto'` (DOM default), safe to spread without null-checking at each callsite
|
|
16
|
+
- **`true`** → `'high'` (intended for LCP candidates)
|
|
17
|
+
- **`false`** → `'low'`
|
|
18
|
+
- **`'high' | 'low' | 'auto'`** → passed through as-is
|
|
19
|
+
|
|
20
|
+
## Usage Example
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { fetchPriorityProp } from './fetch-priority';
|
|
24
|
+
|
|
25
|
+
// Boolean shorthand — LCP hero image
|
|
26
|
+
<img
|
|
27
|
+
src="/hero.jpg"
|
|
28
|
+
alt="Hero"
|
|
29
|
+
{...fetchPriorityProp(true)} // React 18: { fetchpriority: "high" }
|
|
30
|
+
// React 19: { fetchPriority: "high" }
|
|
31
|
+
/>
|
|
32
|
+
|
|
33
|
+
// Explicit value
|
|
34
|
+
<iframe
|
|
35
|
+
src="/embed"
|
|
36
|
+
{...fetchPriorityProp('low')}
|
|
37
|
+
/>
|
|
38
|
+
|
|
39
|
+
// Optional prop — undefined safely becomes 'auto'
|
|
40
|
+
<img src={src} {...fetchPriorityProp(maybeHigh)} />
|
|
41
|
+
```
|
package/src/utils/.format.md
CHANGED
|
@@ -1,38 +1,87 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: dbfaad05e48db5fac78d6f613b9afd1e -->
|
|
2
|
+
Utility functions for formatting data across dates, numbers, currencies, bytes, durations, and display strings. Serves as the single source of truth for all presentation-layer formatting in the Flamingo/OpenFrame stack.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
| Function | Description |
|
|
7
|
+
|---|---|
|
|
8
|
+
| `formatDate` | Locale-aware date formatting with `Intl.DateTimeFormatOptions` support |
|
|
9
|
+
| `formatDateUTC` | UTC-anchored date formatter with fallback; handles ISO strings, epoch ms, and numeric strings |
|
|
10
|
+
| `formatLegalDate` | Fixed `MM/DD/YYYY` format for legal documents |
|
|
11
|
+
| `formatNumber` | Thousands-separator number formatting |
|
|
12
|
+
| `formatPrice` | Currency-symbol formatting via `Intl.NumberFormat` |
|
|
13
|
+
| `formatCurrency` | USD whole-dollar KPI formatter with `'N/A'` null guard |
|
|
14
|
+
| `formatWholeDollars` | Configurable whole-dollar formatter (no cents) |
|
|
15
|
+
| `formatPercent` | Fixed 2-decimal percent string with `'N/A'` null guard |
|
|
16
|
+
| `formatBytes` | Human-readable byte sizes up to YB |
|
|
17
|
+
| `formatBytesShort` | Compact byte formatter (`'B'` unit) for tight UI spaces |
|
|
18
|
+
| `formatLargeNumber` | Abbreviated integers — `1K`, `2M`, `3B` (floor, no decimals) |
|
|
19
|
+
| `formatAbbreviatedNumber` | Abbreviated numbers with one decimal when needed — `1.2K`, `2.5M` |
|
|
20
|
+
| `getFirstLastInitials` | First + last word initials (e.g. `"John Michael Doe"` → `"JD"`) |
|
|
21
|
+
| `nameInitials` | First + second word initials, max 2 chars, with configurable fallback |
|
|
22
|
+
| `formatDurationMMSS` | Duration as `MM:SS` or `HH:MM:SS` |
|
|
23
|
+
| `formatDurationCompact` | Duration as `"Xh Xm"` or `"X min"` |
|
|
24
|
+
| `formatDurationFromRange` | Duration between two timestamps as compact string |
|
|
25
|
+
| `formatTimeWithTimezone` | Time string with optional timezone label |
|
|
26
|
+
| `formatCompactMetric` | Metric value with compact notation for KPI cards (partial) |
|
|
27
|
+
| `MetricFormat` | Type: `'number' \| 'currency' \| 'percentage' \| 'months'` |
|
|
28
|
+
| `TrendPolarity` | Type: `'positive' \| 'negative' \| 'neutral'` |
|
|
12
29
|
|
|
13
30
|
## Usage Example
|
|
14
31
|
|
|
15
32
|
```typescript
|
|
16
|
-
import {
|
|
17
|
-
formatDate,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
33
|
+
import {
|
|
34
|
+
formatDate,
|
|
35
|
+
formatDateUTC,
|
|
36
|
+
formatBytes,
|
|
37
|
+
formatBytesShort,
|
|
21
38
|
formatLargeNumber,
|
|
22
|
-
formatAbbreviatedNumber
|
|
39
|
+
formatAbbreviatedNumber,
|
|
40
|
+
formatPrice,
|
|
41
|
+
formatCurrency,
|
|
42
|
+
formatPercent,
|
|
43
|
+
formatDurationMMSS,
|
|
44
|
+
formatDurationCompact,
|
|
45
|
+
formatDurationFromRange,
|
|
46
|
+
formatTimeWithTimezone,
|
|
47
|
+
nameInitials,
|
|
48
|
+
getFirstLastInitials,
|
|
23
49
|
} from './format'
|
|
24
50
|
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
console.log(formatDate(date, { month: 'short', day: 'numeric' })) // "Jan 15"
|
|
51
|
+
// Dates
|
|
52
|
+
formatDate('2024-08-15')
|
|
53
|
+
// → "August 15, 2024"
|
|
29
54
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
console.log(formatPrice(29.99, 'USD')) // "$29.99"
|
|
33
|
-
console.log(formatBytes(1024000)) // "1000 KB"
|
|
55
|
+
formatDateUTC('2024-08-15')
|
|
56
|
+
// → "Aug 15, 2024" (UTC-anchored, no timezone drift)
|
|
34
57
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
58
|
+
formatDateUTC(null, { fallback: 'Unknown' })
|
|
59
|
+
// → "Unknown"
|
|
60
|
+
|
|
61
|
+
// Bytes
|
|
62
|
+
formatBytes(1536) // → "1.5 KB"
|
|
63
|
+
formatBytesShort(1536) // → "1.5 KB" (tight UI variant)
|
|
64
|
+
|
|
65
|
+
// Numbers
|
|
66
|
+
formatLargeNumber(1_500_000) // → "1M" (floor, no decimals)
|
|
67
|
+
formatAbbreviatedNumber(1_200) // → "1.2K" (one decimal when needed)
|
|
68
|
+
|
|
69
|
+
// Currency
|
|
70
|
+
formatPrice(49.99) // → "$49.99"
|
|
71
|
+
formatCurrency(1234567) // → "$1,234,567"
|
|
72
|
+
formatPercent(12.5) // → "12.50%"
|
|
73
|
+
|
|
74
|
+
// Duration
|
|
75
|
+
formatDurationMMSS(3725) // → "1:02:05"
|
|
76
|
+
formatDurationCompact(3725) // → "1h 2m"
|
|
77
|
+
formatDurationFromRange('2024-01-01T10:00:00Z', '2024-01-01T11:30:00Z')
|
|
78
|
+
// → "1h 30m"
|
|
79
|
+
|
|
80
|
+
formatTimeWithTimezone(new Date(), 'EST')
|
|
81
|
+
// → "10:30 AM EST"
|
|
82
|
+
|
|
83
|
+
// Initials
|
|
84
|
+
nameInitials('John Michael Doe') // → "JM"
|
|
85
|
+
getFirstLastInitials('John Michael Doe') // → "JD"
|
|
86
|
+
nameInitials(null) // → "E" (default fallback)
|
|
38
87
|
```
|