@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,356 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* RoadmapCard (pure presentation). Two densities — `default` (rich
|
|
5
|
+
* /roadmap page card with vote buttons + figma/screenshots controls)
|
|
6
|
+
* and `sm` (compact horizontal for chat-inline).
|
|
7
|
+
*
|
|
8
|
+
* The card writes NO click logic — the parent wraps with its own
|
|
9
|
+
* anchor for the compact branch and supplies vote handlers for the
|
|
10
|
+
* default branch.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import React, { useState } from 'react'
|
|
14
|
+
import Image from '../../../embed-shims/next-image'
|
|
15
|
+
import { ThumbsUp, ThumbsDown } from 'lucide-react'
|
|
16
|
+
import { RoadmapVoteButton } from './roadmap-vote-button'
|
|
17
|
+
import { FigmaIcon } from '../../icons/figma-icon'
|
|
18
|
+
import { ImageIcon } from '../../icons/image-icon'
|
|
19
|
+
import { Button } from '../../ui/button/button'
|
|
20
|
+
import { StatusBadge } from '../../ui/status-badge'
|
|
21
|
+
import { ImageGalleryModal } from '../../ui/image-gallery-modal'
|
|
22
|
+
import { getProxiedImageUrl } from '../../../utils/image-proxy'
|
|
23
|
+
import {
|
|
24
|
+
COMPACT_CARD_META_ROW_BOX,
|
|
25
|
+
COMPACT_CARD_OUTER,
|
|
26
|
+
COMPACT_CARD_OUTER_STATIC,
|
|
27
|
+
COMPACT_CARD_ROW_FILLER,
|
|
28
|
+
COMPACT_CARD_SKELETON_OUTER,
|
|
29
|
+
COMPACT_CARD_SUMMARY,
|
|
30
|
+
COMPACT_CARD_TEXT_COL,
|
|
31
|
+
COMPACT_CARD_TITLE,
|
|
32
|
+
COMPACT_CARD_TITLE_ROW,
|
|
33
|
+
safeHref,
|
|
34
|
+
} from '../utils/compact-card-classes'
|
|
35
|
+
import { getStatusColorScheme } from '../utils/agent-status-message'
|
|
36
|
+
import { getTaskTypeLabel } from '../utils/clickup-task-type-utils'
|
|
37
|
+
import { TaskTypeIcon } from './task-type-icon'
|
|
38
|
+
import type { RoadmapItem } from '../types/entities/roadmap-item'
|
|
39
|
+
|
|
40
|
+
type CardSize = 'default' | 'sm'
|
|
41
|
+
export type VoteType = 'up' | 'down' | null
|
|
42
|
+
|
|
43
|
+
export function RoadmapCardSkeleton({ size = 'default' }: { size?: CardSize }) {
|
|
44
|
+
if (size === 'sm') {
|
|
45
|
+
return (
|
|
46
|
+
<span className={COMPACT_CARD_SKELETON_OUTER}>
|
|
47
|
+
<span className="block h-12 w-12 aspect-square shrink-0 self-start rounded-md bg-ods-bg border border-ods-border p-1.5" />
|
|
48
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
49
|
+
<span className={`${COMPACT_CARD_TITLE_ROW} flex-nowrap gap-2`}>
|
|
50
|
+
<span className="h-3.5 w-1/2 rounded bg-ods-bg" />
|
|
51
|
+
<span className="h-4 w-12 rounded bg-ods-bg/70 shrink-0" />
|
|
52
|
+
</span>
|
|
53
|
+
<span className={`${COMPACT_CARD_META_ROW_BOX} flex-nowrap gap-2`}>
|
|
54
|
+
<span className="h-3 w-2/5 rounded bg-ods-bg/60 flex-1" />
|
|
55
|
+
<span className="h-3 w-10 rounded bg-ods-bg/40 shrink-0" />
|
|
56
|
+
</span>
|
|
57
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
58
|
+
<span className="h-3 w-5/6 rounded bg-ods-bg/40" />
|
|
59
|
+
</span>
|
|
60
|
+
</span>
|
|
61
|
+
</span>
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
return (
|
|
65
|
+
<div className="bg-ods-card border border-ods-border rounded-[6px] p-[24px] flex flex-col gap-4 h-full animate-pulse">
|
|
66
|
+
<div className="flex gap-4 items-center">
|
|
67
|
+
<div className="w-16 h-16 rounded-lg bg-ods-bg flex-shrink-0" />
|
|
68
|
+
<div className="flex-1 space-y-2">
|
|
69
|
+
<div className="h-5 w-3/4 bg-ods-bg rounded" />
|
|
70
|
+
<div className="h-3 w-1/2 bg-ods-bg/60 rounded" />
|
|
71
|
+
</div>
|
|
72
|
+
<div className="h-6 w-16 bg-ods-bg rounded" />
|
|
73
|
+
</div>
|
|
74
|
+
<div className="space-y-2">
|
|
75
|
+
<div className="h-3 w-full bg-ods-bg/60 rounded" />
|
|
76
|
+
<div className="h-3 w-5/6 bg-ods-bg/60 rounded" />
|
|
77
|
+
<div className="h-3 w-4/5 bg-ods-bg/60 rounded" />
|
|
78
|
+
</div>
|
|
79
|
+
<div className="flex-1" />
|
|
80
|
+
<div className="flex items-center justify-between">
|
|
81
|
+
<div className="h-12 w-32 bg-ods-bg rounded" />
|
|
82
|
+
<div className="h-8 w-20 bg-ods-bg rounded" />
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface RoadmapCardProps {
|
|
89
|
+
item: RoadmapItem
|
|
90
|
+
/** Detail URL for the compact branch (`sm`). Used by the parent
|
|
91
|
+
* wrapper to drive nav. Default-branch cards don't need href —
|
|
92
|
+
* voting + screenshot UI is the entire action surface. */
|
|
93
|
+
href?: string
|
|
94
|
+
/** When `_blank`, opens in a new tab. Set by chat dispatch via
|
|
95
|
+
* `computeIsNewTab`. Defaults to same-tab. */
|
|
96
|
+
target?: '_blank'
|
|
97
|
+
rel?: 'noopener noreferrer'
|
|
98
|
+
targetPlatform?: string | null
|
|
99
|
+
/** Compact-branch variant — drives the icon-slot fallback rule. */
|
|
100
|
+
cardType?: 'roadmap_item' | 'delivery_item' | 'internal_task'
|
|
101
|
+
size?: CardSize
|
|
102
|
+
className?: string
|
|
103
|
+
// Default-branch vote controls (ignored in `sm`):
|
|
104
|
+
userVote?: VoteType | null
|
|
105
|
+
onVote?: (voteType: 'up' | 'down') => void
|
|
106
|
+
isVoting?: boolean
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function RoadmapCard({
|
|
110
|
+
item,
|
|
111
|
+
href,
|
|
112
|
+
|
|
113
|
+
target,
|
|
114
|
+
|
|
115
|
+
rel,
|
|
116
|
+
size = 'default',
|
|
117
|
+
cardType = 'roadmap_item',
|
|
118
|
+
className,
|
|
119
|
+
userVote,
|
|
120
|
+
onVote,
|
|
121
|
+
isVoting = false,
|
|
122
|
+
}: RoadmapCardProps) {
|
|
123
|
+
const [showScreenshots, setShowScreenshots] = useState(false)
|
|
124
|
+
|
|
125
|
+
const logoUrl = item.icon && item.icon.startsWith('http') ? item.icon : null
|
|
126
|
+
const iconSrc = logoUrl
|
|
127
|
+
? getProxiedImageUrl(logoUrl, { directHttps: true }) || logoUrl
|
|
128
|
+
: null
|
|
129
|
+
|
|
130
|
+
if (size === 'sm') {
|
|
131
|
+
const compactHref = safeHref(href ?? null)
|
|
132
|
+
const hasVotes = (item.upvotes ?? 0) > 0 || (item.downvotes ?? 0) > 0
|
|
133
|
+
const hasFigma = !!item.figmaUrl
|
|
134
|
+
const hasScreenshots = (item.screenshots?.length ?? 0) > 0
|
|
135
|
+
const typeLabel = getTaskTypeLabel(item.customItemId)
|
|
136
|
+
const useTypeIcon = cardType === 'internal_task' || (!iconSrc && item.customItemId != null)
|
|
137
|
+
const body = (
|
|
138
|
+
<>
|
|
139
|
+
<span
|
|
140
|
+
className="flex h-12 w-12 aspect-square shrink-0 self-start items-center justify-center rounded-md overflow-hidden bg-ods-bg border border-ods-border p-1.5 text-ods-accent"
|
|
141
|
+
title={typeLabel ?? undefined}
|
|
142
|
+
>
|
|
143
|
+
{useTypeIcon ? (
|
|
144
|
+
<TaskTypeIcon customItemId={item.customItemId} className="h-6 w-6" />
|
|
145
|
+
) : iconSrc ? (
|
|
146
|
+
<Image
|
|
147
|
+
src={iconSrc}
|
|
148
|
+
alt={`${item.title} logo`}
|
|
149
|
+
width={32}
|
|
150
|
+
height={32}
|
|
151
|
+
unoptimized
|
|
152
|
+
className="h-8 w-8 object-contain"
|
|
153
|
+
/>
|
|
154
|
+
) : (
|
|
155
|
+
<span className="text-[10px] font-medium uppercase text-ods-text-secondary">
|
|
156
|
+
{item.title?.substring(0, 2) || '??'}
|
|
157
|
+
</span>
|
|
158
|
+
)}
|
|
159
|
+
</span>
|
|
160
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
161
|
+
<span className={`${COMPACT_CARD_TITLE_ROW} gap-2`}>
|
|
162
|
+
<span className={`${COMPACT_CARD_TITLE} min-w-0`}>{item.title}</span>
|
|
163
|
+
{item.status && item.status.trim().length > 0 ? (
|
|
164
|
+
<StatusBadge
|
|
165
|
+
text={item.status.toUpperCase()}
|
|
166
|
+
colorScheme={getStatusColorScheme(item.status)}
|
|
167
|
+
variant="button"
|
|
168
|
+
singleLine
|
|
169
|
+
className="border border-ods-border shrink-0 max-w-[60%] truncate whitespace-nowrap"
|
|
170
|
+
/>
|
|
171
|
+
) : null}
|
|
172
|
+
</span>
|
|
173
|
+
<span className={`${COMPACT_CARD_META_ROW_BOX} gap-2 text-ods-text-secondary`}>
|
|
174
|
+
<span className="truncate text-[11px] leading-4 min-w-0 flex-1">
|
|
175
|
+
{(() => {
|
|
176
|
+
const parts = [
|
|
177
|
+
item.quarter,
|
|
178
|
+
item.targetVersion ? `${item.targetVersion} version` : null,
|
|
179
|
+
].filter(Boolean)
|
|
180
|
+
if (parts.length > 0) return parts.join(' · ')
|
|
181
|
+
if (cardType === 'delivery_item') {
|
|
182
|
+
return typeLabel ? `Delivery · ${typeLabel}` : 'Delivery'
|
|
183
|
+
}
|
|
184
|
+
if (cardType === 'internal_task') {
|
|
185
|
+
return typeLabel ?? 'Internal task'
|
|
186
|
+
}
|
|
187
|
+
return 'Roadmap item'
|
|
188
|
+
})()}
|
|
189
|
+
</span>
|
|
190
|
+
{hasVotes ? (
|
|
191
|
+
<span className="hidden sm:flex items-center gap-2 shrink-0 text-[11px] leading-4 text-ods-text-secondary">
|
|
192
|
+
<span className="flex items-center gap-0.5">
|
|
193
|
+
<ThumbsUp className="h-3 w-3" />
|
|
194
|
+
<span>{item.upvotes ?? 0}</span>
|
|
195
|
+
</span>
|
|
196
|
+
<span className="flex items-center gap-0.5">
|
|
197
|
+
<ThumbsDown className="h-3 w-3" />
|
|
198
|
+
<span>{item.downvotes ?? 0}</span>
|
|
199
|
+
</span>
|
|
200
|
+
</span>
|
|
201
|
+
) : null}
|
|
202
|
+
{hasFigma ? (
|
|
203
|
+
<span className="hidden sm:flex shrink-0 items-center" title="Has Figma prototype">
|
|
204
|
+
<FigmaIcon className="h-3 w-3" />
|
|
205
|
+
</span>
|
|
206
|
+
) : null}
|
|
207
|
+
{hasScreenshots ? (
|
|
208
|
+
<span
|
|
209
|
+
className="hidden sm:flex shrink-0 items-center gap-0.5 text-[11px] leading-4"
|
|
210
|
+
title={`${item.screenshots.length} screenshot${item.screenshots.length === 1 ? '' : 's'}`}
|
|
211
|
+
>
|
|
212
|
+
<ImageIcon className="h-3 w-3" />
|
|
213
|
+
<span>{item.screenshots.length}</span>
|
|
214
|
+
</span>
|
|
215
|
+
) : null}
|
|
216
|
+
</span>
|
|
217
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
218
|
+
<span className={COMPACT_CARD_SUMMARY}>
|
|
219
|
+
{item.description || COMPACT_CARD_ROW_FILLER}
|
|
220
|
+
</span>
|
|
221
|
+
</span>
|
|
222
|
+
</span>
|
|
223
|
+
</>
|
|
224
|
+
)
|
|
225
|
+
if (!compactHref) {
|
|
226
|
+
return <span className={`${COMPACT_CARD_OUTER_STATIC} ${className ?? ''}`} aria-label="No link available">{body}</span>
|
|
227
|
+
}
|
|
228
|
+
return (
|
|
229
|
+
<a href={compactHref} target={target} rel={rel} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
|
|
230
|
+
{body}
|
|
231
|
+
</a>
|
|
232
|
+
)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return (
|
|
236
|
+
<div className={`bg-ods-card border border-ods-border rounded-[6px] p-[24px] flex flex-col gap-[16px] hover:border-ods-accent transition-all h-full ${className ?? ''}`}>
|
|
237
|
+
<div className="flex gap-[16px] items-center w-full">
|
|
238
|
+
<div className="w-16 h-16 rounded-lg flex items-center justify-center flex-shrink-0 bg-ods-bg border border-ods-border">
|
|
239
|
+
{iconSrc ? (
|
|
240
|
+
<Image
|
|
241
|
+
src={iconSrc}
|
|
242
|
+
alt={`${item.title} logo`}
|
|
243
|
+
width={40}
|
|
244
|
+
height={40}
|
|
245
|
+
unoptimized
|
|
246
|
+
className="object-contain p-1"
|
|
247
|
+
/>
|
|
248
|
+
) : (
|
|
249
|
+
<span className="text-xs font-medium uppercase text-ods-text-secondary">
|
|
250
|
+
{item.title?.substring(0, 2) || '??'}
|
|
251
|
+
</span>
|
|
252
|
+
)}
|
|
253
|
+
</div>
|
|
254
|
+
|
|
255
|
+
<div className="flex-1 min-w-0 flex flex-col">
|
|
256
|
+
<div className="min-h-[48px] flex items-center">
|
|
257
|
+
<h3 className="text-h3 text-ods-text-primary tracking-[-0.36px] flex-1 line-clamp-2">
|
|
258
|
+
{item.title}
|
|
259
|
+
</h3>
|
|
260
|
+
</div>
|
|
261
|
+
<div className="min-h-[20px] flex items-center">
|
|
262
|
+
<p className="text-h5 text-ods-text-secondary uppercase tracking-[-0.28px] truncate">
|
|
263
|
+
{item.quarter}, {item.id}
|
|
264
|
+
</p>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
|
|
268
|
+
<div className="hidden md:block">
|
|
269
|
+
<StatusBadge
|
|
270
|
+
text={item.status.toUpperCase()}
|
|
271
|
+
colorScheme={getStatusColorScheme(item.status)}
|
|
272
|
+
className="border border-ods-border"
|
|
273
|
+
/>
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
|
|
277
|
+
<div className="md:hidden">
|
|
278
|
+
<StatusBadge
|
|
279
|
+
text={item.status.toUpperCase()}
|
|
280
|
+
colorScheme={getStatusColorScheme(item.status)}
|
|
281
|
+
className="border border-ods-border"
|
|
282
|
+
/>
|
|
283
|
+
</div>
|
|
284
|
+
|
|
285
|
+
<div className="min-h-[72px] flex items-center">
|
|
286
|
+
<p className="text-h4 text-ods-text-secondary line-clamp-3">
|
|
287
|
+
{item.description || ''}
|
|
288
|
+
</p>
|
|
289
|
+
</div>
|
|
290
|
+
|
|
291
|
+
<div className="flex-1" />
|
|
292
|
+
|
|
293
|
+
<div className="flex items-center justify-between w-full">
|
|
294
|
+
{onVote && (
|
|
295
|
+
<div className="bg-ods-card border border-ods-border h-[48px] rounded-[6px] flex overflow-hidden">
|
|
296
|
+
<RoadmapVoteButton
|
|
297
|
+
voteType="up"
|
|
298
|
+
count={item.upvotes}
|
|
299
|
+
color="var(--color-text-secondary)"
|
|
300
|
+
className="rounded-none"
|
|
301
|
+
isActive={userVote === 'up'}
|
|
302
|
+
onClick={() => onVote('up')}
|
|
303
|
+
disabled={isVoting}
|
|
304
|
+
/>
|
|
305
|
+
<RoadmapVoteButton
|
|
306
|
+
voteType="down"
|
|
307
|
+
count={item.downvotes}
|
|
308
|
+
className="rounded-none"
|
|
309
|
+
color="var(--color-text-secondary)"
|
|
310
|
+
isActive={userVote === 'down'}
|
|
311
|
+
onClick={() => onVote('down')}
|
|
312
|
+
disabled={isVoting}
|
|
313
|
+
/>
|
|
314
|
+
</div>
|
|
315
|
+
)}
|
|
316
|
+
|
|
317
|
+
<div className="flex items-center gap-2">
|
|
318
|
+
{item.screenshots && item.screenshots.length > 0 && (
|
|
319
|
+
<Button
|
|
320
|
+
variant="outline"
|
|
321
|
+
size="small-legacy"
|
|
322
|
+
onClick={() => setShowScreenshots(true)}
|
|
323
|
+
leftIcon={<ImageIcon className="w-5 h-5" />}
|
|
324
|
+
/>
|
|
325
|
+
)}
|
|
326
|
+
{(() => {
|
|
327
|
+
const figmaSafe = safeHref(item.figmaUrl)
|
|
328
|
+
return figmaSafe ? (
|
|
329
|
+
<Button
|
|
330
|
+
variant="outline"
|
|
331
|
+
size="small-legacy"
|
|
332
|
+
openInNewTab
|
|
333
|
+
href={figmaSafe}
|
|
334
|
+
leftIcon={<FigmaIcon className="w-5 h-5" />}
|
|
335
|
+
/>
|
|
336
|
+
) : null
|
|
337
|
+
})()}
|
|
338
|
+
{item.targetVersion && (
|
|
339
|
+
<StatusBadge
|
|
340
|
+
text={`${item.targetVersion} VERSION`}
|
|
341
|
+
className="border border-ods-border"
|
|
342
|
+
/>
|
|
343
|
+
)}
|
|
344
|
+
</div>
|
|
345
|
+
</div>
|
|
346
|
+
|
|
347
|
+
{item.screenshots && item.screenshots.length > 0 && (
|
|
348
|
+
<ImageGalleryModal
|
|
349
|
+
images={item.screenshots}
|
|
350
|
+
isOpen={showScreenshots}
|
|
351
|
+
onClose={() => setShowScreenshots(false)}
|
|
352
|
+
/>
|
|
353
|
+
)}
|
|
354
|
+
</div>
|
|
355
|
+
)
|
|
356
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* RoadmapVoteButton — small thumbs-up / thumbs-down vote button used by
|
|
5
|
+
* `RoadmapCard`'s `default` variant. Pure presentation; click handler
|
|
6
|
+
* comes from the parent (typically a `useRoadmapVoting` hook).
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import React from 'react'
|
|
10
|
+
import { ThumbsUpIcon } from '../../icons/thumbs-up-icon'
|
|
11
|
+
import { ThumbsDownIcon } from '../../icons/thumbs-down-icon'
|
|
12
|
+
import { Button } from '../../ui/button/button'
|
|
13
|
+
import { cn } from '../../../utils/cn'
|
|
14
|
+
|
|
15
|
+
export interface RoadmapVoteButtonProps {
|
|
16
|
+
voteType: 'up' | 'down'
|
|
17
|
+
count: number
|
|
18
|
+
isActive: boolean
|
|
19
|
+
onClick: () => void
|
|
20
|
+
disabled?: boolean
|
|
21
|
+
showCount?: boolean
|
|
22
|
+
color?: string
|
|
23
|
+
className?: string
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function RoadmapVoteButton({
|
|
27
|
+
voteType,
|
|
28
|
+
count,
|
|
29
|
+
isActive,
|
|
30
|
+
onClick,
|
|
31
|
+
disabled = false,
|
|
32
|
+
showCount = true,
|
|
33
|
+
color,
|
|
34
|
+
className,
|
|
35
|
+
}: RoadmapVoteButtonProps) {
|
|
36
|
+
const Icon = voteType === 'up' ? ThumbsUpIcon : ThumbsDownIcon
|
|
37
|
+
return (
|
|
38
|
+
<Button
|
|
39
|
+
variant="outline"
|
|
40
|
+
onClick={onClick}
|
|
41
|
+
disabled={disabled}
|
|
42
|
+
leftIcon={<Icon className="w-5 h-5" color={color} />}
|
|
43
|
+
className={cn(
|
|
44
|
+
className,
|
|
45
|
+
'bg-ods-bg border-0 border-ods-border flex gap-[2px] items-center justify-center p-[12px] h-full',
|
|
46
|
+
'disabled:cursor-not-allowed disabled:opacity-50',
|
|
47
|
+
'hover:bg-ods-border transition-all',
|
|
48
|
+
isActive && 'bg-ods-border',
|
|
49
|
+
)}
|
|
50
|
+
>
|
|
51
|
+
{showCount && <span className="text-sm">{count}</span>}
|
|
52
|
+
</Button>
|
|
53
|
+
)
|
|
54
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Slack Message Card — unified visual for slack-messages markers.
|
|
5
|
+
*
|
|
6
|
+
* PURE PRESENTATION (no internal nav). The card receives the structured
|
|
7
|
+
* `<a>` prop bundle via `anchorProps` (composed by the caller from a
|
|
8
|
+
* runtime hook) and renders the rest from the `SlackMessageItem` shape
|
|
9
|
+
* directly.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import React from 'react'
|
|
13
|
+
import { SlackIcon } from '../../icons/slack-icon'
|
|
14
|
+
import { ExternalLink, Hash } from 'lucide-react'
|
|
15
|
+
import {
|
|
16
|
+
COMPACT_CARD_ICON_SLOT,
|
|
17
|
+
COMPACT_CARD_META_ROW,
|
|
18
|
+
COMPACT_CARD_META_ROW_BOX,
|
|
19
|
+
COMPACT_CARD_OUTER,
|
|
20
|
+
COMPACT_CARD_OUTER_STATIC,
|
|
21
|
+
COMPACT_CARD_ROW_FILLER,
|
|
22
|
+
COMPACT_CARD_SKELETON_IMAGE_SLOT,
|
|
23
|
+
COMPACT_CARD_SKELETON_OUTER,
|
|
24
|
+
COMPACT_CARD_SUMMARY,
|
|
25
|
+
COMPACT_CARD_TEXT_COL,
|
|
26
|
+
COMPACT_CARD_TITLE,
|
|
27
|
+
COMPACT_CARD_TITLE_ROW,
|
|
28
|
+
safeHref,
|
|
29
|
+
} from '../utils/compact-card-classes'
|
|
30
|
+
import { formatDateUTC as formatDate } from '../../../utils/format'
|
|
31
|
+
import type { SlackMessageItem } from '../types/entities/slack-message'
|
|
32
|
+
|
|
33
|
+
export interface SlackMessageCardAnchorProps {
|
|
34
|
+
href: string
|
|
35
|
+
target?: '_blank'
|
|
36
|
+
rel?: 'noopener noreferrer'
|
|
37
|
+
onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface SlackMessageCardProps {
|
|
41
|
+
item: SlackMessageItem
|
|
42
|
+
variant?: 'row' | 'compact'
|
|
43
|
+
className?: string
|
|
44
|
+
anchorProps?: SlackMessageCardAnchorProps
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function parseChannelFromUrl(url: string | null | undefined): string | null {
|
|
48
|
+
if (!url) return null
|
|
49
|
+
try {
|
|
50
|
+
const u = new URL(url)
|
|
51
|
+
if (!u.host.endsWith('.slack.com')) return null
|
|
52
|
+
const parts = u.pathname.split('/').filter(Boolean)
|
|
53
|
+
const archivesIdx = parts.indexOf('archives')
|
|
54
|
+
if (archivesIdx !== -1 && parts.length > archivesIdx + 1) return parts[archivesIdx + 1]
|
|
55
|
+
} catch {
|
|
56
|
+
/* malformed URL */
|
|
57
|
+
}
|
|
58
|
+
return null
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function SlackMessageCard({ item, variant = 'compact', className, anchorProps }: SlackMessageCardProps) {
|
|
62
|
+
const channel = item.channel ?? parseChannelFromUrl(item.url) ?? null
|
|
63
|
+
const dateText = formatDate(item.dateUpdated, { fallback: '', timezone: 'local' })
|
|
64
|
+
|
|
65
|
+
if (variant === 'row') {
|
|
66
|
+
return (
|
|
67
|
+
<div className={`flex items-center gap-3 min-w-0 ${className ?? ''}`}>
|
|
68
|
+
<SlackIcon className="h-3.5 w-3.5 shrink-0" />
|
|
69
|
+
<span className="text-ods-text-primary text-sm font-medium truncate max-w-[180px] shrink-0">{item.title}</span>
|
|
70
|
+
{item.preview ? (
|
|
71
|
+
<span className="text-ods-text-secondary text-sm flex-1 min-w-0 truncate">{item.preview}</span>
|
|
72
|
+
) : null}
|
|
73
|
+
{channel ? (
|
|
74
|
+
<span className="font-mono text-[11px] text-ods-text-secondary truncate max-w-[140px] shrink-0">
|
|
75
|
+
<Hash className="inline h-3 w-3" />
|
|
76
|
+
{channel}
|
|
77
|
+
</span>
|
|
78
|
+
) : null}
|
|
79
|
+
{dateText ? (
|
|
80
|
+
<span className="text-ods-text-secondary text-xs w-24 shrink-0 text-right">{dateText}</span>
|
|
81
|
+
) : null}
|
|
82
|
+
</div>
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const metaParts: React.ReactNode[] = []
|
|
87
|
+
if (channel) {
|
|
88
|
+
metaParts.push(
|
|
89
|
+
<span key="channel" className="flex items-center gap-0.5 min-w-0">
|
|
90
|
+
<Hash className="h-3 w-3 shrink-0" />
|
|
91
|
+
<span className="truncate font-mono">{channel}</span>
|
|
92
|
+
</span>,
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
if (dateText) metaParts.push(<span key="date" className="whitespace-nowrap">{dateText}</span>)
|
|
96
|
+
|
|
97
|
+
const href = safeHref(item.url)
|
|
98
|
+
const body = (
|
|
99
|
+
<>
|
|
100
|
+
<span className={COMPACT_CARD_ICON_SLOT}>
|
|
101
|
+
<SlackIcon className="h-5 w-5" />
|
|
102
|
+
</span>
|
|
103
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
104
|
+
<span className={COMPACT_CARD_TITLE_ROW}>
|
|
105
|
+
<span className={COMPACT_CARD_TITLE}>{item.title}</span>
|
|
106
|
+
</span>
|
|
107
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
108
|
+
<span className={COMPACT_CARD_SUMMARY}>
|
|
109
|
+
{item.preview || COMPACT_CARD_ROW_FILLER}
|
|
110
|
+
</span>
|
|
111
|
+
</span>
|
|
112
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
113
|
+
<span className={COMPACT_CARD_META_ROW}>
|
|
114
|
+
{metaParts.length > 0 ? metaParts.map((part, i) => (
|
|
115
|
+
<React.Fragment key={i}>
|
|
116
|
+
{i > 0 ? <span className="text-ods-text-secondary/40 shrink-0">·</span> : null}
|
|
117
|
+
<span className="min-w-0 truncate">{part}</span>
|
|
118
|
+
</React.Fragment>
|
|
119
|
+
)) : <span className={COMPACT_CARD_SUMMARY}>{COMPACT_CARD_ROW_FILLER}</span>}
|
|
120
|
+
</span>
|
|
121
|
+
</span>
|
|
122
|
+
</span>
|
|
123
|
+
{href ? (
|
|
124
|
+
<span className="flex shrink-0 items-center self-start h-5 text-ods-text-secondary">
|
|
125
|
+
<ExternalLink className="w-3.5 h-3.5" />
|
|
126
|
+
</span>
|
|
127
|
+
) : null}
|
|
128
|
+
</>
|
|
129
|
+
)
|
|
130
|
+
if (anchorProps) {
|
|
131
|
+
return (
|
|
132
|
+
<a {...anchorProps} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
|
|
133
|
+
{body}
|
|
134
|
+
</a>
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
return href ? (
|
|
138
|
+
<a
|
|
139
|
+
href={href}
|
|
140
|
+
target="_blank"
|
|
141
|
+
rel="noopener noreferrer"
|
|
142
|
+
className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}
|
|
143
|
+
>
|
|
144
|
+
{body}
|
|
145
|
+
</a>
|
|
146
|
+
) : (
|
|
147
|
+
<span className={`${COMPACT_CARD_OUTER_STATIC} ${className ?? ''}`} aria-label="No link available">{body}</span>
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function SlackMessageCardSkeleton({ variant = 'compact', className }: { variant?: 'row' | 'compact'; className?: string }) {
|
|
152
|
+
if (variant === 'row') {
|
|
153
|
+
return (
|
|
154
|
+
<div className={`flex items-center gap-3 min-w-0 animate-pulse ${className ?? ''}`}>
|
|
155
|
+
<div className="h-3.5 w-3.5 rounded bg-ods-bg shrink-0" />
|
|
156
|
+
<div className="h-3 w-32 bg-ods-bg rounded shrink-0" />
|
|
157
|
+
<div className="h-3 w-2/3 bg-ods-bg/60 rounded flex-1" />
|
|
158
|
+
<div className="h-3 w-24 bg-ods-bg/60 rounded shrink-0" />
|
|
159
|
+
<div className="h-3 w-20 bg-ods-bg/60 rounded shrink-0" />
|
|
160
|
+
</div>
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
return (
|
|
164
|
+
<span className={`${COMPACT_CARD_SKELETON_OUTER} ${className ?? ''}`}>
|
|
165
|
+
<span className={COMPACT_CARD_SKELETON_IMAGE_SLOT} />
|
|
166
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
167
|
+
<span className={COMPACT_CARD_TITLE_ROW}>
|
|
168
|
+
<span className="h-3.5 w-2/3 rounded bg-ods-bg" />
|
|
169
|
+
</span>
|
|
170
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
171
|
+
<span className="h-3 w-5/6 rounded bg-ods-bg/60" />
|
|
172
|
+
</span>
|
|
173
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
174
|
+
<span className="h-3 w-1/3 rounded bg-ods-bg/70" />
|
|
175
|
+
</span>
|
|
176
|
+
</span>
|
|
177
|
+
<span className="flex shrink-0 items-center self-start h-5">
|
|
178
|
+
<span className="h-3.5 w-3.5 rounded bg-ods-bg" />
|
|
179
|
+
</span>
|
|
180
|
+
</span>
|
|
181
|
+
)
|
|
182
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Per-type icon for a ClickUp task — driven by `custom_item_id` via the
|
|
5
|
+
* canonical `CUSTOM_ITEM_ID` map in `../utils/clickup-task-type-utils`.
|
|
6
|
+
*
|
|
7
|
+
* Used by the roadmap entity card so the icon slot communicates the
|
|
8
|
+
* task TYPE (Bug, Feature, Story, …) at a glance instead of falling
|
|
9
|
+
* back to a generic logo / two-letter placeholder.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import React from 'react'
|
|
13
|
+
import {
|
|
14
|
+
Bug,
|
|
15
|
+
Inbox,
|
|
16
|
+
Sparkles,
|
|
17
|
+
BookOpen,
|
|
18
|
+
Trophy,
|
|
19
|
+
Component,
|
|
20
|
+
Flag,
|
|
21
|
+
Goal,
|
|
22
|
+
ListTodo,
|
|
23
|
+
CheckSquare,
|
|
24
|
+
FileText,
|
|
25
|
+
Repeat,
|
|
26
|
+
Compass,
|
|
27
|
+
type LucideIcon,
|
|
28
|
+
} from 'lucide-react'
|
|
29
|
+
import { CUSTOM_ITEM_ID } from '../utils/clickup-task-type-utils'
|
|
30
|
+
|
|
31
|
+
function iconFor(customItemId: number | null | undefined): LucideIcon {
|
|
32
|
+
switch (customItemId) {
|
|
33
|
+
case CUSTOM_ITEM_ID.BUG: return Bug
|
|
34
|
+
case CUSTOM_ITEM_ID.REQUEST: return Inbox
|
|
35
|
+
case CUSTOM_ITEM_ID.FEATURE: return Sparkles
|
|
36
|
+
case CUSTOM_ITEM_ID.STORY: return BookOpen
|
|
37
|
+
case CUSTOM_ITEM_ID.EPIC: return Trophy
|
|
38
|
+
case CUSTOM_ITEM_ID.COMPONENT: return Component
|
|
39
|
+
case CUSTOM_ITEM_ID.INITIATIVE: return Flag
|
|
40
|
+
case CUSTOM_ITEM_ID.MILESTONE: return Goal
|
|
41
|
+
case CUSTOM_ITEM_ID.SUBTASK: return ListTodo
|
|
42
|
+
case CUSTOM_ITEM_ID.FORM: return FileText
|
|
43
|
+
case CUSTOM_ITEM_ID.RECURRING: return Repeat
|
|
44
|
+
case CUSTOM_ITEM_ID.PLAN: return Compass
|
|
45
|
+
case CUSTOM_ITEM_ID.STRATEGY: return Compass
|
|
46
|
+
case CUSTOM_ITEM_ID.TASK:
|
|
47
|
+
default:
|
|
48
|
+
return CheckSquare
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface TaskTypeIconProps {
|
|
53
|
+
customItemId: number | null | undefined
|
|
54
|
+
className?: string
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function TaskTypeIcon({ customItemId, className = 'h-5 w-5' }: TaskTypeIconProps) {
|
|
58
|
+
const Icon = iconFor(customItemId)
|
|
59
|
+
return <Icon className={className} aria-hidden="true" />
|
|
60
|
+
}
|
|
@@ -5,3 +5,25 @@ export * from './use-collapsible'
|
|
|
5
5
|
export * from './use-jetstream-dialog-subscription'
|
|
6
6
|
export * from './use-nats-dialog-subscription'
|
|
7
7
|
export * from './use-realtime-chunk-processor'
|
|
8
|
+
|
|
9
|
+
// Chat hooks migrated from hub `hooks/*` (Task #7).
|
|
10
|
+
export * from './use-slash-commands'
|
|
11
|
+
export * from './use-chat-attachments'
|
|
12
|
+
export * from './use-chat-attachment-image-gallery'
|
|
13
|
+
export * from './use-chat-identity'
|
|
14
|
+
export * from './use-chat-card-item'
|
|
15
|
+
export * from './use-close-on-navigation'
|
|
16
|
+
|
|
17
|
+
// useChat + useSSE — ported from hub `hooks/useChat.ts` + `hooks/useSSE.ts`
|
|
18
|
+
// minus the MockChatService + useChatConfig dependencies (which stay in
|
|
19
|
+
// hub-only code). `useEmbeddedChat` is the runtime-driven refactor of
|
|
20
|
+
// the hub's `useDocChat`.
|
|
21
|
+
export * from './use-chat'
|
|
22
|
+
export * from './use-sse'
|
|
23
|
+
export * from './use-embedded-chat'
|
|
24
|
+
|
|
25
|
+
// useProxiedImageUrl — runtime-driven hook wrapping pure
|
|
26
|
+
// `getProxiedImageUrl`. Reads proxy prefix + skip-domain list from
|
|
27
|
+
// `ChatRuntime.endpoints`, so hub vs. embedders share one image-proxy
|
|
28
|
+
// resolver.
|
|
29
|
+
export * from './use-proxied-image-url'
|