@flamingo-stack/openframe-frontend-core 0.0.438 → 0.0.439-snapshot.20260717095442
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-RVWC4P3H.js → chunk-2BTDPDME.js} +9 -9
- package/dist/chunk-2BTDPDME.js.map +1 -0
- package/dist/{chunk-5D5SJOLE.js → chunk-63TSTDME.js} +21 -21
- package/dist/chunk-63TSTDME.js.map +1 -0
- package/dist/{chunk-4ACSUJ7Q.js → chunk-6CITW5BD.js} +10 -10
- package/dist/chunk-6CITW5BD.js.map +1 -0
- package/dist/{chunk-QXYOGJQJ.js → chunk-7KDR5P23.js} +2 -2
- package/dist/{chunk-ZEY7A3MP.js → chunk-7KNOHGMI.js} +2 -2
- package/dist/{chunk-PCMDRDYX.cjs → chunk-7QP65IE4.cjs} +5 -5
- package/dist/{chunk-PCMDRDYX.cjs.map → chunk-7QP65IE4.cjs.map} +1 -1
- package/dist/{chunk-XFSDFO6U.js → chunk-AGV26PUR.js} +6 -6
- package/dist/{chunk-XFSDFO6U.js.map → chunk-AGV26PUR.js.map} +1 -1
- package/dist/{chunk-2DCP2TIF.cjs → chunk-DUQQEQ7G.cjs} +2892 -2579
- package/dist/chunk-DUQQEQ7G.cjs.map +1 -0
- package/dist/{chunk-W2PRXXUD.js → chunk-FPE3SQ5D.js} +13 -13
- package/dist/chunk-FPE3SQ5D.js.map +1 -0
- package/dist/{chunk-POFDZH2C.js → chunk-IAZ5AN2E.js} +30 -30
- package/dist/chunk-IAZ5AN2E.js.map +1 -0
- package/dist/{chunk-H2TQ44VD.cjs → chunk-IPEIOR77.cjs} +130 -130
- package/dist/chunk-IPEIOR77.cjs.map +1 -0
- package/dist/{chunk-6R5SZPAQ.cjs → chunk-IZ6A6K6N.cjs} +25 -25
- package/dist/chunk-IZ6A6K6N.cjs.map +1 -0
- package/dist/{chunk-EE5NH5SH.cjs → chunk-J5NO7PAG.cjs} +3 -3
- package/dist/{chunk-EE5NH5SH.cjs.map → chunk-J5NO7PAG.cjs.map} +1 -1
- package/dist/{chunk-WF7VGEYR.cjs → chunk-JNC4LVD6.cjs} +42 -42
- package/dist/chunk-JNC4LVD6.cjs.map +1 -0
- package/dist/{chunk-CMP56RUC.cjs → chunk-JOH5D76X.cjs} +108 -108
- package/dist/chunk-JOH5D76X.cjs.map +1 -0
- package/dist/{chunk-KBFQF4AV.js → chunk-JYI4R25Q.js} +5 -5
- package/dist/chunk-JYI4R25Q.js.map +1 -0
- package/dist/{chunk-YKP2F2NC.cjs → chunk-KUXGQ2FQ.cjs} +36 -36
- package/dist/chunk-KUXGQ2FQ.cjs.map +1 -0
- package/dist/{chunk-SYTL2VIU.cjs → chunk-LFWPWIAC.cjs} +16 -16
- package/dist/{chunk-SYTL2VIU.cjs.map → chunk-LFWPWIAC.cjs.map} +1 -1
- package/dist/{chunk-DTYPYYKD.cjs → chunk-LUKRPHEW.cjs} +96 -96
- package/dist/chunk-LUKRPHEW.cjs.map +1 -0
- package/dist/{chunk-IMK6RUEC.cjs → chunk-PYR4LVAF.cjs} +10 -10
- package/dist/chunk-PYR4LVAF.cjs.map +1 -0
- package/dist/{chunk-LR6A67KZ.js → chunk-QAG357PE.js} +7 -7
- package/dist/chunk-QAG357PE.js.map +1 -0
- package/dist/{chunk-N2TJ3HAM.cjs → chunk-QO6MCQYE.cjs} +9 -9
- package/dist/chunk-QO6MCQYE.cjs.map +1 -0
- package/dist/{chunk-RTHOCS3S.js → chunk-SM26C2L7.js} +9 -9
- package/dist/chunk-SM26C2L7.js.map +1 -0
- package/dist/{chunk-B5SGPIJ4.cjs → chunk-TAQMYVO6.cjs} +42 -42
- package/dist/{chunk-B5SGPIJ4.cjs.map → chunk-TAQMYVO6.cjs.map} +1 -1
- package/dist/{chunk-X66KRL5G.cjs → chunk-UFBUQO7Z.cjs} +19 -19
- package/dist/{chunk-X66KRL5G.cjs.map → chunk-UFBUQO7Z.cjs.map} +1 -1
- package/dist/{chunk-D5RTZ2WN.js → chunk-W3JZXLJ2.js} +10 -10
- package/dist/chunk-W3JZXLJ2.js.map +1 -0
- package/dist/{chunk-VYG2CJFJ.cjs → chunk-XMCVUYKC.cjs} +14 -14
- package/dist/chunk-XMCVUYKC.cjs.map +1 -0
- package/dist/{chunk-A25RPWYF.js → chunk-Y3NFB6HR.js} +5 -5
- package/dist/chunk-Y3NFB6HR.js.map +1 -0
- package/dist/{chunk-44HNH57W.js → chunk-YZJUHEPZ.js} +95 -95
- package/dist/chunk-YZJUHEPZ.js.map +1 -0
- package/dist/{chunk-6ETVJ5ON.js → chunk-ZQYFDYWV.js} +6726 -6413
- package/dist/chunk-ZQYFDYWV.js.map +1 -0
- package/dist/components/case-studies/index.cjs +15 -15
- package/dist/components/case-studies/index.cjs.map +1 -1
- package/dist/components/case-studies/index.js +9 -9
- package/dist/components/case-studies/index.js.map +1 -1
- package/dist/components/chat/approval-request-message.d.ts.map +1 -1
- package/dist/components/chat/chat-archive-page.d.ts +28 -8
- package/dist/components/chat/chat-archive-page.d.ts.map +1 -1
- package/dist/components/chat/chat-header-icon-button.d.ts +6 -2
- package/dist/components/chat/chat-header-icon-button.d.ts.map +1 -1
- package/dist/components/chat/chat-header-search-field.d.ts +25 -0
- package/dist/components/chat/chat-header-search-field.d.ts.map +1 -0
- package/dist/components/chat/chat-list-empty-state.d.ts +20 -0
- package/dist/components/chat/chat-list-empty-state.d.ts.map +1 -0
- package/dist/components/chat/chat-panel-header.d.ts +19 -9
- package/dist/components/chat/chat-panel-header.d.ts.map +1 -1
- package/dist/components/chat/embeddable-chat.d.ts +15 -6
- package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/blog-card.d.ts.map +1 -1
- package/dist/components/chat/hooks/use-chat-dialog-manager.d.ts +2 -0
- package/dist/components/chat/hooks/use-chat-dialog-manager.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +6 -4
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.d.ts +2 -0
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +7 -5
- package/dist/components/chat/mingo-chat-history.d.ts +5 -10
- package/dist/components/chat/mingo-chat-history.d.ts.map +1 -1
- package/dist/components/chat/mingo-history-rail.d.ts +54 -0
- package/dist/components/chat/mingo-history-rail.d.ts.map +1 -0
- package/dist/components/chat/mingo-welcome.d.ts +6 -25
- package/dist/components/chat/mingo-welcome.d.ts.map +1 -1
- package/dist/components/chat/tool-call-blocks.d.ts.map +1 -1
- package/dist/components/chat/utils/compact-card-classes.d.ts +3 -3
- package/dist/components/chat/utils/compact-card-classes.d.ts.map +1 -1
- package/dist/components/contact/index.cjs +5 -5
- package/dist/components/contact/index.js +4 -4
- package/dist/components/docs/index.cjs +7 -7
- package/dist/components/docs/index.js +6 -6
- package/dist/components/embeds/index.cjs +5 -5
- package/dist/components/embeds/index.js +4 -4
- package/dist/components/faq/index.cjs +6 -6
- package/dist/components/faq/index.js +5 -5
- package/dist/components/features/index.cjs +4 -4
- package/dist/components/features/index.js +3 -3
- package/dist/components/help-center-pages/index.cjs +23 -23
- package/dist/components/help-center-pages/index.js +14 -14
- package/dist/components/index.cjs +263 -255
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +121 -113
- package/dist/components/index.js.map +1 -1
- package/dist/components/msp-display.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +4 -4
- package/dist/components/navigation/index.js +3 -3
- package/dist/components/navigation/sticky-section-nav.d.ts.map +1 -1
- package/dist/components/onboarding-guides/index.cjs +8 -8
- package/dist/components/onboarding-guides/index.js +7 -7
- package/dist/components/pricing-display.d.ts +9 -9
- package/dist/components/related-content/index.cjs +6 -6
- package/dist/components/related-content/index.js +5 -5
- package/dist/components/tickets/index.cjs +7 -7
- package/dist/components/tickets/index.js +6 -6
- package/dist/components/toast/index.cjs +5 -5
- package/dist/components/toast/index.cjs.map +1 -1
- package/dist/components/toast/index.js +5 -5
- package/dist/components/toast/index.js.map +1 -1
- package/dist/components/ui/bullet-list.d.ts.map +1 -1
- package/dist/components/ui/drawer.d.ts +1 -1
- package/dist/components/ui/drawer.d.ts.map +1 -1
- package/dist/components/ui/file-manager/index.cjs +73 -73
- package/dist/components/ui/file-manager/index.cjs.map +1 -1
- package/dist/components/ui/file-manager/index.js +24 -24
- package/dist/components/ui/file-manager/index.js.map +1 -1
- package/dist/components/ui/index.cjs +6 -4
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +7 -5
- package/dist/components/ui/markdown-editor.d.ts.map +1 -1
- package/dist/components/ui/square-avatar.d.ts +3 -0
- package/dist/components/ui/square-avatar.d.ts.map +1 -1
- package/dist/components/user-display.d.ts.map +1 -1
- package/dist/components/vendor-tag.d.ts.map +1 -1
- package/dist/hooks/index.cjs +2 -2
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +6 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -5
- package/dist/tailwind.config.cjs +38 -5
- package/dist/tailwind.config.cjs.map +1 -1
- package/dist/tailwind.config.js +38 -5
- package/dist/tailwind.config.js.map +1 -1
- package/package.json +1 -1
- package/src/ODS_TOKEN_RULES.md +5 -0
- package/src/components/.footer.md +2 -2
- package/src/components/announcement-bar.tsx +1 -1
- package/src/components/authors/author-detail-view.tsx +3 -3
- package/src/components/calendar.tsx +2 -2
- package/src/components/case-studies/share-experience-section.tsx +5 -5
- package/src/components/categories-cart.tsx +6 -6
- package/src/components/category-card.tsx +5 -5
- package/src/components/chart.tsx +3 -3
- package/src/components/chat/approval-request-message.tsx +2 -5
- package/src/components/chat/chat-archive-page.tsx +89 -73
- package/src/components/chat/chat-attachment-bar.tsx +3 -3
- package/src/components/chat/chat-header-icon-button.tsx +12 -5
- package/src/components/chat/chat-header-search-field.tsx +144 -0
- package/src/components/chat/chat-list-empty-state.tsx +44 -0
- package/src/components/chat/chat-message-enhanced.tsx +1 -1
- package/src/components/chat/chat-message-list.tsx +1 -1
- package/src/components/chat/chat-message-row.tsx +3 -3
- package/src/components/chat/chat-panel-header.tsx +76 -29
- package/src/components/chat/chat-quick-action.tsx +1 -1
- package/src/components/chat/chat-sidebar-skeleton.tsx +1 -1
- package/src/components/chat/chat-sidebar.tsx +6 -6
- package/src/components/chat/chat-typing-indicator.tsx +1 -1
- package/src/components/chat/context-compaction-display.tsx +1 -1
- package/src/components/chat/embeddable-chat.tsx +551 -128
- package/src/components/chat/entity-cards/admin-content-card.tsx +5 -5
- package/src/components/chat/entity-cards/blog-card.tsx +5 -8
- package/src/components/chat/entity-cards/case-study-card.tsx +5 -5
- package/src/components/chat/entity-cards/chat-ticket-item.tsx +1 -1
- package/src/components/chat/entity-cards/customer-interview-card.tsx +9 -9
- package/src/components/chat/entity-cards/data-room-doc-card.tsx +2 -2
- package/src/components/chat/entity-cards/dispatch.tsx +1 -1
- package/src/components/chat/entity-cards/entity-author-card.tsx +3 -3
- package/src/components/chat/entity-cards/entity-portrait-card.tsx +4 -4
- package/src/components/chat/entity-cards/generic-entity-card.tsx +3 -3
- package/src/components/chat/entity-cards/github-activity-card.tsx +11 -11
- package/src/components/chat/entity-cards/hubspot-ticket-card.tsx +5 -5
- package/src/components/chat/entity-cards/investor-update-card.tsx +1 -1
- package/src/components/chat/entity-cards/onboarding-guide-card.tsx +12 -12
- package/src/components/chat/entity-cards/program-card.tsx +12 -12
- package/src/components/chat/entity-cards/roadmap-card.tsx +6 -6
- package/src/components/chat/entity-cards/roadmap-vote-button.tsx +1 -1
- package/src/components/chat/entity-cards/slack-message-card.tsx +4 -4
- package/src/components/chat/error-message-display.tsx +2 -2
- package/src/components/chat/guide-welcome.tsx +4 -4
- package/src/components/chat/hooks/use-chat-dialog-manager.ts +59 -5
- package/src/components/chat/index.ts +2 -0
- package/src/components/chat/mingo-chat-history.tsx +46 -100
- package/src/components/chat/mingo-history-rail.tsx +161 -0
- package/src/components/chat/mingo-info-card.tsx +2 -2
- package/src/components/chat/mingo-welcome.tsx +17 -98
- package/src/components/chat/model-display.tsx +7 -7
- package/src/components/chat/quick-action-chip.tsx +1 -1
- package/src/components/chat/source-action-button.tsx +2 -2
- package/src/components/chat/tool-call-blocks.tsx +3 -5
- package/src/components/chat/utils/.chip-action-class.md +1 -1
- package/src/components/chat/utils/.chip-styles.md +2 -2
- package/src/components/chat/utils/chip-action-class.ts +1 -1
- package/src/components/chat/utils/chip-styles.ts +2 -2
- package/src/components/chat/utils/compact-card-classes.ts +3 -3
- package/src/components/command.tsx +3 -3
- package/src/components/comment-card.tsx +1 -1
- package/src/components/contact/contact-form.tsx +9 -9
- package/src/components/context-menu.tsx +5 -5
- package/src/components/date-time-picker.tsx +2 -2
- package/src/components/docs/doc-viewer.tsx +4 -4
- package/src/components/embeds/figma-embed.tsx +2 -2
- package/src/components/embeds/file-download-card.tsx +2 -2
- package/src/components/embeds/google-sheets-viewer.tsx +1 -1
- package/src/components/embeds/linkedin-embed-client.tsx +3 -3
- package/src/components/embeds/og-link-preview.tsx +14 -14
- package/src/components/embeds/pdf-viewer.tsx +1 -1
- package/src/components/embeds/reddit-embed-client.tsx +9 -9
- package/src/components/embeds/twitter-embed-client.tsx +9 -9
- package/src/components/empty-state.tsx +5 -5
- package/src/components/faq/faq-section.tsx +1 -1
- package/src/components/features/ai-enrich/AIEnrichSection.tsx +14 -14
- package/src/components/features/ai-enrich/AIRequiredBadge.tsx +5 -5
- package/src/components/features/ai-enrich/AIStatusIndicator.tsx +8 -8
- package/src/components/features/ai-enrich/AIWarningsSection.tsx +4 -4
- package/src/components/features/ai-enrich/ConfidenceBadge.tsx +4 -4
- package/src/components/features/array-entry-manager.tsx +7 -7
- package/src/components/features/auth-providers-list.tsx +1 -1
- package/src/components/features/board/ticket-card.tsx +1 -1
- package/src/components/features/changelog-manager.tsx +10 -10
- package/src/components/features/command-box.tsx +2 -2
- package/src/components/features/entity-summary-editor.tsx +3 -3
- package/src/components/features/figma-prototype-viewer.tsx +9 -9
- package/src/components/features/filters-dropdown.tsx +2 -2
- package/src/components/features/highlight-config-section.tsx +3 -3
- package/src/components/features/highlight-video-combined-section.tsx +2 -2
- package/src/components/features/highlight-video-preview.tsx +2 -2
- package/src/components/features/highlight-video-section.tsx +9 -9
- package/src/components/features/media-gallery-manager.tsx +14 -14
- package/src/components/features/og-editor-preview.tsx +4 -4
- package/src/components/features/os-type-badge-group.tsx +1 -1
- package/src/components/features/os-type-badge.tsx +2 -2
- package/src/components/features/platform-badge.tsx +4 -4
- package/src/components/features/policy-configuration-panel.tsx +6 -6
- package/src/components/features/provider-button.tsx +1 -1
- package/src/components/features/push-button-selector.tsx +21 -21
- package/src/components/features/release-media-manager.tsx +16 -16
- package/src/components/features/section-selector.tsx +8 -8
- package/src/components/features/select-button.tsx +4 -4
- package/src/components/features/seo-editor-preview.tsx +20 -20
- package/src/components/features/social-links-manager.tsx +3 -3
- package/src/components/features/start-with-openframe-button.tsx +3 -3
- package/src/components/features/status-filter-component.tsx +1 -1
- package/src/components/features/tags-selector.tsx +6 -6
- package/src/components/features/transcript-summary-editor.tsx +9 -9
- package/src/components/features/video-bites-strip.tsx +1 -1
- package/src/components/features/video-ratio-tabs.tsx +1 -1
- package/src/components/features/video-source-selector.tsx +7 -7
- package/src/components/features/video.tsx +1 -1
- package/src/components/features/waitlist-form.tsx +3 -3
- package/src/components/filter-chip.tsx +13 -13
- package/src/components/footer.tsx +3 -3
- package/src/components/form.tsx +2 -2
- package/src/components/hero-image-uploader.tsx +3 -3
- package/src/components/image-cropper.tsx +2 -2
- package/src/components/layout/page-container.tsx +6 -6
- package/src/components/layout/page-heading.tsx +1 -1
- package/src/components/loading/card-skeleton.tsx +2 -2
- package/src/components/loading/category-card-skeleton.tsx +1 -1
- package/src/components/loading/margin-report-skeleton.tsx +22 -22
- package/src/components/loading/openmsp-heartbeat.tsx +1 -1
- package/src/components/loading/page-layout-skeleton.tsx +83 -83
- package/src/components/loading/unified-skeleton.tsx +1 -1
- package/src/components/loading/users-grid-skeleton.tsx +2 -2
- package/src/components/logs-list.tsx +8 -8
- package/src/components/media-carousel.tsx +7 -7
- package/src/components/metric-value.tsx +2 -2
- package/src/components/msp-display.tsx +8 -2
- package/src/components/navigation/app-header.tsx +6 -6
- package/src/components/navigation/header-organization-filter.tsx +2 -2
- package/src/components/navigation/header.tsx +4 -4
- package/src/components/navigation/mobile-burger-menu.tsx +7 -7
- package/src/components/navigation/mobile-nav-panel.tsx +1 -1
- package/src/components/navigation/multi-level-navigation.tsx +7 -7
- package/src/components/navigation/navigation-sidebar.tsx +1 -1
- package/src/components/navigation/sticky-section-nav.tsx +2 -2
- package/src/components/onboarding-guides/onboarding-guides-catalog-view.tsx +4 -4
- package/src/components/pagination.tsx +2 -2
- package/src/components/persistent-filter-controls.tsx +1 -1
- package/src/components/platform/.ShellTypeBadge.md +1 -1
- package/src/components/platform/CveLink.tsx +1 -1
- package/src/components/platform/ScriptArguments.tsx +2 -2
- package/src/components/platform/ScriptInfoSection.tsx +5 -5
- package/src/components/platform/ShellTypeBadge.tsx +6 -6
- package/src/components/platform/SoftwareInfo.tsx +2 -2
- package/src/components/pricing-display.tsx +9 -9
- package/src/components/profile/ProfileLoadingSkeleton.tsx +6 -6
- package/src/components/related-content/related-content-section.tsx +3 -3
- package/src/components/results-count.tsx +1 -1
- package/src/components/shared/delivery/delivery-row.tsx +1 -1
- package/src/components/shared/delivery/delivery-table.tsx +1 -1
- package/src/components/shared/dev-section/dev-section-view.tsx +1 -1
- package/src/components/shared/doc-search/doc-search-result-row.tsx +2 -2
- package/src/components/shared/legal-document/legal-document-page.tsx +5 -5
- package/src/components/shared/onboarding/onboarding-step-card.tsx +1 -1
- package/src/components/shared/product-release/product-release-card-skeleton.tsx +3 -3
- package/src/components/shared/product-release/product-release-card.tsx +14 -14
- package/src/components/shared/product-release/release-detail-page.tsx +16 -16
- package/src/components/shared/roadmap/roadmap-grid.tsx +2 -2
- package/src/components/smooth-accordion.tsx +1 -1
- package/src/components/social-icon-row.tsx +1 -1
- package/src/components/sonner.tsx +5 -5
- package/src/components/steps.tsx +3 -3
- package/src/components/tickets/help-center-create-form.tsx +1 -1
- package/src/components/tickets/help-center-list.tsx +1 -1
- package/src/components/tickets/ticket-center.tsx +2 -2
- package/src/components/tickets/ticket-detail-drawer.tsx +5 -5
- package/src/components/tickets/ticket-open-form.tsx +6 -6
- package/src/components/ui/.title-content-block.md +1 -1
- package/src/components/ui/accordion.tsx +2 -2
- package/src/components/ui/actions-menu.tsx +1 -1
- package/src/components/ui/alert-dialog.tsx +3 -3
- package/src/components/ui/alert.tsx +2 -2
- package/src/components/ui/allowed-domains-input.tsx +3 -3
- package/src/components/ui/autocomplete.tsx +3 -3
- package/src/components/ui/badge.tsx +2 -2
- package/src/components/ui/brand-association-card.tsx +2 -2
- package/src/components/ui/breadcrumb.tsx +3 -3
- package/src/components/ui/bullet-list.tsx +2 -2
- package/src/components/ui/button/button.tsx +1 -1
- package/src/components/ui/card.tsx +4 -4
- package/src/components/ui/checkbox-with-description.tsx +1 -1
- package/src/components/ui/chevron-button.tsx +1 -1
- package/src/components/ui/content-loader.tsx +16 -16
- package/src/components/ui/cursor-pagination.tsx +1 -1
- package/src/components/ui/date-picker.tsx +2 -2
- package/src/components/ui/device-card-compact.tsx +2 -2
- package/src/components/ui/device-card.tsx +3 -3
- package/src/components/ui/dialog.tsx +3 -3
- package/src/components/ui/drawer.tsx +4 -4
- package/src/components/ui/dropdown-menu.tsx +6 -6
- package/src/components/ui/error-state.tsx +9 -9
- package/src/components/ui/fade-preview.tsx +1 -1
- package/src/components/ui/field-wrapper.tsx +1 -1
- package/src/components/ui/file-manager/file-manager-breadcrumb.tsx +2 -2
- package/src/components/ui/file-manager/file-manager-empty.tsx +3 -3
- package/src/components/ui/file-manager/file-manager-skeleton.tsx +4 -4
- package/src/components/ui/file-manager/file-manager-table-row.tsx +7 -7
- package/src/components/ui/file-manager/file-manager-table.tsx +8 -8
- package/src/components/ui/file-upload.tsx +9 -9
- package/src/components/ui/filter-pill-row.tsx +1 -1
- package/src/components/ui/floating-tooltip.tsx +1 -1
- package/src/components/ui/highlight-card.tsx +1 -1
- package/src/components/ui/hover-dropdown.tsx +1 -1
- package/src/components/ui/image-gallery-modal.tsx +1 -1
- package/src/components/ui/info-row.tsx +1 -1
- package/src/components/ui/input.tsx +1 -1
- package/src/components/ui/label.tsx +5 -5
- package/src/components/ui/markdown-editor.tsx +4 -5
- package/src/components/ui/menubar.tsx +7 -7
- package/src/components/ui/modal-v2.tsx +1 -1
- package/src/components/ui/modal.tsx +1 -1
- package/src/components/ui/more-actions-menu.tsx +1 -1
- package/src/components/ui/navigation-menu.tsx +1 -1
- package/src/components/ui/organization-card.tsx +8 -8
- package/src/components/ui/page-loader.tsx +6 -6
- package/src/components/ui/phone-input.tsx +1 -1
- package/src/components/ui/progress-bar.tsx +5 -5
- package/src/components/ui/query-report-table/.query-report-table-header.md +1 -1
- package/src/components/ui/query-report-table/query-report-table-header.tsx +1 -1
- package/src/components/ui/query-report-table/query-report-table-row.tsx +2 -2
- package/src/components/ui/query-report-table/query-report-table.tsx +1 -1
- package/src/components/ui/release-changelog-section.tsx +2 -2
- package/src/components/ui/rich-markdown-renderer.tsx +6 -6
- package/src/components/ui/search-input.tsx +7 -7
- package/src/components/ui/select.tsx +1 -1
- package/src/components/ui/service-card.tsx +4 -4
- package/src/components/ui/sheet.tsx +3 -3
- package/src/components/ui/simple-markdown-renderer.tsx +4 -4
- package/src/components/ui/square-avatar.tsx +9 -5
- package/src/components/ui/status-badge.tsx +11 -11
- package/src/components/ui/status-indicator.tsx +6 -6
- package/src/components/ui/tab-content.tsx +1 -1
- package/src/components/ui/tab-navigation.tsx +2 -2
- package/src/components/ui/table/table-column-filter-dropdown.tsx +1 -1
- package/src/components/ui/table/table-description-cell.tsx +1 -1
- package/src/components/ui/table/table-timestamp-cell.tsx +1 -1
- package/src/components/ui/table/table.tsx +2 -2
- package/src/components/ui/tabs.tsx +1 -1
- package/src/components/ui/tag-search-input.tsx +1 -1
- package/src/components/ui/tag.tsx +23 -23
- package/src/components/ui/tags-input.tsx +2 -2
- package/src/components/ui/ticket-status-tag.tsx +1 -1
- package/src/components/ui/toaster.tsx +8 -8
- package/src/components/ui/toggle.tsx +1 -1
- package/src/components/ui/tooltip.tsx +1 -1
- package/src/components/user-display.tsx +12 -6
- package/src/components/user-summary-stub.tsx +4 -4
- package/src/components/vendor-display-button.tsx +2 -2
- package/src/components/vendor-icon.tsx +1 -1
- package/src/components/vendor-tag.tsx +9 -10
- package/src/components/yes-no-display.tsx +3 -3
- package/src/stories/MingoWelcome.stories.tsx +2 -11
- package/src/styles/ods-colors.css +2 -0
- package/tailwind.config.ts +49 -4
- package/dist/chunk-2DCP2TIF.cjs.map +0 -1
- package/dist/chunk-44HNH57W.js.map +0 -1
- package/dist/chunk-4ACSUJ7Q.js.map +0 -1
- package/dist/chunk-5D5SJOLE.js.map +0 -1
- package/dist/chunk-6ETVJ5ON.js.map +0 -1
- package/dist/chunk-6R5SZPAQ.cjs.map +0 -1
- package/dist/chunk-A25RPWYF.js.map +0 -1
- package/dist/chunk-CMP56RUC.cjs.map +0 -1
- package/dist/chunk-D5RTZ2WN.js.map +0 -1
- package/dist/chunk-DTYPYYKD.cjs.map +0 -1
- package/dist/chunk-H2TQ44VD.cjs.map +0 -1
- package/dist/chunk-IMK6RUEC.cjs.map +0 -1
- package/dist/chunk-KBFQF4AV.js.map +0 -1
- package/dist/chunk-LR6A67KZ.js.map +0 -1
- package/dist/chunk-N2TJ3HAM.cjs.map +0 -1
- package/dist/chunk-POFDZH2C.js.map +0 -1
- package/dist/chunk-RTHOCS3S.js.map +0 -1
- package/dist/chunk-RVWC4P3H.js.map +0 -1
- package/dist/chunk-VYG2CJFJ.cjs.map +0 -1
- package/dist/chunk-W2PRXXUD.js.map +0 -1
- package/dist/chunk-WF7VGEYR.cjs.map +0 -1
- package/dist/chunk-YKP2F2NC.cjs.map +0 -1
- package/dist/components/accordion.d.ts +0 -8
- package/dist/components/accordion.d.ts.map +0 -1
- package/dist/components/alert-dialog.d.ts +0 -21
- package/dist/components/alert-dialog.d.ts.map +0 -1
- package/dist/components/alert.d.ts +0 -9
- package/dist/components/alert.d.ts.map +0 -1
- package/dist/components/badge.d.ts +0 -10
- package/dist/components/badge.d.ts.map +0 -1
- package/dist/components/breadcrumb.d.ts +0 -20
- package/dist/components/breadcrumb.d.ts.map +0 -1
- package/dist/components/chevron-button.d.ts +0 -14
- package/dist/components/chevron-button.d.ts.map +0 -1
- package/dist/components/dialog.d.ts +0 -29
- package/dist/components/dialog.d.ts.map +0 -1
- package/dist/components/dropdown-menu.d.ts +0 -28
- package/dist/components/dropdown-menu.d.ts.map +0 -1
- package/dist/components/input.d.ts +0 -8
- package/dist/components/input.d.ts.map +0 -1
- package/dist/components/label.d.ts +0 -6
- package/dist/components/label.d.ts.map +0 -1
- package/dist/components/menubar.d.ts +0 -34
- package/dist/components/menubar.d.ts.map +0 -1
- package/dist/components/navigation-menu.d.ts +0 -13
- package/dist/components/navigation-menu.d.ts.map +0 -1
- package/dist/components/select.d.ts +0 -14
- package/dist/components/select.d.ts.map +0 -1
- package/dist/components/sidebar.d.ts +0 -67
- package/dist/components/sidebar.d.ts.map +0 -1
- package/dist/components/square-avatar.d.ts +0 -21
- package/dist/components/square-avatar.d.ts.map +0 -1
- package/dist/components/table.d.ts +0 -11
- package/dist/components/table.d.ts.map +0 -1
- package/dist/components/tabs.d.ts +0 -18
- package/dist/components/tabs.d.ts.map +0 -1
- package/dist/components/toggle.d.ts +0 -13
- package/dist/components/toggle.d.ts.map +0 -1
- package/src/components/.accordion.md +0 -42
- package/src/components/.alert-dialog.md +0 -58
- package/src/components/.alert.md +0 -43
- package/src/components/.badge.md +0 -40
- package/src/components/.breadcrumb.md +0 -54
- package/src/components/.chevron-button.md +0 -46
- package/src/components/.dialog.md +0 -60
- package/src/components/.dropdown-menu.md +0 -51
- package/src/components/.input.md +0 -40
- package/src/components/.label.md +0 -41
- package/src/components/.menubar.md +0 -49
- package/src/components/.navigation-menu.md +0 -44
- package/src/components/.select.md +0 -54
- package/src/components/.sidebar.md +0 -58
- package/src/components/.square-avatar.md +0 -42
- package/src/components/.table.md +0 -51
- package/src/components/.tabs.md +0 -38
- package/src/components/.toggle.md +0 -49
- package/src/components/accordion.tsx +0 -56
- package/src/components/alert-dialog.tsx +0 -141
- package/src/components/alert.tsx +0 -59
- package/src/components/badge.tsx +0 -30
- package/src/components/breadcrumb.tsx +0 -115
- package/src/components/chevron-button.tsx +0 -68
- package/src/components/dialog.tsx +0 -150
- package/src/components/dropdown-menu.tsx +0 -200
- package/src/components/input.tsx +0 -39
- package/src/components/label.tsx +0 -19
- package/src/components/menubar.tsx +0 -236
- package/src/components/navigation-menu.tsx +0 -128
- package/src/components/select.tsx +0 -160
- package/src/components/sidebar.tsx +0 -764
- package/src/components/square-avatar.tsx +0 -61
- package/src/components/table.tsx +0 -72
- package/src/components/tabs.tsx +0 -65
- package/src/components/toggle.tsx +0 -45
- /package/dist/{chunk-QXYOGJQJ.js.map → chunk-7KDR5P23.js.map} +0 -0
- /package/dist/{chunk-ZEY7A3MP.js.map → chunk-7KNOHGMI.js.map} +0 -0
|
@@ -19,7 +19,7 @@ export function CategoriesCart({
|
|
|
19
19
|
return (
|
|
20
20
|
<Link
|
|
21
21
|
href={`/vendors?category=${category.slug}`}
|
|
22
|
-
className={`block bg-ods-card border border-ods-border rounded-lg p-3 md:p-4 pb-4 md:pb-6 hover:border-
|
|
22
|
+
className={`block bg-ods-card border border-ods-border rounded-lg p-3 md:p-4 pb-4 md:pb-6 hover:border-ods-accent transition-colors group relative ${className}`}
|
|
23
23
|
>
|
|
24
24
|
<div className="flex flex-col gap-4 md:gap-6">
|
|
25
25
|
{/* Vendor Icons Grid */}
|
|
@@ -49,7 +49,7 @@ export function CategoriesCart({
|
|
|
49
49
|
key={index}
|
|
50
50
|
className="w-8 h-8 md:w-10 md:h-10 bg-ods-border rounded flex items-center justify-center opacity-30 flex-shrink-0"
|
|
51
51
|
>
|
|
52
|
-
<div className="w-4 h-4 md:w-6 md:h-6 bg-
|
|
52
|
+
<div className="w-4 h-4 md:w-6 md:h-6 bg-ods-skeleton rounded-sm" />
|
|
53
53
|
</div>
|
|
54
54
|
))
|
|
55
55
|
)}
|
|
@@ -66,22 +66,22 @@ export function CategoriesCart({
|
|
|
66
66
|
<h3 className="text-xl md:text-2xl font-bold text-ods-text-primary group-hover:text-ods-accent transition-colors leading-[1.33] font-body">
|
|
67
67
|
{category.name}
|
|
68
68
|
</h3>
|
|
69
|
-
<p className="text-
|
|
69
|
+
<p className="text-h6 text-ods-text-secondary">
|
|
70
70
|
{subcategoryCount || 0} Subcategories • {vendorCount || 0} Products
|
|
71
71
|
</p>
|
|
72
72
|
</div>
|
|
73
73
|
|
|
74
74
|
<div className="flex items-start md:items-end justify-between gap-4 md:gap-6">
|
|
75
|
-
<p className="
|
|
75
|
+
<p className="text-h4 text-ods-text-primary flex-1">
|
|
76
76
|
{category.description}
|
|
77
77
|
</p>
|
|
78
78
|
|
|
79
79
|
{/* Arrow Button */}
|
|
80
80
|
<div
|
|
81
|
-
className="flex items-center justify-center w-10 h-10 md:w-12 md:h-12 bg-transparent border border-ods-border rounded-md group-hover:bg-
|
|
81
|
+
className="flex items-center justify-center w-10 h-10 md:w-12 md:h-12 bg-transparent border border-ods-border rounded-md group-hover:bg-ods-accent transition-colors flex-shrink-0"
|
|
82
82
|
aria-label={`View ${category.name} category`}
|
|
83
83
|
>
|
|
84
|
-
<ChevronRight className="w-5 h-5 md:w-6 md:h-6 text-ods-text-primary group-hover:text-
|
|
84
|
+
<ChevronRight className="w-5 h-5 md:w-6 md:h-6 text-ods-text-primary group-hover:text-ods-text-on-accent transition-colors" />
|
|
85
85
|
</div>
|
|
86
86
|
</div>
|
|
87
87
|
</div>
|
|
@@ -12,23 +12,23 @@ interface CategoryCardProps {
|
|
|
12
12
|
|
|
13
13
|
export function CategoryCard({ name, description, categoryCount, productCount, icons = [] }: CategoryCardProps) {
|
|
14
14
|
return (
|
|
15
|
-
<article className="bg-
|
|
15
|
+
<article className="bg-ods-card border border-ods-border rounded-[12px] p-8 flex flex-col min-w-0 box-border">
|
|
16
16
|
<div className="flex gap-6 mb-8 justify-center items-center">
|
|
17
17
|
{(icons.length > 0 ? icons : Array(10).fill(null)).map((icon, i) => (
|
|
18
|
-
<div key={i} className="w-10 h-10 bg-
|
|
18
|
+
<div key={i} className="w-10 h-10 bg-ods-skeleton rounded flex items-center justify-center">
|
|
19
19
|
{icon}
|
|
20
20
|
</div>
|
|
21
21
|
))}
|
|
22
22
|
</div>
|
|
23
23
|
<div className="flex-1 flex flex-col">
|
|
24
24
|
<h2 className="text-[24px] font-bold text-ods-text-primary mb-2 text-left leading-tight">{name}</h2>
|
|
25
|
-
<div className="text-
|
|
25
|
+
<div className="text-h6 text-ods-text-secondary mb-4 text-left">
|
|
26
26
|
{categoryCount} Categories • {productCount} Products
|
|
27
27
|
</div>
|
|
28
28
|
<div className="flex flex-row items-start">
|
|
29
|
-
<p className="text-
|
|
29
|
+
<p className="text-h6 text-ods-text-primary text-left flex-1">{description}</p>
|
|
30
30
|
<button
|
|
31
|
-
className="w-12 h-12 flex items-center justify-center border border-ods-border rounded-[6px] bg-transparent hover:bg-
|
|
31
|
+
className="w-12 h-12 flex items-center justify-center border border-ods-border rounded-[6px] bg-transparent hover:bg-ods-accent transition-colors ml-4"
|
|
32
32
|
style={{ minWidth: 48, minHeight: 48 }}
|
|
33
33
|
aria-label={`View ${name}`}
|
|
34
34
|
>
|
package/src/components/chart.tsx
CHANGED
|
@@ -52,7 +52,7 @@ const ChartContainer = React.forwardRef<
|
|
|
52
52
|
data-chart={chartId}
|
|
53
53
|
ref={ref}
|
|
54
54
|
className={cn(
|
|
55
|
-
"flex aspect-video justify-center text-
|
|
55
|
+
"flex aspect-video justify-center text-h6 [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none",
|
|
56
56
|
className
|
|
57
57
|
)}
|
|
58
58
|
{...props}
|
|
@@ -178,7 +178,7 @@ const ChartTooltipContent = React.forwardRef<
|
|
|
178
178
|
<div
|
|
179
179
|
ref={ref}
|
|
180
180
|
className={cn(
|
|
181
|
-
"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-
|
|
181
|
+
"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-h6 shadow-xl",
|
|
182
182
|
className
|
|
183
183
|
)}
|
|
184
184
|
>
|
|
@@ -238,7 +238,7 @@ const ChartTooltipContent = React.forwardRef<
|
|
|
238
238
|
</span>
|
|
239
239
|
</div>
|
|
240
240
|
{item.value && (
|
|
241
|
-
<span className="
|
|
241
|
+
<span className="text-code tabular-nums text-foreground">
|
|
242
242
|
{item.value.toLocaleString()}
|
|
243
243
|
</span>
|
|
244
244
|
)}
|
|
@@ -22,10 +22,7 @@ function ApprovalFieldList({ fields }: { fields: ApprovalRequestField[] }) {
|
|
|
22
22
|
<dl className="flex flex-col gap-2.5 mt-[var(--spacing-system-xxs)]">
|
|
23
23
|
{fields.map((f, i) => (
|
|
24
24
|
<div key={i} className="flex flex-col gap-0.5">
|
|
25
|
-
|
|
26
|
-
(h5 is Azeret Mono, h6 is 14px) — flagged for a future caption
|
|
27
|
-
token; kept as-is rather than forcing a mismatched h-class. */}
|
|
28
|
-
<dt className="font-['DM_Sans'] font-semibold text-[11px] uppercase tracking-wide text-ods-text-tertiary leading-4">
|
|
25
|
+
<dt className="text-h6 font-semibold uppercase text-ods-text-tertiary">
|
|
29
26
|
{f.label}
|
|
30
27
|
</dt>
|
|
31
28
|
<dd className="text-h6 text-ods-text-primary whitespace-pre-wrap break-words">
|
|
@@ -55,7 +52,7 @@ function ApprovalCardBody({
|
|
|
55
52
|
return (
|
|
56
53
|
<div className="flex flex-col gap-[var(--spacing-system-xxs)]">
|
|
57
54
|
<div className="bg-ods-bg border border-ods-border rounded-md p-[var(--spacing-system-sf)] flex gap-[var(--spacing-system-xsf)] items-start max-h-32 overflow-y-auto">
|
|
58
|
-
<code className="text-
|
|
55
|
+
<code className="text-code text-ods-text-primary flex-1 whitespace-pre-wrap break-words">
|
|
59
56
|
{data.command}
|
|
60
57
|
</code>
|
|
61
58
|
{data.icon && (
|
|
@@ -4,75 +4,102 @@ import * as React from 'react'
|
|
|
4
4
|
import { Chevron02LeftIcon, BoxArchiveIcon } from '../icons-v2-generated'
|
|
5
5
|
import { XmarkIcon } from '../icons-v2-generated/signs-and-symbols/xmark-icon'
|
|
6
6
|
import { ChatHeaderIconButton } from './chat-header-icon-button'
|
|
7
|
-
import { COMPACT_HEADER_BUTTON } from './chat-panel-header'
|
|
8
7
|
import { ChatPanelHeaderMobile } from './chat-panel-header-mobile'
|
|
9
|
-
import { MingoChatHistory } from './mingo-chat-history'
|
|
8
|
+
import { MingoChatHistory, MingoChatHistorySkeleton } from './mingo-chat-history'
|
|
9
|
+
import { ChatListEmptyState } from './chat-list-empty-state'
|
|
10
10
|
import type { DialogItem } from './types/component.types'
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
interface ChatArchivePageBaseProps {
|
|
13
13
|
/** Archived dialogs, grouped (Today / Yesterday / Older) by the list. */
|
|
14
14
|
dialogs: ReadonlyArray<DialogItem>
|
|
15
15
|
/** Open an archived dialog. */
|
|
16
16
|
onSelectDialog: (id: string) => void
|
|
17
|
-
/**
|
|
18
|
-
onBack: () => void
|
|
19
|
-
/** Close the whole chat panel. */
|
|
20
|
-
onClose: () => void
|
|
21
|
-
/** True while a page is loading (drives the empty/loading copy + spinner). */
|
|
17
|
+
/** The delayed skeleton is visible (a slow first page is loading). */
|
|
22
18
|
isLoading?: boolean
|
|
19
|
+
/** A first-page load is in flight but the delayed skeleton hasn't appeared
|
|
20
|
+
* yet — keeps the empty state suppressed so it never flashes before the
|
|
21
|
+
* skeleton/data arrives. */
|
|
22
|
+
isFetching?: boolean
|
|
23
23
|
/** Whether another page of archived dialogs remains. */
|
|
24
24
|
hasMore?: boolean
|
|
25
25
|
/** Fetch the next page. */
|
|
26
26
|
onLoadMore?: () => void
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
/** Standalone (default): renders its own back/close header, so BOTH handlers
|
|
30
|
+
* are required. */
|
|
31
|
+
export interface ChatArchivePageStandaloneProps extends ChatArchivePageBaseProps {
|
|
32
|
+
embedded?: false
|
|
33
|
+
/** Back chevron — returns to the previous (list) view. */
|
|
34
|
+
onBack: () => void
|
|
35
|
+
/** Close the whole chat panel. */
|
|
36
|
+
onClose: () => void
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Embedded (wide split layout): the archive lives in the left rail and the
|
|
40
|
+
* host header already provides the "Chat Archive" back + close controls, so
|
|
41
|
+
* the built-in header — and its handlers — are dropped. */
|
|
42
|
+
export interface ChatArchivePageEmbeddedProps extends ChatArchivePageBaseProps {
|
|
43
|
+
embedded: true
|
|
44
|
+
onBack?: never
|
|
45
|
+
onClose?: never
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type ChatArchivePageProps =
|
|
49
|
+
| ChatArchivePageStandaloneProps
|
|
50
|
+
| ChatArchivePageEmbeddedProps
|
|
51
|
+
|
|
29
52
|
/**
|
|
30
53
|
* Chat Archive page — Figma node `7361:427312`. Back + title + close header
|
|
31
54
|
* over the date-grouped archived-dialog list (reuses `MingoChatHistory`
|
|
32
|
-
* without the row action menus).
|
|
55
|
+
* without the row action menus). In `embedded` mode the header is dropped so
|
|
56
|
+
* the list can slot into the split layout's left rail.
|
|
33
57
|
*/
|
|
34
|
-
export function ChatArchivePage({
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
58
|
+
export function ChatArchivePage(props: ChatArchivePageProps) {
|
|
59
|
+
const {
|
|
60
|
+
dialogs,
|
|
61
|
+
onSelectDialog,
|
|
62
|
+
isLoading = false,
|
|
63
|
+
isFetching = false,
|
|
64
|
+
hasMore = false,
|
|
65
|
+
onLoadMore,
|
|
66
|
+
} = props
|
|
43
67
|
return (
|
|
44
68
|
<>
|
|
45
69
|
{/* Mobile (<md): the shared mobile header — back to the list + a ⋯ menu
|
|
46
|
-
(Close only here, since the archive list has no per-chat actions).
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
70
|
+
(Close only here, since the archive list has no per-chat actions).
|
|
71
|
+
`!props.embedded` narrows the union so `onBack` / `onClose` are the
|
|
72
|
+
required standalone handlers (no no-op fallbacks). */}
|
|
73
|
+
{!props.embedded && (
|
|
74
|
+
<ChatPanelHeaderMobile
|
|
75
|
+
className="flex md:hidden"
|
|
76
|
+
showBack
|
|
77
|
+
title="Chat Archive"
|
|
78
|
+
backAriaLabel="Back"
|
|
79
|
+
onBack={props.onBack}
|
|
80
|
+
onClose={props.onClose}
|
|
81
|
+
/>
|
|
82
|
+
)}
|
|
55
83
|
|
|
56
|
-
{/* Desktop (md+): fixed-height bar with
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
>
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
</span>
|
|
70
|
-
</div>
|
|
84
|
+
{/* Desktop (md+): fixed-height bar with full-height divider action cells —
|
|
85
|
+
the back chevron is a leading `ChatHeaderIconButton` cell matching the
|
|
86
|
+
trailing close cell (not a small inline chevron). */}
|
|
87
|
+
{!props.embedded && (
|
|
88
|
+
<div className="hidden md:flex flex-shrink-0 h-14 w-full overflow-hidden border-b border-ods-border bg-ods-card">
|
|
89
|
+
<ChatHeaderIconButton divider="right" onClick={props.onBack} aria-label="Back">
|
|
90
|
+
<Chevron02LeftIcon size={24} />
|
|
91
|
+
</ChatHeaderIconButton>
|
|
92
|
+
<div className="flex flex-1 min-w-0 items-center px-[var(--spacing-system-mf)] py-[var(--spacing-system-sf)]">
|
|
93
|
+
<span className="truncate text-h3 text-ods-text-primary">
|
|
94
|
+
Chat Archive
|
|
95
|
+
</span>
|
|
96
|
+
</div>
|
|
71
97
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
98
|
+
<ChatHeaderIconButton onClick={props.onClose} aria-label="Close">
|
|
99
|
+
<XmarkIcon size={24} />
|
|
100
|
+
</ChatHeaderIconButton>
|
|
101
|
+
</div>
|
|
102
|
+
)}
|
|
76
103
|
<div className="flex flex-1 min-h-0 flex-col p-[var(--spacing-system-m)]">
|
|
77
104
|
{dialogs.length > 0 ? (
|
|
78
105
|
<MingoChatHistory
|
|
@@ -83,34 +110,23 @@ export function ChatArchivePage({
|
|
|
83
110
|
onLoadMore={onLoadMore}
|
|
84
111
|
/>
|
|
85
112
|
) : isLoading ? (
|
|
86
|
-
// First-load skeleton —
|
|
87
|
-
//
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
</div>
|
|
96
|
-
))}
|
|
97
|
-
</div>
|
|
113
|
+
// First-load skeleton — the SAME grouped/bordered placeholder the
|
|
114
|
+
// active list uses, so the archive loads and lands without a layout
|
|
115
|
+
// shift or a mismatched flat-list skeleton.
|
|
116
|
+
<MingoChatHistorySkeleton />
|
|
117
|
+
) : isFetching ? (
|
|
118
|
+
// A first, uncached load is in flight but the delayed skeleton hasn't
|
|
119
|
+
// appeared yet (the 120ms window). Render nothing rather than flashing
|
|
120
|
+
// the empty state before the skeleton / data arrives.
|
|
121
|
+
null
|
|
98
122
|
) : (
|
|
99
|
-
// Empty state —
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
<div className="flex flex-col gap-[var(--spacing-system-xxs)]">
|
|
107
|
-
<p className="text-h3 text-ods-text-primary">No archived chats</p>
|
|
108
|
-
<p className="max-w-xs text-h5 text-ods-text-secondary">
|
|
109
|
-
Chats you archive will appear here. Archive a chat from its
|
|
110
|
-
actions menu to tuck it away without deleting it.
|
|
111
|
-
</p>
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
123
|
+
// Empty state — mirrors the "Current Chats" rail empty state
|
|
124
|
+
// (Figma 113:60939): centred 24px muted glyph + h4 title + h6 caption.
|
|
125
|
+
<ChatListEmptyState
|
|
126
|
+
icon={<BoxArchiveIcon size={24} />}
|
|
127
|
+
title="No Archived Chats"
|
|
128
|
+
description="Archived Mingo sessions will show here"
|
|
129
|
+
/>
|
|
114
130
|
)}
|
|
115
131
|
</div>
|
|
116
132
|
</>
|
|
@@ -288,18 +288,18 @@ function AttachmentChip({ attachment, onRemove, disabled, size = 'default' }: At
|
|
|
288
288
|
|
|
289
289
|
{/* Filename + status */}
|
|
290
290
|
<div className="min-w-0 flex-1">
|
|
291
|
-
<div className=
|
|
291
|
+
<div className="truncate text-ods-text-primary text-h6" title={file.name}>
|
|
292
292
|
{file.name}
|
|
293
293
|
</div>
|
|
294
294
|
{/* Compact mode hides the size/status sub-line for ready files to keep the
|
|
295
295
|
chip to a single line; uploading/error states still surface. */}
|
|
296
296
|
{(!compact || status !== 'ready') && (
|
|
297
|
-
<div className=
|
|
297
|
+
<div className="text-ods-text-muted text-h6">
|
|
298
298
|
{status === 'sniffing' && 'Checking…'}
|
|
299
299
|
{status === 'uploading' && `${progress}% · ${formatFileSize(file.size)}`}
|
|
300
300
|
{status === 'ready' && formatFileSize(file.size)}
|
|
301
301
|
{status === 'error' && (
|
|
302
|
-
<span className="text-ods-
|
|
302
|
+
<span className="text-ods-error" title={errorMessage}>
|
|
303
303
|
{errorMessage ?? 'Upload failed'}
|
|
304
304
|
</span>
|
|
305
305
|
)}
|
|
@@ -4,12 +4,17 @@ import * as React from 'react'
|
|
|
4
4
|
import { cn } from '../../utils/cn'
|
|
5
5
|
|
|
6
6
|
export interface ChatHeaderIconButtonProps
|
|
7
|
-
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
7
|
+
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
8
|
+
/** Which side carries the 1px cell divider. Trailing cells (close, ⋯,
|
|
9
|
+
* archive) use the default `'left'`; a leading cell (the back chevron) uses
|
|
10
|
+
* `'right'`; `'none'` drops it. */
|
|
11
|
+
divider?: 'left' | 'right' | 'none'
|
|
12
|
+
}
|
|
8
13
|
|
|
9
14
|
/**
|
|
10
15
|
* Square 56×56 icon cell used in the chat panel's top-navigation
|
|
11
|
-
* (archive / restore / close,
|
|
12
|
-
* as the 1px divider between cells.
|
|
16
|
+
* (archive / restore / close, the `⋯` menu trigger, and the leading back
|
|
17
|
+
* chevron). A border on one side acts as the 1px divider between cells.
|
|
13
18
|
*
|
|
14
19
|
* On hover only the background changes (`ods-bg-hover`) — the icon keeps its
|
|
15
20
|
* `ods-text-secondary` colour. `forwardRef` + prop spread so it works as a
|
|
@@ -18,12 +23,14 @@ export interface ChatHeaderIconButtonProps
|
|
|
18
23
|
export const ChatHeaderIconButton = React.forwardRef<
|
|
19
24
|
HTMLButtonElement,
|
|
20
25
|
ChatHeaderIconButtonProps
|
|
21
|
-
>(({ className, children, type = 'button', ...props }, ref) => (
|
|
26
|
+
>(({ className, children, type = 'button', divider = 'left', ...props }, ref) => (
|
|
22
27
|
<button
|
|
23
28
|
ref={ref}
|
|
24
29
|
type={type}
|
|
25
30
|
className={cn(
|
|
26
|
-
'flex size-14 shrink-0 items-center justify-center border-
|
|
31
|
+
'flex size-14 shrink-0 items-center justify-center border-ods-border',
|
|
32
|
+
divider === 'left' && 'border-l',
|
|
33
|
+
divider === 'right' && 'border-r',
|
|
27
34
|
'text-ods-text-secondary transition-colors hover:bg-ods-bg-hover',
|
|
28
35
|
'focus:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent',
|
|
29
36
|
className,
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import { cn } from '../../utils/cn'
|
|
5
|
+
import { useDebounce } from '../../hooks/ui/use-debounce'
|
|
6
|
+
import { SearchIcon } from '../icons-v2-generated'
|
|
7
|
+
|
|
8
|
+
export interface ChatHeaderSearchFieldProps {
|
|
9
|
+
/** Seeds the field on mount (the current server-side search term). */
|
|
10
|
+
initialValue?: string
|
|
11
|
+
/** Emits the DEBOUNCED term. The host owns the query and refetches the
|
|
12
|
+
* dialog list server-side — the field never filters locally. */
|
|
13
|
+
onSearchChange: (query: string) => void
|
|
14
|
+
/** Collapse the field back to the title. Fired on Escape and on blur while
|
|
15
|
+
* the field is empty (an accidental open closes itself). */
|
|
16
|
+
onCollapse?: () => void
|
|
17
|
+
/** Focus the input on mount (default true — the field only mounts when the
|
|
18
|
+
* user opens search, so we drop them straight into typing). */
|
|
19
|
+
autoFocus?: boolean
|
|
20
|
+
/** Appended to the root element (e.g. to tweak the open animation). */
|
|
21
|
+
className?: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Inline chat-header search field (Figma node 116:51217). When search is
|
|
26
|
+
* toggled on, the panel header's title area is REPLACED in place by this
|
|
27
|
+
* full-height field — a leading magnifier + a bare, borderless input — instead
|
|
28
|
+
* of dropping a separate search bar into the list body. Holds its own text for
|
|
29
|
+
* snappy typing and emits the debounced term via `onSearchChange`.
|
|
30
|
+
*/
|
|
31
|
+
export function ChatHeaderSearchField({
|
|
32
|
+
initialValue,
|
|
33
|
+
onSearchChange,
|
|
34
|
+
onCollapse,
|
|
35
|
+
autoFocus = true,
|
|
36
|
+
className,
|
|
37
|
+
}: ChatHeaderSearchFieldProps) {
|
|
38
|
+
const [value, setValue] = React.useState(initialValue ?? '')
|
|
39
|
+
const debounced = useDebounce(value, 300)
|
|
40
|
+
const lastEmitted = React.useRef(initialValue ?? '')
|
|
41
|
+
|
|
42
|
+
// Exit animation: collapsing plays `animate-out` (slide/fade back toward the
|
|
43
|
+
// right) BEFORE the parent unmounts us. We stay mounted through the leave —
|
|
44
|
+
// the parent only drops the field once we call `onCollapse`, which we defer
|
|
45
|
+
// to the animation's end.
|
|
46
|
+
const [exiting, setExiting] = React.useState(false)
|
|
47
|
+
const collapsedRef = React.useRef(false)
|
|
48
|
+
|
|
49
|
+
React.useEffect(() => {
|
|
50
|
+
// Once the collapse starts, no further emits: Escape already flushed the
|
|
51
|
+
// cleared term synchronously, and a still-pending debounce of the typed
|
|
52
|
+
// text ("abc" → Escape before 300ms) must not resurrect a stale query
|
|
53
|
+
// while the field animates out.
|
|
54
|
+
if (exiting) return
|
|
55
|
+
if (debounced === lastEmitted.current) return
|
|
56
|
+
lastEmitted.current = debounced
|
|
57
|
+
onSearchChange(debounced)
|
|
58
|
+
}, [debounced, exiting, onSearchChange])
|
|
59
|
+
|
|
60
|
+
const finishCollapse = React.useCallback(() => {
|
|
61
|
+
if (collapsedRef.current) return
|
|
62
|
+
collapsedRef.current = true
|
|
63
|
+
onCollapse?.()
|
|
64
|
+
}, [onCollapse])
|
|
65
|
+
|
|
66
|
+
const beginCollapse = React.useCallback(() => {
|
|
67
|
+
setExiting(true)
|
|
68
|
+
}, [])
|
|
69
|
+
|
|
70
|
+
// Fallback for when `animationend` never fires (reduced motion, or the
|
|
71
|
+
// animation utilities are disabled) — otherwise the field would hang open.
|
|
72
|
+
React.useEffect(() => {
|
|
73
|
+
if (!exiting) return
|
|
74
|
+
const t = setTimeout(finishCollapse, 240)
|
|
75
|
+
return () => clearTimeout(t)
|
|
76
|
+
}, [exiting, finishCollapse])
|
|
77
|
+
|
|
78
|
+
return (
|
|
79
|
+
<div
|
|
80
|
+
onAnimationEnd={(e) => {
|
|
81
|
+
// Only the root's OWN leave animation collapses — ignore the child
|
|
82
|
+
// icon's animations bubbling up, and the enter animation.
|
|
83
|
+
if (e.target === e.currentTarget && exiting) finishCollapse()
|
|
84
|
+
}}
|
|
85
|
+
className={cn(
|
|
86
|
+
'flex min-w-0 flex-1 items-center gap-[var(--spacing-system-xs)] px-[var(--spacing-system-sf)]',
|
|
87
|
+
exiting
|
|
88
|
+
? // Elegant leave: sweep back out to the right + fade, holding the end
|
|
89
|
+
// frame (`fill-mode-forwards`) so it stays hidden until unmount.
|
|
90
|
+
'animate-out fade-out-0 slide-out-to-right-4 duration-200 ease-in fill-mode-forwards pointer-events-none'
|
|
91
|
+
: // Elegant open: sweep in from the right (where the magnifier toggle
|
|
92
|
+
// sat) and fade up as it takes over the title area.
|
|
93
|
+
'animate-in fade-in-0 slide-in-from-right-4 duration-200 ease-out',
|
|
94
|
+
className,
|
|
95
|
+
)}
|
|
96
|
+
>
|
|
97
|
+
{/* The magnifier eases in a touch later + scales up, so the icon reads as
|
|
98
|
+
"growing" into the field rather than hard-cutting in. */}
|
|
99
|
+
<SearchIcon
|
|
100
|
+
size={24}
|
|
101
|
+
className="shrink-0 text-ods-text-secondary animate-in fade-in-0 zoom-in-75 duration-300 ease-out"
|
|
102
|
+
/>
|
|
103
|
+
{/* biome-ignore lint/a11y/noAutofocus: the field only mounts on an
|
|
104
|
+
explicit search toggle, so focusing it is the intended behaviour. */}
|
|
105
|
+
<input
|
|
106
|
+
autoFocus={autoFocus}
|
|
107
|
+
type="text"
|
|
108
|
+
value={value}
|
|
109
|
+
disabled={exiting}
|
|
110
|
+
onChange={(e) => setValue(e.target.value)}
|
|
111
|
+
onKeyDown={(e) => {
|
|
112
|
+
if (e.key === 'Escape') {
|
|
113
|
+
e.preventDefault()
|
|
114
|
+
setValue('')
|
|
115
|
+
// Emit the cleared term immediately AND record it as the last emit,
|
|
116
|
+
// so the 300ms debounce effect doesn't fire a second, redundant
|
|
117
|
+
// `onSearchChange('')` (extra server round-trip) before we unmount.
|
|
118
|
+
lastEmitted.current = ''
|
|
119
|
+
onSearchChange('')
|
|
120
|
+
beginCollapse()
|
|
121
|
+
}
|
|
122
|
+
}}
|
|
123
|
+
onBlur={() => {
|
|
124
|
+
// An accidental open (no query typed) collapses itself; a field with
|
|
125
|
+
// an active query stays open so the filtered state stays visible.
|
|
126
|
+
if (!value.trim()) {
|
|
127
|
+
// Flush the cleared term synchronously (mirrors Escape) — the
|
|
128
|
+
// debounce effect is muted once `exiting` flips, so a just-deleted
|
|
129
|
+
// query ("abc" → "" → immediate blur) must emit its reset here or
|
|
130
|
+
// the host would keep filtering by the stale term.
|
|
131
|
+
if (lastEmitted.current !== '') {
|
|
132
|
+
lastEmitted.current = ''
|
|
133
|
+
onSearchChange('')
|
|
134
|
+
}
|
|
135
|
+
beginCollapse()
|
|
136
|
+
}
|
|
137
|
+
}}
|
|
138
|
+
placeholder="Search for Chats"
|
|
139
|
+
aria-label="Search chats"
|
|
140
|
+
className="min-w-0 flex-1 bg-transparent text-h4 text-ods-text-primary placeholder:text-ods-text-secondary focus:outline-none"
|
|
141
|
+
/>
|
|
142
|
+
</div>
|
|
143
|
+
)
|
|
144
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import { cn } from '../../utils/cn'
|
|
5
|
+
|
|
6
|
+
export interface ChatListEmptyStateProps {
|
|
7
|
+
/** Centred 24px glyph — rendered muted (`ods-text-secondary`). Pass the icon
|
|
8
|
+
* already sized (e.g. `<ChatsIcon size={24} />`). */
|
|
9
|
+
icon: React.ReactNode
|
|
10
|
+
/** Title line (`h4`). */
|
|
11
|
+
title: React.ReactNode
|
|
12
|
+
/** Caption line under the title (`h6`). Omitted → title alone. */
|
|
13
|
+
description?: React.ReactNode
|
|
14
|
+
/** Appended to the root element. */
|
|
15
|
+
className?: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Shared empty state for the chat-list surfaces — the "Current Chats" rail and
|
|
20
|
+
* the Chat Archive page (Figma node 113:60939). A centred 24px muted glyph over
|
|
21
|
+
* a title (`h4`) + caption (`h6`), both in `ods-text-secondary`. Kept in one
|
|
22
|
+
* place so the two lists can't drift apart.
|
|
23
|
+
*/
|
|
24
|
+
export function ChatListEmptyState({
|
|
25
|
+
icon,
|
|
26
|
+
title,
|
|
27
|
+
description,
|
|
28
|
+
className,
|
|
29
|
+
}: ChatListEmptyStateProps) {
|
|
30
|
+
return (
|
|
31
|
+
<div
|
|
32
|
+
className={cn(
|
|
33
|
+
'flex flex-1 min-h-0 flex-col items-center justify-center gap-[var(--spacing-system-l)] p-[var(--spacing-system-l)] text-center text-ods-text-secondary',
|
|
34
|
+
className,
|
|
35
|
+
)}
|
|
36
|
+
>
|
|
37
|
+
<span className="flex size-6 shrink-0 items-center justify-center">{icon}</span>
|
|
38
|
+
<div className="flex flex-col">
|
|
39
|
+
<p className="text-h4">{title}</p>
|
|
40
|
+
{description && <p className="text-h6">{description}</p>}
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
@@ -478,7 +478,7 @@ const ChatMessageEnhanced = forwardRef<HTMLDivElement, ChatMessageEnhancedProps>
|
|
|
478
478
|
{name || (isUser ? "User" : assistantType === 'mingo' ? "Mingo" : "Fae")}{!isSystem && ':'}
|
|
479
479
|
</span>
|
|
480
480
|
{timestamp && (
|
|
481
|
-
<span className="
|
|
481
|
+
<span className="text-h6 text-ods-text-secondary shrink-0 whitespace-nowrap">
|
|
482
482
|
{formatMessageTimestamp(timestamp)}
|
|
483
483
|
</span>
|
|
484
484
|
)}
|
|
@@ -569,7 +569,7 @@ const ChatMessageList = forwardRef<HTMLDivElement, ChatMessageListProps>(
|
|
|
569
569
|
aria-live="polite"
|
|
570
570
|
>
|
|
571
571
|
<DotsLoaderIcon className="w-6 h-6" />
|
|
572
|
-
<CyclingPhrase words={STREAMING_WORDS} className="text-
|
|
572
|
+
<CyclingPhrase words={STREAMING_WORDS} className="text-h6" />
|
|
573
573
|
</div>
|
|
574
574
|
)}
|
|
575
575
|
|
|
@@ -75,7 +75,7 @@ export function ChatMessageRow({
|
|
|
75
75
|
onError={() => setFailedSrc(resolvedAvatar ?? null)}
|
|
76
76
|
/>
|
|
77
77
|
) : (
|
|
78
|
-
<div className="w-8 h-8 md:w-10 md:h-10 rounded-lg flex-shrink-0 flex items-center justify-center bg-ods-bg border border-ods-border text-
|
|
78
|
+
<div className="w-8 h-8 md:w-10 md:h-10 rounded-lg flex-shrink-0 flex items-center justify-center bg-ods-bg border border-ods-border text-h6 text-ods-text-primary">
|
|
79
79
|
{getFirstLastInitials(displayName) || '?'}
|
|
80
80
|
</div>
|
|
81
81
|
)}
|
|
@@ -88,7 +88,7 @@ export function ChatMessageRow({
|
|
|
88
88
|
{displayName}
|
|
89
89
|
</span>
|
|
90
90
|
{timeLabel && (
|
|
91
|
-
<span className="text-
|
|
91
|
+
<span className="text-h6 text-ods-text-secondary flex-shrink-0">
|
|
92
92
|
{timeLabel}
|
|
93
93
|
</span>
|
|
94
94
|
)}
|
|
@@ -96,7 +96,7 @@ export function ChatMessageRow({
|
|
|
96
96
|
|
|
97
97
|
{/* Body — verbatim Slack: 12/14px, pre-wrap, break-words. */}
|
|
98
98
|
{hasBody && (
|
|
99
|
-
<div className="text-
|
|
99
|
+
<div className="text-h6 text-ods-text-primary whitespace-pre-wrap break-words min-w-0 max-w-full">
|
|
100
100
|
{body}
|
|
101
101
|
</div>
|
|
102
102
|
)}
|