@flamingo-stack/openframe-frontend-core 0.0.212 → 0.0.213-snapshot.20260528174436
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-QKFBZLIR.js → chunk-5OWDOFKK.js} +2 -2
- package/dist/chunk-CZR7ARBA.js +698 -0
- package/dist/chunk-CZR7ARBA.js.map +1 -0
- package/dist/{chunk-UYQOPC57.js → chunk-HICZPTRR.js} +4 -351
- package/dist/chunk-HICZPTRR.js.map +1 -0
- package/dist/{chunk-5BNWGK6D.js → chunk-HWY35EAK.js} +3 -3
- package/dist/{chunk-VTUIMMHO.cjs → chunk-IZL2KEH6.cjs} +26 -26
- package/dist/{chunk-VTUIMMHO.cjs.map → chunk-IZL2KEH6.cjs.map} +1 -1
- package/dist/{chunk-ZFBLC5GV.cjs → chunk-KDNGUYZM.cjs} +17 -17
- package/dist/{chunk-ZFBLC5GV.cjs.map → chunk-KDNGUYZM.cjs.map} +1 -1
- package/dist/chunk-OZ3GH6OQ.cjs +698 -0
- package/dist/chunk-OZ3GH6OQ.cjs.map +1 -0
- package/dist/{chunk-3E5ANY55.js → chunk-UKND27XC.js} +410 -544
- package/dist/chunk-UKND27XC.js.map +1 -0
- package/dist/{chunk-EH3RWVF3.cjs → chunk-WT5JV2GS.cjs} +8 -355
- package/dist/chunk-WT5JV2GS.cjs.map +1 -0
- package/dist/{chunk-WI76ZUBE.cjs → chunk-YZUUFTIK.cjs} +545 -679
- package/dist/chunk-YZUUFTIK.cjs.map +1 -0
- package/dist/components/chat/hooks/use-jetstream-dialog-subscription.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-nats-dialog-subscription.d.ts +0 -9
- package/dist/components/chat/hooks/use-nats-dialog-subscription.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +5 -4
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.js +4 -3
- package/dist/components/contact/index.cjs +6 -5
- package/dist/components/contact/index.cjs.map +1 -1
- package/dist/components/contact/index.js +5 -4
- package/dist/components/features/index.cjs +5 -4
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.js +4 -3
- package/dist/components/features/notifications/index.d.ts +2 -2
- package/dist/components/features/notifications/index.d.ts.map +1 -1
- package/dist/components/features/notifications/notifications-context.d.ts +16 -1
- package/dist/components/features/notifications/notifications-context.d.ts.map +1 -1
- package/dist/components/features/notifications/types.d.ts +4 -0
- package/dist/components/features/notifications/types.d.ts.map +1 -1
- package/dist/components/index.cjs +55 -54
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +7 -6
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/app-header.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +5 -4
- package/dist/components/navigation/index.cjs.map +1 -1
- package/dist/components/navigation/index.js +4 -3
- package/dist/components/tickets/index.cjs +66 -65
- package/dist/components/tickets/index.cjs.map +1 -1
- package/dist/components/tickets/index.js +6 -5
- package/dist/components/tickets/index.js.map +1 -1
- package/dist/components/ui/index.cjs +5 -4
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +4 -3
- package/dist/embed-shims/index.cjs +3 -3
- package/dist/embed-shims/index.cjs.map +1 -1
- package/dist/embed-shims/index.js +4 -4
- package/dist/hooks/index.cjs +3 -2
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.js +2 -1
- package/dist/index.cjs +5 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -3
- package/dist/nats/index.cjs +28 -346
- package/dist/nats/index.cjs.map +1 -1
- package/dist/nats/index.d.ts +3 -0
- package/dist/nats/index.d.ts.map +1 -1
- package/dist/nats/index.js +30 -346
- package/dist/nats/index.js.map +1 -1
- package/dist/nats/nats-provider.d.ts +28 -0
- package/dist/nats/nats-provider.d.ts.map +1 -0
- package/dist/nats/nats.d.ts +1 -0
- package/dist/nats/nats.d.ts.map +1 -1
- package/dist/nats/shared-connection.d.ts +73 -0
- package/dist/nats/shared-connection.d.ts.map +1 -0
- package/dist/nats/use-nats-subscription.d.ts +18 -0
- package/dist/nats/use-nats-subscription.d.ts.map +1 -0
- 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/hooks/use-jetstream-dialog-subscription.ts +60 -207
- package/src/components/chat/hooks/use-nats-dialog-subscription.ts +71 -214
- 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/features/notifications/index.ts +2 -1
- package/src/components/features/notifications/notifications-context.tsx +104 -6
- package/src/components/features/notifications/types.ts +5 -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/navigation/app-header.tsx +7 -9
- 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/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/nats/index.ts +3 -0
- package/src/nats/nats-provider.tsx +146 -0
- package/src/nats/nats.ts +2 -0
- package/src/nats/shared-connection.ts +285 -0
- package/src/nats/use-nats-subscription.ts +99 -0
- 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-3E5ANY55.js.map +0 -1
- package/dist/chunk-EH3RWVF3.cjs.map +0 -1
- package/dist/chunk-UYQOPC57.js.map +0 -1
- package/dist/chunk-WI76ZUBE.cjs.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-QKFBZLIR.js.map → chunk-5OWDOFKK.js.map} +0 -0
- /package/dist/{chunk-5BNWGK6D.js.map → chunk-HWY35EAK.js.map} +0 -0
|
@@ -1,40 +1,56 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: f987a6879214f07a120da4bd03335b15 -->
|
|
2
|
+
Reusable client-side status filter component that renders a row of toggle buttons for filtering content by status, following the admin dashboard pattern used across the Flamingo/OpenFrame platform.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
- **StatusOption**: Interface defining the structure for filter options with value and label
|
|
8
|
-
- **StatusFilterComponentProps**: Props interface supporting status selection, change handlers, options, and optional count display
|
|
6
|
+
### Interfaces
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
| Interface | Description |
|
|
9
|
+
|-----------|-------------|
|
|
10
|
+
| `StatusOption` | Defines a filter option with `value` and `label` strings |
|
|
11
|
+
| `StatusFilterComponentProps` | Full props contract for the component |
|
|
12
|
+
|
|
13
|
+
### Props
|
|
14
|
+
|
|
15
|
+
| Prop | Type | Default | Description |
|
|
16
|
+
|------|------|---------|-------------|
|
|
17
|
+
| `selectedStatus` | `string` | — | Currently active filter value |
|
|
18
|
+
| `onStatusChange` | `(status: string) => void` | — | Callback fired on filter selection |
|
|
19
|
+
| `statusOptions` | `StatusOption[]` | — | Array of filter options to render |
|
|
20
|
+
| `showCount` | `boolean` | `false` | Toggles item count display |
|
|
21
|
+
| `count` | `number` | `0` | Number shown when `showCount` is enabled |
|
|
22
|
+
| `className` | `string` | `''` | Additional CSS classes for the wrapper |
|
|
23
|
+
|
|
24
|
+
### Exported
|
|
25
|
+
|
|
26
|
+
- `StatusFilterComponent` — named export, main component
|
|
27
|
+
- `StatusOption` — exported interface
|
|
28
|
+
- `StatusFilterComponentProps` — exported interface
|
|
11
29
|
|
|
12
30
|
## Usage Example
|
|
13
31
|
|
|
14
32
|
```typescript
|
|
15
33
|
import { StatusFilterComponent, StatusOption } from './status-filter-component';
|
|
16
34
|
|
|
17
|
-
const
|
|
18
|
-
{ value: '
|
|
19
|
-
{ value: '
|
|
20
|
-
{ value: '
|
|
35
|
+
const ticketStatusOptions: StatusOption[] = [
|
|
36
|
+
{ value: 'open', label: 'Open' },
|
|
37
|
+
{ value: 'in_progress', label: 'In Progress' },
|
|
38
|
+
{ value: 'closed', label: 'Closed' },
|
|
21
39
|
];
|
|
22
40
|
|
|
23
|
-
function
|
|
24
|
-
const [
|
|
25
|
-
const [itemCount, setItemCount] = useState(42);
|
|
41
|
+
export function TicketDashboard() {
|
|
42
|
+
const [status, setStatus] = React.useState('all');
|
|
26
43
|
|
|
27
44
|
return (
|
|
28
45
|
<StatusFilterComponent
|
|
29
|
-
selectedStatus={
|
|
30
|
-
onStatusChange={
|
|
31
|
-
statusOptions={
|
|
32
|
-
showCount
|
|
33
|
-
count={
|
|
34
|
-
className="mb-6"
|
|
46
|
+
selectedStatus={status}
|
|
47
|
+
onStatusChange={setStatus}
|
|
48
|
+
statusOptions={ticketStatusOptions}
|
|
49
|
+
showCount
|
|
50
|
+
count={42}
|
|
35
51
|
/>
|
|
36
52
|
);
|
|
37
53
|
}
|
|
38
54
|
```
|
|
39
55
|
|
|
40
|
-
The
|
|
56
|
+
> **Note:** The `'all'` option is always rendered as a dedicated button — any `StatusOption` with `value: 'all'` in the input array is automatically excluded from the mapped list to prevent duplication.
|
|
@@ -1,45 +1,61 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
A
|
|
1
|
+
<!-- source-hash: 0d6f9a8deca3671804c89abef2d0469f -->
|
|
2
|
+
A reusable React component for selecting and creating tags with search autocomplete, chip display, and tag limit enforcement.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
- Selected tags displayed as removable chips inside the search input
|
|
9
|
-
- Configurable tag limits (default 10)
|
|
10
|
-
- Focus-triggered dropdown with all available tags
|
|
11
|
-
- Real-time filtering based on search query
|
|
12
|
-
- Disabled state support with visual feedback
|
|
6
|
+
### `TagsSelector`
|
|
7
|
+
Main exported component that renders a search input with inline tag chips, an autocomplete dropdown, and a tag counter.
|
|
13
8
|
|
|
14
|
-
**
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
**Props (`TagsSelectorProps`):**
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Default | Description |
|
|
12
|
+
|------|------|---------|-------------|
|
|
13
|
+
| `availableTags` | `Tag[]` | — | Pool of tags to search from |
|
|
14
|
+
| `selectedTagIds` | `number[]` | — | Currently selected tag IDs |
|
|
15
|
+
| `onTagsChange` | `(tagIds: number[]) => void` | — | Callback when selection changes |
|
|
16
|
+
| `onCreateTag` | `(name: string) => Promise<Tag \| null>` | — | Optional async tag creation handler |
|
|
17
|
+
| `maxTags` | `number` | `10` | Maximum selectable tags |
|
|
18
|
+
| `allowCreate` | `boolean` | `true` | Enables the "Create tag" option |
|
|
19
|
+
| `disabled` | `boolean` | `false` | Disables all interactions |
|
|
20
|
+
|
|
21
|
+
### Internal Helpers
|
|
22
|
+
|
|
23
|
+
- `handleTagAdd` — Adds a tag if not already selected and under the limit
|
|
24
|
+
- `handleTagRemove` — Removes a tag chip from selection
|
|
25
|
+
- `handleCreateTag` — Calls `onCreateTag`, auto-selects the result, manages loading state
|
|
26
|
+
- `getFilteredTagsForAutocomplete` — Filters available tags by search query, excluding already selected
|
|
27
|
+
- `tagExistsWithName` — Case-insensitive duplicate check before showing "Create" option
|
|
17
28
|
|
|
18
29
|
## Usage Example
|
|
19
30
|
|
|
20
31
|
```typescript
|
|
21
|
-
import { TagsSelector } from './
|
|
32
|
+
import { TagsSelector } from './tags-selector';
|
|
22
33
|
|
|
23
|
-
|
|
24
|
-
{ id: 1, name: 'React', slug: 'react' },
|
|
25
|
-
{ id: 2, name: 'TypeScript', slug: 'typescript' },
|
|
26
|
-
{ id: 3, name: 'Next.js', slug: 'nextjs' }
|
|
27
|
-
];
|
|
28
|
-
|
|
29
|
-
function BlogEditor() {
|
|
34
|
+
function BlogPostForm() {
|
|
30
35
|
const [selectedTagIds, setSelectedTagIds] = useState<number[]>([]);
|
|
31
36
|
|
|
37
|
+
const handleCreateTag = async (name: string) => {
|
|
38
|
+
const res = await fetch('/api/tags', {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
body: JSON.stringify({ name }),
|
|
41
|
+
});
|
|
42
|
+
return res.json(); // { id, name, slug }
|
|
43
|
+
};
|
|
44
|
+
|
|
32
45
|
return (
|
|
33
46
|
<TagsSelector
|
|
34
|
-
availableTags={
|
|
47
|
+
availableTags={[
|
|
48
|
+
{ id: 1, name: 'MSP', slug: 'msp' },
|
|
49
|
+
{ id: 2, name: 'AI', slug: 'ai' },
|
|
50
|
+
]}
|
|
35
51
|
selectedTagIds={selectedTagIds}
|
|
36
52
|
onTagsChange={setSelectedTagIds}
|
|
53
|
+
onCreateTag={handleCreateTag}
|
|
37
54
|
maxTags={5}
|
|
38
|
-
placeholder="Search
|
|
39
|
-
className="w-full"
|
|
55
|
+
placeholder="Search tags..."
|
|
40
56
|
/>
|
|
41
57
|
);
|
|
42
58
|
}
|
|
43
59
|
```
|
|
44
60
|
|
|
45
|
-
|
|
61
|
+
> **Note:** The dropdown auto-opens on focus and supports keyboard creation — pressing `Enter` while typing a new tag name triggers `handleCreateTag` when `allowCreate` is enabled.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<!-- source-hash: a9ac065f3da523be3fea0a878f95156f -->
|
|
2
|
+
Unified React component that combines the `AIEnrichSection` (trigger button + status) and `TranscriptSummaryEditor` (editable output fields) into a single cohesive UI for video transcription and summarization workflows.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
- **`TranscribeAndSummarizeCombinedSection`** — Default export; renders an `AIEnrichSection` followed by a `TranscriptSummaryEditor` in a vertical stack
|
|
7
|
+
- **`TranscribeAndSummarizeCombinedSectionProps`** — Full interface merging props from both child components, split into two logical groups via inline comments
|
|
8
|
+
- Automatically resolves `buttonLabel` to `"Generate"` or `"Regenerate"` based on the `hasResult` flag when no custom label is provided
|
|
9
|
+
|
|
10
|
+
## Usage Example
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import { TranscribeAndSummarizeCombinedSection } from './transcribe-and-summarize-combined-section';
|
|
14
|
+
|
|
15
|
+
<TranscribeAndSummarizeCombinedSection
|
|
16
|
+
// Trigger controls
|
|
17
|
+
onTranscribe={handleTranscribe}
|
|
18
|
+
isProcessing={isLoading}
|
|
19
|
+
canEnrich={!!videoFile}
|
|
20
|
+
requiredFields={[{ label: 'Video file', met: !!videoFile }]}
|
|
21
|
+
status={status}
|
|
22
|
+
statusMessage={statusMessage}
|
|
23
|
+
hasResult={!!transcript}
|
|
24
|
+
showCancel
|
|
25
|
+
onCancel={handleCancel}
|
|
26
|
+
|
|
27
|
+
// Editor content
|
|
28
|
+
videoSummary={summary}
|
|
29
|
+
onVideoSummaryChange={setSummary}
|
|
30
|
+
transcript={transcript}
|
|
31
|
+
onTranscriptChange={setTranscript}
|
|
32
|
+
isAIGenerated={isAIGenerated}
|
|
33
|
+
videoSummaryConfidence={0.92}
|
|
34
|
+
transcriptConfidence={0.88}
|
|
35
|
+
subtitles={srtContent}
|
|
36
|
+
onSubtitlesChange={setSrtContent}
|
|
37
|
+
hasSubtitles={hasSubtitles}
|
|
38
|
+
/>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Notes
|
|
42
|
+
|
|
43
|
+
- Used by both `CustomerInterview` and `ProductRelease` modals
|
|
44
|
+
- All text labels (`title`, `description`, `videoSummaryLabel`, etc.) are fully customizable with sensible defaults
|
|
45
|
+
- The `disabled` prop propagates only to `TranscriptSummaryEditor`, not to the enrich trigger button
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<!-- source-hash: e9e7f82a90db0014d3b7c868be383461 -->
|
|
2
|
+
A reusable React wrapper around `AIEnrichSection` that provides a standardized UI for video transcription and summarization workflows across `CustomerInterview` and `ProductRelease` entities.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `TranscribeSummarizeSection`
|
|
7
|
+
The primary export — a client-side React component that delegates rendering to `AIEnrichSection` with transcription-specific defaults.
|
|
8
|
+
|
|
9
|
+
### `TranscribeSummarizeSectionProps`
|
|
10
|
+
Full TypeScript interface exposing all configurable props:
|
|
11
|
+
|
|
12
|
+
| Prop | Type | Default | Description |
|
|
13
|
+
|------|------|---------|-------------|
|
|
14
|
+
| `onTranscribe` | `() => void` | — | Triggers transcription processing |
|
|
15
|
+
| `isProcessing` | `boolean` | — | Controls loading state |
|
|
16
|
+
| `canEnrich` | `boolean` | — | Enables/disables the action button |
|
|
17
|
+
| `requiredFields` | `AIRequiredField[]` | — | Fields displayed as prerequisites |
|
|
18
|
+
| `hasResult` | `boolean` | `false` | Switches button label to "Regenerate" |
|
|
19
|
+
| `disabledMessage` | `string` | `"Upload a video first"` | Shown when button is disabled |
|
|
20
|
+
| `title` | `string` | `"Transcribe & Summarize"` | Section heading |
|
|
21
|
+
| `description` | `string` | `"Generate transcript..."` | Section subtext |
|
|
22
|
+
| `loadingLabel` | `string` | `"Processing..."` | Label during active processing |
|
|
23
|
+
| `showCancel` | `boolean` | `true` | Toggles cancel button visibility |
|
|
24
|
+
|
|
25
|
+
## Usage Example
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { TranscribeSummarizeSection } from './transcribe-summarize-section';
|
|
29
|
+
|
|
30
|
+
function CustomerInterviewPanel() {
|
|
31
|
+
const [isProcessing, setIsProcessing] = React.useState(false);
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<TranscribeSummarizeSection
|
|
35
|
+
onTranscribe={() => setIsProcessing(true)}
|
|
36
|
+
isProcessing={isProcessing}
|
|
37
|
+
canEnrich={true}
|
|
38
|
+
requiredFields={[{ key: 'videoUrl', label: 'Video URL' }]}
|
|
39
|
+
hasResult={false}
|
|
40
|
+
onCancel={() => setIsProcessing(false)}
|
|
41
|
+
status="loading"
|
|
42
|
+
statusMessage="Transcribing video..."
|
|
43
|
+
/>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The button label automatically toggles between `"Generate"` and `"Regenerate"` based on the `hasResult` prop, or can be fully overridden via `buttonLabel`.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<!-- source-hash: 82679c7416bd1640d332a170504ba800 -->
|
|
2
|
+
A reusable React component that renders editable textarea fields for video summary, transcript, and optional SRT subtitles — with AI generation badges and confidence score indicators.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `TranscriptSummaryEditor`
|
|
7
|
+
The default export. Renders up to three labeled textarea sections:
|
|
8
|
+
|
|
9
|
+
| Section | Shown When |
|
|
10
|
+
|---|---|
|
|
11
|
+
| **Video Summary** | Always |
|
|
12
|
+
| **Transcript** | Always |
|
|
13
|
+
| **Subtitles (SRT)** | `subtitles` content exists OR `onSubtitlesChange` is provided |
|
|
14
|
+
|
|
15
|
+
Each section supports:
|
|
16
|
+
- Customizable label, helper text, and placeholder
|
|
17
|
+
- Configurable minimum height
|
|
18
|
+
- `isAIGenerated` badge (Sparkles icon / CC icon for subtitles)
|
|
19
|
+
- `ConfidenceBadge` for AI confidence scores (video summary and transcript only)
|
|
20
|
+
- `disabled` state propagated to all textareas
|
|
21
|
+
|
|
22
|
+
### `TranscriptSummaryEditorProps`
|
|
23
|
+
Full TypeScript interface with all configurable props — all optional except `onVideoSummaryChange` and `onTranscriptChange`.
|
|
24
|
+
|
|
25
|
+
## Usage Example
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { TranscriptSummaryEditor } from './transcript-summary-editor';
|
|
29
|
+
|
|
30
|
+
function InterviewEditor() {
|
|
31
|
+
const [summary, setSummary] = useState('');
|
|
32
|
+
const [transcript, setTranscript] = useState('');
|
|
33
|
+
const [subtitles, setSubtitles] = useState('');
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<TranscriptSummaryEditor
|
|
37
|
+
videoSummary={summary}
|
|
38
|
+
onVideoSummaryChange={setSummary}
|
|
39
|
+
transcript={transcript}
|
|
40
|
+
onTranscriptChange={setTranscript}
|
|
41
|
+
isAIGenerated={true}
|
|
42
|
+
videoSummaryConfidence={87}
|
|
43
|
+
transcriptConfidence={92}
|
|
44
|
+
subtitles={subtitles}
|
|
45
|
+
onSubtitlesChange={setSubtitles}
|
|
46
|
+
videoSummaryMinHeight={250}
|
|
47
|
+
transcriptMinHeight={400}
|
|
48
|
+
/>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
> Designed for use with `CustomerInterview` and `ProductRelease` entities in the Flamingo/OpenFrame platform, providing a consistent editing UI across entity types.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<!-- source-hash: 5b4e3ad25ef1abb4f28d722afea48eb0 -->
|
|
2
|
+
Renders a responsive, lazily-loaded grid of short video bites grouped by aspect ratio (portrait, square, landscape), using viewport-gating to defer off-screen player mounts and prevent cumulative layout shift (CLS).
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `VideoBitesDisplay` | Component | Primary public component; filters, sorts, and groups bites by aspect ratio |
|
|
9
|
+
| `VideoBiteCard` | Component | Individual bite card wrapping `<Video>` inside a styled `<Card>` |
|
|
10
|
+
| `LazyBite` | Component (internal) | Defers child mount until within 500px of the viewport via `useNearViewport` |
|
|
11
|
+
| `BiteGrid` | Component (internal) | Renders ratio-appropriate column grid with each bite wrapped in `LazyBite` |
|
|
12
|
+
|
|
13
|
+
## Key Behaviors
|
|
14
|
+
|
|
15
|
+
- **Filtering & sorting**: Optionally filters to published bites only, sorted newest-first by `created_at`
|
|
16
|
+
- **Aspect ratio grouping**: When multiple ratios exist, renders `<RatioTabs>`; otherwise falls back to a flat `<BiteGrid>`
|
|
17
|
+
- **CLS prevention**: `LazyBite` uses a CSS `aspect-ratio` placeholder matching the bite's ratio before the player mounts; `layout="fill"` on `<Video>` fills the card from first paint
|
|
18
|
+
- **Player routing**: All bites go through the `<Video>` primitive (no raw `VideoPlayer` carve-out) since MuxPlayer loads its HLS engine lazily
|
|
19
|
+
|
|
20
|
+
## Usage Example
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { VideoBitesDisplay } from './video-bites-display';
|
|
24
|
+
import type { VideoTeaser } from '../../types/video-processing';
|
|
25
|
+
|
|
26
|
+
const bites: VideoTeaser[] = [
|
|
27
|
+
{
|
|
28
|
+
url: 'https://stream.example.com/clip1.mp4',
|
|
29
|
+
title: 'Product Demo',
|
|
30
|
+
thumbnail_url: 'https://cdn.example.com/thumb1.jpg',
|
|
31
|
+
published: true,
|
|
32
|
+
created_at: '2024-06-01T12:00:00Z',
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
export function HighlightsSection() {
|
|
37
|
+
return (
|
|
38
|
+
<VideoBitesDisplay
|
|
39
|
+
bites={bites}
|
|
40
|
+
title="Product Highlights"
|
|
41
|
+
filterPublished={true}
|
|
42
|
+
showTitle={true}
|
|
43
|
+
/>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
```
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<!-- source-hash: 81400380536975a05d6ee9dc0f9ea30f -->
|
|
2
|
+
Reusable wrapper component around `AIEnrichSection` that provides a standardized UI for triggering and managing video clips extraction from uploaded media.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `VideoClipsSection`
|
|
7
|
+
A pre-configured `AIEnrichSection` wrapper that handles the video clips extraction step for `CustomerInterview` and `ProductRelease` entities. Automatically toggles the button label between `"Generate Clips"` and `"Regenerate Clips"` based on whether a result already exists.
|
|
8
|
+
|
|
9
|
+
### `VideoClipsSectionProps`
|
|
10
|
+
Full interface for controlling extraction state, UI labels, cancel behavior, and required field validation display.
|
|
11
|
+
|
|
12
|
+
## Usage Example
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import { VideoClipsSection } from './video-clips-section';
|
|
16
|
+
|
|
17
|
+
<VideoClipsSection
|
|
18
|
+
onExtractClips={handleExtract}
|
|
19
|
+
isProcessing={isLoading}
|
|
20
|
+
canEnrich={!!uploadedVideo}
|
|
21
|
+
requiredFields={[{ label: 'Video', isMet: !!uploadedVideo }]}
|
|
22
|
+
status={extractionStatus}
|
|
23
|
+
statusMessage="Clips extracted successfully"
|
|
24
|
+
hasResult={clips.length > 0}
|
|
25
|
+
showCancel={true}
|
|
26
|
+
onCancel={handleCancel}
|
|
27
|
+
isCancelling={isCancelling}
|
|
28
|
+
/>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Props Summary
|
|
32
|
+
|
|
33
|
+
| Prop | Type | Default | Description |
|
|
34
|
+
|------|------|---------|-------------|
|
|
35
|
+
| `onExtractClips` | `() => void` | — | Triggers extraction |
|
|
36
|
+
| `isProcessing` | `boolean` | — | Shows loading state |
|
|
37
|
+
| `canEnrich` | `boolean` | — | Enables the button |
|
|
38
|
+
| `hasResult` | `boolean` | `false` | Switches label to "Regenerate" |
|
|
39
|
+
| `disabledMessage` | `string` | `"Upload a video first"` | Tooltip when disabled |
|
|
40
|
+
| `loadingLabel` | `string` | `"Extracting clips..."` | In-progress button label |
|
|
41
|
+
| `showCancel` | `boolean` | `true` | Shows cancel option |
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<!-- source-hash: d2815a723188c45f4c5d2910a19ffd76 -->
|
|
2
|
+
Aspect-ratio tab and grouping primitives for video grids, used by `VideoBitesDisplay` and admin editors to render portrait, square, and landscape clips in cohesive tabbed groups.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### Types & Interfaces
|
|
7
|
+
- **`VizardAspectRatio`** — Union type for Vizard clip ratios: `'9:16' | '16:9' | '1:1'`
|
|
8
|
+
- **`VideoTeaserWithRatio`** — Extends `VideoTeaser` with `aspect_ratio`, `confidence`, `viral_reason`, and timing metadata
|
|
9
|
+
- **`RatioCategory`** — Grid grouping label: `'portrait' | 'square' | 'landscape'`
|
|
10
|
+
|
|
11
|
+
### Constants
|
|
12
|
+
- **`RATIO_GRID_CLASS`** — Tailwind grid classes for admin editor views (narrower columns)
|
|
13
|
+
- **`RATIO_DISPLAY_GRID_CLASS`** — Tailwind grid classes for public display pages (wider columns)
|
|
14
|
+
|
|
15
|
+
### Components
|
|
16
|
+
- **`RatioTabs`** — Tab wrapper that only renders tabs with content; auto-collapses to flat render when only one ratio group is populated; uses `forceMount` to prevent scroll-jump on tab switch
|
|
17
|
+
|
|
18
|
+
### Utilities
|
|
19
|
+
- **`detectAspectRatio(ratioString?, width?, height?)`** — Resolves a `VizardAspectRatio` from a string, falling back to dimension inference, defaulting to `'9:16'`
|
|
20
|
+
- **`ratioToCategory(ratio)`** — Maps `VizardAspectRatio` → `RatioCategory`
|
|
21
|
+
- **`groupByAspectRatio(items, getAspectRatio)`** — Buckets any item array into `{ portrait, square, landscape, hasMultiple }`
|
|
22
|
+
|
|
23
|
+
## Usage Example
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import {
|
|
27
|
+
RatioTabs,
|
|
28
|
+
groupByAspectRatio,
|
|
29
|
+
detectAspectRatio,
|
|
30
|
+
ratioToCategory,
|
|
31
|
+
RATIO_DISPLAY_GRID_CLASS,
|
|
32
|
+
} from './video-ratio-tabs';
|
|
33
|
+
|
|
34
|
+
// Group clips by detected aspect ratio
|
|
35
|
+
const { portrait, square, landscape, hasMultiple } = groupByAspectRatio(
|
|
36
|
+
clips,
|
|
37
|
+
(clip) => detectAspectRatio(clip.aspect_ratio, clip.width, clip.height),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
// Render with tabbed UI
|
|
41
|
+
<RatioTabs
|
|
42
|
+
groups={{
|
|
43
|
+
portrait: {
|
|
44
|
+
count: portrait.length,
|
|
45
|
+
render: () => (
|
|
46
|
+
<div className={RATIO_DISPLAY_GRID_CLASS.portrait}>
|
|
47
|
+
{portrait.map((c) => <ClipCard key={c.id} clip={c} />)}
|
|
48
|
+
</div>
|
|
49
|
+
),
|
|
50
|
+
},
|
|
51
|
+
square: { count: square.length, render: () => <SquareGrid items={square} /> },
|
|
52
|
+
landscape: { count: landscape.length, render: () => <LandscapeGrid items={landscape} /> },
|
|
53
|
+
}}
|
|
54
|
+
defaultTab="portrait"
|
|
55
|
+
/>
|
|
56
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!-- source-hash: 1995e98822c487bba791ce8689ae2447 -->
|
|
2
|
+
Unified toggle component for selecting between a YouTube URL input and a direct video file upload, managing upload state, progress, and preview rendering internally.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### Exports
|
|
7
|
+
- **`VideoSourceSelector`** — Main React component (default + named export)
|
|
8
|
+
- **`VideoSourceType`** — Union type: `'youtube' | 'uploaded'`
|
|
9
|
+
- **`VideoSourceSelectorProps`** — Full prop interface for the component
|
|
10
|
+
|
|
11
|
+
### Internal State
|
|
12
|
+
| State | Purpose |
|
|
13
|
+
|---|---|
|
|
14
|
+
| `isUploading` | Tracks active upload operation |
|
|
15
|
+
| `uploadProgress` | Numeric progress (0–100) |
|
|
16
|
+
| `uploadMessage` | Status message during upload |
|
|
17
|
+
| `uploadError` | Error string if upload fails |
|
|
18
|
+
|
|
19
|
+
### Key Handlers
|
|
20
|
+
- **`handleUploadClick`** — Programmatically triggers a hidden `<input type="file">`, invokes `onUploadVideo`, and manages progress callbacks
|
|
21
|
+
- **`handleDeleteVideo`** — Clears the uploaded video URL via `onMainVideoUrlChange('')`
|
|
22
|
+
|
|
23
|
+
## Usage Example
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { VideoSourceSelector, VideoSourceType } from './video-source-selector';
|
|
27
|
+
|
|
28
|
+
function MyForm() {
|
|
29
|
+
const [sourceType, setSourceType] = useState<VideoSourceType>('youtube');
|
|
30
|
+
const [youtubeUrl, setYoutubeUrl] = useState('');
|
|
31
|
+
const [videoUrl, setVideoUrl] = useState('');
|
|
32
|
+
|
|
33
|
+
const handleUpload = async (file: File, onProgress?: (p: number) => void) => {
|
|
34
|
+
const formData = new FormData();
|
|
35
|
+
formData.append('file', file);
|
|
36
|
+
// ... upload logic with progress callbacks
|
|
37
|
+
return 'https://cdn.example.com/video.mp4';
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<VideoSourceSelector
|
|
42
|
+
videoSourceType={sourceType}
|
|
43
|
+
onVideoSourceTypeChange={setSourceType}
|
|
44
|
+
youtubeUrl={youtubeUrl}
|
|
45
|
+
onYoutubeUrlChange={setYoutubeUrl}
|
|
46
|
+
mainVideoUrl={videoUrl}
|
|
47
|
+
onMainVideoUrlChange={setVideoUrl}
|
|
48
|
+
onUploadVideo={handleUpload}
|
|
49
|
+
isAIGenerated={false}
|
|
50
|
+
title="Course Video"
|
|
51
|
+
/>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Notes
|
|
57
|
+
|
|
58
|
+
- Switching between `youtube` and `uploaded` tabs **preserves both values** — no data is cleared on toggle
|
|
59
|
+
- Accepts optional `VideoPreviewComponent` and `UploadProgressComponent` for custom rendering; falls back to built-in implementations if omitted
|
|
60
|
+
- All text labels and placeholders are customizable via props for reuse across different contexts
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<!-- source-hash: 9e88b910bdaffc13eb668740a6d415f4 -->
|
|
2
|
+
Renders video content from YouTube URLs, bare video IDs, or file sources (HLS/MP4) with smart auto-detection and three layout modes. Consolidates the previous `<VideoPlayer>` and `<YouTubeEmbed>` primitives into a single component.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
- **`Video`** — Primary export. Discriminates on `kind` prop (`'youtube'` | `'file'` | `'auto'`) to route to the correct player branch, then wraps in the chosen layout
|
|
7
|
+
- **`extractYouTubeId`** — Exported utility that parses any YouTube URL shape or bare 11-char video ID into a raw video ID. Uses strict URL parsing + anchored regex (ReDoS-safe)
|
|
8
|
+
- **`VideoProps`** — Discriminated union type (`VideoFileProps | VideoYouTubeProps | VideoAutoProps`)
|
|
9
|
+
- **`VideoLayout`** — `'centered'` | `'fill'` | `'native'`
|
|
10
|
+
- **`resolveKind`** (internal) — URL classifier that maps a URL to `'youtube'` or `'file'`
|
|
11
|
+
- **`YouTubeFacade`** (internal) — Lite-YouTube poster + click-to-iframe embed
|
|
12
|
+
- **`FilePlayer`** (internal) — `<MuxPlayer>` wrapper handling HLS, MP4, captions, and Mux Data
|
|
13
|
+
|
|
14
|
+
## Usage Example
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
// Auto-detect source from URL (recommended)
|
|
18
|
+
<Video url="https://www.youtube.com/watch?v=dQw4w9WgXcQ" layout="centered" />
|
|
19
|
+
|
|
20
|
+
// Bare YouTube ID
|
|
21
|
+
<Video url="dQw4w9WgXcQ" layout="native" priority />
|
|
22
|
+
|
|
23
|
+
// HLS or MP4 file with captions
|
|
24
|
+
<Video
|
|
25
|
+
kind="file"
|
|
26
|
+
url="https://cdn.example.com/video.m3u8"
|
|
27
|
+
captionsUrl="https://cdn.example.com/captions.vtt"
|
|
28
|
+
layout="fill"
|
|
29
|
+
muted
|
|
30
|
+
/>
|
|
31
|
+
|
|
32
|
+
// Marketing embed — minimal YouTube controls
|
|
33
|
+
<Video
|
|
34
|
+
kind="youtube"
|
|
35
|
+
url="https://youtu.be/dQw4w9WgXcQ"
|
|
36
|
+
layout="centered"
|
|
37
|
+
minimalControls
|
|
38
|
+
title="Product demo"
|
|
39
|
+
/>
|
|
40
|
+
|
|
41
|
+
// Validate a URL without rendering
|
|
42
|
+
import { extractYouTubeId } from './video';
|
|
43
|
+
const id = extractYouTubeId('https://youtu.be/dQw4w9WgXcQ'); // → "dQw4w9WgXcQ"
|
|
44
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<!-- source-hash: 6dd94b5db8fe43eb78a9a8032c387c0e -->
|
|
2
|
+
A platform-agnostic waitlist registration form component for OpenFrame/Flamingo, handling email capture, optional phone input with country detection, SMS consent, and submission state management.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `WaitlistFormProps`
|
|
7
|
+
Configuration interface with the following notable props:
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Description |
|
|
10
|
+
|------|------|-------------|
|
|
11
|
+
| `onRegister` | `(email, phone?) => Promise<void>` | Required submission handler; must throw on failure |
|
|
12
|
+
| `geoApiUrl` | `string \| null` | Geo-detection endpoint for auto-selecting country code (default: `"/api/geo"`) |
|
|
13
|
+
| `isSubmitting` | `boolean` | Controls loading state on the submit button |
|
|
14
|
+
| `isSuccess` | `boolean` | Switches button label to `successLabel` |
|
|
15
|
+
| `defaultEmail` / `defaultPhone` | `string` | Pre-filled values from auth context or user profile |
|
|
16
|
+
| `termsOfServiceUrl` / `privacyPolicyUrl` | `string` | Links rendered in SMS consent copy |
|
|
17
|
+
|
|
18
|
+
### `WaitlistForm`
|
|
19
|
+
The exported form component. Key internal behaviors:
|
|
20
|
+
|
|
21
|
+
- **Hydration-safe skeleton** — renders animated placeholder blocks until client-side mount
|
|
22
|
+
- **Geo-detection** — fetches `geoApiUrl` on mount to pre-select the user's country code via `libphonenumber-js`
|
|
23
|
+
- **Generic email warning** — surfaces a warning (not a block) when a personal domain is detected
|
|
24
|
+
- **SMS consent gate** — requires checkbox agreement before submitting a phone number
|
|
25
|
+
- **E.164 formatting** — converts raw phone input via `formatPhoneE164` before calling `onRegister`
|
|
26
|
+
- **Enter key support** — `handleKeyDown` triggers submission from any field
|
|
27
|
+
|
|
28
|
+
## Usage Example
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { WaitlistForm } from './waitlist-form'
|
|
32
|
+
|
|
33
|
+
function WaitlistPage() {
|
|
34
|
+
const [isSubmitting, setIsSubmitting] = useState(false)
|
|
35
|
+
const [isSuccess, setIsSuccess] = useState(false)
|
|
36
|
+
|
|
37
|
+
const handleRegister = async (email: string, phone?: string) => {
|
|
38
|
+
setIsSubmitting(true)
|
|
39
|
+
try {
|
|
40
|
+
await api.joinWaitlist({ email, phone })
|
|
41
|
+
setIsSuccess(true)
|
|
42
|
+
} finally {
|
|
43
|
+
setIsSubmitting(false)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<WaitlistForm
|
|
49
|
+
onRegister={handleRegister}
|
|
50
|
+
isSubmitting={isSubmitting}
|
|
51
|
+
isSuccess={isSuccess}
|
|
52
|
+
geoApiUrl="/api/geo"
|
|
53
|
+
termsOfServiceUrl="/legal/terms"
|
|
54
|
+
privacyPolicyUrl="/legal/privacy"
|
|
55
|
+
/>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
> **Note:** `onRegister` is responsible for its own error toasts. The form handles only email-empty and consent-missing validation client-side.
|