@flamingo-stack/openframe-frontend-core 0.0.204 → 0.0.205
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-4CWSZPXH.cjs → chunk-24KCAECR.cjs} +9 -9
- package/dist/{chunk-4CWSZPXH.cjs.map → chunk-24KCAECR.cjs.map} +1 -1
- package/dist/chunk-27APPAJN.cjs +24 -0
- package/dist/chunk-27APPAJN.cjs.map +1 -0
- package/dist/{chunk-UC43NICZ.cjs → chunk-664KA5FI.cjs} +2 -35
- package/dist/chunk-664KA5FI.cjs.map +1 -0
- package/dist/chunk-6RZYJICV.cjs +24 -0
- package/dist/chunk-6RZYJICV.cjs.map +1 -0
- package/dist/chunk-7L4DWM7P.js +24 -0
- package/dist/chunk-7L4DWM7P.js.map +1 -0
- package/dist/chunk-BZFW3FOF.cjs +21 -0
- package/dist/chunk-BZFW3FOF.cjs.map +1 -0
- package/dist/{chunk-N57KWHDB.js → chunk-CIPO6DXK.js} +5 -5
- package/dist/chunk-EL5YVPD5.js +21 -0
- package/dist/chunk-EL5YVPD5.js.map +1 -0
- package/dist/{chunk-ARQ4XP64.cjs → chunk-FDCFI7YT.cjs} +40080 -31492
- package/dist/chunk-FDCFI7YT.cjs.map +1 -0
- package/dist/chunk-G7UE6RKV.cjs +121 -0
- package/dist/chunk-G7UE6RKV.cjs.map +1 -0
- package/dist/{chunk-25LVV26X.cjs → chunk-JUZGUQMX.cjs} +178 -50
- package/dist/chunk-JUZGUQMX.cjs.map +1 -0
- package/dist/{chunk-SZPJ5R5B.js → chunk-KSOOKNBG.js} +1 -34
- package/dist/chunk-KSOOKNBG.js.map +1 -0
- package/dist/{chunk-RMB5DVED.cjs → chunk-KUZGEA7U.cjs} +83 -66
- package/dist/chunk-KUZGEA7U.cjs.map +1 -0
- package/dist/chunk-LXC6P2EO.js +63 -0
- package/dist/chunk-LXC6P2EO.js.map +1 -0
- package/dist/chunk-MJNXIEV2.js +24 -0
- package/dist/chunk-MJNXIEV2.js.map +1 -0
- package/dist/{chunk-CPXLQ57U.js → chunk-MVGGXOFA.js} +37 -20
- package/dist/chunk-MVGGXOFA.js.map +1 -0
- package/dist/{chunk-LY34ORX6.js → chunk-O55ZUAX7.js} +39920 -31332
- package/dist/chunk-O55ZUAX7.js.map +1 -0
- package/dist/chunk-OHPI2HRK.js +47 -0
- package/dist/chunk-OHPI2HRK.js.map +1 -0
- package/dist/chunk-PLJLE4A4.js +121 -0
- package/dist/chunk-PLJLE4A4.js.map +1 -0
- package/dist/{chunk-XGL5FKIK.js → chunk-SCN5WFIZ.js} +148 -20
- package/dist/chunk-SCN5WFIZ.js.map +1 -0
- package/dist/chunk-WBR7H6E3.cjs +47 -0
- package/dist/chunk-WBR7H6E3.cjs.map +1 -0
- package/dist/chunk-XL4V2PYG.cjs +63 -0
- package/dist/chunk-XL4V2PYG.cjs.map +1 -0
- package/dist/components/announcement-bar.d.ts.map +1 -1
- package/dist/components/chat/chat-attachment-bar.d.ts +66 -0
- package/dist/components/chat/chat-attachment-bar.d.ts.map +1 -0
- package/dist/components/chat/chat-container.d.ts +21 -1
- package/dist/components/chat/chat-container.d.ts.map +1 -1
- package/dist/components/chat/chat-input.d.ts.map +1 -1
- package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
- package/dist/components/chat/chat-message-list.d.ts.map +1 -1
- package/dist/components/chat/chat-panel-context.d.ts +9 -0
- package/dist/components/chat/chat-panel-context.d.ts.map +1 -0
- package/dist/components/chat/chat-ticket-list.d.ts +1 -1
- package/dist/components/chat/chat-ticket-list.d.ts.map +1 -1
- package/dist/components/chat/embeddable-chat.d.ts +42 -0
- package/dist/components/chat/embeddable-chat.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/admin-content-card.d.ts +34 -0
- package/dist/components/chat/entity-cards/admin-content-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/block-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/blog-card.d.ts +30 -0
- package/dist/components/chat/entity-cards/blog-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/blog-image-placeholder.d.ts +26 -0
- package/dist/components/chat/entity-cards/blog-image-placeholder.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/campaign-card-admin.d.ts +33 -0
- package/dist/components/chat/entity-cards/campaign-card-admin.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/case-study-card.d.ts +20 -0
- package/dist/components/chat/entity-cards/case-study-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/chat-ticket-item.d.ts.map +1 -0
- package/dist/components/chat/{chat-video-entity-card.d.ts → entity-cards/chat-video-entity-card.d.ts} +1 -1
- package/dist/components/chat/entity-cards/chat-video-entity-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/customer-interview-card.d.ts +19 -0
- package/dist/components/chat/entity-cards/customer-interview-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/data-room-doc-card.d.ts +47 -0
- package/dist/components/chat/entity-cards/data-room-doc-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/dispatch.d.ts +119 -0
- package/dist/components/chat/entity-cards/dispatch.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/entity-author-card.d.ts +87 -0
- package/dist/components/chat/entity-cards/entity-author-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/generic-entity-card.d.ts +42 -0
- package/dist/components/chat/entity-cards/generic-entity-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/github-activity-card.d.ts +37 -0
- package/dist/components/chat/entity-cards/github-activity-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/hubspot-ticket-card.d.ts +28 -0
- package/dist/components/chat/entity-cards/hubspot-ticket-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/index.d.ts +32 -0
- package/dist/components/chat/entity-cards/index.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/investor-update-card.d.ts +19 -0
- package/dist/components/chat/entity-cards/investor-update-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts +20 -0
- package/dist/components/chat/entity-cards/onboarding-guide-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/product-release-card-defaults.d.ts +21 -0
- package/dist/components/chat/entity-cards/product-release-card-defaults.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/product-release-card.d.ts +12 -0
- package/dist/components/chat/entity-cards/product-release-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/program-card-defaults.d.ts +32 -0
- package/dist/components/chat/entity-cards/program-card-defaults.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/program-card.d.ts +37 -0
- package/dist/components/chat/entity-cards/program-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/roadmap-card.d.ts +28 -0
- package/dist/components/chat/entity-cards/roadmap-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/roadmap-vote-button.d.ts +12 -0
- package/dist/components/chat/entity-cards/roadmap-vote-button.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/slack-message-card.d.ts +28 -0
- package/dist/components/chat/entity-cards/slack-message-card.d.ts.map +1 -0
- package/dist/components/chat/entity-cards/task-type-icon.d.ts +6 -0
- package/dist/components/chat/entity-cards/task-type-icon.d.ts.map +1 -0
- package/dist/components/chat/hooks/index.d.ts +10 -0
- package/dist/components/chat/hooks/index.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-chat-attachment-image-gallery.d.ts +5 -0
- package/dist/components/chat/hooks/use-chat-attachment-image-gallery.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-chat-attachments.d.ts +33 -0
- package/dist/components/chat/hooks/use-chat-attachments.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-chat-card-item.d.ts +7 -0
- package/dist/components/chat/hooks/use-chat-card-item.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-chat-identity.d.ts +44 -0
- package/dist/components/chat/hooks/use-chat-identity.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-chat.d.ts +30 -0
- package/dist/components/chat/hooks/use-chat.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-close-on-navigation.d.ts +2 -0
- package/dist/components/chat/hooks/use-close-on-navigation.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-embedded-chat.d.ts +174 -0
- package/dist/components/chat/hooks/use-embedded-chat.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-proxied-image-url.d.ts +18 -0
- package/dist/components/chat/hooks/use-proxied-image-url.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-slash-commands.d.ts +32 -0
- package/dist/components/chat/hooks/use-slash-commands.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-sse.d.ts +57 -0
- package/dist/components/chat/hooks/use-sse.d.ts.map +1 -0
- package/dist/components/chat/index.cjs +393 -0
- package/dist/components/chat/index.cjs.map +1 -0
- package/dist/components/chat/index.d.ts +5 -3
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +393 -0
- package/dist/components/chat/index.js.map +1 -0
- package/dist/components/chat/nav-link-anchor-via-runtime.d.ts +33 -0
- package/dist/components/chat/nav-link-anchor-via-runtime.d.ts.map +1 -0
- package/dist/components/chat/source-action-button.d.ts +39 -0
- package/dist/components/chat/source-action-button.d.ts.map +1 -0
- package/dist/components/chat/types/chat.types.d.ts +36 -0
- package/dist/components/chat/types/chat.types.d.ts.map +1 -1
- package/dist/components/chat/types/component.types.d.ts +56 -11
- package/dist/components/chat/types/component.types.d.ts.map +1 -1
- package/dist/components/chat/types/entities/blog.d.ts +14 -0
- package/dist/components/chat/types/entities/blog.d.ts.map +1 -0
- package/dist/components/chat/types/entities/case-study.d.ts +10 -0
- package/dist/components/chat/types/entities/case-study.d.ts.map +1 -0
- package/dist/components/chat/types/entities/content-ref.d.ts +23 -0
- package/dist/components/chat/types/entities/content-ref.d.ts.map +1 -0
- package/dist/components/chat/types/entities/customer-interview.d.ts +10 -0
- package/dist/components/chat/types/entities/customer-interview.d.ts.map +1 -0
- package/dist/components/chat/types/entities/data-room-doc.d.ts +37 -0
- package/dist/components/chat/types/entities/data-room-doc.d.ts.map +1 -0
- package/dist/components/chat/types/entities/github-activity.d.ts +29 -0
- package/dist/components/chat/types/entities/github-activity.d.ts.map +1 -0
- package/dist/components/chat/types/entities/hubspot-ticket.d.ts +39 -0
- package/dist/components/chat/types/entities/hubspot-ticket.d.ts.map +1 -0
- package/dist/components/chat/types/entities/index.d.ts +28 -0
- package/dist/components/chat/types/entities/index.d.ts.map +1 -0
- package/dist/components/chat/types/entities/investor-update.d.ts +83 -0
- package/dist/components/chat/types/entities/investor-update.d.ts.map +1 -0
- package/dist/components/chat/types/entities/onboarding-guide.d.ts +79 -0
- package/dist/components/chat/types/entities/onboarding-guide.d.ts.map +1 -0
- package/dist/components/chat/types/entities/program-types.d.ts +303 -0
- package/dist/components/chat/types/entities/program-types.d.ts.map +1 -0
- package/dist/components/chat/types/entities/roadmap-item.d.ts +41 -0
- package/dist/components/chat/types/entities/roadmap-item.d.ts.map +1 -0
- package/dist/components/chat/types/entities/slack-message.d.ts +28 -0
- package/dist/components/chat/types/entities/slack-message.d.ts.map +1 -0
- package/dist/components/chat/types/index.d.ts +1 -0
- package/dist/components/chat/types/index.d.ts.map +1 -1
- package/dist/components/chat/utils/agent-status-message.d.ts +18 -0
- package/dist/components/chat/utils/agent-status-message.d.ts.map +1 -0
- package/dist/components/chat/utils/auto-continuation-directive.d.ts +38 -0
- package/dist/components/chat/utils/auto-continuation-directive.d.ts.map +1 -0
- package/dist/components/chat/utils/chat-attachment-markdown.d.ts +114 -0
- package/dist/components/chat/utils/chat-attachment-markdown.d.ts.map +1 -0
- package/dist/components/chat/utils/chat-authed-fetch.d.ts +13 -0
- package/dist/components/chat/utils/chat-authed-fetch.d.ts.map +1 -0
- package/dist/components/chat/utils/chat-nav-resolution.d.ts +72 -0
- package/dist/components/chat/utils/chat-nav-resolution.d.ts.map +1 -0
- package/dist/components/chat/utils/chat-proxy-auth-storage.d.ts +43 -0
- package/dist/components/chat/utils/chat-proxy-auth-storage.d.ts.map +1 -0
- package/dist/components/chat/utils/chip-action-class.d.ts +16 -0
- package/dist/components/chat/utils/chip-action-class.d.ts.map +1 -0
- package/dist/components/chat/utils/chip-styles.d.ts +32 -0
- package/dist/components/chat/utils/chip-styles.d.ts.map +1 -0
- package/dist/components/chat/utils/clickup-task-type-utils.d.ts +38 -0
- package/dist/components/chat/utils/clickup-task-type-utils.d.ts.map +1 -0
- package/dist/components/chat/utils/compact-card-classes.d.ts +50 -0
- package/dist/components/chat/utils/compact-card-classes.d.ts.map +1 -0
- package/dist/components/chat/utils/decide-new-tab.d.ts +39 -0
- package/dist/components/chat/utils/decide-new-tab.d.ts.map +1 -0
- package/dist/components/chat/utils/external-app-urls.d.ts +14 -0
- package/dist/components/chat/utils/external-app-urls.d.ts.map +1 -0
- package/dist/components/chat/utils/flatten-assistant-content.d.ts +25 -0
- package/dist/components/chat/utils/flatten-assistant-content.d.ts.map +1 -0
- package/dist/components/chat/utils/icon-registry.d.ts +67 -0
- package/dist/components/chat/utils/icon-registry.d.ts.map +1 -0
- package/dist/components/chat/utils/index.d.ts +21 -0
- package/dist/components/chat/utils/index.d.ts.map +1 -1
- package/dist/components/chat/utils/is-cross-origin-url.d.ts +22 -0
- package/dist/components/chat/utils/is-cross-origin-url.d.ts.map +1 -0
- package/dist/components/chat/utils/nav-anchor-props.d.ts +54 -0
- package/dist/components/chat/utils/nav-anchor-props.d.ts.map +1 -0
- package/dist/components/chat/utils/nav-click-handler.d.ts +51 -0
- package/dist/components/chat/utils/nav-click-handler.d.ts.map +1 -0
- package/dist/components/chat/utils/scroll-anchor.d.ts +30 -0
- package/dist/components/chat/utils/scroll-anchor.d.ts.map +1 -0
- package/dist/components/chat/utils/slash-dispatch-utils.d.ts +109 -0
- package/dist/components/chat/utils/slash-dispatch-utils.d.ts.map +1 -0
- package/dist/components/chat/utils/source-icons.d.ts +8 -0
- package/dist/components/chat/utils/source-icons.d.ts.map +1 -0
- package/dist/components/chat/utils/source-row-cta.d.ts +111 -0
- package/dist/components/chat/utils/source-row-cta.d.ts.map +1 -0
- package/dist/components/features/figma-prototype-viewer.d.ts.map +1 -1
- package/dist/components/features/index.cjs +12 -6
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.js +11 -5
- package/dist/components/features/video.d.ts.map +1 -1
- package/dist/components/icons/index.cjs +3 -3
- package/dist/components/icons/index.js +2 -2
- package/dist/components/index.cjs +274 -8
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +273 -7
- package/dist/components/interactive-wrapper.d.ts +3 -3
- package/dist/components/navigation/index.cjs +12 -6
- package/dist/components/navigation/index.cjs.map +1 -1
- package/dist/components/navigation/index.js +11 -5
- package/dist/components/resizable.d.ts +1 -1
- package/dist/components/shared/product-release/product-release-card-skeleton.d.ts +1 -1
- package/dist/components/shared/product-release/product-release-card-skeleton.d.ts.map +1 -1
- package/dist/components/shared/product-release/product-release-card.d.ts +19 -12
- package/dist/components/shared/product-release/product-release-card.d.ts.map +1 -1
- package/dist/components/shared/product-release/release-detail-page.d.ts +2 -4
- package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
- package/dist/components/ui/button/button.d.ts +13 -0
- package/dist/components/ui/button/button.d.ts.map +1 -1
- package/dist/components/ui/dashboard-info-card.d.ts.map +1 -1
- package/dist/components/ui/entity-image.d.ts.map +1 -1
- package/dist/components/ui/file-manager/index.cjs +71 -70
- package/dist/components/ui/file-manager/index.cjs.map +1 -1
- package/dist/components/ui/file-manager/index.js +6 -5
- package/dist/components/ui/file-manager/index.js.map +1 -1
- package/dist/components/ui/hover-dropdown.d.ts +66 -0
- package/dist/components/ui/hover-dropdown.d.ts.map +1 -0
- package/dist/components/ui/index.cjs +276 -6
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.d.ts +1 -0
- package/dist/components/ui/index.d.ts.map +1 -1
- package/dist/components/ui/index.js +278 -8
- package/dist/components/ui/simple-markdown-renderer.d.ts.map +1 -1
- package/dist/components/ui/square-avatar.d.ts.map +1 -1
- package/dist/contexts/chat-runtime-context.d.ts +109 -0
- package/dist/contexts/chat-runtime-context.d.ts.map +1 -0
- package/dist/contexts/endpoints-runtime-context.d.ts +28 -0
- package/dist/contexts/endpoints-runtime-context.d.ts.map +1 -0
- package/dist/contexts/index.cjs +30 -0
- package/dist/contexts/index.cjs.map +1 -0
- package/dist/contexts/index.d.ts +26 -0
- package/dist/contexts/index.d.ts.map +1 -0
- package/dist/contexts/index.js +30 -0
- package/dist/contexts/index.js.map +1 -0
- package/dist/contexts/use-outer-or-default.d.ts +29 -0
- package/dist/contexts/use-outer-or-default.d.ts.map +1 -0
- package/dist/embed-shims/index.cjs +51 -0
- package/dist/embed-shims/index.cjs.map +1 -0
- package/dist/embed-shims/index.d.ts +31 -0
- package/dist/embed-shims/index.d.ts.map +1 -0
- package/dist/embed-shims/index.js +51 -0
- package/dist/embed-shims/index.js.map +1 -0
- package/dist/embed-shims/next-dynamic.cjs +12 -0
- package/dist/embed-shims/next-dynamic.cjs.map +1 -0
- package/dist/embed-shims/next-dynamic.d.ts +47 -0
- package/dist/embed-shims/next-dynamic.d.ts.map +1 -0
- package/dist/embed-shims/next-dynamic.js +12 -0
- package/dist/embed-shims/next-dynamic.js.map +1 -0
- package/dist/embed-shims/next-image.cjs +12 -0
- package/dist/embed-shims/next-image.cjs.map +1 -0
- package/dist/embed-shims/next-image.d.ts +28 -0
- package/dist/embed-shims/next-image.d.ts.map +1 -0
- package/dist/embed-shims/next-image.js +12 -0
- package/dist/embed-shims/next-image.js.map +1 -0
- package/dist/embed-shims/next-link.cjs +14 -0
- package/dist/embed-shims/next-link.cjs.map +1 -0
- package/dist/embed-shims/next-link.d.ts +22 -0
- package/dist/embed-shims/next-link.d.ts.map +1 -0
- package/dist/embed-shims/next-link.js +14 -0
- package/dist/embed-shims/next-link.js.map +1 -0
- package/dist/embed-shims/next-navigation.cjs +30 -0
- package/dist/embed-shims/next-navigation.cjs.map +1 -0
- package/dist/embed-shims/next-navigation.d.ts +46 -0
- package/dist/embed-shims/next-navigation.d.ts.map +1 -0
- package/dist/embed-shims/next-navigation.js +30 -0
- package/dist/embed-shims/next-navigation.js.map +1 -0
- package/dist/hooks/index.cjs +10 -4
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +9 -3
- package/dist/hooks/use-access-code-integration.d.ts +48 -0
- package/dist/hooks/use-access-code-integration.d.ts.map +1 -0
- package/dist/hooks/use-contact-submission.d.ts.map +1 -1
- package/dist/hooks/use-og-placeholder.d.ts +31 -0
- package/dist/hooks/use-og-placeholder.d.ts.map +1 -0
- package/dist/hooks/use-toast.d.ts +1 -1
- package/dist/index.cjs +367 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +378 -18
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/access-code-client.d.ts +21 -37
- package/dist/utils/access-code-client.d.ts.map +1 -1
- package/dist/utils/cn.d.ts +0 -27
- package/dist/utils/cn.d.ts.map +1 -1
- package/dist/utils/color-analysis.d.ts +33 -0
- package/dist/utils/color-analysis.d.ts.map +1 -0
- package/dist/utils/date-formatters.d.ts +16 -5
- package/dist/utils/date-formatters.d.ts.map +1 -1
- package/dist/utils/fetch-priority.d.ts +3 -0
- package/dist/utils/fetch-priority.d.ts.map +1 -0
- package/dist/utils/format.d.ts +192 -1
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/image-proxy.d.ts +67 -2
- package/dist/utils/image-proxy.d.ts.map +1 -1
- package/dist/utils/index.cjs +1274 -155
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.ts +19 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1200 -157
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/local-storage-adapter.d.ts +46 -0
- package/dist/utils/local-storage-adapter.d.ts.map +1 -0
- package/dist/utils/source-icons.d.ts +78 -0
- package/dist/utils/source-icons.d.ts.map +1 -0
- package/package.json +29 -2
- package/src/components/announcement-bar.tsx +26 -4
- package/src/components/categories-cart.tsx +1 -1
- package/src/components/chat/chat-attachment-bar.tsx +323 -0
- package/src/components/chat/chat-container.tsx +39 -5
- package/src/components/chat/chat-input.tsx +7 -1
- package/src/components/chat/chat-message-enhanced.tsx +32 -22
- package/src/components/chat/chat-message-list.tsx +53 -4
- package/src/components/chat/chat-panel-context.tsx +37 -0
- package/src/components/chat/chat-ticket-list.tsx +1 -1
- package/src/components/chat/embeddable-chat.tsx +1106 -0
- package/src/components/chat/entity-cards/admin-content-card.tsx +155 -0
- package/src/components/chat/entity-cards/blog-card.tsx +259 -0
- package/src/components/chat/entity-cards/blog-image-placeholder.tsx +52 -0
- package/src/components/chat/entity-cards/campaign-card-admin.tsx +113 -0
- package/src/components/chat/entity-cards/case-study-card.tsx +192 -0
- package/src/components/chat/{chat-ticket-item.tsx → entity-cards/chat-ticket-item.tsx} +2 -2
- package/src/components/chat/{chat-video-entity-card.tsx → entity-cards/chat-video-entity-card.tsx} +2 -2
- package/src/components/chat/entity-cards/customer-interview-card.tsx +211 -0
- package/src/components/chat/entity-cards/data-room-doc-card.tsx +120 -0
- package/src/components/chat/entity-cards/dispatch.tsx +1093 -0
- package/src/components/chat/entity-cards/entity-author-card.tsx +193 -0
- package/src/components/chat/entity-cards/generic-entity-card.tsx +144 -0
- package/src/components/chat/entity-cards/github-activity-card.tsx +305 -0
- package/src/components/chat/entity-cards/hubspot-ticket-card.tsx +205 -0
- package/src/components/chat/entity-cards/index.ts +125 -0
- package/src/components/chat/entity-cards/investor-update-card.tsx +150 -0
- package/src/components/chat/entity-cards/onboarding-guide-card.tsx +326 -0
- package/src/components/chat/entity-cards/product-release-card-defaults.ts +57 -0
- package/src/components/chat/entity-cards/product-release-card.tsx +19 -0
- package/src/components/chat/entity-cards/program-card-defaults.ts +62 -0
- package/src/components/chat/entity-cards/program-card.tsx +451 -0
- package/src/components/chat/entity-cards/roadmap-card.tsx +356 -0
- package/src/components/chat/entity-cards/roadmap-vote-button.tsx +54 -0
- package/src/components/chat/entity-cards/slack-message-card.tsx +182 -0
- package/src/components/chat/entity-cards/task-type-icon.tsx +60 -0
- package/src/components/chat/hooks/index.ts +22 -0
- package/src/components/chat/hooks/use-chat-attachment-image-gallery.tsx +114 -0
- package/src/components/chat/hooks/use-chat-attachments.ts +429 -0
- package/src/components/chat/hooks/use-chat-card-item.ts +102 -0
- package/src/components/chat/hooks/use-chat-identity.ts +139 -0
- package/src/components/chat/hooks/use-chat.ts +501 -0
- package/src/components/chat/hooks/use-close-on-navigation.ts +87 -0
- package/src/components/chat/hooks/use-embedded-chat.ts +1023 -0
- package/src/components/chat/hooks/use-proxied-image-url.ts +31 -0
- package/src/components/chat/hooks/use-slash-commands.ts +106 -0
- package/src/components/chat/hooks/use-sse.ts +143 -0
- package/src/components/chat/index.ts +30 -4
- package/src/components/chat/nav-link-anchor-via-runtime.tsx +72 -0
- package/src/components/chat/source-action-button.tsx +120 -0
- package/src/components/chat/types/chat.types.ts +61 -0
- package/src/components/chat/types/component.types.ts +57 -11
- package/src/components/chat/types/entities/blog.ts +27 -0
- package/src/components/chat/types/entities/case-study.ts +14 -0
- package/src/components/chat/types/entities/content-ref.ts +23 -0
- package/src/components/chat/types/entities/customer-interview.ts +15 -0
- package/src/components/chat/types/entities/data-room-doc.ts +37 -0
- package/src/components/chat/types/entities/github-activity.ts +36 -0
- package/src/components/chat/types/entities/hubspot-ticket.ts +39 -0
- package/src/components/chat/types/entities/index.ts +28 -0
- package/src/components/chat/types/entities/investor-update.ts +100 -0
- package/src/components/chat/types/entities/onboarding-guide.ts +101 -0
- package/src/components/chat/types/entities/program-types.ts +433 -0
- package/src/components/chat/types/entities/roadmap-item.ts +42 -0
- package/src/components/chat/types/entities/slack-message.ts +28 -0
- package/src/components/chat/types/index.ts +1 -0
- package/src/components/chat/utils/agent-status-message.ts +52 -0
- package/src/components/chat/utils/auto-continuation-directive.ts +70 -0
- package/src/components/chat/utils/chat-attachment-markdown.ts +190 -0
- package/src/components/chat/utils/chat-authed-fetch.ts +73 -0
- package/src/components/chat/utils/chat-nav-resolution.ts +151 -0
- package/src/components/chat/utils/chat-proxy-auth-storage.ts +148 -0
- package/src/components/chat/utils/chip-action-class.ts +19 -0
- package/src/components/chat/utils/chip-styles.ts +51 -0
- package/src/components/chat/utils/clickup-task-type-utils.ts +59 -0
- package/src/components/chat/utils/compact-card-classes.ts +97 -0
- package/src/components/chat/utils/decide-new-tab.ts +57 -0
- package/src/components/chat/utils/external-app-urls.ts +19 -0
- package/src/components/chat/utils/flatten-assistant-content.ts +35 -0
- package/src/components/chat/utils/icon-registry.ts +297 -0
- package/src/components/chat/utils/index.ts +133 -0
- package/src/components/chat/utils/is-cross-origin-url.ts +28 -0
- package/src/components/chat/utils/nav-anchor-props.ts +78 -0
- package/src/components/chat/utils/nav-click-handler.ts +81 -0
- package/src/components/chat/utils/scroll-anchor.ts +35 -0
- package/src/components/chat/utils/slash-dispatch-utils.ts +183 -0
- package/src/components/chat/utils/source-icons.ts +14 -0
- package/src/components/chat/utils/source-row-cta.ts +215 -0
- package/src/components/empty-state.tsx +1 -1
- package/src/components/features/board/ticket-card.tsx +1 -1
- package/src/components/features/figma-prototype-viewer.tsx +2 -1
- package/src/components/features/media-gallery-manager.tsx +1 -1
- package/src/components/features/parallax-image-showcase.tsx +1 -1
- package/src/components/features/release-media-manager.tsx +1 -1
- package/src/components/features/seo-editor-preview.tsx +1 -1
- package/src/components/features/video.tsx +54 -3
- package/src/components/footer-waitlist-button.tsx +1 -1
- package/src/components/navigation/header.tsx +1 -1
- package/src/components/shared/onboarding/onboarding-step-card.tsx +1 -1
- package/src/components/shared/product-release/product-release-card-skeleton.tsx +8 -44
- package/src/components/shared/product-release/product-release-card.tsx +31 -116
- package/src/components/shared/product-release/release-detail-page.tsx +12 -16
- package/src/components/ui/actions-menu.tsx +1 -1
- package/src/components/ui/button/button.tsx +41 -11
- package/src/components/ui/button/split-button.tsx +1 -1
- package/src/components/ui/dashboard-info-card.tsx +2 -3
- package/src/components/ui/data-table/data-table-row.tsx +1 -1
- package/src/components/ui/entity-image.tsx +2 -8
- package/src/components/ui/hover-dropdown.tsx +258 -0
- package/src/components/ui/image-gallery-modal.tsx +1 -1
- package/src/components/ui/index.ts +1 -0
- package/src/components/ui/markdown-editor.tsx +1 -1
- package/src/components/ui/more-actions-menu.tsx +1 -1
- package/src/components/ui/organization-card.tsx +1 -1
- package/src/components/ui/simple-markdown-renderer.tsx +53 -5
- package/src/components/ui/square-avatar.tsx +3 -12
- package/src/components/ui/tab-navigation.tsx +1 -1
- package/src/components/ui/table/table-row.tsx +1 -1
- package/src/components/unified-filter-logic.tsx +1 -1
- package/src/components/unified-pagination.tsx +1 -1
- package/src/components/user-summary-stub.tsx +1 -1
- package/src/components/vendor-display-button.tsx +1 -1
- package/src/components/vendor-icon.tsx +1 -1
- package/src/contexts/chat-runtime-context.tsx +163 -0
- package/src/contexts/endpoints-runtime-context.tsx +68 -0
- package/src/contexts/index.ts +38 -0
- package/src/contexts/use-outer-or-default.ts +42 -0
- package/src/embed-shims/index.ts +42 -0
- package/src/embed-shims/next-dynamic.tsx +70 -0
- package/src/embed-shims/next-image.tsx +114 -0
- package/src/embed-shims/next-link.tsx +91 -0
- package/src/embed-shims/next-navigation.tsx +201 -0
- package/src/hooks/index.ts +9 -0
- package/src/hooks/state/use-api-params.ts +1 -1
- package/src/hooks/state/use-query-params.ts +1 -1
- package/src/hooks/use-access-code-integration.ts +107 -0
- package/src/hooks/use-contact-submission.ts +7 -3
- package/src/hooks/use-og-placeholder.ts +45 -0
- package/src/stories/OnboardingStepCard.stories.tsx +140 -0
- package/src/styles/chat-animations.css +65 -0
- package/src/styles/index.css +1 -0
- package/src/utils/access-code-client.ts +32 -75
- package/src/utils/cn.ts +0 -65
- package/src/utils/color-analysis.ts +205 -0
- package/src/utils/date-formatters.ts +54 -11
- package/src/utils/fetch-priority.ts +41 -0
- package/src/utils/format.ts +525 -1
- package/src/utils/image-proxy.ts +127 -7
- package/src/utils/index.ts +145 -5
- package/src/utils/local-storage-adapter.ts +105 -0
- package/src/utils/source-icons.ts +219 -0
- package/dist/chunk-25LVV26X.cjs.map +0 -1
- package/dist/chunk-ARQ4XP64.cjs.map +0 -1
- package/dist/chunk-CPXLQ57U.js.map +0 -1
- package/dist/chunk-LY34ORX6.js.map +0 -1
- package/dist/chunk-RMB5DVED.cjs.map +0 -1
- package/dist/chunk-SZPJ5R5B.js.map +0 -1
- package/dist/chunk-UC43NICZ.cjs.map +0 -1
- package/dist/chunk-XGL5FKIK.js.map +0 -1
- package/dist/components/chat/block-card.d.ts.map +0 -1
- package/dist/components/chat/chat-ticket-item.d.ts.map +0 -1
- package/dist/components/chat/chat-video-entity-card.d.ts.map +0 -1
- package/dist/utils/dynamic-icons.d.ts +0 -26
- package/dist/utils/dynamic-icons.d.ts.map +0 -1
- package/dist/utils/format-relative-time.d.ts +0 -21
- package/dist/utils/format-relative-time.d.ts.map +0 -1
- package/src/utils/.dynamic-icons.md +0 -30
- package/src/utils/.format-relative-time.md +0 -36
- package/src/utils/dynamic-icons.tsx +0 -120
- package/src/utils/format-relative-time.ts +0 -52
- /package/dist/{chunk-N57KWHDB.js.map → chunk-CIPO6DXK.js.map} +0 -0
- /package/dist/components/chat/{block-card.d.ts → entity-cards/block-card.d.ts} +0 -0
- /package/dist/components/chat/{chat-ticket-item.d.ts → entity-cards/chat-ticket-item.d.ts} +0 -0
- /package/src/components/chat/{block-card.tsx → entity-cards/block-card.tsx} +0 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* OnboardingGuideCard (pure presentation).
|
|
5
|
+
*
|
|
6
|
+
* Three variants:
|
|
7
|
+
* - `catalog`: rich detail card (hero + author grid) for the public catalog
|
|
8
|
+
* page.
|
|
9
|
+
* - `default`: horizontal step-numbered card for "More in {section}" rail.
|
|
10
|
+
* - `sm`: compact horizontal card for chat-inline rendering.
|
|
11
|
+
*
|
|
12
|
+
* The card writes NO click logic — callers wrap with their own anchor and
|
|
13
|
+
* pass the resolved detail URL via `href`.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import React from 'react'
|
|
17
|
+
import Image from '../../../embed-shims/next-image'
|
|
18
|
+
import { Clock, ExternalLink, GraduationCap, Play } from 'lucide-react'
|
|
19
|
+
import { cn } from '../../../utils/cn'
|
|
20
|
+
import { BlogImagePlaceholder } from './blog-image-placeholder'
|
|
21
|
+
import { EntityAuthorCard } from './entity-author-card'
|
|
22
|
+
import { formatDurationMMSS } from '../../../utils/format'
|
|
23
|
+
import type { OnboardingGuide } from '../types/entities/onboarding-guide'
|
|
24
|
+
import {
|
|
25
|
+
COMPACT_CARD_OUTER,
|
|
26
|
+
COMPACT_CARD_IMAGE_SLOT,
|
|
27
|
+
COMPACT_CARD_SKELETON_IMAGE_SLOT,
|
|
28
|
+
COMPACT_CARD_SKELETON_OUTER,
|
|
29
|
+
COMPACT_CARD_TEXT_COL,
|
|
30
|
+
COMPACT_CARD_TITLE_ROW,
|
|
31
|
+
COMPACT_CARD_TITLE,
|
|
32
|
+
COMPACT_CARD_META_ROW_BOX,
|
|
33
|
+
COMPACT_CARD_SUMMARY,
|
|
34
|
+
COMPACT_CARD_ROW_FILLER,
|
|
35
|
+
} from '../utils/compact-card-classes'
|
|
36
|
+
|
|
37
|
+
export interface OnboardingGuideCardProps {
|
|
38
|
+
guide: OnboardingGuide
|
|
39
|
+
/** Detail URL resolved by the caller. */
|
|
40
|
+
href: string
|
|
41
|
+
/** When `_blank`, opens in a new tab. Set by chat dispatch via
|
|
42
|
+
* `computeIsNewTab`. Defaults to same-tab. */
|
|
43
|
+
target?: '_blank'
|
|
44
|
+
rel?: 'noopener noreferrer'
|
|
45
|
+
targetPlatform?: string | null
|
|
46
|
+
/** OG placeholder URL used by the catalog + sm variants when no cover. */
|
|
47
|
+
placeholderUrl?: string | null
|
|
48
|
+
size?: 'catalog' | 'default' | 'sm'
|
|
49
|
+
className?: string
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const HORIZONTAL_SIZE_TOKENS = {
|
|
53
|
+
default: {
|
|
54
|
+
padding: 'p-4',
|
|
55
|
+
step: 'w-8 h-8 text-sm',
|
|
56
|
+
title: 'text-h5',
|
|
57
|
+
summaryClamp: 'line-clamp-2',
|
|
58
|
+
},
|
|
59
|
+
} as const
|
|
60
|
+
|
|
61
|
+
export function OnboardingGuideCardSkeleton({ size = 'default' }: { size?: 'catalog' | 'default' | 'sm' }) {
|
|
62
|
+
if (size === 'catalog') {
|
|
63
|
+
return (
|
|
64
|
+
<div className="bg-ods-system-greys-black border border-ods-border rounded-lg overflow-hidden flex flex-col p-6 gap-4 animate-pulse">
|
|
65
|
+
<div className="flex flex-col md:flex-row gap-4 md:gap-6">
|
|
66
|
+
<div className="w-full md:w-[256px] aspect-[16/9] bg-ods-border rounded-lg flex-shrink-0" />
|
|
67
|
+
<div className="flex-1 min-w-0 flex flex-col">
|
|
68
|
+
<div className="min-h-[60px] md:min-h-[72px] flex flex-col gap-1.5 justify-start mb-3">
|
|
69
|
+
<div className="h-[25px] md:h-[30px] w-3/4 bg-ods-border rounded" />
|
|
70
|
+
<div className="h-[25px] md:h-[30px] w-1/2 bg-ods-border rounded" />
|
|
71
|
+
</div>
|
|
72
|
+
<div className="min-h-[46px] md:min-h-[52px] flex flex-col gap-2 justify-start">
|
|
73
|
+
<div className="h-3 w-full bg-ods-border/70 rounded" />
|
|
74
|
+
<div className="h-3 w-5/6 bg-ods-border/70 rounded" />
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
<div className="grid grid-cols-1 md:grid-cols-3 border border-ods-border rounded-md overflow-hidden w-full">
|
|
79
|
+
{[0, 1].map((i) => (
|
|
80
|
+
<div
|
|
81
|
+
key={`cell-${i}`}
|
|
82
|
+
className="bg-ods-card p-4 flex flex-col gap-3 border-b md:border-b-0 md:border-r border-ods-border"
|
|
83
|
+
>
|
|
84
|
+
<div className="flex flex-col gap-2">
|
|
85
|
+
<div className="h-6 w-32 bg-ods-bg rounded" />
|
|
86
|
+
<div className="h-3 w-20 bg-ods-bg/60 rounded" />
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
))}
|
|
90
|
+
<div className="bg-ods-card p-4 flex items-center gap-3">
|
|
91
|
+
<div className="h-10 w-10 rounded-full bg-ods-bg shrink-0" />
|
|
92
|
+
<div className="flex flex-col gap-2 flex-1 min-w-0">
|
|
93
|
+
<div className="h-4 w-3/4 bg-ods-bg rounded" />
|
|
94
|
+
<div className="h-3 w-1/2 bg-ods-bg/60 rounded" />
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
if (size === 'sm') {
|
|
102
|
+
return (
|
|
103
|
+
<span className={COMPACT_CARD_SKELETON_OUTER}>
|
|
104
|
+
<span className={COMPACT_CARD_SKELETON_IMAGE_SLOT} />
|
|
105
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
106
|
+
<span className={COMPACT_CARD_TITLE_ROW}>
|
|
107
|
+
<span className="h-3.5 w-3/5 rounded bg-ods-bg" />
|
|
108
|
+
</span>
|
|
109
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
110
|
+
<span className="h-3 w-2/5 rounded bg-ods-bg/70" />
|
|
111
|
+
</span>
|
|
112
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
113
|
+
<span className="h-3 w-11/12 rounded bg-ods-bg/40" />
|
|
114
|
+
</span>
|
|
115
|
+
</span>
|
|
116
|
+
<span className="flex shrink-0 items-center self-start h-5">
|
|
117
|
+
<span className="h-3.5 w-3.5 rounded bg-ods-bg" />
|
|
118
|
+
</span>
|
|
119
|
+
</span>
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
const t = HORIZONTAL_SIZE_TOKENS.default
|
|
123
|
+
return (
|
|
124
|
+
<span
|
|
125
|
+
className={`flex items-start gap-3 rounded-md border border-ods-border bg-ods-card ${t.padding} animate-pulse`}
|
|
126
|
+
>
|
|
127
|
+
<span className={`shrink-0 inline-flex items-center justify-center rounded-full bg-ods-bg ${t.step}`} />
|
|
128
|
+
<span className="flex flex-col gap-2 flex-1 min-w-0">
|
|
129
|
+
<span className="block h-4 w-2/3 rounded bg-ods-bg" />
|
|
130
|
+
<span className="block h-3 w-1/3 rounded bg-ods-bg/70" />
|
|
131
|
+
<span className="block h-3 w-full rounded bg-ods-bg/40" />
|
|
132
|
+
</span>
|
|
133
|
+
</span>
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function OnboardingGuideCard({ guide, href, target, rel, placeholderUrl, size = 'default', className }: OnboardingGuideCardProps) {
|
|
138
|
+
if (size === 'catalog') {
|
|
139
|
+
const coverImage =
|
|
140
|
+
guide.featured_image ||
|
|
141
|
+
guide.main_video_thumbnail ||
|
|
142
|
+
guide.og_image_url ||
|
|
143
|
+
null
|
|
144
|
+
const hasVideoCover = !!(guide.main_video_thumbnail || guide.highlight_video_thumbnail)
|
|
145
|
+
const stepLabel =
|
|
146
|
+
typeof guide.step_order === 'number'
|
|
147
|
+
? String(guide.step_order).padStart(2, '0')
|
|
148
|
+
: '—'
|
|
149
|
+
const durationLabel =
|
|
150
|
+
typeof guide.highlight_video_duration_ms === 'number' && guide.highlight_video_duration_ms > 0
|
|
151
|
+
? formatDurationMMSS(Math.floor(guide.highlight_video_duration_ms / 1000))
|
|
152
|
+
: ''
|
|
153
|
+
|
|
154
|
+
return (
|
|
155
|
+
<a
|
|
156
|
+
href={href}
|
|
157
|
+
target={target}
|
|
158
|
+
rel={rel}
|
|
159
|
+
className={cn(
|
|
160
|
+
'group block no-underline bg-ods-system-greys-black',
|
|
161
|
+
'border border-ods-border rounded-lg overflow-hidden',
|
|
162
|
+
'transition-all duration-300 ease-out',
|
|
163
|
+
'transform hover:translate-y-[-2px]',
|
|
164
|
+
'hover:border-ods-accent hover:shadow-lg hover:shadow-ods-accent/[0.08]',
|
|
165
|
+
className,
|
|
166
|
+
)}
|
|
167
|
+
aria-label={`Open ${guide.title}`}
|
|
168
|
+
>
|
|
169
|
+
<div className="flex flex-col p-6 gap-4">
|
|
170
|
+
<div className="flex flex-col md:flex-row gap-4 md:gap-6">
|
|
171
|
+
<div className="w-full md:w-[256px] flex-shrink-0">
|
|
172
|
+
<div className="relative rounded-lg overflow-hidden w-full aspect-[16/9] bg-ods-bg">
|
|
173
|
+
{coverImage ? (
|
|
174
|
+
<Image
|
|
175
|
+
src={coverImage}
|
|
176
|
+
alt={guide.title}
|
|
177
|
+
fill
|
|
178
|
+
sizes="(max-width: 768px) 100vw, 256px"
|
|
179
|
+
className="object-cover"
|
|
180
|
+
unoptimized
|
|
181
|
+
/>
|
|
182
|
+
) : (
|
|
183
|
+
<BlogImagePlaceholder
|
|
184
|
+
title={guide.title}
|
|
185
|
+
imageUrl={placeholderUrl ?? null}
|
|
186
|
+
className="absolute inset-0"
|
|
187
|
+
/>
|
|
188
|
+
)}
|
|
189
|
+
{hasVideoCover && coverImage && (
|
|
190
|
+
<span className="absolute inset-0 flex items-center justify-center bg-black/30">
|
|
191
|
+
<Play className="w-10 h-10 text-white" fill="white" />
|
|
192
|
+
</span>
|
|
193
|
+
)}
|
|
194
|
+
{durationLabel && (
|
|
195
|
+
<span className="absolute bottom-2 right-2 inline-flex items-center gap-1 px-2 py-1 rounded bg-black/60 text-white text-xs font-medium font-mono">
|
|
196
|
+
<Clock className="w-3 h-3" />
|
|
197
|
+
{durationLabel}
|
|
198
|
+
</span>
|
|
199
|
+
)}
|
|
200
|
+
</div>
|
|
201
|
+
</div>
|
|
202
|
+
|
|
203
|
+
<div className="flex-1 min-w-0 flex flex-col">
|
|
204
|
+
<div className="min-h-[60px] md:min-h-[72px] flex items-start mb-3">
|
|
205
|
+
<h3 className="font-['Azeret_Mono'] font-semibold text-xl md:text-2xl text-ods-text-primary leading-tight line-clamp-2">
|
|
206
|
+
{guide.title}
|
|
207
|
+
</h3>
|
|
208
|
+
</div>
|
|
209
|
+
<div className="min-h-[46px] md:min-h-[52px]">
|
|
210
|
+
<p className="font-['DM_Sans'] text-sm md:text-base text-ods-text-secondary leading-relaxed line-clamp-2">
|
|
211
|
+
{(guide.video_summary || guide.content || '').trim()}
|
|
212
|
+
</p>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
<EntityAuthorCard
|
|
218
|
+
author={guide.author}
|
|
219
|
+
publishedAt={guide.published_at}
|
|
220
|
+
renderEmptyAuthor
|
|
221
|
+
extraCells={[
|
|
222
|
+
{
|
|
223
|
+
value: `${guide.section} · Step ${stepLabel}`,
|
|
224
|
+
label: 'Section',
|
|
225
|
+
uppercase: false,
|
|
226
|
+
},
|
|
227
|
+
]}
|
|
228
|
+
/>
|
|
229
|
+
</div>
|
|
230
|
+
</a>
|
|
231
|
+
)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (size === 'sm') {
|
|
235
|
+
const coverImage = guide.featured_image || guide.main_video_thumbnail || guide.og_image_url || null
|
|
236
|
+
const compactCover = coverImage || placeholderUrl || null
|
|
237
|
+
const hasVideoCover = !guide.featured_image && !!guide.main_video_thumbnail
|
|
238
|
+
const summary = (guide.video_summary || guide.content || '').trim()
|
|
239
|
+
const author = guide.author?.full_name?.trim() || ''
|
|
240
|
+
const subtitleParts = [
|
|
241
|
+
`Step ${guide.step_order}`,
|
|
242
|
+
guide.section,
|
|
243
|
+
author,
|
|
244
|
+
].filter((s): s is string => typeof s === 'string' && s.length > 0)
|
|
245
|
+
return (
|
|
246
|
+
<a href={href} target={target} rel={rel} className={cn(COMPACT_CARD_OUTER, className)}>
|
|
247
|
+
<span className={COMPACT_CARD_IMAGE_SLOT}>
|
|
248
|
+
{compactCover ? (
|
|
249
|
+
<Image
|
|
250
|
+
src={compactCover}
|
|
251
|
+
alt={guide.title}
|
|
252
|
+
fill
|
|
253
|
+
sizes="56px"
|
|
254
|
+
className="object-contain"
|
|
255
|
+
unoptimized
|
|
256
|
+
/>
|
|
257
|
+
) : (
|
|
258
|
+
<span className="flex h-full w-full items-center justify-center text-ods-accent">
|
|
259
|
+
<GraduationCap className="w-4 h-4" />
|
|
260
|
+
</span>
|
|
261
|
+
)}
|
|
262
|
+
{hasVideoCover && compactCover && (
|
|
263
|
+
<span className="absolute inset-0 flex items-center justify-center bg-black/30">
|
|
264
|
+
<Play className="h-4 w-4 text-white" fill="white" />
|
|
265
|
+
</span>
|
|
266
|
+
)}
|
|
267
|
+
</span>
|
|
268
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
269
|
+
<span className={COMPACT_CARD_TITLE_ROW}>
|
|
270
|
+
<span className={cn(COMPACT_CARD_TITLE, "font-['Azeret_Mono']")}>
|
|
271
|
+
{guide.title}
|
|
272
|
+
</span>
|
|
273
|
+
</span>
|
|
274
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
275
|
+
<span className="truncate text-[11px] leading-4 text-[var(--color-accent-primary)]">
|
|
276
|
+
{subtitleParts.join(' · ')}
|
|
277
|
+
</span>
|
|
278
|
+
</span>
|
|
279
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
280
|
+
<span className={COMPACT_CARD_SUMMARY}>
|
|
281
|
+
{summary || COMPACT_CARD_ROW_FILLER}
|
|
282
|
+
</span>
|
|
283
|
+
</span>
|
|
284
|
+
</span>
|
|
285
|
+
<span className="flex shrink-0 items-center self-start h-5 text-ods-text-secondary">
|
|
286
|
+
<ExternalLink className="w-3.5 h-3.5" />
|
|
287
|
+
</span>
|
|
288
|
+
</a>
|
|
289
|
+
)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// size === 'default' — horizontal step-numbered card for related-rail.
|
|
293
|
+
const t = HORIZONTAL_SIZE_TOKENS.default
|
|
294
|
+
const summary = (guide.video_summary || guide.content || '').trim()
|
|
295
|
+
|
|
296
|
+
return (
|
|
297
|
+
<a
|
|
298
|
+
href={href}
|
|
299
|
+
target={target}
|
|
300
|
+
rel={rel}
|
|
301
|
+
className={cn(
|
|
302
|
+
`flex items-start gap-3 rounded-md border border-ods-border bg-ods-card hover:border-ods-accent transition-colors ${t.padding}`,
|
|
303
|
+
className,
|
|
304
|
+
)}
|
|
305
|
+
>
|
|
306
|
+
<span
|
|
307
|
+
className={`shrink-0 inline-flex items-center justify-center rounded-full bg-ods-accent/10 text-ods-accent font-semibold ${t.step}`}
|
|
308
|
+
aria-hidden="true"
|
|
309
|
+
>
|
|
310
|
+
{guide.step_order}
|
|
311
|
+
</span>
|
|
312
|
+
<span className="flex flex-col gap-0.5 flex-1 min-w-0">
|
|
313
|
+
<span className={`block ${t.title} text-ods-text-primary truncate`}>{guide.title}</span>
|
|
314
|
+
<span className="inline-flex items-center gap-1 font-['DM_Sans'] text-[12px] leading-[16px] text-ods-text-secondary">
|
|
315
|
+
<GraduationCap className="h-3 w-3 shrink-0" />
|
|
316
|
+
<span className="truncate">{guide.section}</span>
|
|
317
|
+
</span>
|
|
318
|
+
{summary && (
|
|
319
|
+
<span className={`block font-['DM_Sans'] text-[14px] leading-[20px] text-ods-text-secondary ${t.summaryClamp}`}>
|
|
320
|
+
{summary}
|
|
321
|
+
</span>
|
|
322
|
+
)}
|
|
323
|
+
</span>
|
|
324
|
+
</a>
|
|
325
|
+
)
|
|
326
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lib-side default `buildProductReleaseCardProps` for the chat dispatch.
|
|
3
|
+
*
|
|
4
|
+
* The compact (`size='sm'`) branch of `<ProductReleaseCard>` only reads
|
|
5
|
+
* `coverImage`, `hasVideoCover`, and `formattedDate` — the rest of the
|
|
6
|
+
* derived prop bundle is catalog-page (`size='lg'`) metadata. This
|
|
7
|
+
* default builder satisfies the three sm-relevant fields with row data
|
|
8
|
+
* the list-API already returns, so embedders that don't supply
|
|
9
|
+
* `opts.extras.buildProductReleaseCardProps` still get a rendered card
|
|
10
|
+
* instead of a bare text chip. Hub-side embedders pass their richer
|
|
11
|
+
* builder via `extras` to get the lg-only fields (changelogCounts,
|
|
12
|
+
* badge color, view count, etc.).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { formatReleaseDate } from '../../../utils/date-formatters'
|
|
16
|
+
|
|
17
|
+
interface ReleaseLike {
|
|
18
|
+
release_date?: string | null
|
|
19
|
+
featured_image?: string | null
|
|
20
|
+
og_image_url?: string | null
|
|
21
|
+
main_video_thumbnail?: string | null
|
|
22
|
+
highlight_video_thumbnail?: string | null
|
|
23
|
+
main_video_url?: string | null
|
|
24
|
+
youtube_url?: string | null
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface DerivedSmProps {
|
|
28
|
+
coverImage: string | null
|
|
29
|
+
hasVideoCover: boolean
|
|
30
|
+
formattedDate: string
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Pick the first usable image URL from the row's cover-candidate
|
|
34
|
+
* fields. Order mirrors the hub's `resolveReleaseCover` precedence
|
|
35
|
+
* (video thumbnail wins when a video is set, then featured/og). */
|
|
36
|
+
function pickCover(item: ReleaseLike): string | null {
|
|
37
|
+
const hasVideo = Boolean(item.main_video_url || item.youtube_url)
|
|
38
|
+
if (hasVideo) {
|
|
39
|
+
if (item.main_video_thumbnail) return item.main_video_thumbnail
|
|
40
|
+
if (item.highlight_video_thumbnail) return item.highlight_video_thumbnail
|
|
41
|
+
}
|
|
42
|
+
return item.featured_image ?? item.og_image_url ?? null
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function defaultBuildProductReleaseCardProps(item: unknown): DerivedSmProps {
|
|
46
|
+
const row = (item ?? {}) as ReleaseLike
|
|
47
|
+
return {
|
|
48
|
+
coverImage: pickCover(row),
|
|
49
|
+
hasVideoCover: Boolean(row.main_video_url || row.youtube_url),
|
|
50
|
+
// `formatReleaseDate` is TZ-safe (splits the `YYYY-MM-DD` head before
|
|
51
|
+
// constructing the Date). Using `new Date(input).toLocaleDateString`
|
|
52
|
+
// here would shift the date by one day west of UTC for date-only
|
|
53
|
+
// inputs — the hub's own `buildProductReleaseCardProps` already uses
|
|
54
|
+
// this helper, so the chat-default + hub builder agree.
|
|
55
|
+
formattedDate: row.release_date ? formatReleaseDate(row.release_date) : '',
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ProductReleaseCard — chat entity-card re-export of the canonical
|
|
5
|
+
* `<ProductReleaseCard>` already in `src/components/shared/product-release/`.
|
|
6
|
+
*
|
|
7
|
+
* The shared module is the SOURCE OF TRUTH (lg + sm variants live there).
|
|
8
|
+
* This file just re-exports under `entity-cards/` so the chat barrel
|
|
9
|
+
* (`components/chat/index.ts`) groups every entity card under one path
|
|
10
|
+
* — consumers don't notice the indirection.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
ProductReleaseCard,
|
|
15
|
+
type ProductReleaseCardProps,
|
|
16
|
+
type ProductReleaseCardSize,
|
|
17
|
+
type ProductReleaseCardAnchorProps,
|
|
18
|
+
} from '../../shared/product-release/product-release-card'
|
|
19
|
+
export { ProductReleaseCardSkeleton } from '../../shared/product-release/product-release-card-skeleton'
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lib-side default ProgramConfig values for the chat dispatch.
|
|
3
|
+
*
|
|
4
|
+
* `<ProgramCard size='sm'>` (the compact chat card) only consumes
|
|
5
|
+
* `config.type` (for branching on podcast vs webinar vs event presentation
|
|
6
|
+
* details) and `config.labels?.singular` (rendered as the subtitle's
|
|
7
|
+
* type label, e.g. "Episode" / "Webinar" / "Event"). Everything else on
|
|
8
|
+
* `ProgramConfig` — `dateField`, `table`, `apiEndpoint`, `icon`,
|
|
9
|
+
* `detailRoute`, `externalLinkLabel`, etc. — is catalog-page metadata,
|
|
10
|
+
* not used by the inline chat card.
|
|
11
|
+
*
|
|
12
|
+
* Previously the chat dispatch REQUIRED `opts.extras.programConfigs.X`
|
|
13
|
+
* to be provided by the embedder; if it was missing the dispatch
|
|
14
|
+
* returned `null` and the chat fell back to a bare text chip ("Ask" +
|
|
15
|
+
* id). That tightly coupled every embedder to the hub-side
|
|
16
|
+
* `program-configs.ts` (which transitively imports `currentPlatform()`
|
|
17
|
+
* + `buildContentURL` — hub-internal). The validation app + any
|
|
18
|
+
* non-hub embedder couldn't render podcast/webinar/event cards at all.
|
|
19
|
+
*
|
|
20
|
+
* These defaults satisfy the compact-card render contract with
|
|
21
|
+
* minimal hard-coded labels. Embedders that need richer catalog
|
|
22
|
+
* configs (full icon, externalLinkLabel, etc.) can still override per
|
|
23
|
+
* type via `opts.extras.programConfigs.X` — the dispatch reads
|
|
24
|
+
* `extras.programConfigs.X ?? DEFAULT_PROGRAM_CONFIGS.X`.
|
|
25
|
+
*/
|
|
26
|
+
import type { ProgramConfig, BaseProgramItem } from '../types/entities/program-types'
|
|
27
|
+
|
|
28
|
+
/** Minimal config — fields the compact card actually reads + safe
|
|
29
|
+
* placeholders for the others so type-checking passes. */
|
|
30
|
+
function makeDefault<T extends BaseProgramItem>(
|
|
31
|
+
type: 'podcast' | 'webinar' | 'event',
|
|
32
|
+
singular: string,
|
|
33
|
+
plural: string,
|
|
34
|
+
): ProgramConfig<T> {
|
|
35
|
+
return {
|
|
36
|
+
type,
|
|
37
|
+
labels: {
|
|
38
|
+
singular,
|
|
39
|
+
plural,
|
|
40
|
+
upcoming: `Latest ${singular}:`,
|
|
41
|
+
upcomingSection: `Upcoming ${plural}`,
|
|
42
|
+
archive: `Past ${plural}`,
|
|
43
|
+
empty: `No ${plural.toLowerCase()} yet`,
|
|
44
|
+
},
|
|
45
|
+
// dateField / table / apiEndpoint / icon / detailRoute /
|
|
46
|
+
// externalLinkLabel are NOT read by the compact chat card — set to
|
|
47
|
+
// empty / null so the embedder doesn't have to think about catalog
|
|
48
|
+
// page concerns when all they want is the inline chat card.
|
|
49
|
+
dateField: 'date' as keyof T,
|
|
50
|
+
table: '',
|
|
51
|
+
apiEndpoint: '',
|
|
52
|
+
icon: null,
|
|
53
|
+
externalLinkLabel: '',
|
|
54
|
+
detailRoute: '',
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const DEFAULT_PROGRAM_CONFIGS = {
|
|
59
|
+
podcast: makeDefault<BaseProgramItem>('podcast', 'Episode', 'Episodes'),
|
|
60
|
+
webinar: makeDefault<BaseProgramItem>('webinar', 'Webinar', 'Webinars'),
|
|
61
|
+
event: makeDefault<BaseProgramItem>('event', 'Event', 'Events'),
|
|
62
|
+
} as const
|