@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,193 @@
|
|
|
1
|
+
import { SquareAvatar } from '../../ui/square-avatar'
|
|
2
|
+
import { formatDate, nameInitials } from '../../../utils/format'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Author + publication metadata, rendered as the SAME 2-or-N-cell grid pattern
|
|
6
|
+
* the release detail page uses.
|
|
7
|
+
*
|
|
8
|
+
* Each cell sits inside a single bordered/rounded container, separated by
|
|
9
|
+
* `border-r` dividers — byte-identical visual contract to the release page.
|
|
10
|
+
*
|
|
11
|
+
* Cell taxonomy:
|
|
12
|
+
* - `<EntityMetadataValueCell>` — top: large value (`text-h4` uppercase),
|
|
13
|
+
* bottom: small label (`DM_Sans` 14px secondary). Used for Type / Status
|
|
14
|
+
* / Date.
|
|
15
|
+
* - `<EntityMetadataAuthorCell>` — `<SquareAvatar>` + name + label. Used
|
|
16
|
+
* for the Author column.
|
|
17
|
+
*
|
|
18
|
+
* `<EntityAuthorCard>` is the convenience composer for the common
|
|
19
|
+
* "Published + Author" pair. Pass `publishedAt` to get both cells; omit it
|
|
20
|
+
* to get just the Author card (single-cell mode used by surfaces with no
|
|
21
|
+
* separate publication-date concept).
|
|
22
|
+
*
|
|
23
|
+
* Renders null when `author` is null/empty unless `renderEmptyAuthor` is set.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Documented empty-author placeholder. Single source for the visual
|
|
27
|
+
* shape of "author cell with no author".
|
|
28
|
+
*/
|
|
29
|
+
export const EMPTY_AUTHOR_PLACEHOLDER = {
|
|
30
|
+
full_name: '—',
|
|
31
|
+
avatar_url: null,
|
|
32
|
+
job_title: 'Unknown',
|
|
33
|
+
} as const
|
|
34
|
+
|
|
35
|
+
export interface EntityAuthorCardProps {
|
|
36
|
+
author: {
|
|
37
|
+
full_name: string | null
|
|
38
|
+
avatar_url: string | null
|
|
39
|
+
job_title: string | null
|
|
40
|
+
} | null | undefined
|
|
41
|
+
/** Role label rendered under the name. Defaults to "Author". Override
|
|
42
|
+
* to e.g. "Presenter" / "Contributor" if semantics differ. */
|
|
43
|
+
roleLabel?: string
|
|
44
|
+
/** Optional publication date. When provided, the component renders as a
|
|
45
|
+
* 2-cell grid (Published | Author). When omitted, only the Author cell
|
|
46
|
+
* renders inside the same bordered container. */
|
|
47
|
+
publishedAt?: string | Date | null
|
|
48
|
+
/** Label for the Published cell. Defaults to "Published". */
|
|
49
|
+
publishedLabel?: string
|
|
50
|
+
/**
|
|
51
|
+
* Extra value cells inserted into the metadata grid BEFORE the
|
|
52
|
+
* Published cell. Each item renders as an `<EntityMetadataValueCell>`
|
|
53
|
+
* with a large `text-h4` value and a small `DM_Sans` 14px label.
|
|
54
|
+
*
|
|
55
|
+
* Use for entity-specific labels (e.g. onboarding-guide section/step,
|
|
56
|
+
* webinar host, customer-interview customer). The grid auto-sizes via
|
|
57
|
+
* `grid-cols-N`.
|
|
58
|
+
*/
|
|
59
|
+
extraCells?: Array<{ value: string; label: string; uppercase?: boolean }>
|
|
60
|
+
/** When true, render the author cell even when `author?.full_name` is
|
|
61
|
+
* missing — using the `EMPTY_AUTHOR_PLACEHOLDER` shape above. Used by
|
|
62
|
+
* catalog grids that must keep a fixed shape so skeleton alignment
|
|
63
|
+
* holds. Defaults to false. */
|
|
64
|
+
renderEmptyAuthor?: boolean
|
|
65
|
+
className?: string
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Single value cell — top: large `text-h4` value (uppercase), bottom: small
|
|
71
|
+
* `DM_Sans` 14px secondary label.
|
|
72
|
+
*/
|
|
73
|
+
export function EntityMetadataValueCell({
|
|
74
|
+
value,
|
|
75
|
+
label,
|
|
76
|
+
className,
|
|
77
|
+
uppercase = true,
|
|
78
|
+
}: {
|
|
79
|
+
value: string
|
|
80
|
+
label: string
|
|
81
|
+
className?: string
|
|
82
|
+
uppercase?: boolean
|
|
83
|
+
}) {
|
|
84
|
+
return (
|
|
85
|
+
<div className={`bg-ods-card p-4 flex flex-col gap-3 ${className ?? ''}`}>
|
|
86
|
+
<div className="flex flex-col gap-0">
|
|
87
|
+
<p className="text-h4 text-ods-text-primary">
|
|
88
|
+
{uppercase ? value.toLocaleUpperCase() : value}
|
|
89
|
+
</p>
|
|
90
|
+
<p className="font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary">
|
|
91
|
+
{label}
|
|
92
|
+
</p>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Author cell — `<SquareAvatar>` + name + role label. The containing border /
|
|
100
|
+
* divider is the caller's responsibility — this is just the cell content.
|
|
101
|
+
*/
|
|
102
|
+
export function EntityMetadataAuthorCell({
|
|
103
|
+
author,
|
|
104
|
+
roleLabel = 'Author',
|
|
105
|
+
className,
|
|
106
|
+
}: {
|
|
107
|
+
author: NonNullable<EntityAuthorCardProps['author']>
|
|
108
|
+
roleLabel?: string
|
|
109
|
+
className?: string
|
|
110
|
+
}) {
|
|
111
|
+
const fullName = author.full_name || 'Unknown Author'
|
|
112
|
+
return (
|
|
113
|
+
<div className={`bg-ods-card p-4 flex items-center gap-3 ${className ?? ''}`}>
|
|
114
|
+
<SquareAvatar
|
|
115
|
+
src={author.avatar_url || ''}
|
|
116
|
+
alt={fullName}
|
|
117
|
+
fallback={nameInitials(fullName, '')}
|
|
118
|
+
size="md"
|
|
119
|
+
variant="round"
|
|
120
|
+
/>
|
|
121
|
+
<div className="flex flex-col gap-0 flex-1 min-w-0">
|
|
122
|
+
<p className="text-h3 tracking-[-0.36px] text-ods-text-primary truncate">
|
|
123
|
+
{fullName}
|
|
124
|
+
</p>
|
|
125
|
+
<p className="font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary">
|
|
126
|
+
{author.job_title || roleLabel}
|
|
127
|
+
</p>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function EntityAuthorCard({
|
|
134
|
+
author,
|
|
135
|
+
roleLabel = 'Author',
|
|
136
|
+
publishedAt,
|
|
137
|
+
publishedLabel = 'Published',
|
|
138
|
+
extraCells,
|
|
139
|
+
renderEmptyAuthor = false,
|
|
140
|
+
className,
|
|
141
|
+
}: EntityAuthorCardProps) {
|
|
142
|
+
const hasAuthor = !!author?.full_name
|
|
143
|
+
if (!hasAuthor && !renderEmptyAuthor) return null
|
|
144
|
+
const effectiveAuthor = hasAuthor ? (author as NonNullable<EntityAuthorCardProps['author']>) : EMPTY_AUTHOR_PLACEHOLDER
|
|
145
|
+
|
|
146
|
+
// Resolve the date label. `formatDate` returns "Invalid Date" for
|
|
147
|
+
// unparseable inputs; collapse that to empty so the cell is hidden, not
|
|
148
|
+
// literal text.
|
|
149
|
+
const formatted = publishedAt ? formatDate(publishedAt as Date | string) : ''
|
|
150
|
+
const dateLabel = formatted === 'Invalid Date' ? '' : formatted
|
|
151
|
+
|
|
152
|
+
const showDateCell = !!dateLabel
|
|
153
|
+
const extras = extraCells ?? []
|
|
154
|
+
// Total cell count = extras + (optional Published) + Author. Map to
|
|
155
|
+
// an explicit tailwind `md:grid-cols-N` class string so JIT picks it
|
|
156
|
+
// up at build time.
|
|
157
|
+
const totalCells = extras.length + (showDateCell ? 1 : 0) + 1
|
|
158
|
+
const gridColsClass =
|
|
159
|
+
totalCells >= 4 ? 'md:grid-cols-4'
|
|
160
|
+
: totalCells === 3 ? 'md:grid-cols-3'
|
|
161
|
+
: totalCells === 2 ? 'md:grid-cols-2'
|
|
162
|
+
: 'md:grid-cols-1'
|
|
163
|
+
|
|
164
|
+
// Helper — every cell EXCEPT the last needs the dividers (bottom on
|
|
165
|
+
// mobile, right on desktop). The last cell (Author) closes the grid
|
|
166
|
+
// without a trailing divider so the rounded corner stays clean.
|
|
167
|
+
const dividerClass = 'border-b md:border-b-0 md:border-r border-ods-border'
|
|
168
|
+
|
|
169
|
+
return (
|
|
170
|
+
<div
|
|
171
|
+
className={`grid grid-cols-1 ${gridColsClass} border border-ods-border rounded-md overflow-hidden w-full ${className ?? ''}`}
|
|
172
|
+
>
|
|
173
|
+
{extras.map((cell, i) => (
|
|
174
|
+
<EntityMetadataValueCell
|
|
175
|
+
key={`${cell.label}-${i}`}
|
|
176
|
+
value={cell.value}
|
|
177
|
+
label={cell.label}
|
|
178
|
+
uppercase={cell.uppercase ?? true}
|
|
179
|
+
className={dividerClass}
|
|
180
|
+
/>
|
|
181
|
+
))}
|
|
182
|
+
{showDateCell && (
|
|
183
|
+
<EntityMetadataValueCell
|
|
184
|
+
value={dateLabel}
|
|
185
|
+
label={publishedLabel}
|
|
186
|
+
uppercase={false}
|
|
187
|
+
className={dividerClass}
|
|
188
|
+
/>
|
|
189
|
+
)}
|
|
190
|
+
<EntityMetadataAuthorCell author={effectiveAuthor} roleLabel={roleLabel} />
|
|
191
|
+
</div>
|
|
192
|
+
)
|
|
193
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generic compact entity/document card for any chat type that doesn't
|
|
5
|
+
* warrant a bespoke component.
|
|
6
|
+
*
|
|
7
|
+
* PURE PRESENTATION. Receives pre-composed `<a>` props via `anchorProps`
|
|
8
|
+
* and renders the rest from the item shape.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import React from 'react'
|
|
12
|
+
import { ExternalLink } from 'lucide-react'
|
|
13
|
+
import { StatusBadge } from '../../ui/status-badge'
|
|
14
|
+
import {
|
|
15
|
+
COMPACT_CARD_META_ROW,
|
|
16
|
+
COMPACT_CARD_META_ROW_BOX,
|
|
17
|
+
COMPACT_CARD_OUTER,
|
|
18
|
+
COMPACT_CARD_OUTER_STATIC,
|
|
19
|
+
COMPACT_CARD_SKELETON_OUTER,
|
|
20
|
+
COMPACT_CARD_TEXT_COL,
|
|
21
|
+
COMPACT_CARD_TITLE,
|
|
22
|
+
safeHref,
|
|
23
|
+
} from '../utils/compact-card-classes'
|
|
24
|
+
import { formatDateUTC as formatDate } from '../../../utils/format'
|
|
25
|
+
|
|
26
|
+
type BadgeScheme = 'success' | 'error' | 'warning' | 'cyan' | 'default'
|
|
27
|
+
|
|
28
|
+
export interface GenericEntityCardItem {
|
|
29
|
+
id: string
|
|
30
|
+
title: string
|
|
31
|
+
preview?: string | null
|
|
32
|
+
url?: string | null
|
|
33
|
+
subtitle?: string | null
|
|
34
|
+
badge?: { text: string; scheme?: BadgeScheme } | null
|
|
35
|
+
facts?: Array<{ label: string; value: string }> | null
|
|
36
|
+
dateUpdated?: string | number | null
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface GenericEntityCardAnchorProps {
|
|
40
|
+
href: string
|
|
41
|
+
target?: '_blank'
|
|
42
|
+
rel?: 'noopener noreferrer'
|
|
43
|
+
onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface GenericEntityCardProps {
|
|
47
|
+
item: GenericEntityCardItem
|
|
48
|
+
className?: string
|
|
49
|
+
anchorProps?: GenericEntityCardAnchorProps
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function GenericEntityCard({ item, className, anchorProps }: GenericEntityCardProps) {
|
|
53
|
+
const href = safeHref(item.url)
|
|
54
|
+
const dateText = formatDate(item.dateUpdated, { fallback: '', timezone: 'local' })
|
|
55
|
+
const body = (
|
|
56
|
+
<>
|
|
57
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
58
|
+
<span className="flex flex-wrap items-center gap-1.5 min-w-0">
|
|
59
|
+
<span className={`${COMPACT_CARD_TITLE} shrink min-w-0`}>{item.title}</span>
|
|
60
|
+
{item.badge ? (
|
|
61
|
+
<StatusBadge
|
|
62
|
+
text={item.badge.text}
|
|
63
|
+
variant="button"
|
|
64
|
+
colorScheme={item.badge.scheme || 'default'}
|
|
65
|
+
className="shrink-0"
|
|
66
|
+
/>
|
|
67
|
+
) : null}
|
|
68
|
+
</span>
|
|
69
|
+
{item.subtitle ? (
|
|
70
|
+
<span className="flex min-w-0 items-center gap-1 text-[11px] leading-4 text-ods-text-secondary">
|
|
71
|
+
<span className="min-w-0 truncate font-mono">{item.subtitle}</span>
|
|
72
|
+
</span>
|
|
73
|
+
) : null}
|
|
74
|
+
{item.preview ? (
|
|
75
|
+
<span className="flex min-w-0">
|
|
76
|
+
<span className="line-clamp-2 whitespace-pre-wrap break-words text-[13px] leading-5 text-ods-text-secondary">
|
|
77
|
+
{item.preview}
|
|
78
|
+
</span>
|
|
79
|
+
</span>
|
|
80
|
+
) : null}
|
|
81
|
+
{item.facts && item.facts.length > 0 ? (
|
|
82
|
+
<span className="flex flex-wrap items-center gap-x-3 gap-y-0.5 min-w-0 text-[11px] leading-4">
|
|
83
|
+
{item.facts.map((f, i) => (
|
|
84
|
+
<span key={i} className="inline-flex items-center gap-1 min-w-0 truncate">
|
|
85
|
+
<span className="text-ods-text-secondary/70 shrink-0">{f.label}:</span>
|
|
86
|
+
<span className="text-ods-text-primary font-medium truncate">{f.value}</span>
|
|
87
|
+
</span>
|
|
88
|
+
))}
|
|
89
|
+
</span>
|
|
90
|
+
) : null}
|
|
91
|
+
{dateText ? (
|
|
92
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
93
|
+
<span className={COMPACT_CARD_META_ROW}>
|
|
94
|
+
<span className="whitespace-nowrap">{dateText}</span>
|
|
95
|
+
</span>
|
|
96
|
+
</span>
|
|
97
|
+
) : null}
|
|
98
|
+
</span>
|
|
99
|
+
{href ? (
|
|
100
|
+
<span className="flex shrink-0 items-center self-start h-5 text-ods-text-secondary">
|
|
101
|
+
<ExternalLink className="w-3.5 h-3.5" />
|
|
102
|
+
</span>
|
|
103
|
+
) : null}
|
|
104
|
+
</>
|
|
105
|
+
)
|
|
106
|
+
if (anchorProps) {
|
|
107
|
+
return (
|
|
108
|
+
<a {...anchorProps} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
|
|
109
|
+
{body}
|
|
110
|
+
</a>
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
return href ? (
|
|
114
|
+
<a href={href} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
|
|
115
|
+
{body}
|
|
116
|
+
</a>
|
|
117
|
+
) : (
|
|
118
|
+
<span className={`${COMPACT_CARD_OUTER_STATIC} ${className ?? ''}`} aria-label="No link available">
|
|
119
|
+
{body}
|
|
120
|
+
</span>
|
|
121
|
+
)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function GenericEntityCardSkeleton({ className }: { className?: string }) {
|
|
125
|
+
return (
|
|
126
|
+
<span className={`${COMPACT_CARD_SKELETON_OUTER} ${className ?? ''}`}>
|
|
127
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
128
|
+
<span className="flex items-center gap-1.5 min-w-0">
|
|
129
|
+
<span className="h-3.5 w-2/3 rounded bg-ods-bg" />
|
|
130
|
+
<span className="h-4 w-16 rounded-full bg-ods-bg/60" />
|
|
131
|
+
</span>
|
|
132
|
+
<span className="h-4 w-1/2 rounded bg-ods-bg/60" />
|
|
133
|
+
<span className="flex flex-col gap-0 min-w-0">
|
|
134
|
+
<span className="h-5 w-5/6 rounded bg-ods-bg/60" />
|
|
135
|
+
<span className="h-5 w-3/4 rounded bg-ods-bg/60" />
|
|
136
|
+
</span>
|
|
137
|
+
<span className="h-3 w-1/4 rounded bg-ods-bg/70" />
|
|
138
|
+
</span>
|
|
139
|
+
<span className="flex shrink-0 items-center self-start h-5">
|
|
140
|
+
<span className="h-3.5 w-3.5 rounded bg-ods-bg" />
|
|
141
|
+
</span>
|
|
142
|
+
</span>
|
|
143
|
+
)
|
|
144
|
+
}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GitHub Activity Card — unified visual for commits, PRs, and PR reviews.
|
|
5
|
+
*
|
|
6
|
+
* PURE PRESENTATION (no internal nav, no internal data fetching). The card
|
|
7
|
+
* receives the structured `<a>` prop bundle via `anchorProps` (composed by
|
|
8
|
+
* the caller from a runtime hook) and renders the rest from the
|
|
9
|
+
* `GitHubActivityItem` shape directly.
|
|
10
|
+
*
|
|
11
|
+
* Two consumers share this component:
|
|
12
|
+
* 1. Activity-list row (employee detail / similar) — pass `variant="row"`.
|
|
13
|
+
* 2. Chat-inline `[card://github_commit:<sha>]` markers — `variant="compact"`.
|
|
14
|
+
*
|
|
15
|
+
* Unified data shape `GitHubActivityItem` covers all three GitHub types
|
|
16
|
+
* (commit / PR / review).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import React from 'react'
|
|
20
|
+
import { GitHubIcon } from '../../icons/github-icon'
|
|
21
|
+
import { GitPullRequest, Eye, ExternalLink } from 'lucide-react'
|
|
22
|
+
import {
|
|
23
|
+
COMPACT_CARD_ICON_SLOT,
|
|
24
|
+
COMPACT_CARD_META_ROW,
|
|
25
|
+
COMPACT_CARD_META_ROW_BOX,
|
|
26
|
+
COMPACT_CARD_OUTER,
|
|
27
|
+
COMPACT_CARD_OUTER_STATIC,
|
|
28
|
+
COMPACT_CARD_ROW_FILLER,
|
|
29
|
+
COMPACT_CARD_SKELETON_IMAGE_SLOT,
|
|
30
|
+
COMPACT_CARD_SKELETON_OUTER,
|
|
31
|
+
COMPACT_CARD_SUMMARY,
|
|
32
|
+
COMPACT_CARD_TEXT_COL,
|
|
33
|
+
COMPACT_CARD_TITLE,
|
|
34
|
+
COMPACT_CARD_TITLE_ROW,
|
|
35
|
+
safeHref,
|
|
36
|
+
} from '../utils/compact-card-classes'
|
|
37
|
+
import { formatDateUTC as formatDate } from '../../../utils/format'
|
|
38
|
+
import type {
|
|
39
|
+
GitHubActivityItem,
|
|
40
|
+
GitHubActivityKind,
|
|
41
|
+
PrReviewState,
|
|
42
|
+
} from '../types/entities/github-activity'
|
|
43
|
+
|
|
44
|
+
/** Extract owner/repo from a GitHub URL. */
|
|
45
|
+
function parseRepoFromUrl(url: string | null | undefined): string | null {
|
|
46
|
+
if (!url) return null
|
|
47
|
+
try {
|
|
48
|
+
const u = new URL(url)
|
|
49
|
+
if (u.host !== 'github.com') return null
|
|
50
|
+
const parts = u.pathname.split('/').filter(Boolean)
|
|
51
|
+
if (parts.length >= 2) return `${parts[0]}/${parts[1]}`
|
|
52
|
+
} catch {
|
|
53
|
+
/* malformed URL */
|
|
54
|
+
}
|
|
55
|
+
return null
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function kindIcon(kind: GitHubActivityKind, className = 'h-4 w-4') {
|
|
59
|
+
switch (kind) {
|
|
60
|
+
case 'pull_request':
|
|
61
|
+
return <GitPullRequest className={`${className} shrink-0`} />
|
|
62
|
+
case 'pr_review':
|
|
63
|
+
return <Eye className={`${className} shrink-0`} />
|
|
64
|
+
case 'commit':
|
|
65
|
+
default:
|
|
66
|
+
return <GitHubIcon className={`${className} shrink-0`} />
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function kindLabel(kind: GitHubActivityKind): string {
|
|
71
|
+
switch (kind) {
|
|
72
|
+
case 'pull_request': return 'PR'
|
|
73
|
+
case 'pr_review': return 'Review'
|
|
74
|
+
case 'commit':
|
|
75
|
+
default: return 'Commit'
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function formatActivityId(id: string, kind: GitHubActivityKind): string {
|
|
80
|
+
if (!id) return ''
|
|
81
|
+
if (kind === 'pull_request' || kind === 'pr_review') return `#${id}`
|
|
82
|
+
if (/^[0-9a-f]{40}$/i.test(id)) return id.slice(0, 7)
|
|
83
|
+
return id.length > 12 ? id.slice(0, 12) : id
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function parseGithubTitle(title: string, kind: GitHubActivityKind): { display: string; reviewState: PrReviewState | null } {
|
|
87
|
+
if (!title) return { display: '', reviewState: null }
|
|
88
|
+
|
|
89
|
+
// Split prefix-tag from rest by hand instead of one giant regex.
|
|
90
|
+
// Avoids polynomial-redos on chained `\s*` quantifiers (`\[\s*X\s*\]`),
|
|
91
|
+
// since multiple consecutive `\s*` groups against long whitespace runs
|
|
92
|
+
// trigger exponential backtracking on CodeQL's heuristic.
|
|
93
|
+
//
|
|
94
|
+
// Algorithm: trim; if it starts with `[`, locate the matching `]`,
|
|
95
|
+
// then content[0:closing] is the tag, content[closing+1:] is the
|
|
96
|
+
// remainder. Linear scan — no regex backtracking possible.
|
|
97
|
+
const trimmed = title.trim()
|
|
98
|
+
let tag: string | null = null
|
|
99
|
+
let rest: string = trimmed
|
|
100
|
+
if (trimmed.startsWith('[')) {
|
|
101
|
+
const close = trimmed.indexOf(']')
|
|
102
|
+
if (close > 0) {
|
|
103
|
+
tag = trimmed.slice(1, close).trim().toLowerCase()
|
|
104
|
+
rest = trimmed.slice(close + 1).trim()
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (kind === 'pr_review' && tag && tag.startsWith('review:')) {
|
|
109
|
+
const stateRaw = tag.slice('review:'.length).trim().toUpperCase()
|
|
110
|
+
const reviewState = (['APPROVED', 'CHANGES_REQUESTED', 'COMMENTED', 'DISMISSED', 'PENDING'] as PrReviewState[]).includes(stateRaw as PrReviewState)
|
|
111
|
+
? (stateRaw as PrReviewState)
|
|
112
|
+
: null
|
|
113
|
+
return { display: rest || 'Review', reviewState }
|
|
114
|
+
}
|
|
115
|
+
if (kind === 'pull_request' && tag && tag.startsWith('pr')) {
|
|
116
|
+
// Accept `[PR #123]`, `[PR#123]`, `[ pr # 123 ]` etc. — anything
|
|
117
|
+
// matching `pr` followed by `#?\s*\d+`. Validate the suffix is
|
|
118
|
+
// a numeric PR id, not arbitrary text.
|
|
119
|
+
const after = tag.slice(2).trim().replace(/^#\s*/, '')
|
|
120
|
+
if (after.length > 0 && /^\d+$/.test(after)) {
|
|
121
|
+
return { display: rest || title, reviewState: null }
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (kind === 'commit' && tag === 'commit') {
|
|
125
|
+
return { display: rest || title, reviewState: null }
|
|
126
|
+
}
|
|
127
|
+
return { display: title.trim(), reviewState: null }
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const REVIEW_STATE_STYLE: Record<PrReviewState, { label: string; className: string }> = {
|
|
131
|
+
APPROVED: {
|
|
132
|
+
label: 'Approved',
|
|
133
|
+
className: 'bg-[var(--ods-attention-green-success-secondary)] text-[var(--ods-attention-green-success)]',
|
|
134
|
+
},
|
|
135
|
+
CHANGES_REQUESTED: {
|
|
136
|
+
label: 'Changes',
|
|
137
|
+
className: 'bg-[var(--ods-attention-red-error-secondary)] text-[var(--ods-attention-red-error)]',
|
|
138
|
+
},
|
|
139
|
+
COMMENTED: {
|
|
140
|
+
label: 'Comment',
|
|
141
|
+
className: 'bg-ods-bg-secondary text-ods-text-primary',
|
|
142
|
+
},
|
|
143
|
+
DISMISSED: {
|
|
144
|
+
label: 'Dismissed',
|
|
145
|
+
className: 'bg-ods-bg-secondary text-ods-text-secondary',
|
|
146
|
+
},
|
|
147
|
+
PENDING: {
|
|
148
|
+
label: 'Pending',
|
|
149
|
+
className: 'bg-[var(--ods-attention-yellow-warning-secondary)] text-[var(--ods-attention-yellow-warning)]',
|
|
150
|
+
},
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function ReviewStateBadge({ state, className = '' }: { state: PrReviewState; className?: string }) {
|
|
154
|
+
const { label, className: paint } = REVIEW_STATE_STYLE[state] ?? REVIEW_STATE_STYLE.COMMENTED
|
|
155
|
+
return (
|
|
156
|
+
<span
|
|
157
|
+
className={`inline-flex items-center rounded px-1.5 py-0.5 font-mono text-[10px] font-medium uppercase tracking-wide shrink-0 ${paint} ${className}`}
|
|
158
|
+
>
|
|
159
|
+
{label}
|
|
160
|
+
</span>
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export interface GitHubActivityCardAnchorProps {
|
|
165
|
+
href: string
|
|
166
|
+
target?: '_blank'
|
|
167
|
+
rel?: 'noopener noreferrer'
|
|
168
|
+
onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export interface GitHubActivityCardProps {
|
|
172
|
+
item: GitHubActivityItem
|
|
173
|
+
variant?: 'row' | 'compact'
|
|
174
|
+
className?: string
|
|
175
|
+
/** Pre-composed `<a>` prop bundle (typically from a `useNavLink` hook in
|
|
176
|
+
* the consumer). When provided, the outer renders as a real `<a>`. */
|
|
177
|
+
anchorProps?: GitHubActivityCardAnchorProps
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export function GitHubActivityCard({ item, variant = 'compact', className, anchorProps }: GitHubActivityCardProps) {
|
|
181
|
+
const kind = item.kind ?? 'commit'
|
|
182
|
+
const repo = item.repo ?? parseRepoFromUrl(item.url) ?? ''
|
|
183
|
+
const dateText = formatDate(item.dateUpdated, { fallback: '', timezone: 'local' })
|
|
184
|
+
const idLabel = formatActivityId(item.id, kind)
|
|
185
|
+
const { display: title, reviewState } = parseGithubTitle(item.title, kind)
|
|
186
|
+
const primaryText = kind === 'pr_review'
|
|
187
|
+
? (title.replace(/^by\s+/i, '').trim() || 'Reviewer')
|
|
188
|
+
: title
|
|
189
|
+
|
|
190
|
+
if (variant === 'row') {
|
|
191
|
+
return (
|
|
192
|
+
<div className={`flex items-center gap-3 min-w-0 ${className ?? ''}`}>
|
|
193
|
+
<span className="flex items-center gap-2 w-28 shrink-0">
|
|
194
|
+
{kindIcon(kind, 'h-3.5 w-3.5')}
|
|
195
|
+
<code className="text-ods-text-secondary font-mono text-xs truncate">{idLabel}</code>
|
|
196
|
+
</span>
|
|
197
|
+
<span className="flex items-center gap-2 text-ods-text-primary text-sm flex-1 min-w-0">
|
|
198
|
+
{reviewState ? <ReviewStateBadge state={reviewState} /> : null}
|
|
199
|
+
<span className="truncate">{primaryText}</span>
|
|
200
|
+
</span>
|
|
201
|
+
{repo ? (
|
|
202
|
+
<span className="font-mono text-[11px] text-ods-text-secondary truncate max-w-[240px] shrink-0">{repo}</span>
|
|
203
|
+
) : null}
|
|
204
|
+
{dateText ? (
|
|
205
|
+
<span className="text-ods-text-secondary text-xs w-24 shrink-0 text-right">{dateText}</span>
|
|
206
|
+
) : null}
|
|
207
|
+
</div>
|
|
208
|
+
)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const metaParts: React.ReactNode[] = []
|
|
212
|
+
metaParts.push(
|
|
213
|
+
<span key="kind" className="font-medium uppercase tracking-wide text-[10px]">{kindLabel(kind)}</span>,
|
|
214
|
+
)
|
|
215
|
+
if (idLabel) metaParts.push(<code key="id" className="font-mono">{idLabel}</code>)
|
|
216
|
+
if (repo) metaParts.push(<span key="repo" className="font-mono truncate">{repo}</span>)
|
|
217
|
+
if (dateText) metaParts.push(<span key="date" className="whitespace-nowrap">{dateText}</span>)
|
|
218
|
+
|
|
219
|
+
const href = safeHref(item.url)
|
|
220
|
+
const body = (
|
|
221
|
+
<>
|
|
222
|
+
<span className={COMPACT_CARD_ICON_SLOT}>
|
|
223
|
+
{kindIcon(kind, 'h-5 w-5')}
|
|
224
|
+
</span>
|
|
225
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
226
|
+
<span className={`${COMPACT_CARD_TITLE_ROW} flex-nowrap gap-1.5`}>
|
|
227
|
+
{reviewState ? <ReviewStateBadge state={reviewState} /> : null}
|
|
228
|
+
<span className={COMPACT_CARD_TITLE}>{primaryText}</span>
|
|
229
|
+
</span>
|
|
230
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
231
|
+
<span className={COMPACT_CARD_META_ROW}>
|
|
232
|
+
{metaParts.map((part, i) => (
|
|
233
|
+
<React.Fragment key={i}>
|
|
234
|
+
{i > 0 ? <span className="text-ods-text-secondary/40 shrink-0">·</span> : null}
|
|
235
|
+
<span className="min-w-0 truncate">{part}</span>
|
|
236
|
+
</React.Fragment>
|
|
237
|
+
))}
|
|
238
|
+
</span>
|
|
239
|
+
</span>
|
|
240
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
241
|
+
<span className={COMPACT_CARD_SUMMARY}>{COMPACT_CARD_ROW_FILLER}</span>
|
|
242
|
+
</span>
|
|
243
|
+
</span>
|
|
244
|
+
{href ? (
|
|
245
|
+
<span className="flex shrink-0 items-center self-start h-5 text-ods-text-secondary">
|
|
246
|
+
<ExternalLink className="w-3.5 h-3.5" />
|
|
247
|
+
</span>
|
|
248
|
+
) : null}
|
|
249
|
+
</>
|
|
250
|
+
)
|
|
251
|
+
if (anchorProps) {
|
|
252
|
+
return (
|
|
253
|
+
<a {...anchorProps} className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}>
|
|
254
|
+
{body}
|
|
255
|
+
</a>
|
|
256
|
+
)
|
|
257
|
+
}
|
|
258
|
+
return href ? (
|
|
259
|
+
<a
|
|
260
|
+
href={href}
|
|
261
|
+
target="_blank"
|
|
262
|
+
rel="noopener noreferrer"
|
|
263
|
+
className={`${COMPACT_CARD_OUTER} ${className ?? ''}`}
|
|
264
|
+
>
|
|
265
|
+
{body}
|
|
266
|
+
</a>
|
|
267
|
+
) : (
|
|
268
|
+
<span className={`${COMPACT_CARD_OUTER_STATIC} ${className ?? ''}`} aria-label="No link available">{body}</span>
|
|
269
|
+
)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export function GitHubActivityCardSkeleton({ variant = 'compact', className }: { variant?: 'row' | 'compact'; className?: string }) {
|
|
273
|
+
if (variant === 'row') {
|
|
274
|
+
return (
|
|
275
|
+
<div className={`flex items-center gap-3 min-w-0 animate-pulse ${className ?? ''}`}>
|
|
276
|
+
<div className="flex items-center gap-2 w-28 shrink-0">
|
|
277
|
+
<div className="h-3.5 w-3.5 rounded bg-ods-bg" />
|
|
278
|
+
<div className="h-3 w-16 bg-ods-bg rounded" />
|
|
279
|
+
</div>
|
|
280
|
+
<div className="h-3 w-2/3 bg-ods-bg rounded flex-1" />
|
|
281
|
+
<div className="h-3 w-40 bg-ods-bg/60 rounded shrink-0" />
|
|
282
|
+
<div className="h-3 w-20 bg-ods-bg/60 rounded shrink-0" />
|
|
283
|
+
</div>
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
return (
|
|
287
|
+
<span className={`${COMPACT_CARD_SKELETON_OUTER} ${className ?? ''}`}>
|
|
288
|
+
<span className={COMPACT_CARD_SKELETON_IMAGE_SLOT} />
|
|
289
|
+
<span className={COMPACT_CARD_TEXT_COL}>
|
|
290
|
+
<span className={COMPACT_CARD_TITLE_ROW}>
|
|
291
|
+
<span className="h-3.5 w-2/3 rounded bg-ods-bg" />
|
|
292
|
+
</span>
|
|
293
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
294
|
+
<span className="h-3 w-1/2 rounded bg-ods-bg/70" />
|
|
295
|
+
</span>
|
|
296
|
+
<span className={COMPACT_CARD_META_ROW_BOX}>
|
|
297
|
+
<span className={COMPACT_CARD_SUMMARY}>{COMPACT_CARD_ROW_FILLER}</span>
|
|
298
|
+
</span>
|
|
299
|
+
</span>
|
|
300
|
+
<span className="flex shrink-0 items-center self-start h-5">
|
|
301
|
+
<span className="h-3.5 w-3.5 rounded bg-ods-bg" />
|
|
302
|
+
</span>
|
|
303
|
+
</span>
|
|
304
|
+
)
|
|
305
|
+
}
|