@flamingo-stack/openframe-frontend-core 0.0.212 → 0.0.213-snapshot.20260528174436
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-QKFBZLIR.js → chunk-5OWDOFKK.js} +2 -2
- package/dist/chunk-CZR7ARBA.js +698 -0
- package/dist/chunk-CZR7ARBA.js.map +1 -0
- package/dist/{chunk-UYQOPC57.js → chunk-HICZPTRR.js} +4 -351
- package/dist/chunk-HICZPTRR.js.map +1 -0
- package/dist/{chunk-5BNWGK6D.js → chunk-HWY35EAK.js} +3 -3
- package/dist/{chunk-VTUIMMHO.cjs → chunk-IZL2KEH6.cjs} +26 -26
- package/dist/{chunk-VTUIMMHO.cjs.map → chunk-IZL2KEH6.cjs.map} +1 -1
- package/dist/{chunk-ZFBLC5GV.cjs → chunk-KDNGUYZM.cjs} +17 -17
- package/dist/{chunk-ZFBLC5GV.cjs.map → chunk-KDNGUYZM.cjs.map} +1 -1
- package/dist/chunk-OZ3GH6OQ.cjs +698 -0
- package/dist/chunk-OZ3GH6OQ.cjs.map +1 -0
- package/dist/{chunk-3E5ANY55.js → chunk-UKND27XC.js} +410 -544
- package/dist/chunk-UKND27XC.js.map +1 -0
- package/dist/{chunk-EH3RWVF3.cjs → chunk-WT5JV2GS.cjs} +8 -355
- package/dist/chunk-WT5JV2GS.cjs.map +1 -0
- package/dist/{chunk-WI76ZUBE.cjs → chunk-YZUUFTIK.cjs} +545 -679
- package/dist/chunk-YZUUFTIK.cjs.map +1 -0
- package/dist/components/chat/hooks/use-jetstream-dialog-subscription.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-nats-dialog-subscription.d.ts +0 -9
- package/dist/components/chat/hooks/use-nats-dialog-subscription.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +5 -4
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.js +4 -3
- package/dist/components/contact/index.cjs +6 -5
- package/dist/components/contact/index.cjs.map +1 -1
- package/dist/components/contact/index.js +5 -4
- package/dist/components/features/index.cjs +5 -4
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.js +4 -3
- package/dist/components/features/notifications/index.d.ts +2 -2
- package/dist/components/features/notifications/index.d.ts.map +1 -1
- package/dist/components/features/notifications/notifications-context.d.ts +16 -1
- package/dist/components/features/notifications/notifications-context.d.ts.map +1 -1
- package/dist/components/features/notifications/types.d.ts +4 -0
- package/dist/components/features/notifications/types.d.ts.map +1 -1
- package/dist/components/index.cjs +55 -54
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +7 -6
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/app-header.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +5 -4
- package/dist/components/navigation/index.cjs.map +1 -1
- package/dist/components/navigation/index.js +4 -3
- package/dist/components/tickets/index.cjs +66 -65
- package/dist/components/tickets/index.cjs.map +1 -1
- package/dist/components/tickets/index.js +6 -5
- package/dist/components/tickets/index.js.map +1 -1
- package/dist/components/ui/index.cjs +5 -4
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +4 -3
- package/dist/embed-shims/index.cjs +3 -3
- package/dist/embed-shims/index.cjs.map +1 -1
- package/dist/embed-shims/index.js +4 -4
- package/dist/hooks/index.cjs +3 -2
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.js +2 -1
- package/dist/index.cjs +5 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -3
- package/dist/nats/index.cjs +28 -346
- package/dist/nats/index.cjs.map +1 -1
- package/dist/nats/index.d.ts +3 -0
- package/dist/nats/index.d.ts.map +1 -1
- package/dist/nats/index.js +30 -346
- package/dist/nats/index.js.map +1 -1
- package/dist/nats/nats-provider.d.ts +28 -0
- package/dist/nats/nats-provider.d.ts.map +1 -0
- package/dist/nats/nats.d.ts +1 -0
- package/dist/nats/nats.d.ts.map +1 -1
- package/dist/nats/shared-connection.d.ts +73 -0
- package/dist/nats/shared-connection.d.ts.map +1 -0
- package/dist/nats/use-nats-subscription.d.ts +18 -0
- package/dist/nats/use-nats-subscription.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/.index.md +36 -34
- package/src/components/.alert-dialog.md +27 -23
- package/src/components/.announcement-bar.md +26 -21
- package/src/components/.breadcrumb.md +19 -15
- package/src/components/.calendar.md +24 -19
- package/src/components/.categories-cart.md +29 -24
- package/src/components/.checkbox.md +23 -25
- package/src/components/.chevron-button.md +37 -32
- package/src/components/.comment-card.md +32 -62
- package/src/components/.dialog.md +26 -26
- package/src/components/.dynamic-skeleton.md +54 -57
- package/src/components/.empty-state.md +42 -51
- package/src/components/.faq-accordion.md +27 -21
- package/src/components/.filter-chip.md +41 -24
- package/src/components/.flamingo-logo.md +20 -23
- package/src/components/.footer-waitlist-button.md +29 -22
- package/src/components/.footer.md +32 -32
- package/src/components/.icons-block.md +27 -17
- package/src/components/.image-cropper.md +41 -32
- package/src/components/.index.md +33 -39
- package/src/components/.input.md +31 -35
- package/src/components/.logs-list.md +31 -20
- package/src/components/.media-carousel.md +35 -36
- package/src/components/.open-source-features.md +33 -16
- package/src/components/.pagination.md +52 -51
- package/src/components/.provider-button.md +21 -23
- package/src/components/.select.md +31 -20
- package/src/components/.sidebar.md +34 -24
- package/src/components/.smooth-accordion.md +29 -24
- package/src/components/.social-icon-row.md +36 -32
- package/src/components/.textarea.md +25 -31
- package/src/components/.tool-icon.md +24 -26
- package/src/components/.unified-filter-logic.md +37 -30
- package/src/components/.unified-pagination.md +23 -22
- package/src/components/.user-summary-stub.md +38 -22
- package/src/components/.vendor-display-button.md +25 -25
- package/src/components/.vendor-icon.md +33 -25
- package/src/components/.why-it-matters.md +28 -25
- package/src/components/chat/.approval-batch-message.md +51 -0
- package/src/components/chat/.approval-request-message.md +35 -34
- package/src/components/chat/.chat-attachment-bar.md +64 -0
- package/src/components/chat/.chat-container.md +36 -18
- package/src/components/chat/.chat-input.md +37 -20
- package/src/components/chat/.chat-message-enhanced.md +30 -49
- package/src/components/chat/.chat-message-list.md +45 -32
- package/src/components/chat/.chat-message-skeleton.md +26 -22
- package/src/components/chat/.chat-panel-context.md +52 -0
- package/src/components/chat/.chat-ref.types.md +42 -0
- package/src/components/chat/.chat-sidebar-skeleton.md +34 -25
- package/src/components/chat/.chat-sidebar.md +31 -26
- package/src/components/chat/.chat-ticket-list.md +39 -0
- package/src/components/chat/.context-compaction-display.md +36 -0
- package/src/components/chat/.cycling-phrase.md +52 -0
- package/src/components/chat/.embeddable-chat.md +48 -0
- package/src/components/chat/.expand-chevron.md +24 -0
- package/src/components/chat/.index.md +31 -35
- package/src/components/chat/.mingo-onboarding-card-skeleton.md +44 -0
- package/src/components/chat/.mingo-onboarding-card.md +62 -0
- package/src/components/chat/.model-display.md +32 -30
- package/src/components/chat/.nav-link-anchor-via-runtime.md +40 -0
- package/src/components/chat/.remark-card-links.md +38 -0
- package/src/components/chat/.slash-command-suggestions.md +47 -0
- package/src/components/chat/.source-action-button.md +48 -0
- package/src/components/chat/.thinking-display.md +42 -0
- package/src/components/chat/.tool-call-blocks.md +45 -0
- package/src/components/chat/.tool-execution-display.md +44 -36
- package/src/components/chat/chat-container.tsx +1 -1
- package/src/components/chat/entity-cards/.admin-content-card.md +43 -0
- package/src/components/chat/entity-cards/.block-card.md +47 -0
- package/src/components/chat/entity-cards/.blog-card.md +52 -0
- package/src/components/chat/entity-cards/.blog-image-placeholder.md +39 -0
- package/src/components/chat/entity-cards/.campaign-card-admin.md +47 -0
- package/src/components/chat/entity-cards/.case-study-card.md +58 -0
- package/src/components/chat/entity-cards/.chat-ticket-item.md +40 -0
- package/src/components/chat/entity-cards/.chat-video-entity-card.md +43 -0
- package/src/components/chat/entity-cards/.customer-interview-card.md +53 -0
- package/src/components/chat/entity-cards/.data-room-doc-card.md +47 -0
- package/src/components/chat/entity-cards/.dispatch.md +39 -0
- package/src/components/chat/entity-cards/.entity-author-card.md +51 -0
- package/src/components/chat/entity-cards/.generic-entity-card.md +62 -0
- package/src/components/chat/entity-cards/.github-activity-card.md +61 -0
- package/src/components/chat/entity-cards/.hubspot-ticket-card.md +53 -0
- package/src/components/chat/entity-cards/.index.md +66 -0
- package/src/components/chat/entity-cards/.investor-update-card.md +47 -0
- package/src/components/chat/entity-cards/.onboarding-guide-card.md +58 -0
- package/src/components/chat/entity-cards/.product-release-card-defaults.md +31 -0
- package/src/components/chat/entity-cards/.product-release-card.md +29 -0
- package/src/components/chat/entity-cards/.program-card-defaults.md +41 -0
- package/src/components/chat/entity-cards/.program-card.md +59 -0
- package/src/components/chat/entity-cards/.roadmap-card.md +46 -0
- package/src/components/chat/entity-cards/.roadmap-vote-button.md +52 -0
- package/src/components/chat/entity-cards/.slack-message-card.md +48 -0
- package/src/components/chat/entity-cards/.task-type-icon.md +47 -0
- package/src/components/chat/hooks/.index.md +36 -21
- package/src/components/chat/hooks/.use-chat-attachment-image-gallery.md +51 -0
- package/src/components/chat/hooks/.use-chat-attachments.md +48 -0
- package/src/components/chat/hooks/.use-chat-card-item.md +39 -0
- package/src/components/chat/hooks/.use-chat-identity.md +45 -0
- package/src/components/chat/hooks/.use-chat.md +58 -0
- package/src/components/chat/hooks/.use-chunk-catchup.md +46 -48
- package/src/components/chat/hooks/.use-close-on-navigation.md +44 -0
- package/src/components/chat/hooks/.use-collapsible.md +48 -0
- package/src/components/chat/hooks/.use-embedded-chat.md +32 -0
- package/src/components/chat/hooks/.use-jetstream-dialog-subscription.md +40 -0
- package/src/components/chat/hooks/.use-nats-chat-adapter.md +52 -0
- package/src/components/chat/hooks/.use-nats-dialog-subscription.md +49 -30
- package/src/components/chat/hooks/.use-proxied-image-url.md +40 -0
- package/src/components/chat/hooks/.use-realtime-chunk-processor.md +43 -40
- package/src/components/chat/hooks/.use-slash-commands.md +46 -0
- package/src/components/chat/hooks/.use-sse-chat-adapter.md +34 -0
- package/src/components/chat/hooks/.use-sse.md +60 -0
- package/src/components/chat/hooks/.use-unified-chat.md +57 -0
- package/src/components/chat/hooks/use-jetstream-dialog-subscription.ts +60 -207
- package/src/components/chat/hooks/use-nats-dialog-subscription.ts +71 -214
- package/src/components/chat/types/.api.types.md +52 -38
- package/src/components/chat/types/.chat.types.md +43 -34
- package/src/components/chat/types/.component.types.md +47 -48
- package/src/components/chat/types/.index.md +20 -27
- package/src/components/chat/types/.message.types.md +58 -48
- package/src/components/chat/types/.network.types.md +57 -31
- package/src/components/chat/types/.processing.types.md +49 -31
- package/src/components/chat/types/.unified-chat-state.types.md +41 -0
- package/src/components/chat/types/entities/.blog.md +43 -0
- package/src/components/chat/types/entities/.case-study.md +26 -0
- package/src/components/chat/types/entities/.content-ref.md +41 -0
- package/src/components/chat/types/entities/.customer-interview.md +28 -0
- package/src/components/chat/types/entities/.data-room-doc.md +36 -0
- package/src/components/chat/types/entities/.github-activity.md +43 -0
- package/src/components/chat/types/entities/.hubspot-ticket.md +53 -0
- package/src/components/chat/types/entities/.index.md +42 -0
- package/src/components/chat/types/entities/.investor-update.md +45 -0
- package/src/components/chat/types/entities/.onboarding-guide.md +50 -0
- package/src/components/chat/types/entities/.program-types.md +57 -0
- package/src/components/chat/types/entities/.roadmap-item.md +58 -0
- package/src/components/chat/types/entities/.slack-message.md +35 -0
- package/src/components/chat/utils/.agent-status-message.md +45 -0
- package/src/components/chat/utils/.auto-continuation-directive.md +58 -0
- package/src/components/chat/utils/.chat-attachment-markdown.md +54 -0
- package/src/components/chat/utils/.chat-authed-fetch.md +25 -0
- package/src/components/chat/utils/.chat-nav-resolution.md +46 -0
- package/src/components/chat/utils/.chat-proxy-auth-storage.md +38 -0
- package/src/components/chat/utils/.chip-action-class.md +34 -0
- package/src/components/chat/utils/.chip-styles.md +46 -0
- package/src/components/chat/utils/.chunk-parser.md +38 -28
- package/src/components/chat/utils/.clickup-task-type-utils.md +48 -0
- package/src/components/chat/utils/.compact-card-classes.md +62 -0
- package/src/components/chat/utils/.decide-new-tab.md +51 -0
- package/src/components/chat/utils/.external-app-urls.md +29 -0
- package/src/components/chat/utils/.extract-incomplete-message-state.md +25 -29
- package/src/components/chat/utils/.flatten-assistant-content.md +34 -0
- package/src/components/chat/utils/.icon-registry.md +46 -0
- package/src/components/chat/utils/.index.md +37 -32
- package/src/components/chat/utils/.is-cross-origin-url.md +35 -0
- package/src/components/chat/utils/.message-segment-accumulator.md +25 -34
- package/src/components/chat/utils/.nav-anchor-props.md +44 -0
- package/src/components/chat/utils/.nav-click-handler.md +47 -0
- package/src/components/chat/utils/.onboarding-icons.md +28 -0
- package/src/components/chat/utils/.process-historical-messages.md +46 -35
- package/src/components/chat/utils/.scroll-anchor.md +40 -0
- package/src/components/chat/utils/.slash-dispatch-utils.md +44 -0
- package/src/components/chat/utils/.source-icons.md +35 -0
- package/src/components/chat/utils/.source-row-cta.md +54 -0
- package/src/components/chat/utils/.tool-call-helpers.md +42 -0
- package/src/components/contact/.contact-form.md +43 -0
- package/src/components/contact/.index.md +27 -0
- package/src/components/features/.array-entry-manager.md +36 -45
- package/src/components/features/.changelog-manager.md +47 -21
- package/src/components/features/.changelog-sections-manager.md +21 -26
- package/src/components/features/.command-box.md +31 -28
- package/src/components/features/.entity-summary-editor.md +46 -0
- package/src/components/features/.entity-video-section.md +51 -0
- package/src/components/features/.figma-prototype-viewer.md +48 -29
- package/src/components/features/.filters-dropdown.md +33 -46
- package/src/components/features/.highlight-config-section.md +42 -0
- package/src/components/features/.highlight-generation-section.md +46 -0
- package/src/components/features/.highlight-video-combined-section.md +47 -0
- package/src/components/features/.highlight-video-preview.md +44 -0
- package/src/components/features/.highlight-video-section.md +47 -0
- package/src/components/features/.index.md +40 -66
- package/src/components/features/.media-gallery-manager.md +48 -38
- package/src/components/features/.more-about-button.md +22 -19
- package/src/components/features/.og-editor-preview.md +40 -36
- package/src/components/features/.parallax-image-showcase.md +33 -26
- package/src/components/features/.paths-display.md +42 -43
- package/src/components/features/.platform-badge.md +37 -36
- package/src/components/features/.platform-filter.md +23 -16
- package/src/components/features/.policy-configuration-panel.md +48 -56
- package/src/components/features/.provider-button.md +33 -36
- package/src/components/features/.push-button-selector.md +40 -29
- package/src/components/features/.release-media-manager.md +46 -31
- package/src/components/features/.section-selector.md +26 -31
- package/src/components/features/.select-button.md +35 -25
- package/src/components/features/.seo-editor-preview.md +41 -44
- package/src/components/features/.social-links-manager.md +25 -19
- package/src/components/features/.start-with-openframe-button.md +37 -29
- package/src/components/features/.status-filter-component.md +36 -20
- package/src/components/features/.tags-selector.md +40 -24
- package/src/components/features/.transcribe-and-summarize-combined-section.md +45 -0
- package/src/components/features/.transcribe-summarize-section.md +48 -0
- package/src/components/features/.transcript-summary-editor.md +53 -0
- package/src/components/features/.video-bites-display.md +46 -0
- package/src/components/features/.video-clips-section.md +41 -0
- package/src/components/features/.video-ratio-tabs.md +56 -0
- package/src/components/features/.video-source-selector.md +60 -0
- package/src/components/features/.video.md +44 -0
- package/src/components/features/.waitlist-form.md +60 -0
- package/src/components/features/ai-enrich/.AIEnrichButton.md +30 -27
- package/src/components/features/ai-enrich/.AIEnrichSection.md +46 -42
- package/src/components/features/board/.board-column-header.md +38 -0
- package/src/components/features/board/.board-column.md +43 -0
- package/src/components/features/board/.board.md +51 -0
- package/src/components/features/board/.color-utils.md +26 -0
- package/src/components/features/board/.index.md +56 -0
- package/src/components/features/board/.ticket-card-skeleton.md +38 -0
- package/src/components/features/board/.ticket-card.md +47 -0
- package/src/components/features/board/.types.md +45 -0
- package/src/components/features/board/.use-board-collapse.md +34 -0
- package/src/components/features/notifications/.index.md +57 -0
- package/src/components/features/notifications/.notification-drawer.md +34 -0
- package/src/components/features/notifications/.notification-tile.md +39 -0
- package/src/components/features/notifications/.notifications-context.md +73 -0
- package/src/components/features/notifications/.types.md +45 -0
- package/src/components/features/notifications/index.ts +2 -1
- package/src/components/features/notifications/notifications-context.tsx +104 -6
- package/src/components/features/notifications/types.ts +5 -0
- package/src/components/icons/.about-icon.md +20 -28
- package/src/components/icons/.ai-robot-icon.md +15 -17
- package/src/components/icons/.bash-icon.md +16 -23
- package/src/components/icons/.buildings-icon.md +10 -24
- package/src/components/icons/.capterra-icon.md +30 -26
- package/src/components/icons/.carta-icon.md +29 -0
- package/src/components/icons/.clickup-icon.md +26 -0
- package/src/components/icons/.cmd-icon.md +15 -22
- package/src/components/icons/.coins-icon.md +17 -25
- package/src/components/icons/.community-hub-icon.md +19 -25
- package/src/components/icons/.community-icon.md +24 -21
- package/src/components/icons/.compare-icon.md +32 -19
- package/src/components/icons/.copy-icon.md +29 -15
- package/src/components/icons/.custom-external-link-icon.md +19 -17
- package/src/components/icons/.custom-fork-icon.md +32 -21
- package/src/components/icons/.custom-license-icon.md +29 -25
- package/src/components/icons/.custom-star-icon.md +20 -28
- package/src/components/icons/.custom-time-icon.md +21 -22
- package/src/components/icons/.cut-vendor-costs-icon.md +6 -19
- package/src/components/icons/.dashboard-icon.md +13 -18
- package/src/components/icons/.deno-icon.md +16 -23
- package/src/components/icons/.donut-icon.md +12 -23
- package/src/components/icons/.double-chevron-icon.md +28 -36
- package/src/components/icons/.elestio-logo.md +13 -23
- package/src/components/icons/.empty-vendor-icon.md +16 -18
- package/src/components/icons/.explore-categories-icon.md +18 -29
- package/src/components/icons/.eye-icon.md +16 -26
- package/src/components/icons/.facebook-icon.md +9 -20
- package/src/components/icons/.figma-icon.md +8 -17
- package/src/components/icons/.filter-icon.md +15 -17
- package/src/components/icons/.flamingo-logo.md +28 -27
- package/src/components/icons/.folder-shield-icon.md +28 -19
- package/src/components/icons/.g2-icon.md +22 -21
- package/src/components/icons/.getapp-icon.md +25 -21
- package/src/components/icons/.github-icon.md +13 -25
- package/src/components/icons/.globe-icon.md +14 -19
- package/src/components/icons/.google-gemini-icon.md +16 -19
- package/src/components/icons/.google-logo.md +15 -21
- package/src/components/icons/.grid-view-icon.md +30 -19
- package/src/components/icons/.hamburger-icon.md +22 -20
- package/src/components/icons/.hand-dollar-icon.md +24 -34
- package/src/components/icons/.hotel-icon.md +27 -21
- package/src/components/icons/.icon-utils.md +28 -29
- package/src/components/icons/.image-icon.md +15 -22
- package/src/components/icons/.index.md +25 -28
- package/src/components/icons/.info-circle-icon.md +29 -30
- package/src/components/icons/.instagram-icon.md +10 -24
- package/src/components/icons/.jump-in-icon.md +18 -18
- package/src/components/icons/.linux-icon.md +18 -18
- package/src/components/icons/.log-out-icon.md +15 -23
- package/src/components/icons/.logs-icon.md +14 -23
- package/src/components/icons/.margin-crisis-icon.md +21 -20
- package/src/components/icons/.menu-icon.md +18 -19
- package/src/components/icons/.miami-cyber-gang-logo-face-only.md +18 -21
- package/src/components/icons/.miami-cyber-gang-logo.md +22 -14
- package/src/components/icons/.mlg-logo.md +18 -16
- package/src/components/icons/.moon-icon.md +32 -22
- package/src/components/icons/.ms-icon.md +30 -19
- package/src/components/icons/.nushell-icon.md +7 -21
- package/src/components/icons/.open-source-icon.md +19 -23
- package/src/components/icons/.openai-icon.md +9 -24
- package/src/components/icons/.openframe-ai-icons.md +25 -26
- package/src/components/icons/.openframe-logo.md +28 -22
- package/src/components/icons/.openframe-text.md +24 -27
- package/src/components/icons/.openmsp-logo.md +26 -23
- package/src/components/icons/.pilot-icon.md +23 -0
- package/src/components/icons/.powershell-icon.md +17 -22
- package/src/components/icons/.python-icon.md +16 -23
- package/src/components/icons/.queries-icon.md +13 -21
- package/src/components/icons/.reddit-icon.md +28 -24
- package/src/components/icons/.remote-control-icon.md +13 -17
- package/src/components/icons/.script-icon.md +27 -19
- package/src/components/icons/.search-icon.md +21 -21
- package/src/components/icons/.send-icon.md +14 -16
- package/src/components/icons/.settings-icon.md +30 -19
- package/src/components/icons/.shape-circle-dash-icon.md +16 -21
- package/src/components/icons/.shell-icon.md +15 -19
- package/src/components/icons/.shield-check-icon.md +18 -31
- package/src/components/icons/.shield-key-icon.md +25 -25
- package/src/components/icons/.shield-lock-icon.md +8 -18
- package/src/components/icons/.slack-icon.md +28 -32
- package/src/components/icons/.sparkles-icon.md +18 -23
- package/src/components/icons/.sso-configuration-icon.md +29 -16
- package/src/components/icons/.sun-icon.md +20 -18
- package/src/components/icons/.table-view-icon.md +17 -19
- package/src/components/icons/.telegram-icon.md +8 -22
- package/src/components/icons/.thumbs-down-icon.md +10 -19
- package/src/components/icons/.thumbs-up-icon.md +8 -17
- package/src/components/icons/.tool-directory-icons.md +24 -28
- package/src/components/icons/.trustpilot-icon.md +25 -22
- package/src/components/icons/.user-icon.md +26 -28
- package/src/components/icons/.users-group-icon.md +28 -24
- package/src/components/icons/.vendor-showcase-icons.md +21 -29
- package/src/components/icons/.vendors-icon.md +18 -22
- package/src/components/icons/.whatsapp-icon.md +30 -14
- package/src/components/icons/.x-icon.md +18 -23
- package/src/components/icons/.x-logo.md +13 -38
- package/src/components/icons/.youtube-icon.md +8 -19
- package/src/components/icons/device-type-icons/.get-device-type-icon.md +26 -34
- package/src/components/icons-v2-generated/.index.md +52 -0
- package/src/components/icons-v2-generated/alphabet/.index.md +33 -0
- package/src/components/icons-v2-generated/arrows/.index.md +39 -0
- package/src/components/icons-v2-generated/audio-and-visual/.index.md +40 -0
- package/src/components/icons-v2-generated/brand-logos/.elestio-logo-icon.md +40 -0
- package/src/components/icons-v2-generated/brand-logos/.gemini-logo-icon.md +37 -0
- package/src/components/icons-v2-generated/brand-logos/.google-gemini-logo-icon.md +33 -0
- package/src/components/icons-v2-generated/brand-logos/.index.md +38 -0
- package/src/components/icons-v2-generated/brand-logos/.meshcentral-logo-grey-icon.md +35 -0
- package/src/components/icons-v2-generated/brand-logos/.meshcentral-logo-icon.md +36 -0
- package/src/components/icons-v2-generated/buildings/.index.md +48 -0
- package/src/components/icons-v2-generated/charts/.index.md +40 -0
- package/src/components/icons-v2-generated/clothes/.index.md +48 -0
- package/src/components/icons-v2-generated/coding/.index.md +42 -0
- package/src/components/icons-v2-generated/communication/.index.md +39 -0
- package/src/components/icons-v2-generated/date-and-time/.index.md +29 -0
- package/src/components/icons-v2-generated/design/.index.md +39 -0
- package/src/components/icons-v2-generated/devices/.index.md +38 -0
- package/src/components/icons-v2-generated/documents/.index.md +38 -0
- package/src/components/icons-v2-generated/finance/.index.md +34 -0
- package/src/components/icons-v2-generated/food-and-drinks/.index.md +34 -0
- package/src/components/icons-v2-generated/food-and-drinks/.leafy-green-icon.md +36 -0
- package/src/components/icons-v2-generated/food-and-drinks/.strawberry-icon.md +39 -0
- package/src/components/icons-v2-generated/health/.index.md +40 -0
- package/src/components/icons-v2-generated/household/.index.md +45 -0
- package/src/components/icons-v2-generated/interface/.index.md +36 -0
- package/src/components/icons-v2-generated/map-and-travel/.index.md +41 -0
- package/src/components/icons-v2-generated/media-playback/.index.md +51 -0
- package/src/components/icons-v2-generated/number/.index.md +41 -0
- package/src/components/icons-v2-generated/school/.index.md +37 -0
- package/src/components/icons-v2-generated/security/.fingerprint-icon.md +38 -0
- package/src/components/icons-v2-generated/security/.index.md +39 -0
- package/src/components/icons-v2-generated/shopping/.index.md +42 -0
- package/src/components/icons-v2-generated/signs-and-symbols/.index.md +32 -0
- package/src/components/icons-v2-generated/sort-and-filter/.index.md +35 -0
- package/src/components/icons-v2-generated/sport/.index.md +41 -0
- package/src/components/icons-v2-generated/text-editor/.index.md +44 -0
- package/src/components/icons-v2-generated/users/.index.md +45 -0
- package/src/components/icons-v2-generated/vehicles-and-delivery/.index.md +36 -0
- package/src/components/icons-v2-generated/weather-and-nature/.flower-sakura-icon.md +36 -0
- package/src/components/icons-v2-generated/weather-and-nature/.index.md +34 -0
- package/src/components/layout/.article-detail-layout.md +43 -0
- package/src/components/layout/.back-button.md +40 -0
- package/src/components/layout/.list-page-layout.md +35 -26
- package/src/components/layout/.page-container.md +27 -38
- package/src/components/layout/.page-layout.md +50 -0
- package/src/components/layout/.title-block.md +42 -0
- package/src/components/loading/.card-skeleton.md +38 -29
- package/src/components/loading/.device-card-skeleton.md +29 -25
- package/src/components/loading/.index.md +39 -46
- package/src/components/loading/.margin-report-skeleton.md +45 -34
- package/src/components/loading/.organization-card-skeleton.md +39 -44
- package/src/components/loading/.page-layout-skeleton.md +34 -45
- package/src/components/loading/.unified-skeleton.md +62 -36
- package/src/components/navigation/.app-header.md +40 -29
- package/src/components/navigation/.app-layout.md +25 -26
- package/src/components/navigation/.header-global-search.md +34 -37
- package/src/components/navigation/.header-organization-filter.md +23 -22
- package/src/components/navigation/.header.md +31 -35
- package/src/components/navigation/.mobile-burger-menu.md +39 -47
- package/src/components/navigation/.mobile-nav-panel.md +51 -32
- package/src/components/navigation/.navigation-sidebar-header.md +36 -0
- package/src/components/navigation/.navigation-sidebar-item.md +45 -0
- package/src/components/navigation/.navigation-sidebar-toggle.md +38 -0
- package/src/components/navigation/.navigation-sidebar.md +33 -34
- package/src/components/navigation/.sliding-sidebar.md +52 -41
- package/src/components/navigation/.sticky-section-nav.md +56 -48
- package/src/components/navigation/app-header.tsx +7 -9
- package/src/components/platform/.ScriptArguments.md +39 -25
- package/src/components/platform/.ScriptInfoSection.md +30 -26
- package/src/components/platform/.ShellTypeBadge.md +18 -13
- package/src/components/platform/.SoftwareInfo.md +23 -27
- package/src/components/platform/.SoftwareSourceBadge.md +28 -19
- package/src/components/platform/.ToolBadge.md +25 -26
- package/src/components/providers/.theme-provider.md +52 -0
- package/src/components/shared/delivery/.delivery-lists.md +39 -0
- package/src/components/shared/delivery/.delivery-row.md +41 -0
- package/src/components/shared/delivery/.delivery-table.md +41 -0
- package/src/components/shared/delivery/.index.md +38 -0
- package/src/components/shared/dev-section/.dev-card-row.md +60 -0
- package/src/components/shared/dev-section/.dev-section-page.md +48 -0
- package/src/components/shared/dev-section/.dev-section-view.md +43 -0
- package/src/components/shared/dev-section/.index.md +38 -0
- package/src/components/shared/legal-document/.index.md +40 -0
- package/src/components/shared/legal-document/.legal-document-page.md +50 -0
- package/src/components/shared/legal-document/.use-legal-docs.md +42 -0
- package/src/components/shared/onboarding/.onboarding-step-card.md +32 -31
- package/src/components/shared/onboarding/.onboarding-walkthrough.md +39 -43
- package/src/components/shared/product-release/.index.md +28 -30
- package/src/components/shared/product-release/.product-release-card-skeleton.md +28 -28
- package/src/components/shared/product-release/.product-release-card.md +45 -27
- package/src/components/shared/product-release/.release-detail-page.md +23 -24
- package/src/components/shared/roadmap/.index.md +37 -0
- package/src/components/shared/roadmap/.roadmap-grid-skeleton.md +39 -0
- package/src/components/shared/roadmap/.roadmap-grid.md +66 -0
- package/src/components/shared/roadmap/.use-roadmap-voting.md +68 -0
- package/src/components/tickets/.help-center-card.md +51 -0
- package/src/components/tickets/.help-center-create-form.md +38 -0
- package/src/components/tickets/.help-center-list.md +40 -0
- package/src/components/tickets/.index.md +65 -0
- package/src/components/tickets/.ticket-center.md +51 -0
- package/src/components/tickets/.ticket-detail-drawer.md +48 -0
- package/src/components/tickets/.ticket-linked-delivery-card.md +36 -0
- package/src/components/tickets/.ticket-open-form.md +50 -0
- package/src/components/tickets/.ticket-row.md +30 -0
- package/src/components/tickets/.types.md +57 -0
- package/src/components/tickets/hooks/.use-ticket-actions.md +77 -0
- package/src/components/tickets/hooks/.use-ticket-engagements.md +42 -0
- package/src/components/tickets/hooks/.use-tickets-list.md +54 -0
- package/src/components/ui/.actions-menu.md +66 -41
- package/src/components/ui/.alert-dialog.md +29 -26
- package/src/components/ui/.allowed-domains-input.md +29 -21
- package/src/components/ui/.assignee-dropdown.md +45 -0
- package/src/components/ui/.autocomplete.md +47 -41
- package/src/components/ui/.benefit-card.md +51 -36
- package/src/components/ui/.brand-association-card.md +30 -27
- package/src/components/ui/.breadcrumb.md +17 -15
- package/src/components/ui/.checkbox-block.md +39 -35
- package/src/components/ui/.checkbox-with-description.md +23 -16
- package/src/components/ui/.checkbox.md +31 -23
- package/src/components/ui/.circular-progress.md +49 -19
- package/src/components/ui/.content-loader.md +32 -20
- package/src/components/ui/.cursor-pagination.md +41 -52
- package/src/components/ui/.dashboard-info-card.md +33 -26
- package/src/components/ui/.date-picker.md +27 -25
- package/src/components/ui/.device-card-compact.md +28 -29
- package/src/components/ui/.device-card.md +27 -27
- package/src/components/ui/.dialog.md +25 -16
- package/src/components/ui/.drawer.md +86 -0
- package/src/components/ui/.dropdown-button.md +45 -0
- package/src/components/ui/.entity-image.md +46 -0
- package/src/components/ui/.error-state.md +41 -28
- package/src/components/ui/.feature-card.md +35 -31
- package/src/components/ui/.feature-list.md +48 -0
- package/src/components/ui/.field-wrapper.md +47 -0
- package/src/components/ui/.file-upload.md +42 -0
- package/src/components/ui/.filter-checkbox-item.md +43 -0
- package/src/components/ui/.filter-list.md +57 -0
- package/src/components/ui/.filter-modal.md +59 -0
- package/src/components/ui/.floating-tooltip.md +43 -26
- package/src/components/ui/.hidden-tags-popup.md +49 -0
- package/src/components/ui/.hover-dropdown.md +54 -0
- package/src/components/ui/.image-gallery-modal.md +41 -34
- package/src/components/ui/.image-uploader.md +53 -0
- package/src/components/ui/.index.md +40 -34
- package/src/components/ui/.info-card.md +31 -31
- package/src/components/ui/.info-row.md +31 -27
- package/src/components/ui/.input-trigger.md +44 -0
- package/src/components/ui/.input.md +37 -31
- package/src/components/ui/.markdown-editor.md +57 -0
- package/src/components/ui/.modal-v2.md +51 -0
- package/src/components/ui/.modal.md +32 -31
- package/src/components/ui/.more-actions-menu.md +45 -38
- package/src/components/ui/.organization-card.md +31 -37
- package/src/components/ui/.page-actions.md +44 -54
- package/src/components/ui/.phone-input.md +54 -0
- package/src/components/ui/.progress-bar.md +35 -27
- package/src/components/ui/.radio-group.md +39 -27
- package/src/components/ui/.release-changelog-section.md +34 -34
- package/src/components/ui/.search-input.md +48 -0
- package/src/components/ui/.select.md +54 -34
- package/src/components/ui/.service-card.md +42 -40
- package/src/components/ui/.sheet.md +27 -18
- package/src/components/ui/.simple-markdown-renderer.md +29 -31
- package/src/components/ui/.sort-column-item.md +42 -0
- package/src/components/ui/.square-avatar.md +34 -24
- package/src/components/ui/.status-badge.md +26 -38
- package/src/components/ui/.switch.md +22 -35
- package/src/components/ui/.tab-navigation.md +56 -53
- package/src/components/ui/.tab-selector.md +40 -0
- package/src/components/ui/.tag-key-value-filter.md +56 -0
- package/src/components/ui/.tag-search-input.md +53 -0
- package/src/components/ui/.tag.md +49 -31
- package/src/components/ui/.tags-manager.md +60 -0
- package/src/components/ui/.textarea.md +44 -34
- package/src/components/ui/.ticket-attachments-list.md +45 -0
- package/src/components/ui/.ticket-detail-section.md +29 -0
- package/src/components/ui/.ticket-info-section.md +56 -0
- package/src/components/ui/.ticket-note-card.md +53 -0
- package/src/components/ui/.ticket-notes-section.md +54 -0
- package/src/components/ui/.ticket-status-tag.md +49 -0
- package/src/components/ui/.title-content-block.md +25 -26
- package/src/components/ui/.toaster.md +40 -28
- package/src/components/ui/.tooltip.md +22 -11
- package/src/components/ui/.truncate-text.md +39 -0
- package/src/components/ui/button/.button-styles.md +35 -0
- package/src/components/ui/button/.button.md +53 -0
- package/src/components/ui/button/.split-button.md +48 -0
- package/src/components/ui/data-table/.data-table-body.md +48 -0
- package/src/components/ui/data-table/.data-table-column-filter.md +45 -0
- package/src/components/ui/data-table/.data-table-cursor-footer.md +45 -0
- package/src/components/ui/data-table/.data-table-empty.md +43 -0
- package/src/components/ui/data-table/.data-table-header.md +55 -0
- package/src/components/ui/data-table/.data-table-infinite-footer.md +44 -0
- package/src/components/ui/data-table/.data-table-row-count.md +43 -0
- package/src/components/ui/data-table/.data-table-row.md +47 -0
- package/src/components/ui/data-table/.data-table-skeleton.md +42 -0
- package/src/components/ui/data-table/.data-table.md +47 -0
- package/src/components/ui/data-table/.index.md +55 -0
- package/src/components/ui/data-table/.types.md +54 -0
- package/src/components/ui/data-table/.use-data-table.md +45 -0
- package/src/components/ui/data-table/.utils.md +38 -0
- package/src/components/ui/file-manager/.file-manager-action-bar.md +39 -30
- package/src/components/ui/file-manager/.file-manager-breadcrumb.md +29 -27
- package/src/components/ui/file-manager/.file-manager-context-menu.md +38 -42
- package/src/components/ui/file-manager/.file-manager-empty.md +26 -39
- package/src/components/ui/file-manager/.file-manager-table-row.md +33 -41
- package/src/components/ui/file-manager/.file-manager.md +35 -31
- package/src/components/ui/query-report-table/.index.md +43 -0
- package/src/components/ui/query-report-table/.query-report-table-header.md +36 -0
- package/src/components/ui/query-report-table/.query-report-table-row.md +40 -0
- package/src/components/ui/query-report-table/.query-report-table-skeleton.md +44 -0
- package/src/components/ui/query-report-table/.query-report-table.md +47 -0
- package/src/components/ui/query-report-table/.types.md +41 -0
- package/src/components/ui/query-report-table/.utils.md +35 -0
- package/src/components/ui/table/.index.md +27 -48
- package/src/components/ui/table/.table-cell.md +18 -27
- package/src/components/ui/table/.table-column-filter-dropdown.md +40 -0
- package/src/components/ui/table/.table-description-cell.md +24 -14
- package/src/components/ui/table/.table-empty-state.md +21 -22
- package/src/components/ui/table/.table-header.md +25 -40
- package/src/components/ui/table/.table-row.md +22 -40
- package/src/components/ui/table/.table-skeleton.md +33 -26
- package/src/components/ui/table/.table-timestamp-cell.md +26 -16
- package/src/components/ui/table/.table.md +39 -59
- package/src/components/ui/table/.types.md +44 -36
- package/src/components/ui/table/.utils.md +18 -20
- package/src/contexts/.chat-runtime-context.md +54 -0
- package/src/contexts/.endpoints-runtime-context.md +58 -0
- package/src/contexts/.index.md +53 -0
- package/src/contexts/.use-outer-or-default.md +36 -0
- package/src/embed-shims/.index.md +45 -0
- package/src/embed-shims/.next-dynamic.md +43 -0
- package/src/embed-shims/.next-image.md +45 -0
- package/src/embed-shims/.next-link.md +59 -0
- package/src/embed-shims/.next-navigation.md +59 -0
- package/src/hooks/.index.md +34 -29
- package/src/hooks/.use-access-code-integration.md +49 -0
- package/src/hooks/.use-contact-submission.md +37 -26
- package/src/hooks/.use-copy-to-clipboard.md +42 -0
- package/src/hooks/.use-near-viewport.md +44 -0
- package/src/hooks/.use-og-placeholder.md +51 -0
- package/src/hooks/.use-toast.md +36 -35
- package/src/hooks/state/.use-api-params.md +29 -46
- package/src/hooks/state/.use-query-params.md +37 -33
- package/src/hooks/ui/.index.md +33 -32
- package/src/hooks/ui/.use-auto-limit-tags.md +54 -0
- package/src/hooks/ui/.use-horizontal-scrollbar.md +74 -0
- package/src/hooks/ui/.use-image-edge-color.md +42 -0
- package/src/hooks/ui/.use-media-query.md +33 -25
- package/src/hooks/ui/.use-search.md +51 -0
- package/src/nats/.nats.md +49 -28
- package/src/nats/index.ts +3 -0
- package/src/nats/nats-provider.tsx +146 -0
- package/src/nats/nats.ts +2 -0
- package/src/nats/shared-connection.ts +285 -0
- package/src/nats/use-nats-subscription.ts +99 -0
- package/src/schemas/.contact-schema.md +45 -0
- package/src/stories/.AnnouncementBar.stories.md +45 -0
- package/src/stories/.AppLayout.stories.md +20 -21
- package/src/stories/.Autocomplete.stories.md +48 -34
- package/src/stories/.Board.stories.md +35 -0
- package/src/stories/.Button.stories.md +36 -33
- package/src/stories/.ChatTicketList.stories.md +33 -0
- package/src/stories/.CheckboxBlock.stories.md +40 -28
- package/src/stories/.ContentLoader.stories.md +47 -0
- package/src/stories/.DashboardInfoCard.stories.md +57 -0
- package/src/stories/.DataTable.stories.md +41 -0
- package/src/stories/.DatePicker.stories.md +66 -52
- package/src/stories/.DeviceCard.stories.md +41 -40
- package/src/stories/.DeviceCardCompact.stories.md +41 -0
- package/src/stories/.DotsLoaderIcon.stories.md +36 -0
- package/src/stories/.Drawer.stories.md +58 -0
- package/src/stories/.EmbeddableChat.stories.md +41 -0
- package/src/stories/.FileManager.stories.md +41 -0
- package/src/stories/.FileManagerActionBar.stories.md +38 -0
- package/src/stories/.FileUpload.stories.md +53 -0
- package/src/stories/.FilterList.stories.md +54 -0
- package/src/stories/.FilterModal.stories.md +72 -0
- package/src/stories/.FiltersDropdown.stories.md +57 -0
- package/src/stories/.Header.stories.md +48 -0
- package/src/stories/.ImageUploader.stories.md +49 -0
- package/src/stories/.InfoCard.stories.md +54 -0
- package/src/stories/.Input.stories.md +48 -30
- package/src/stories/.ListPageLayout.stories.md +56 -43
- package/src/stories/.MingoOnboardingCard.stories.md +42 -0
- package/src/stories/.MingoOnboardingCardSkeleton.stories.md +35 -0
- package/src/stories/.Modal.stories.md +40 -31
- package/src/stories/.NotificationDrawer.stories.md +55 -0
- package/src/stories/.OnboardingStepCard.stories.md +41 -0
- package/src/stories/.OrganizationCard.stories.md +61 -0
- package/src/stories/.PageActions.stories.md +52 -49
- package/src/stories/.PageContainer.stories.md +41 -35
- package/src/stories/.PageLayout.stories.md +60 -0
- package/src/stories/.ParallaxImageShowcase.stories.md +49 -0
- package/src/stories/.PhoneInput.stories.md +53 -0
- package/src/stories/.QueryReportTable.stories.md +44 -0
- package/src/stories/.RadioGroup.stories.md +46 -0
- package/src/stories/.RadioGroupBlock.stories.md +45 -0
- package/src/stories/.Select.stories.md +29 -15
- package/src/stories/.SlashCommandSuggestions.stories.md +41 -0
- package/src/stories/.SplitButton.stories.md +62 -0
- package/src/stories/.TabNavigation.stories.md +47 -38
- package/src/stories/.TabSelector.stories.md +65 -0
- package/src/stories/.Table.stories.md +38 -46
- package/src/stories/.TableColumnFilterDropdown.stories.md +46 -0
- package/src/stories/.Tag.stories.md +43 -32
- package/src/stories/.TagKeyValueFilter.stories.md +44 -0
- package/src/stories/.TagSearchInput.stories.md +61 -0
- package/src/stories/.Textarea.stories.md +49 -26
- package/src/stories/.Theme.stories.md +41 -0
- package/src/stories/.TicketAttachmentsList.stories.md +39 -0
- package/src/stories/.TicketDescriptionViewer.stories.md +39 -0
- package/src/stories/.TicketInfoSection.stories.md +40 -0
- package/src/stories/.TicketKnowledgeBaseList.stories.md +36 -0
- package/src/stories/.TicketNotesSection.stories.md +50 -0
- package/src/stories/.Toaster.stories.md +40 -0
- package/src/stories/.ToolExecutionDisplay.stories.md +41 -0
- package/src/stories/.Tooltip.stories.md +41 -0
- package/src/stories/.UserSummary.stories.md +41 -0
- package/src/stories/.WaitlistForm.stories.md +42 -0
- package/src/stories/BlogCard.stories.tsx +61 -0
- package/src/stories/CampaignCardAdmin.stories.tsx +52 -0
- package/src/stories/CaseStudyCard.stories.tsx +42 -0
- package/src/stories/ChatContainer.stories.tsx +186 -0
- package/src/stories/ChatInlineVideoPill.stories.tsx +63 -0
- package/src/stories/CustomerInterviewCard.stories.tsx +42 -0
- package/src/stories/DataRoomDocCard.stories.tsx +52 -0
- package/src/stories/GenericEntityCard.stories.tsx +66 -0
- package/src/stories/GitHubActivityCard.stories.tsx +61 -0
- package/src/stories/HubspotTicketCard.stories.tsx +98 -0
- package/src/stories/InvestorUpdateCard.stories.tsx +42 -0
- package/src/stories/OnboardingGuideCard.stories.tsx +52 -0
- package/src/stories/ProductReleaseCard.stories.tsx +61 -0
- package/src/stories/ProgramCard.stories.tsx +79 -0
- package/src/stories/RoadmapCard.stories.tsx +75 -0
- package/src/stories/SlackMessageCard.stories.tsx +41 -0
- package/src/stories/__fixtures__/chat-cards.ts +604 -0
- package/src/types/.blog.md +53 -29
- package/src/types/.case-study.md +44 -27
- package/src/types/.customer-interview.md +66 -44
- package/src/types/.delivery.md +40 -0
- package/src/types/.employee.md +24 -30
- package/src/types/.index.md +33 -47
- package/src/types/.marketing.md +49 -44
- package/src/types/.navigation.md +33 -25
- package/src/types/.os.types.md +32 -27
- package/src/types/.platform.md +31 -28
- package/src/types/.product-release.md +65 -38
- package/src/types/.supabase.md +37 -29
- package/src/types/.team.md +41 -33
- package/src/types/.video-processing.md +54 -0
- package/src/types/.waitlist.md +40 -36
- package/src/utils/.access-code-client.md +37 -36
- package/src/utils/.cn.md +31 -23
- package/src/utils/.color-analysis.md +35 -0
- package/src/utils/.country-phone-utils.md +39 -0
- package/src/utils/.date-formatters.md +19 -18
- package/src/utils/.embed-authed-fetch.md +39 -0
- package/src/utils/.embed-proxy-auth-storage.md +38 -0
- package/src/utils/.fetch-priority.md +41 -0
- package/src/utils/.format.md +74 -25
- package/src/utils/.generic-domain-utils.md +42 -0
- package/src/utils/.image-proxy.md +59 -23
- package/src/utils/.index.md +42 -49
- package/src/utils/.local-storage-adapter.md +50 -0
- package/src/utils/.ods-color-utils.md +55 -38
- package/src/utils/.platform-config.md +45 -25
- package/src/utils/.scroll-into-view.md +40 -0
- package/src/utils/.source-icons.md +53 -0
- package/src/utils/.sse-decision-frame.md +46 -0
- package/src/utils/dev-sections/.index.md +34 -0
- package/src/utils/dev-sections/.openframe-dev-sections.md +49 -0
- package/dist/chunk-3E5ANY55.js.map +0 -1
- package/dist/chunk-EH3RWVF3.cjs.map +0 -1
- package/dist/chunk-UYQOPC57.js.map +0 -1
- package/dist/chunk-WI76ZUBE.cjs.map +0 -1
- package/src/components/.card.md +0 -42
- package/src/components/.contact-button.md +0 -30
- package/src/components/.drawer.md +0 -46
- package/src/components/.fixed-layout-container.md +0 -47
- package/src/components/.footer-waitlist-card.md +0 -29
- package/src/components/.join-waitlist-cta.md +0 -29
- package/src/components/.sheet.md +0 -47
- package/src/components/.sliding-panel.md +0 -48
- package/src/components/.tooltip.md +0 -48
- package/src/components/.use-mobile.md +0 -42
- package/src/components/.vendor-compact-card.md +0 -66
- package/src/components/.x-button.md +0 -42
- package/src/components/features/.github-repo-button.md +0 -40
- package/src/components/features/.organization-icon.md +0 -47
- package/src/components/features/.organization-selector.md +0 -45
- package/src/components/icons/.fleet-icon.md +0 -39
- package/src/components/icons/.meshcentral-icon.md +0 -35
- package/src/components/icons/.refresh-icon.md +0 -34
- package/src/components/icons/.tactical-icon.md +0 -35
- package/src/components/ui/.button.md +0 -69
- package/src/components/ui/.log-table-row.md +0 -47
- package/src/components/ui/.selectable-device-card.md +0 -46
- package/src/hooks/.api-hooks-stub.md +0 -45
- package/src/hooks/api/.use-product-releases.md +0 -53
- package/src/stories/.OrganizationSelector.stories.md +0 -42
- package/src/stories/.SelectableDeviceCard.stories.md +0 -30
- package/src/utils/.lite-youtube-embed-stub.md +0 -37
- package/src/utils/.lite-youtube-embed.md +0 -33
- /package/dist/{chunk-QKFBZLIR.js.map → chunk-5OWDOFKK.js.map} +0 -0
- /package/dist/{chunk-5BNWGK6D.js.map → chunk-HWY35EAK.js.map} +0 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { createNatsClient, type NatsClient, type NatsStatus, type NatsStatusEvent } from './nats'
|
|
2
|
+
|
|
3
|
+
export const NATS_DEFAULTS = {
|
|
4
|
+
SHARED_CLOSE_DELAY_MS: 3000,
|
|
5
|
+
CONNECT_TIMEOUT_MS: 10_000,
|
|
6
|
+
PING_INTERVAL_MS: 30_000,
|
|
7
|
+
MAX_PING_OUT: 3,
|
|
8
|
+
RETRY_INITIAL_DELAY_MS: 1000,
|
|
9
|
+
RETRY_MAX_DELAY_MS: 30_000,
|
|
10
|
+
RETRY_MULTIPLIER: 2,
|
|
11
|
+
} as const
|
|
12
|
+
|
|
13
|
+
export interface NatsReconnectionBackoff {
|
|
14
|
+
/** Number of fast retries before exponential phase kicks in. Default: 0. */
|
|
15
|
+
fastRetries?: number
|
|
16
|
+
/** Delay used during the fast-retry phase. Default: RETRY_INITIAL_DELAY_MS. */
|
|
17
|
+
fastRetryDelayMs?: number
|
|
18
|
+
/** Base delay for the exponential phase. Default: RETRY_INITIAL_DELAY_MS. */
|
|
19
|
+
initialDelayMs?: number
|
|
20
|
+
/** Upper cap on any single retry delay. Default: RETRY_MAX_DELAY_MS. */
|
|
21
|
+
maxDelayMs?: number
|
|
22
|
+
/** Per-attempt multiplier during exponential phase. Default: RETRY_MULTIPLIER. */
|
|
23
|
+
multiplier?: number
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface SharedConnection {
|
|
27
|
+
wsUrl: string
|
|
28
|
+
client: NatsClient
|
|
29
|
+
connectPromise: Promise<void> | null
|
|
30
|
+
refCount: number
|
|
31
|
+
closeTimer: ReturnType<typeof setTimeout> | null
|
|
32
|
+
retryTimer: ReturnType<typeof setTimeout> | null
|
|
33
|
+
/**
|
|
34
|
+
* Identity of the consumer driving reconnect. When set, other consumers
|
|
35
|
+
* should observe status only and skip their own scheduleRetry — otherwise
|
|
36
|
+
* each disconnect triggers multiple concurrent connect() calls racing over
|
|
37
|
+
* connectPromise.
|
|
38
|
+
*/
|
|
39
|
+
retryOwner: object | null
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface AcquireClientOptions {
|
|
43
|
+
name?: string
|
|
44
|
+
user?: string
|
|
45
|
+
pass?: string
|
|
46
|
+
connectTimeoutMs?: number
|
|
47
|
+
pingIntervalMs?: number
|
|
48
|
+
maxPingOut?: number
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface ReleaseClientOptions {
|
|
52
|
+
delayMs?: number
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let shared: SharedConnection | null = null
|
|
56
|
+
|
|
57
|
+
export function getSharedConnection(): SharedConnection | null {
|
|
58
|
+
return shared
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function acquireClient(url: string, opts?: AcquireClientOptions): SharedConnection {
|
|
62
|
+
if (shared?.wsUrl !== url) {
|
|
63
|
+
if (shared) {
|
|
64
|
+
if (shared.closeTimer) clearTimeout(shared.closeTimer)
|
|
65
|
+
const old = shared
|
|
66
|
+
shared = null
|
|
67
|
+
void old.client.close().catch(() => {})
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const {
|
|
71
|
+
name = 'openframe-frontend',
|
|
72
|
+
user = 'machine',
|
|
73
|
+
pass = '',
|
|
74
|
+
connectTimeoutMs = NATS_DEFAULTS.CONNECT_TIMEOUT_MS,
|
|
75
|
+
pingIntervalMs = NATS_DEFAULTS.PING_INTERVAL_MS,
|
|
76
|
+
maxPingOut = NATS_DEFAULTS.MAX_PING_OUT,
|
|
77
|
+
} = opts ?? {}
|
|
78
|
+
|
|
79
|
+
const client = createNatsClient({
|
|
80
|
+
servers: url,
|
|
81
|
+
name,
|
|
82
|
+
user,
|
|
83
|
+
pass,
|
|
84
|
+
connectTimeoutMs,
|
|
85
|
+
reconnect: false,
|
|
86
|
+
pingIntervalMs,
|
|
87
|
+
maxPingOut,
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
shared = {
|
|
91
|
+
wsUrl: url,
|
|
92
|
+
client,
|
|
93
|
+
connectPromise: null,
|
|
94
|
+
refCount: 0,
|
|
95
|
+
closeTimer: null,
|
|
96
|
+
retryTimer: null,
|
|
97
|
+
retryOwner: null,
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
shared.refCount += 1
|
|
102
|
+
if (shared.closeTimer) {
|
|
103
|
+
clearTimeout(shared.closeTimer)
|
|
104
|
+
shared.closeTimer = null
|
|
105
|
+
}
|
|
106
|
+
return shared
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function releaseClient(url: string, opts?: ReleaseClientOptions): void {
|
|
110
|
+
if (!shared || shared.wsUrl !== url) return
|
|
111
|
+
|
|
112
|
+
shared.refCount = Math.max(0, shared.refCount - 1)
|
|
113
|
+
if (shared.refCount > 0) return
|
|
114
|
+
|
|
115
|
+
const delay = opts?.delayMs ?? NATS_DEFAULTS.SHARED_CLOSE_DELAY_MS
|
|
116
|
+
shared.closeTimer = setTimeout(() => {
|
|
117
|
+
const s = shared
|
|
118
|
+
shared = null
|
|
119
|
+
if (s) {
|
|
120
|
+
if (s.retryTimer) {
|
|
121
|
+
clearTimeout(s.retryTimer)
|
|
122
|
+
s.retryTimer = null
|
|
123
|
+
}
|
|
124
|
+
void s.client.close().catch(() => {})
|
|
125
|
+
}
|
|
126
|
+
}, delay)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function getSharedConnectionFor(url: string | null | undefined): SharedConnection | null {
|
|
130
|
+
if (!url) return null
|
|
131
|
+
return shared && shared.wsUrl === url ? shared : null
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
// Connection lifecycle: retry + status loop, shared by NatsProvider and the
|
|
136
|
+
// chat hooks. Each consumer that wants to drive reconnect creates an
|
|
137
|
+
// ownerToken and calls startConnectionLifecycle(). The first caller to claim
|
|
138
|
+
// retryOwner runs the actual retry loop; subsequent claimants observe status
|
|
139
|
+
// only. When the owner unmounts and releases retryOwner, the next status
|
|
140
|
+
// event lets a surviving consumer pick up ownership opportunistically.
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
|
|
143
|
+
export interface ConnectionLifecycleOptions {
|
|
144
|
+
conn: SharedConnection
|
|
145
|
+
wsUrl: string
|
|
146
|
+
onBeforeReconnect?: () => Promise<void> | void
|
|
147
|
+
backoff?: NatsReconnectionBackoff
|
|
148
|
+
getFreshUrl: () => string | null
|
|
149
|
+
/** Called on every status change (after closed-guard). */
|
|
150
|
+
onStatusChange?: (status: NatsStatus, evt: NatsStatusEvent) => void
|
|
151
|
+
/**
|
|
152
|
+
* Decide which statuses should trigger a retry attempt. Defaults to closed +
|
|
153
|
+
* disconnected. Override to skip 'error' (JetStream protocol errors that
|
|
154
|
+
* don't close the WS) or include it.
|
|
155
|
+
*/
|
|
156
|
+
shouldRetryOn?: (status: NatsStatus) => boolean
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export interface ConnectionLifecycleHandle {
|
|
160
|
+
/** Stop observing status, clear any pending retry, release ownership if held. */
|
|
161
|
+
stop(): void
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const defaultShouldRetryOn = (status: NatsStatus) => status === 'closed' || status === 'disconnected'
|
|
165
|
+
|
|
166
|
+
export function startConnectionLifecycle(options: ConnectionLifecycleOptions): ConnectionLifecycleHandle {
|
|
167
|
+
const { conn, wsUrl } = options
|
|
168
|
+
// Each lifecycle gets its own identity for retry ownership. The first lifecycle to claim
|
|
169
|
+
// an unowned connection drives reconnect; later attachers observe status only until the
|
|
170
|
+
// owner releases (see opportunistic claim in scheduleRetry).
|
|
171
|
+
const ownerToken = {}
|
|
172
|
+
if (!conn.retryOwner) conn.retryOwner = ownerToken
|
|
173
|
+
|
|
174
|
+
let closed = false
|
|
175
|
+
let retryAttempt = 0
|
|
176
|
+
|
|
177
|
+
function emitSynthetic(status: NatsStatus) {
|
|
178
|
+
if (closed) return
|
|
179
|
+
options.onStatusChange?.(status, { status })
|
|
180
|
+
if (status === 'connected') {
|
|
181
|
+
retryAttempt = 0
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function scheduleRetry() {
|
|
186
|
+
if (closed) return
|
|
187
|
+
if (getSharedConnectionFor(wsUrl) !== conn) return
|
|
188
|
+
if (!conn.retryOwner) conn.retryOwner = ownerToken
|
|
189
|
+
if (conn.retryOwner !== ownerToken) return
|
|
190
|
+
|
|
191
|
+
if (conn.retryTimer) {
|
|
192
|
+
clearTimeout(conn.retryTimer)
|
|
193
|
+
conn.retryTimer = null
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const cfg = options.backoff ?? {}
|
|
197
|
+
const fastRetries = cfg.fastRetries ?? 0
|
|
198
|
+
const fastDelay = cfg.fastRetryDelayMs ?? NATS_DEFAULTS.RETRY_INITIAL_DELAY_MS
|
|
199
|
+
const baseDelay = cfg.initialDelayMs ?? NATS_DEFAULTS.RETRY_INITIAL_DELAY_MS
|
|
200
|
+
const maxDelay = cfg.maxDelayMs ?? NATS_DEFAULTS.RETRY_MAX_DELAY_MS
|
|
201
|
+
const multiplier = cfg.multiplier ?? NATS_DEFAULTS.RETRY_MULTIPLIER
|
|
202
|
+
|
|
203
|
+
const delay =
|
|
204
|
+
retryAttempt < fastRetries
|
|
205
|
+
? fastDelay
|
|
206
|
+
: Math.min(baseDelay * multiplier ** (retryAttempt - fastRetries), maxDelay)
|
|
207
|
+
const jitteredDelay = delay * (0.5 + Math.random() * 0.5)
|
|
208
|
+
retryAttempt++
|
|
209
|
+
|
|
210
|
+
conn.retryTimer = setTimeout(async () => {
|
|
211
|
+
conn.retryTimer = null
|
|
212
|
+
if (closed) return
|
|
213
|
+
if (getSharedConnectionFor(wsUrl) !== conn) return
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
await options.onBeforeReconnect?.()
|
|
217
|
+
} catch {
|
|
218
|
+
// continue regardless of token-refresh outcome
|
|
219
|
+
}
|
|
220
|
+
if (closed) return
|
|
221
|
+
if (getSharedConnectionFor(wsUrl) !== conn) return
|
|
222
|
+
|
|
223
|
+
const freshUrl = options.getFreshUrl()
|
|
224
|
+
if (freshUrl !== wsUrl) return
|
|
225
|
+
|
|
226
|
+
try {
|
|
227
|
+
conn.connectPromise = null
|
|
228
|
+
conn.connectPromise = conn.client.connect()
|
|
229
|
+
await conn.connectPromise
|
|
230
|
+
if (!closed && getSharedConnectionFor(wsUrl) === conn) {
|
|
231
|
+
retryAttempt = 0
|
|
232
|
+
}
|
|
233
|
+
} catch {
|
|
234
|
+
conn.connectPromise = null
|
|
235
|
+
if (!closed && getSharedConnectionFor(wsUrl) === conn) {
|
|
236
|
+
scheduleRetry()
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}, jitteredDelay)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const shouldRetryOn = options.shouldRetryOn ?? defaultShouldRetryOn
|
|
243
|
+
|
|
244
|
+
const unsubStatus = conn.client.onStatus((evt) => {
|
|
245
|
+
if (closed) return
|
|
246
|
+
options.onStatusChange?.(evt.status, evt)
|
|
247
|
+
if (evt.status === 'connected') {
|
|
248
|
+
retryAttempt = 0
|
|
249
|
+
}
|
|
250
|
+
if (shouldRetryOn(evt.status)) {
|
|
251
|
+
scheduleRetry()
|
|
252
|
+
}
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
if (conn.client.isConnected()) {
|
|
256
|
+
emitSynthetic('connected')
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
void (async () => {
|
|
260
|
+
try {
|
|
261
|
+
conn.connectPromise ||= conn.client.connect()
|
|
262
|
+
await conn.connectPromise
|
|
263
|
+
} catch {
|
|
264
|
+
conn.connectPromise = null
|
|
265
|
+
if (closed) return
|
|
266
|
+
|
|
267
|
+
emitSynthetic('disconnected')
|
|
268
|
+
scheduleRetry()
|
|
269
|
+
}
|
|
270
|
+
})()
|
|
271
|
+
|
|
272
|
+
return {
|
|
273
|
+
stop() {
|
|
274
|
+
closed = true
|
|
275
|
+
unsubStatus()
|
|
276
|
+
if (conn.retryTimer) {
|
|
277
|
+
clearTimeout(conn.retryTimer)
|
|
278
|
+
conn.retryTimer = null
|
|
279
|
+
}
|
|
280
|
+
if (conn.retryOwner === ownerToken) {
|
|
281
|
+
conn.retryOwner = null
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
}
|
|
285
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import type { JsMsg, Msg, NatsSubscribeOptions } from './nats'
|
|
5
|
+
import { useOptionalNats } from './nats-provider'
|
|
6
|
+
|
|
7
|
+
export interface UseNatsSubscriptionOptions extends NatsSubscribeOptions {
|
|
8
|
+
enabled?: boolean
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface UseNatsSubscriptionReturn {
|
|
12
|
+
isSubscribed: boolean
|
|
13
|
+
isReady: boolean
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Subscribe to a NATS subject using the shared connection from <NatsProvider>.
|
|
18
|
+
* Automatically (re)subscribes when the connection becomes ready, when the
|
|
19
|
+
* subject changes, and after reconnections.
|
|
20
|
+
*/
|
|
21
|
+
export function useNatsSubscription(
|
|
22
|
+
subject: string | null,
|
|
23
|
+
onMessage: (msg: Msg) => void | Promise<void>,
|
|
24
|
+
options?: UseNatsSubscriptionOptions,
|
|
25
|
+
): UseNatsSubscriptionReturn {
|
|
26
|
+
const nats = useOptionalNats()
|
|
27
|
+
const handlerRef = React.useRef(onMessage)
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
handlerRef.current = onMessage
|
|
30
|
+
}, [onMessage])
|
|
31
|
+
|
|
32
|
+
const [isSubscribed, setIsSubscribed] = React.useState(false)
|
|
33
|
+
|
|
34
|
+
const enabled = options?.enabled !== false
|
|
35
|
+
const queue = options?.queue
|
|
36
|
+
const max = options?.max
|
|
37
|
+
const reconnectionCount = nats?.reconnectionCount ?? 0
|
|
38
|
+
const isReady = !!nats?.isReady
|
|
39
|
+
const client = nats?.client ?? null
|
|
40
|
+
|
|
41
|
+
React.useEffect(() => {
|
|
42
|
+
if (!client || !isReady || !subject || !enabled) {
|
|
43
|
+
setIsSubscribed(false)
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const sub = client.subscribeBytes(
|
|
48
|
+
subject,
|
|
49
|
+
(msg) => handlerRef.current(msg),
|
|
50
|
+
{ queue, max },
|
|
51
|
+
)
|
|
52
|
+
setIsSubscribed(true)
|
|
53
|
+
|
|
54
|
+
return () => {
|
|
55
|
+
setIsSubscribed(false)
|
|
56
|
+
try {
|
|
57
|
+
sub.unsubscribe()
|
|
58
|
+
} catch {
|
|
59
|
+
// ignore
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// reconnectionCount intentionally in deps: re-subscribe after reconnect
|
|
63
|
+
}, [client, isReady, subject, enabled, queue, max, reconnectionCount])
|
|
64
|
+
|
|
65
|
+
return { isSubscribed, isReady }
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type UseNatsJsonSubscriptionOptions = UseNatsSubscriptionOptions
|
|
69
|
+
|
|
70
|
+
export function useNatsJsonSubscription<T = unknown>(
|
|
71
|
+
subject: string | null,
|
|
72
|
+
onPayload: (payload: T, msg: Msg) => void | Promise<void>,
|
|
73
|
+
options?: UseNatsJsonSubscriptionOptions,
|
|
74
|
+
): UseNatsSubscriptionReturn {
|
|
75
|
+
const handlerRef = React.useRef(onPayload)
|
|
76
|
+
React.useEffect(() => {
|
|
77
|
+
handlerRef.current = onPayload
|
|
78
|
+
}, [onPayload])
|
|
79
|
+
|
|
80
|
+
const decoderRef = React.useRef<TextDecoder | null>(null)
|
|
81
|
+
if (!decoderRef.current && typeof TextDecoder !== 'undefined') {
|
|
82
|
+
decoderRef.current = new TextDecoder()
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const wrapped = React.useCallback(async (msg: Msg) => {
|
|
86
|
+
const decoder = decoderRef.current
|
|
87
|
+
if (!decoder) return
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(decoder.decode(msg.data)) as T
|
|
90
|
+
await handlerRef.current(parsed, msg)
|
|
91
|
+
} catch {
|
|
92
|
+
// ignore malformed payloads
|
|
93
|
+
}
|
|
94
|
+
}, [])
|
|
95
|
+
|
|
96
|
+
return useNatsSubscription(subject, wrapped, options)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export type NatsJsMsg = JsMsg
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<!-- source-hash: 571de537c275f3d8b2eefb0fa68e0454 -->
|
|
2
|
+
Defines and exports Zod validation schemas, type-safe option constants, and API response types for all contact-style forms across the Flamingo platform.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Type | Description |
|
|
7
|
+
|--------|------|-------------|
|
|
8
|
+
| `companySizeOptions` | `const` tuple | Allowed company size values for Select widgets |
|
|
9
|
+
| `referralSourceOptions` | `const` tuple | Allowed referral source values for Select widgets |
|
|
10
|
+
| `defaultHelpCategoryOptions` | `const` tuple | Fallback help category options when none are supplied by the embedder |
|
|
11
|
+
| `LinkedInUrlSchema` | `z.ZodSchema` | Reusable LinkedIn URL validator with hostname-exact matching (prevents substring injection) |
|
|
12
|
+
| `ContactBaseSchema` | `z.ZodObject` | Shared base schema for all contact-style forms (contact, TMCG join, data-room, etc.) |
|
|
13
|
+
| `ContactSchema` | `z.ZodObject` | Extends `ContactBaseSchema` with dropdown-constrained `companySize` and `referralSource` fields |
|
|
14
|
+
| `ContactFormData` | `type` | Inferred TypeScript type from `ContactSchema` |
|
|
15
|
+
| `ContactApiResponse` | `interface` | Shape of the `POST /api/contact` JSON response |
|
|
16
|
+
|
|
17
|
+
## Usage Example
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import {
|
|
21
|
+
ContactSchema,
|
|
22
|
+
ContactBaseSchema,
|
|
23
|
+
LinkedInUrlSchema,
|
|
24
|
+
type ContactFormData,
|
|
25
|
+
defaultHelpCategoryOptions,
|
|
26
|
+
} from './contact-schema';
|
|
27
|
+
|
|
28
|
+
// Validate a generic contact form submission
|
|
29
|
+
const result = ContactSchema.safeParse(req.body);
|
|
30
|
+
if (!result.success) {
|
|
31
|
+
return res.status(400).json({ error: result.error.flatten() });
|
|
32
|
+
}
|
|
33
|
+
const data: ContactFormData = result.data;
|
|
34
|
+
|
|
35
|
+
// Extend the base schema for a custom form
|
|
36
|
+
const JoinSchema = ContactBaseSchema.extend({
|
|
37
|
+
companyName: z.string().min(2),
|
|
38
|
+
linkedin_url: LinkedInUrlSchema,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Use option constants in a Select component
|
|
42
|
+
<Select options={defaultHelpCategoryOptions} name="helpCategory" />
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
> **Note:** Always reference `LinkedInUrlSchema` directly rather than duplicating LinkedIn URL validation logic. Hostname-exact matching (`host === 'linkedin.com'` or `host.endsWith('.linkedin.com')`) is intentional — substring checks would accept adversarial inputs like `https://evil.com/linkedin.com/path`.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<!-- source-hash: cf04b71bf17cf6b35fdcdc036bdc8b09 -->
|
|
2
|
+
Storybook stories for the `AnnouncementBar` component, providing isolated visual variants with mocked API responses and localStorage state to simulate the full announcement lifecycle without a real backend.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Description |
|
|
7
|
+
|--------|-------------|
|
|
8
|
+
| `mockAnnouncement()` | Helper that intercepts `window.fetch` to return mock announcement data and clears dismiss flags from `localStorage` |
|
|
9
|
+
| `Default` | Basic announcement with icon and description using the Flamingo yellow (`#FFD951`) background |
|
|
10
|
+
| `WithCTA` | Announcement with a fully configured call-to-action button opening in a new tab |
|
|
11
|
+
| `WithCTASameTab` | CTA variant targeting `_self` for same-tab navigation |
|
|
12
|
+
| `BlueBackground` / `GreenBackground` | Color theme variants |
|
|
13
|
+
| `WithOpenFrameLogo` | Uses the `openframe-logo` SVG icon with a branded CTA |
|
|
14
|
+
| `WithPNGIcon` | Tests PNG icon rendering via `icon_png_url` |
|
|
15
|
+
| `LongContent` | Stress-tests truncation behavior on long titles and descriptions |
|
|
16
|
+
| `NoAnnouncement` | Renders with `null` announcement to verify the bar hides itself |
|
|
17
|
+
|
|
18
|
+
## Usage Example
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// How the fetch mock works in each story decorator
|
|
22
|
+
const cleanup = mockAnnouncement({
|
|
23
|
+
id: 'story-1',
|
|
24
|
+
title: 'New Feature Released',
|
|
25
|
+
description: 'Check out our latest updates.',
|
|
26
|
+
background_color: '#FFD951',
|
|
27
|
+
icon_type: 'svg',
|
|
28
|
+
icon_svg_name: 'rocket',
|
|
29
|
+
platform_id: 'openframe',
|
|
30
|
+
is_active: true,
|
|
31
|
+
created_at: new Date().toISOString(),
|
|
32
|
+
updated_at: new Date().toISOString(),
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
// The mock intercepts /api/announcements/active
|
|
36
|
+
// and returns the provided announcement object.
|
|
37
|
+
// Pass null to simulate no active announcement.
|
|
38
|
+
mockAnnouncement(null)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Notes
|
|
42
|
+
|
|
43
|
+
- All stories use the `fullscreen` layout to replicate the top-of-page bar context
|
|
44
|
+
- The `mockAnnouncement` helper automatically restores `window.fetch` and removes `localStorage` dismiss keys to prevent state leaking between story renders
|
|
45
|
+
- `autodocs` is enabled, generating a component API table from the `Announcement` type
|
|
@@ -1,46 +1,45 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
Storybook
|
|
1
|
+
<!-- source-hash: 6e460b9179ea9cfc7a0f83bf49f746bd -->
|
|
2
|
+
Storybook stories for the `AppLayout` component, showcasing layout configurations including sidebar states, header options, navigation interactions, and disabled states.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
6
|
+
- **`Default`** — Standard layout with sidebar, header, and active navigation tracking via `useState`
|
|
7
|
+
- **`WithHeaderUserOnly`** — Layout using only `headerProps` for user identity
|
|
8
|
+
- **`WithSearchAndOrganizations`** — Header with search bar and org selector enabled
|
|
9
|
+
- **`WithLoadingFallback`** — Custom Suspense fallback spinner injected via `loadingFallback` prop
|
|
10
|
+
- **`WithCustomMainClassName`** — Overrides main content area background styling
|
|
11
|
+
- **`MinimizedSidebar`** — Starts with sidebar collapsed to icon-only mode
|
|
12
|
+
- **`Interactive`** — Fully interactive story with live navigation state and current route display
|
|
13
|
+
- **`Disabled`** — All controls dimmed/inert except the mobile burger menu and sidebar collapse toggle
|
|
10
14
|
|
|
11
15
|
## Usage Example
|
|
12
16
|
|
|
13
17
|
```typescript
|
|
14
18
|
import { AppLayout } from '../components/navigation/app-layout'
|
|
15
19
|
|
|
16
|
-
// Basic
|
|
20
|
+
// Basic usage with sidebar and header
|
|
17
21
|
<AppLayout
|
|
18
22
|
sidebarConfig={{
|
|
19
23
|
items: navigationItems,
|
|
20
|
-
onNavigate:
|
|
21
|
-
onToggleMinimized:
|
|
24
|
+
onNavigate: (path) => router.push(path),
|
|
25
|
+
onToggleMinimized: () => setMinimized(prev => !prev),
|
|
22
26
|
}}
|
|
23
27
|
headerProps={{
|
|
24
28
|
showNotifications: true,
|
|
25
29
|
showUser: true,
|
|
26
|
-
userName: '
|
|
27
|
-
userEmail: '
|
|
28
|
-
onProfile:
|
|
30
|
+
userName: 'Jane Smith',
|
|
31
|
+
userEmail: 'jane@example.com',
|
|
32
|
+
onProfile: () => router.push('/profile'),
|
|
29
33
|
onLogout: handleLogout,
|
|
30
34
|
}}
|
|
31
35
|
mobileBurgerMenuProps={{
|
|
32
36
|
user: {
|
|
33
|
-
userName: '
|
|
34
|
-
userEmail: '
|
|
35
|
-
userAvatarUrl: 'https://github.com/shadcn.png',
|
|
37
|
+
userName: 'Jane Smith',
|
|
38
|
+
userEmail: 'jane@example.com',
|
|
36
39
|
userRole: 'Admin',
|
|
37
40
|
},
|
|
38
41
|
}}
|
|
39
42
|
>
|
|
40
|
-
<div className="p-4">
|
|
41
|
-
<h1>Main Content</h1>
|
|
42
|
-
</div>
|
|
43
|
+
<div className="p-4">Page content here</div>
|
|
43
44
|
</AppLayout>
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
The stories demonstrate features like responsive sidebar behavior, search functionality, organization selection, custom loading states, and interactive navigation with proper state management.
|
|
45
|
+
```
|
|
@@ -1,42 +1,56 @@
|
|
|
1
|
-
<!-- source-hash:
|
|
2
|
-
Storybook stories
|
|
1
|
+
<!-- source-hash: aaa3356b95c56eaf4a969ac37cfe3145 -->
|
|
2
|
+
Storybook stories for the `Autocomplete` UI component, covering all major interaction modes including single/multiple select, creatable options, server-side filtering, and various configuration props.
|
|
3
3
|
|
|
4
4
|
## Key Components
|
|
5
5
|
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
- `AllVariants` - Comparison view of multiple configurations
|
|
6
|
+
- **`Single`** — Basic single-select with no initial value
|
|
7
|
+
- **`SingleWithValue`** — Single-select with a pre-selected option
|
|
8
|
+
- **`SingleDisabled`** / **`MultipleDisabled`** — Disabled states
|
|
9
|
+
- **`SingleWithError`** / **`MultipleWithError`** — Validation error display
|
|
10
|
+
- **`Multiple`** — Multi-select with tag chips
|
|
11
|
+
- **`MultipleWithValues`** — Multi-select with pre-selected values
|
|
12
|
+
- **`MultipleWithMaxItems`** — Enforces a selection ceiling via `maxItems`
|
|
13
|
+
- **`MultipleFreeSolo`** — Allows arbitrary text input without matching options
|
|
14
|
+
- **`MultipleLimitTags`** — Collapses overflow tags via `limitTags`
|
|
15
|
+
- **`MultipleCustomOptionRender`** — Custom `renderOption` with status indicator dots
|
|
16
|
+
- **`Loading`** — Loading skeleton state with custom `loadingText`
|
|
17
|
+
- **`SingleCreatable`** / **`MultipleCreatable`** — Create new options on the fly via `onCreateOption`
|
|
18
|
+
- **`ServerSideFilter`** / **`ServerSideFilterCreatable`** — Disables client-side filtering; delegates to `onInputChange` with simulated async delay
|
|
19
|
+
- **`SingleNoChevron`** / **`MultipleNoChevron`** — Hides the dropdown chevron icon via `showChevron={false}`
|
|
20
|
+
- **`SingleKeepValueOnOpen`** — Preserves selected label text on focus via `clearOnOpen={false}`
|
|
22
21
|
|
|
23
22
|
## Usage Example
|
|
24
23
|
|
|
25
24
|
```typescript
|
|
26
|
-
|
|
27
|
-
export const ExampleStory: Story = {
|
|
28
|
-
args: {
|
|
29
|
-
options: sampleOptions,
|
|
30
|
-
value: ['enterprise', 'startup'],
|
|
31
|
-
onChange: () => {},
|
|
32
|
-
label: 'Industry Selection',
|
|
33
|
-
placeholder: 'Select industries...',
|
|
34
|
-
},
|
|
35
|
-
render: function Render(args) {
|
|
36
|
-
const [value, setValue] = useState<string[]>(args.value);
|
|
37
|
-
return <Autocomplete {...args} value={value} onChange={setValue} />;
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
```
|
|
25
|
+
import { Autocomplete, AutocompleteOption } from '../components/ui/autocomplete';
|
|
41
26
|
|
|
42
|
-
|
|
27
|
+
const options: AutocompleteOption<string>[] = [
|
|
28
|
+
{ label: 'Enterprise', value: 'enterprise' },
|
|
29
|
+
{ label: 'Startup', value: 'startup' },
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
// Single select
|
|
33
|
+
<Autocomplete
|
|
34
|
+
options={options}
|
|
35
|
+
value={value}
|
|
36
|
+
onChange={setValue}
|
|
37
|
+
label="Industry"
|
|
38
|
+
placeholder="Select..."
|
|
39
|
+
/>
|
|
40
|
+
|
|
41
|
+
// Multi-select with creation + server-side filter
|
|
42
|
+
<Autocomplete
|
|
43
|
+
multiple
|
|
44
|
+
creatable
|
|
45
|
+
disableClientFilter
|
|
46
|
+
options={filteredOptions}
|
|
47
|
+
value={selected}
|
|
48
|
+
onChange={setSelected}
|
|
49
|
+
onInputChange={handleSearch}
|
|
50
|
+
onCreateOption={(input) => addOption(input)}
|
|
51
|
+
loading={isLoading}
|
|
52
|
+
loadingText="Searching..."
|
|
53
|
+
maxItems={5}
|
|
54
|
+
limitTags={2}
|
|
55
|
+
/>
|
|
56
|
+
```
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<!-- source-hash: eded9627e041539da9106ebd71cd1d56 -->
|
|
2
|
+
Storybook stories for the `Board` component, demonstrating all major configuration variants including drag-and-drop, column types, pagination, loading states, and collapse behavior.
|
|
3
|
+
|
|
4
|
+
## Key Components
|
|
5
|
+
|
|
6
|
+
| Export | Description |
|
|
7
|
+
|--------|-------------|
|
|
8
|
+
| `Default` | Five canonical ticket-status columns with seeded tickets and full drag-and-drop wired up |
|
|
9
|
+
| `SystemAndCustom` | Mixed system and custom columns mirroring the OpenFrame Tickets layout, with DnD restrictions |
|
|
10
|
+
| `CustomColumns` | Fully custom columns proving column color is decoupled from `TicketStatus` |
|
|
11
|
+
| `Collapsible` | Columns with collapse toggle persisted to `localStorage` via `collapseStorageKey` |
|
|
12
|
+
| `Pagination` | Demonstrates `onLoadMore` with a 600ms simulated delay, appending 10 tickets per page from a pool of 50 |
|
|
13
|
+
| `InitialLoading` | All columns start in `isLoading` skeleton state, resolving to seeded data after 1 second |
|
|
14
|
+
| `Empty` | Empty columns to verify the drop placeholder render |
|
|
15
|
+
|
|
16
|
+
**Helpers used internally:**
|
|
17
|
+
|
|
18
|
+
- `buildSeedColumns()` — generates five default status columns with varied ticket data
|
|
19
|
+
- `applyChange()` — immutably applies a `BoardChange` (move/reorder) to the column state
|
|
20
|
+
|
|
21
|
+
## Usage Example
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// Minimal interactive board with DnD and immutable state update
|
|
25
|
+
const [columns, setColumns] = React.useState(buildSeedColumns())
|
|
26
|
+
|
|
27
|
+
<Board
|
|
28
|
+
columns={columns}
|
|
29
|
+
onChange={change => setColumns(prev => applyChange(prev, change))}
|
|
30
|
+
onTicketClick={id => console.log('clicked', id)}
|
|
31
|
+
onAddTicket={colId => console.log('add to', colId)}
|
|
32
|
+
collapseStorageKey="my-board-collapse"
|
|
33
|
+
onLoadMore={columnId => fetchNextPage(columnId)}
|
|
34
|
+
/>
|
|
35
|
+
```
|