@flamingo-stack/openframe-frontend-core 0.0.213 → 0.0.214
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-3JWIJJ44.js → chunk-5OWDOFKK.js} +2 -2
- package/dist/{chunk-IK2X5YJU.js → chunk-HWY35EAK.js} +2 -2
- package/dist/{chunk-OTKJASSX.cjs → chunk-IZL2KEH6.cjs} +24 -24
- package/dist/{chunk-OTKJASSX.cjs.map → chunk-IZL2KEH6.cjs.map} +1 -1
- package/dist/{chunk-35XIT2CF.cjs → chunk-KDNGUYZM.cjs} +17 -17
- package/dist/{chunk-35XIT2CF.cjs.map → chunk-KDNGUYZM.cjs.map} +1 -1
- package/dist/{chunk-ZTJVRSN5.js → chunk-UKND27XC.js} +2 -2
- package/dist/chunk-UKND27XC.js.map +1 -0
- package/dist/{chunk-ZDF6F7ED.cjs → chunk-YZUUFTIK.cjs} +2 -2
- package/dist/chunk-YZUUFTIK.cjs.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/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-3JWIJJ44.js.map → chunk-5OWDOFKK.js.map} +0 -0
- /package/dist/{chunk-IK2X5YJU.js.map → chunk-HWY35EAK.js.map} +0 -0
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
A configurable
|
|
1
|
+
<!-- source-hash: 71df967a1bb27327de1d15d5c696e36b -->
|
|
2
|
+
A configurable, platform-aware footer component for Next.js (client-side) that renders navigation sections, social icons, branding, and custom content slots based on a `FooterConfig` object.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
- **UniversalFooter** - Internal component that renders the actual footer layout
|
|
8
|
-
- **FooterConfig** - TypeScript interface defining configuration options
|
|
9
|
-
- **FooterLink/FooterSection** - Type definitions for navigation structure
|
|
10
|
-
- **NavLinkSkeleton** - Loading skeleton for navigation links
|
|
6
|
+
**`Footer`** — Public entry point. Validates config presence and delegates to `UniversalFooter`. Returns `null` with a console warning if no config is provided.
|
|
11
7
|
|
|
12
|
-
|
|
8
|
+
**`UniversalFooter`** — Core rendering logic. Builds a responsive 4-column grid layout with:
|
|
9
|
+
- **Column 1:** Logo, platform name, description, social icons (`SocialIconRow`)
|
|
10
|
+
- **Dynamic sections:** Rendered from `config.sections[]`
|
|
11
|
+
- **Custom component slot:** `config.customComponent`
|
|
12
|
+
- **Right column slot:** `config.rightColumnContent` or relocated description via `config.moveDescriptionToRight`
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
**`FooterConfig`** — Interface driving all layout behavior. Key flags:
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
| Flag | Effect |
|
|
17
|
+
|------|--------|
|
|
18
|
+
| `moveDescriptionToRight` | Moves description to the right column |
|
|
19
|
+
| `keepBelowDescriptionLeft` | Keeps `belowDescriptionContent` in column 1 when description is moved |
|
|
20
|
+
| `hideSocialRow` | Suppresses the `SocialIconRow` |
|
|
21
|
+
| `backgroundColor` | ODS utility class override (default: `bg-ods-bg-card`) |
|
|
22
|
+
|
|
23
|
+
**`renderLink`** — Optional prop to override the default anchor renderer per link.
|
|
22
24
|
|
|
23
25
|
## Usage Example
|
|
24
26
|
|
|
25
27
|
```typescript
|
|
26
|
-
import { Footer } from
|
|
28
|
+
import { Footer } from "@/components/footer"
|
|
27
29
|
|
|
28
|
-
const
|
|
29
|
-
name: "
|
|
30
|
+
const config: FooterConfig = {
|
|
31
|
+
name: "Flamingo",
|
|
30
32
|
legalName: "Flamingo Technologies Inc.",
|
|
31
|
-
description: "AI-powered MSP platform
|
|
32
|
-
backgroundColor: "bg-ods-bg-card",
|
|
33
|
+
description: "AI-powered MSP platform.",
|
|
33
34
|
sections: [
|
|
34
35
|
{
|
|
35
36
|
title: "Product",
|
|
36
37
|
links: [
|
|
37
|
-
{ href: "/
|
|
38
|
-
{ href: "/pricing", label: "Pricing" }
|
|
39
|
-
]
|
|
40
|
-
}
|
|
38
|
+
{ href: "/openframe", label: "OpenFrame" },
|
|
39
|
+
{ href: "/pricing", label: "Pricing" },
|
|
40
|
+
],
|
|
41
|
+
},
|
|
41
42
|
],
|
|
42
43
|
social: {
|
|
43
|
-
github: "https://github.com/flamingo
|
|
44
|
-
twitter: "https://twitter.com/
|
|
45
|
-
}
|
|
44
|
+
github: "https://github.com/flamingo",
|
|
45
|
+
twitter: "https://twitter.com/flamingo",
|
|
46
|
+
},
|
|
47
|
+
backgroundColor: "bg-ods-system-greys-black",
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
export function
|
|
49
|
-
return <Footer config={
|
|
50
|
+
export default function Layout() {
|
|
51
|
+
return <Footer config={config} />
|
|
50
52
|
}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
The component automatically handles responsive breakpoints, Suspense loading states, and integrates with the ODS design system for consistent theming across the platform.
|
|
53
|
+
```
|
|
@@ -1,32 +1,42 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 0fcf2c17c123f63f9ecc989146d3d3d7 -->
|
|
2
|
+
Renders a responsive 2-row decorative icon grid that fills the viewport width, randomly distributing icons while avoiding adjacent duplicates. Used as a visual background/separator element.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
- **
|
|
6
|
+
- **`ResponsiveIconsBlock`** — Main exported component that calculates column count from viewport width and renders a grid of icons
|
|
7
|
+
- **`IconsBlockProps`** — Interface with optional `loading` boolean to force the placeholder skeleton state
|
|
8
|
+
- **`availableIcons`** — Static array of 12 icon components (custom SVGs + Lucide icons) defined outside the component to prevent re-instantiation
|
|
9
|
+
- **Seeded pseudo-random layout** — Uses `Date.now()` as a stable seed per mount to deterministically assign icons without adjacent repeats
|
|
10
10
|
|
|
11
11
|
## Usage Example
|
|
12
12
|
|
|
13
13
|
```typescript
|
|
14
14
|
import { ResponsiveIconsBlock } from './icons-block';
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
// Standard decorative separator
|
|
17
|
+
export default function PageHeader() {
|
|
17
18
|
return (
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
<>
|
|
20
|
+
<HeroSection />
|
|
20
21
|
<ResponsiveIconsBlock />
|
|
21
|
-
|
|
22
|
-
{/* Force loading state */}
|
|
23
|
-
<ResponsiveIconsBlock loading={true} />
|
|
24
|
-
|
|
25
|
-
{/* Responsive grid that adapts to screen width */}
|
|
26
|
-
<ResponsiveIconsBlock loading={false} />
|
|
27
|
-
</div>
|
|
22
|
+
</>
|
|
28
23
|
);
|
|
29
24
|
}
|
|
25
|
+
|
|
26
|
+
// Force loading skeleton (e.g. while parent data fetches)
|
|
27
|
+
export function LoadingLayout() {
|
|
28
|
+
return <ResponsiveIconsBlock loading={true} />;
|
|
29
|
+
}
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
## Behavior Notes
|
|
33
|
+
|
|
34
|
+
| State | Renders |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `loading={true}` | Pulsing `#2A2A2A` placeholder bar |
|
|
37
|
+
| Grid not yet computed | Same placeholder bar |
|
|
38
|
+
| Grid ready | Full icon grid |
|
|
39
|
+
|
|
40
|
+
- Column count recalculates on `window.resize` (`Math.ceil(width / 56) + 4`)
|
|
41
|
+
- All icons are forced to a muted gray (`grayscale + brightness` CSS filter) via an injected `<style>` block scoped to `.icons-block`
|
|
42
|
+
- Marked `aria-hidden="true"` throughout — purely decorative, no accessibility semantics
|
|
@@ -1,46 +1,55 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
|
|
1
|
+
<!-- source-hash: 31fb4dc0d85de6bd77dd4c3210fe1592 -->
|
|
2
|
+
Reusable React component for interactive image cropping, supporting drag/resize, zoom, rotation, circular crop mode, and PNG export via canvas.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
### `ImageCropperResult`
|
|
7
|
+
Return type from a confirmed crop operation.
|
|
8
|
+
|
|
9
|
+
| Field | Type | Description |
|
|
10
|
+
|-------|------|-------------|
|
|
11
|
+
| `dataUrl` | `string` | Cropped PNG as a data URI |
|
|
12
|
+
| `blob` | `Blob` | Corresponding PNG Blob |
|
|
13
|
+
|
|
14
|
+
### `ImageCropperProps`
|
|
15
|
+
|
|
16
|
+
| Prop | Type | Default | Description |
|
|
17
|
+
|------|------|---------|-------------|
|
|
18
|
+
| `src` | `string` | — | Source image URL or data URI |
|
|
19
|
+
| `onComplete` | `(result) => void` | — | Fired when user confirms crop |
|
|
20
|
+
| `onCancel` | `() => void` | — | Fired when user cancels |
|
|
21
|
+
| `aspectRatio` | `number` | free-form | Width/height ratio |
|
|
22
|
+
| `circular` | `boolean` | `false` | Circular overlay for avatars |
|
|
23
|
+
| `maxSizePx` | `number` | `512` | Max exported image dimension |
|
|
24
|
+
| `className` | `string` | — | Wrapper class override |
|
|
25
|
+
|
|
26
|
+
### `ImageCropper`
|
|
27
|
+
Main component. Internally manages crop position, zoom (1–3×), and rotation (0–360°). On confirm, renders the crop to an off-screen `<canvas>`, scales it to `maxSizePx`, optionally clips to a circle, then resolves a PNG `Blob` + data URL.
|
|
28
|
+
|
|
29
|
+
**Keyboard shortcuts:** `Enter` confirms, `Escape` cancels.
|
|
11
30
|
|
|
12
31
|
## Usage Example
|
|
13
32
|
|
|
14
33
|
```typescript
|
|
15
|
-
import { ImageCropper, ImageCropperResult } from
|
|
16
|
-
|
|
17
|
-
function AvatarUpload() {
|
|
18
|
-
const [imageSrc, setImageSrc] = useState<string>('')
|
|
19
|
-
const [showCropper, setShowCropper] = useState(false)
|
|
34
|
+
import { ImageCropper, ImageCropperResult } from "@/components/image-cropper"
|
|
20
35
|
|
|
36
|
+
function AvatarEditor({ imageUrl }: { imageUrl: string }) {
|
|
21
37
|
const handleCropComplete = (result: ImageCropperResult) => {
|
|
22
|
-
//
|
|
23
|
-
console.log(
|
|
24
|
-
|
|
25
|
-
setShowCropper(false)
|
|
38
|
+
// Upload the blob or set preview via dataUrl
|
|
39
|
+
console.log("PNG data URL:", result.dataUrl)
|
|
40
|
+
uploadAvatar(result.blob)
|
|
26
41
|
}
|
|
27
42
|
|
|
28
43
|
return (
|
|
29
|
-
|
|
30
|
-
{
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
className="max-w-md mx-auto"
|
|
39
|
-
/>
|
|
40
|
-
)}
|
|
41
|
-
</>
|
|
44
|
+
<ImageCropper
|
|
45
|
+
src={imageUrl}
|
|
46
|
+
aspectRatio={1}
|
|
47
|
+
circular
|
|
48
|
+
maxSizePx={256}
|
|
49
|
+
onComplete={handleCropComplete}
|
|
50
|
+
onCancel={() => console.log("Cancelled")}
|
|
51
|
+
className="max-w-lg"
|
|
52
|
+
/>
|
|
42
53
|
)
|
|
43
54
|
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
The component uses react-easy-crop for the cropping interface, shadcn/ui components for controls, and includes keyboard accessibility (Enter to apply, Esc to cancel). It automatically scales exported images to prevent oversized outputs while maintaining quality.
|
|
55
|
+
```
|
package/src/components/.index.md
CHANGED
|
@@ -1,48 +1,42 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
Central export
|
|
1
|
+
<!-- source-hash: 6641c546041f6054d9c547ffd4f0f173 -->
|
|
2
|
+
Central barrel export file for the Flamingo/OpenFrame shared UI component library. Re-exports all components, hooks, and utilities from the component subdirectories and individual component modules, enabling single-import access across the platform.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
- `
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
**
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
- **Interactive:** `filter-chip`, `pagination`, `contact-button`, `join-waitlist-cta`
|
|
19
|
-
- **Loading States:** `dynamic-skeleton`, `content-loading-container`, `vendor-page-skeleton`
|
|
20
|
-
- **Specialized:** `auth-stub`, `date-time-picker`, `onboarding`, `product-release`
|
|
6
|
+
The file organizes exports into logical groups:
|
|
7
|
+
|
|
8
|
+
| Group | Source |
|
|
9
|
+
|---|---|
|
|
10
|
+
| **Component Directories** | `chat`, `features`, `icons`, `navigation`, `platform`, `ui` |
|
|
11
|
+
| **Individual Components** | `announcement-bar`, `media-carousel`, `pricing-display`, `vendor-display-button`, etc. |
|
|
12
|
+
| **Shared Modules** | `onboarding`, `product-release`, `dev-section`, `roadmap`, `delivery`, `legal-document` |
|
|
13
|
+
| **Utilities** | `unified-filter-logic`, `unified-pagination`, `persistent-filter-controls` |
|
|
14
|
+
| **Auth & Loading** | `auth-stub`, `loading` |
|
|
15
|
+
| **Date/Time** | `date-time-picker` |
|
|
16
|
+
|
|
17
|
+
Notable named export: `DetailPageSkeleton` and its `DetailPageSkeletonProps` type are explicitly re-exported from `./shared/detail-page-skeleton`.
|
|
21
18
|
|
|
22
19
|
## Usage Example
|
|
23
20
|
|
|
24
21
|
```typescript
|
|
25
|
-
//
|
|
26
|
-
import {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div>
|
|
40
|
-
<MediaCarousel images={productImages} />
|
|
41
|
-
<PricingDisplay price={pricing} />
|
|
42
|
-
<VendorDisplayButton vendor={vendor} />
|
|
43
|
-
</div>
|
|
44
|
-
)
|
|
45
|
-
}
|
|
22
|
+
// Instead of deep imports across many paths:
|
|
23
|
+
import { VendorIcon } from '@flamingo/components/vendor-icon'
|
|
24
|
+
import { Pagination } from '@flamingo/components/pagination'
|
|
25
|
+
|
|
26
|
+
// Import everything from the single barrel:
|
|
27
|
+
import {
|
|
28
|
+
VendorIcon,
|
|
29
|
+
Pagination,
|
|
30
|
+
DetailPageSkeleton,
|
|
31
|
+
type DetailPageSkeletonProps,
|
|
32
|
+
MspDisplay,
|
|
33
|
+
MediaCarousel,
|
|
34
|
+
UnifiedFilterLogic,
|
|
35
|
+
} from '@flamingo/components'
|
|
46
36
|
```
|
|
47
37
|
|
|
48
|
-
|
|
38
|
+
## Notes
|
|
39
|
+
|
|
40
|
+
- Marked `"use client"` — all exported components are React Client Components (Next.js App Router compatible).
|
|
41
|
+
- `PageContainer` is intentionally not re-exported here; it is already available via `./ui/page-container`.
|
|
42
|
+
- Duplicate `chat` export exists in the file; only one is resolved at runtime.
|
package/src/components/.input.md
CHANGED
|
@@ -1,44 +1,40 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
A
|
|
1
|
+
<!-- source-hash: 5d248f58ad416e0486c3eb74baeb29fc -->
|
|
2
|
+
A styled, accessible HTML input component built with `React.forwardRef`, supporting error states and full HTML input attribute passthrough.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
-
|
|
7
|
-
-
|
|
6
|
+
- **`Input`** — Forwarded-ref input component with ODS (OpenFrame Design System) theming, focus/disabled states, hover animations, and optional error styling
|
|
7
|
+
- **`InputProps`** — Extended interface adding an `invalid` boolean prop on top of standard `React.InputHTMLAttributes<HTMLInputElement>`
|
|
8
8
|
|
|
9
9
|
## Usage Example
|
|
10
10
|
|
|
11
11
|
```typescript
|
|
12
|
-
import { Input } from
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
invalid={hasError}
|
|
31
|
-
className="mb-2"
|
|
32
|
-
/>
|
|
33
|
-
|
|
34
|
-
<Input
|
|
35
|
-
type="file"
|
|
36
|
-
accept="image/*"
|
|
37
|
-
className="file:mr-4 file:py-2 file:px-4"
|
|
38
|
-
/>
|
|
39
|
-
</div>
|
|
40
|
-
)
|
|
41
|
-
}
|
|
12
|
+
import { Input } from "./input"
|
|
13
|
+
|
|
14
|
+
// Basic usage
|
|
15
|
+
<Input placeholder="Enter your email" type="email" />
|
|
16
|
+
|
|
17
|
+
// With error state
|
|
18
|
+
<Input
|
|
19
|
+
type="text"
|
|
20
|
+
invalid={true}
|
|
21
|
+
placeholder="Invalid field"
|
|
22
|
+
/>
|
|
23
|
+
|
|
24
|
+
// With ref forwarding
|
|
25
|
+
const ref = React.useRef<HTMLInputElement>(null)
|
|
26
|
+
<Input ref={ref} type="text" />
|
|
27
|
+
|
|
28
|
+
// Disabled state
|
|
29
|
+
<Input disabled placeholder="Not editable" />
|
|
42
30
|
```
|
|
43
31
|
|
|
44
|
-
|
|
32
|
+
## Styling Highlights
|
|
33
|
+
|
|
34
|
+
| State | Applied Classes |
|
|
35
|
+
|-------|----------------|
|
|
36
|
+
| Default | `bg-ods-card border-ods-border text-ods-text-primary` |
|
|
37
|
+
| Hover | `hover:border-ods-accent/30` |
|
|
38
|
+
| Focus | `focus:border-ods-accent focus-visible:ring-ods-accent/20` |
|
|
39
|
+
| Disabled | `disabled:cursor-not-allowed disabled:bg-ods-bg` |
|
|
40
|
+
| Invalid | `border-red-500 focus-visible:ring-red-500` |
|
|
@@ -1,45 +1,56 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
A
|
|
1
|
+
<!-- source-hash: a6c222ce8e1ab58308ac9ed1a6a4776e -->
|
|
2
|
+
A scrollable log viewer component that renders a list of `LogEntry` items with severity indicators, timestamps, and optional tool icons, connected by visual timeline connectors.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `LogsList` | `React.ForwardRefExoticComponent` | Main container that renders a scrollable, bordered list of log entries |
|
|
9
|
+
| `LogCard` | `React.FC` (internal) | Individual log row with severity dot, title, formatted timestamp, and optional tool icon |
|
|
10
|
+
| `formatTimestamp` | `function` (internal) | Formats a `string \| Date` into `YYYY/MM/DD,HH:mm` display format |
|
|
11
|
+
|
|
12
|
+
### `LogsList` Props (`LogsListProps`)
|
|
13
|
+
|
|
14
|
+
| Prop | Default | Description |
|
|
15
|
+
|------|---------|-------------|
|
|
16
|
+
| `logs` | — | Array of `LogEntry` items to display |
|
|
17
|
+
| `maxHeight` | `'400px'` | Container max height; use `'100%'` for full-height flex layout |
|
|
18
|
+
| `showConnector` | `true` | Renders vertical timeline connector lines between entries |
|
|
19
|
+
| `onLogClick` | — | Callback fired with the clicked `LogEntry` |
|
|
20
|
+
| `loading` | `false` | Shows a loading state placeholder |
|
|
21
|
+
| `emptyMessage` | `'No logs to display'` | Message shown when `logs` is empty |
|
|
22
|
+
| `className` | — | Additional Tailwind classes for the container |
|
|
9
23
|
|
|
10
24
|
## Usage Example
|
|
11
25
|
|
|
12
26
|
```typescript
|
|
13
|
-
import { LogsList } from './logs-list'
|
|
14
|
-
import { LogEntry } from '
|
|
27
|
+
import { LogsList } from './components/logs-list'
|
|
28
|
+
import { LogEntry } from './types/logs.types'
|
|
15
29
|
|
|
16
30
|
const logs: LogEntry[] = [
|
|
17
31
|
{
|
|
18
32
|
id: '1',
|
|
19
|
-
title: '
|
|
33
|
+
title: 'Agent task completed successfully',
|
|
20
34
|
severity: 'info',
|
|
21
35
|
timestamp: new Date(),
|
|
22
|
-
toolType: '
|
|
36
|
+
toolType: 'bash',
|
|
23
37
|
},
|
|
24
38
|
{
|
|
25
|
-
id: '2',
|
|
26
|
-
title: '
|
|
27
|
-
severity: '
|
|
28
|
-
timestamp: '2024-01-15T10:30:00Z'
|
|
29
|
-
}
|
|
39
|
+
id: '2',
|
|
40
|
+
title: 'Connection timeout detected',
|
|
41
|
+
severity: 'warning',
|
|
42
|
+
timestamp: '2024-01-15T10:30:00Z',
|
|
43
|
+
},
|
|
30
44
|
]
|
|
31
45
|
|
|
32
|
-
function
|
|
46
|
+
export default function LogsPanel() {
|
|
33
47
|
return (
|
|
34
48
|
<LogsList
|
|
35
49
|
logs={logs}
|
|
36
50
|
maxHeight="500px"
|
|
37
51
|
showConnector={true}
|
|
38
|
-
onLogClick={(log) => console.log('
|
|
39
|
-
emptyMessage="No logs available"
|
|
52
|
+
onLogClick={(log) => console.log('Selected:', log.id)}
|
|
40
53
|
/>
|
|
41
54
|
)
|
|
42
55
|
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
The component supports loading states, empty states, keyboard navigation, and visual connectors between log entries for a timeline-like appearance.
|
|
56
|
+
```
|
|
@@ -1,49 +1,48 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
A
|
|
1
|
+
<!-- source-hash: 3e808df6d9836b82a787de725d9821af -->
|
|
2
|
+
A responsive, accessible media carousel component supporting images, videos (MP4/HLS via MuxPlayer), and YouTube embeds with thumbnail navigation, swipe gestures, and keyboard controls.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
### `MediaCarousel` (default export)
|
|
7
|
+
A memoized React component with the following props:
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Default | Description |
|
|
10
|
+
|------|------|---------|-------------|
|
|
11
|
+
| `media` | `MediaItem[]` | — | Array of media items to display |
|
|
12
|
+
| `className` | `string` | — | Additional CSS classes |
|
|
13
|
+
| `aspectRatio` | `'16/9' \| '4/3' \| '3/2' \| '1/1'` | `'16/9'` | Container aspect ratio |
|
|
14
|
+
| `showThumbnails` | `boolean` | `true` | Toggle thumbnail strip |
|
|
15
|
+
| `autoPlay` | `boolean` | `false` | Auto-advance slides |
|
|
16
|
+
| `objectFit` | `'contain' \| 'cover'` | `'contain'` | Image fit behavior |
|
|
17
|
+
|
|
18
|
+
### Internal Renderers
|
|
19
|
+
- `renderImage` — renders images with lazy loading and error fallback
|
|
20
|
+
- `renderVideo` — delegates to `<Video>` (MuxPlayer facade) for MP4/HLS
|
|
21
|
+
- `renderYouTubeEmbed` — delegates to `<Video>` with `kind="youtube"` for lite-youtube embed
|
|
22
|
+
- `renderThumbnail` — clickable thumbnail with active indicator and video play overlay
|
|
11
23
|
|
|
12
24
|
## Usage Example
|
|
13
25
|
|
|
14
26
|
```typescript
|
|
15
27
|
import { MediaCarousel } from './media-carousel';
|
|
28
|
+
import { MediaItem } from '../utils/media-carousel-utils-stub';
|
|
16
29
|
|
|
17
|
-
const
|
|
18
|
-
{
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
alt: 'Sample image'
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
type: 'video' as const,
|
|
25
|
-
src: '/videos/demo.mp4',
|
|
26
|
-
poster: '/images/video-thumb.jpg',
|
|
27
|
-
alt: 'Demo video'
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
type: 'youtube' as const,
|
|
31
|
-
src: 'https://youtube.com/watch?v=dQw4w9WgXcQ',
|
|
32
|
-
alt: 'YouTube video'
|
|
33
|
-
}
|
|
30
|
+
const items: MediaItem[] = [
|
|
31
|
+
{ type: 'image', src: 'https://example.com/photo.jpg', alt: 'Photo' },
|
|
32
|
+
{ type: 'youtube', src: 'https://youtube.com/watch?v=dQw4w9WgXcQ', alt: 'Demo' },
|
|
33
|
+
{ type: 'video', src: 'https://example.com/clip.mp4', poster: 'https://example.com/thumb.jpg' },
|
|
34
34
|
];
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
objectFit="contain"
|
|
43
|
-
className="max-w-4xl mx-auto"
|
|
44
|
-
/>
|
|
45
|
-
);
|
|
46
|
-
}
|
|
36
|
+
<MediaCarousel
|
|
37
|
+
media={items}
|
|
38
|
+
aspectRatio="16/9"
|
|
39
|
+
showThumbnails={true}
|
|
40
|
+
objectFit="contain"
|
|
41
|
+
/>
|
|
47
42
|
```
|
|
48
43
|
|
|
49
|
-
|
|
44
|
+
## Interaction Support
|
|
45
|
+
- **Keyboard**: `←` / `→` arrow keys when carousel is focused
|
|
46
|
+
- **Touch/Swipe**: 50px minimum swipe distance triggers slide change
|
|
47
|
+
- **Hover**: Navigation arrows reveal on hover; hidden for single-item carousels
|
|
48
|
+
- **Accessibility**: `role="region"` and `aria-label` applied when multiple items exist
|
|
@@ -1,31 +1,48 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
A
|
|
1
|
+
<!-- source-hash: 86b90e3350490d5e683b6b4b06497f43 -->
|
|
2
|
+
A Next.js client component that renders a responsive marketing section showcasing OpenFrame's open-source value propositions as a 4-column feature card grid.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
- **`FeatureCard`**
|
|
7
|
-
- **`OpenSourceFeatures`**
|
|
8
|
-
- **`
|
|
6
|
+
- **`FeatureCard`** — Reusable card component accepting an icon, title, and description; renders with hover transition styling using ODS design tokens
|
|
7
|
+
- **`OpenSourceFeatures`** — Main section component that composes the feature grid with a headline and four predefined feature entries
|
|
8
|
+
- **`features` array** — Static data defining the four pillars: *Built on FOSS*, *Own Your Stack*, *Modular by Design*, and *Community-Powered*
|
|
9
|
+
|
|
10
|
+
## Props
|
|
11
|
+
|
|
12
|
+
### `FeatureCardProps`
|
|
13
|
+
|
|
14
|
+
| Prop | Type | Description |
|
|
15
|
+
|------|------|-------------|
|
|
16
|
+
| `icon` | `React.ReactNode` | Lucide icon element rendered in the card header |
|
|
17
|
+
| `title` | `string` | Feature headline text |
|
|
18
|
+
| `description` | `string` | Supporting body copy |
|
|
9
19
|
|
|
10
20
|
## Usage Example
|
|
11
21
|
|
|
12
22
|
```typescript
|
|
13
|
-
import OpenSourceFeatures from '
|
|
23
|
+
import OpenSourceFeatures from '@/components/open-source-features';
|
|
14
24
|
|
|
15
|
-
//
|
|
16
|
-
function
|
|
25
|
+
// Drop into any page layout — no props required
|
|
26
|
+
export default function LandingPage() {
|
|
17
27
|
return (
|
|
18
|
-
<
|
|
28
|
+
<main>
|
|
19
29
|
<OpenSourceFeatures />
|
|
20
|
-
</
|
|
30
|
+
</main>
|
|
21
31
|
);
|
|
22
32
|
}
|
|
23
33
|
```
|
|
24
34
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
35
|
+
To add a custom feature card standalone:
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
import { FeatureCard } from '@/components/open-source-features';
|
|
39
|
+
import { Shield } from 'lucide-react';
|
|
40
|
+
|
|
41
|
+
<FeatureCard
|
|
42
|
+
icon={<Shield className="w-6 h-6" />}
|
|
43
|
+
title="Secure by Default"
|
|
44
|
+
description="Auditable code with no vendor lock-in."
|
|
45
|
+
/>
|
|
46
|
+
```
|
|
30
47
|
|
|
31
|
-
|
|
48
|
+
> **Note:** `FeatureCard` is not a named export by default — export it explicitly if reuse outside this component is needed. The section uses ODS design tokens (`ods-card`, `ods-border`, `ods-accent`) from the OpenFrame design system.
|