@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
|
@@ -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.
|
|
@@ -1,45 +1,48 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
A
|
|
1
|
+
<!-- source-hash: 553f8dbdfb9763d4ad797668077fd3a4 -->
|
|
2
|
+
A reusable client-side button component that triggers AI enrichment actions, featuring a sparkles icon, loading state, and configurable size/variant options.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
### `AIEnrichButtonProps`
|
|
7
|
+
| Prop | Type | Default | Description |
|
|
8
|
+
|------|------|---------|-------------|
|
|
9
|
+
| `onClick` | `() => void` | — | Handler called on button click |
|
|
10
|
+
| `disabled` | `boolean` | `false` | Disables the button |
|
|
11
|
+
| `loading` | `boolean` | `false` | Shows loading state and swaps label |
|
|
12
|
+
| `label` | `string` | `'AI Enrich'` | Default button text |
|
|
13
|
+
| `loadingLabel` | `string` | `'Enriching...'` | Text shown during loading |
|
|
14
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Button size |
|
|
15
|
+
| `variant` | `'primary' \| 'secondary' \| 'outline'` | `'outline'` | Visual style |
|
|
16
|
+
| `className` | `string` | — | Additional CSS classes |
|
|
17
|
+
|
|
18
|
+
### `AIEnrichButton`
|
|
19
|
+
The exported functional component. Internally maps the `size` and `variant` props to the underlying `Button` component's accepted values, and hides the `SparklesIcon` while loading.
|
|
10
20
|
|
|
11
21
|
## Usage Example
|
|
12
22
|
|
|
13
23
|
```typescript
|
|
14
24
|
import { AIEnrichButton } from './components/AIEnrichButton'
|
|
15
25
|
|
|
16
|
-
function
|
|
17
|
-
const [
|
|
26
|
+
function TicketForm() {
|
|
27
|
+
const [enriching, setEnriching] = React.useState(false)
|
|
18
28
|
|
|
19
29
|
const handleEnrich = async () => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
await enrichContent()
|
|
24
|
-
} finally {
|
|
25
|
-
setIsEnriching(false)
|
|
26
|
-
}
|
|
30
|
+
setEnriching(true)
|
|
31
|
+
await enrichTicketWithAI()
|
|
32
|
+
setEnriching(false)
|
|
27
33
|
}
|
|
28
34
|
|
|
29
35
|
return (
|
|
30
|
-
<
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
className="my-4"
|
|
39
|
-
/>
|
|
40
|
-
</div>
|
|
36
|
+
<AIEnrichButton
|
|
37
|
+
onClick={handleEnrich}
|
|
38
|
+
loading={enriching}
|
|
39
|
+
size="sm"
|
|
40
|
+
variant="primary"
|
|
41
|
+
label="Enrich Ticket"
|
|
42
|
+
loadingLabel="Analyzing..."
|
|
43
|
+
/>
|
|
41
44
|
)
|
|
42
45
|
}
|
|
43
46
|
```
|
|
44
47
|
|
|
45
|
-
The
|
|
48
|
+
> The button automatically disables itself during loading (`disabled || loading`), preventing duplicate submissions while Mingo AI processes the enrichment request.
|
|
@@ -1,51 +1,55 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 3297a26442c5b70d119e373c4687b748 -->
|
|
2
|
+
Reusable AI enrichment panel component that renders a full-featured UI section for triggering AI-powered data enrichment, displaying status feedback, confidence scores, warnings, and optional custom instructions.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
### Interfaces
|
|
7
|
+
|
|
8
|
+
| Interface | Purpose |
|
|
9
|
+
|-----------|---------|
|
|
10
|
+
| `ConfidenceField` | Defines a field with an optional confidence score for display |
|
|
11
|
+
| `AIRequiredField` | Describes a required form field, its fill state, and display label |
|
|
12
|
+
| `AIEnrichSectionProps` | Full prop contract for the `AIEnrichSection` component |
|
|
13
|
+
|
|
14
|
+
### Component: `AIEnrichSection`
|
|
15
|
+
|
|
16
|
+
The main exported component. Renders a card-style panel with:
|
|
17
|
+
|
|
18
|
+
- **Header** — Icon (defaults to `SparklesIcon`), title, and optional description
|
|
19
|
+
- **Custom Instructions** (opt-in) — Controlled `<Textarea>` for user-provided AI focus hints, passed upstream to Claude via `buildEditorFocusBlock()`
|
|
20
|
+
- **Action Buttons** — `AIEnrichButton` (primary) and optional cancel button during loading
|
|
21
|
+
- **Disabled State** — Shows `disabledMessage` with badge-styled list of unfilled required fields
|
|
22
|
+
- **Loading State** — Spinner with live `statusMessage`
|
|
23
|
+
- **Results Section** — Success/error status indicator, confidence badge, `AIWarningsSection`, custom `children`, and a clear button
|
|
10
24
|
|
|
11
25
|
## Usage Example
|
|
12
26
|
|
|
13
27
|
```typescript
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
{
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
statusMessage="Analyzing company data..."
|
|
36
|
-
overallConfidence={88}
|
|
37
|
-
warnings={warnings}
|
|
38
|
-
requiredFields={requiredFields}
|
|
39
|
-
confidenceFields={confidenceFields}
|
|
40
|
-
onClear={() => setStatus('idle')}
|
|
41
|
-
canEnrich={requiredFields.every(f => f.isFilled)}
|
|
42
|
-
>
|
|
43
|
-
<div className="text-sm">
|
|
44
|
-
Created 3 new tags based on industry analysis
|
|
45
|
-
</div>
|
|
46
|
-
</AIEnrichSection>
|
|
47
|
-
)
|
|
48
|
-
}
|
|
28
|
+
<AIEnrichSection
|
|
29
|
+
title="Enrich Asset"
|
|
30
|
+
description="Use AI to auto-fill missing asset details."
|
|
31
|
+
onEnrich={handleEnrich}
|
|
32
|
+
loading={isLoading}
|
|
33
|
+
canEnrich={hasRequiredFields}
|
|
34
|
+
status={enrichStatus}
|
|
35
|
+
statusMessage="Analyzing asset data..."
|
|
36
|
+
overallConfidence={87}
|
|
37
|
+
warnings={enrichWarnings}
|
|
38
|
+
requiredFields={[
|
|
39
|
+
{ key: 'version', label: 'Version', isFilled: !!formValues.version },
|
|
40
|
+
{ key: 'vendor', label: 'Vendor', isFilled: !!formValues.vendor },
|
|
41
|
+
]}
|
|
42
|
+
showCustomInstructions
|
|
43
|
+
customInstructions={instructions}
|
|
44
|
+
onCustomInstructionsChange={setInstructions}
|
|
45
|
+
onClear={handleClear}
|
|
46
|
+
showCancel
|
|
47
|
+
onCancel={handleCancel}
|
|
48
|
+
/>
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
## Notes
|
|
52
|
+
|
|
53
|
+
- Supports `'default'` and `'compact'` layout variants via the `variant` prop
|
|
54
|
+
- `customInstructions` is fully controlled — the parent owns the string value
|
|
55
|
+
- `requiredFields` drives both `canEnrich` gating and the unfilled-fields badge display
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
<!-- source-hash: 1ad6ce49d76bfa9f7bbe6737c01b2305 -->
|
|
2
|
+
Renders the header for a Kanban board column, supporting both expanded and collapsed states with ticket status display, count, and optional ticket creation.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
### `BoardColumnHeaderProps`
|
|
7
|
+
| Prop | Type | Description |
|
|
8
|
+
|------|------|-------------|
|
|
9
|
+
| `column` | `BoardColumnDef` | Column definition including id, label, color, and tickets |
|
|
10
|
+
| `collapsed` | `boolean` | Controls collapsed/expanded display mode |
|
|
11
|
+
| `onToggleCollapse` | `() => void` | Callback to toggle column collapse state |
|
|
12
|
+
| `onAddTicket` | `() => void` (optional) | Callback to trigger ticket creation |
|
|
13
|
+
|
|
14
|
+
### `BoardColumnHeader`
|
|
15
|
+
Client component that renders two distinct layouts:
|
|
16
|
+
- **Collapsed:** Vertical layout with expand icon, rotated status tag, and ticket count
|
|
17
|
+
- **Expanded:** Horizontal layout with status tag, count, collapse button, and optional add-ticket button
|
|
18
|
+
|
|
19
|
+
Uses `getTicketStatusConfig` to determine whether to use a built-in status color or a custom column color for the `TicketStatusTag`.
|
|
20
|
+
|
|
21
|
+
## Usage Example
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { BoardColumnHeader } from './board-column-header'
|
|
25
|
+
|
|
26
|
+
<BoardColumnHeader
|
|
27
|
+
column={{
|
|
28
|
+
id: 'in-progress',
|
|
29
|
+
label: 'In Progress',
|
|
30
|
+
color: '#FFC008',
|
|
31
|
+
tickets: [...],
|
|
32
|
+
total: 12,
|
|
33
|
+
}}
|
|
34
|
+
collapsed={false}
|
|
35
|
+
onToggleCollapse={() => setCollapsed(prev => !prev)}
|
|
36
|
+
onAddTicket={() => openCreateTicketModal('in-progress')}
|
|
37
|
+
/>
|
|
38
|
+
```
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<!-- source-hash: 1bf9b2d5d2d477b1115c900de71defaa -->
|
|
2
|
+
Renders a single kanban board column with drag-and-drop support, collapsible layout, infinite scroll via IntersectionObserver, and ticket card rendering.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `BoardColumn` | Component | Main column shell handling collapsed/expanded state, border joining, and color tinting |
|
|
9
|
+
| `BoardColumnProps` | Interface | Public API for the column component |
|
|
10
|
+
| `ColumnBody` | Internal Component | Scrollable droppable zone with `SortableContext`, infinite scroll sentinel, and loading states |
|
|
11
|
+
| `SkeletonStack` | Internal Component | Renders `n` skeleton placeholders during initial load |
|
|
12
|
+
| `EmptyState` | Internal Component | Illustrated empty state shown when a column has no tickets |
|
|
13
|
+
|
|
14
|
+
## Usage Example
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
<BoardColumn
|
|
18
|
+
column={{
|
|
19
|
+
id: 'open',
|
|
20
|
+
label: 'Open',
|
|
21
|
+
color: '#3B82F6',
|
|
22
|
+
tickets: myTickets,
|
|
23
|
+
hasMore: true,
|
|
24
|
+
isLoading: false,
|
|
25
|
+
isLoadingMore: false,
|
|
26
|
+
}}
|
|
27
|
+
collapsed={false}
|
|
28
|
+
onToggleCollapse={() => setCollapsed(c => !c)}
|
|
29
|
+
onAddTicket={(columnId) => openNewTicketModal(columnId)}
|
|
30
|
+
getTicketHref={(ticketId) => `/tickets/${ticketId}`}
|
|
31
|
+
renderAssignSlot={(ticket) => <AssigneePicker ticket={ticket} />}
|
|
32
|
+
onLoadMore={(columnId) => fetchNextPage(columnId)}
|
|
33
|
+
joinLeft={false}
|
|
34
|
+
joinRight={true}
|
|
35
|
+
/>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Notes
|
|
39
|
+
|
|
40
|
+
- **Drag-and-drop**: Uses `@dnd-kit/core` (`useDroppable`) and `@dnd-kit/sortable` (`SortableContext`) — drop target is disabled when `column.dropDisabled` is set.
|
|
41
|
+
- **Infinite scroll**: An `IntersectionObserver` watches a 1px sentinel div at the bottom of the scroll container; `onLoadMore` fires when it enters the viewport. Scroll is paused while `isLoadingMore` is true.
|
|
42
|
+
- **Collapsed state**: When `collapsed=true`, the column shrinks to `w-14` and hides the body; the header remains visible.
|
|
43
|
+
- **Joined borders**: `joinLeft`/`joinRight` props remove border radii and borders on adjacent edges for seamless multi-column layouts.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!-- source-hash: 266e1c3c423b749f9d7def8ff717188e -->
|
|
2
|
+
A drag-and-drop Kanban board component that manages ticket movement across columns using `@dnd-kit/core`, with support for column collapsing, horizontal scrolling, and constrained drop rules.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export / Symbol | Description |
|
|
7
|
+
|---|---|
|
|
8
|
+
| `Board` | Main board component rendering all columns with full DnD orchestration |
|
|
9
|
+
| `BoardProps` | Props interface defining columns, event handlers, and customization options |
|
|
10
|
+
| `collisionDetection` | Custom collision strategy: prefers ticket hits, falls back to column, then closest corners |
|
|
11
|
+
| `handleDragStart` | Records drag origin (ticket + source column) and sets overlay state |
|
|
12
|
+
| `handleDragOver` | Optimistically moves tickets across columns respecting `dropDisabled` and `allowedFromColumns` |
|
|
13
|
+
| `handleDragEnd` | Commits the move by calling `onChange` with positional context (`afterTicketId`, `beforeTicketId`), or rolls back |
|
|
14
|
+
| `handleDragCancel` | Reverts local state to the last server-provided `columns` prop |
|
|
15
|
+
| `locate` | Helper to find a ticket's column, index, and reference by ID |
|
|
16
|
+
| `findIndexInColumn` | Helper returning a ticket's index within a specific column |
|
|
17
|
+
|
|
18
|
+
## Usage Example
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
<Board
|
|
22
|
+
columns={[
|
|
23
|
+
{
|
|
24
|
+
id: 'open',
|
|
25
|
+
label: 'Open',
|
|
26
|
+
tickets: [{ id: 'T-1', title: 'Fix login bug' }],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'in-progress',
|
|
30
|
+
label: 'In Progress',
|
|
31
|
+
tickets: [],
|
|
32
|
+
allowedFromColumns: ['open'],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'done',
|
|
36
|
+
label: 'Done',
|
|
37
|
+
tickets: [],
|
|
38
|
+
dropDisabled: true,
|
|
39
|
+
},
|
|
40
|
+
]}
|
|
41
|
+
onChange={({ ticketId, fromColumnId, toColumnId, afterTicketId }) => {
|
|
42
|
+
api.moveTicket({ ticketId, toColumnId, afterTicketId })
|
|
43
|
+
}}
|
|
44
|
+
onLoadMore={(columnId) => fetchMore(columnId)}
|
|
45
|
+
getTicketHref={(ticketId) => `/tickets/${ticketId}`}
|
|
46
|
+
renderAssignSlot={(ticket) => <AssigneeAvatar ticket={ticket} />}
|
|
47
|
+
collapseStorageKey="board-collapse-state"
|
|
48
|
+
/>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
> **Drop rules:** Set `dropDisabled: true` on a column to block all inbound drops. Use `allowedFromColumns: ['open']` to restrict which source columns can feed into a target — dragging back to the origin column is always permitted regardless of these rules.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!-- source-hash: 908a5d80c6498d71475f70d268086189 -->
|
|
2
|
+
Computes a pre-blended background tint by mixing a given hex color at 10% opacity over a fixed dark background (`#161616`), returning the resulting opaque hex color.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
- **`tintOnDark(hex: string): string`** — Takes a hex color string (e.g. `#FFC008`), blends it at 10% over `#161616`, and returns the resulting opaque hex color.
|
|
7
|
+
|
|
8
|
+
## Usage Example
|
|
9
|
+
|
|
10
|
+
```typescript
|
|
11
|
+
import { tintOnDark } from './color-utils'
|
|
12
|
+
|
|
13
|
+
const tinted = tintOnDark('#FFC008')
|
|
14
|
+
// Returns the pre-blended hex, e.g. "#211e13"
|
|
15
|
+
// Useful for subtle colored backgrounds on dark UIs
|
|
16
|
+
|
|
17
|
+
const redTint = tintOnDark('#FF0000')
|
|
18
|
+
// Blends red at 10% over #161616 → "#281616"
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Notes
|
|
22
|
+
|
|
23
|
+
- The background is hardcoded to `#161616` (decimal `22`), matching Flamingo's dark theme base.
|
|
24
|
+
- Blend formula per channel: `round(0.1 * foreground + 0.9 * 22)`
|
|
25
|
+
- Input hex may include or omit the leading `#`.
|
|
26
|
+
- Returns a fully opaque hex string — no alpha channel — making it safe for any CSS `background-color` context.
|