@flamingo-stack/openframe-frontend-core 0.0.518-1660.4292.1 → 0.0.518-1663.4312.1
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-7EFJJMNH.cjs → chunk-25JSVBPR.cjs} +7 -7
- package/dist/{chunk-7EFJJMNH.cjs.map → chunk-25JSVBPR.cjs.map} +1 -1
- package/dist/{chunk-NJADHL2G.cjs → chunk-3M2MFP2Y.cjs} +30 -2
- package/dist/chunk-3M2MFP2Y.cjs.map +1 -0
- package/dist/{chunk-QXUMLLYV.cjs → chunk-BQXHC336.cjs} +3 -3
- package/dist/{chunk-QXUMLLYV.cjs.map → chunk-BQXHC336.cjs.map} +1 -1
- package/dist/{chunk-66GH54DV.cjs → chunk-CHMQCXYO.cjs} +40 -40
- package/dist/{chunk-66GH54DV.cjs.map → chunk-CHMQCXYO.cjs.map} +1 -1
- package/dist/{chunk-RWYNJC2F.cjs → chunk-DN3GKQ47.cjs} +98 -98
- package/dist/{chunk-RWYNJC2F.cjs.map → chunk-DN3GKQ47.cjs.map} +1 -1
- package/dist/{chunk-O7L2VJDW.cjs → chunk-GH5YZSQQ.cjs} +12 -12
- package/dist/{chunk-O7L2VJDW.cjs.map → chunk-GH5YZSQQ.cjs.map} +1 -1
- package/dist/{chunk-XURRAFIB.js → chunk-GJAHN7LH.js} +404 -376
- package/dist/chunk-GJAHN7LH.js.map +1 -0
- package/dist/{chunk-FS3YSNSU.js → chunk-GS4HJA2G.js} +2 -2
- package/dist/{chunk-HIV2GIFP.cjs → chunk-GYONSC3U.cjs} +3 -3
- package/dist/{chunk-HIV2GIFP.cjs.map → chunk-GYONSC3U.cjs.map} +1 -1
- package/dist/{chunk-XURCARSX.cjs → chunk-I6IWT62M.cjs} +5 -5
- package/dist/{chunk-XURCARSX.cjs.map → chunk-I6IWT62M.cjs.map} +1 -1
- package/dist/{chunk-43ZZYJ3M.js → chunk-KRBH3PI4.js} +5 -5
- package/dist/{chunk-3LMOLDFT.cjs → chunk-KW7GDLSG.cjs} +14 -14
- package/dist/{chunk-3LMOLDFT.cjs.map → chunk-KW7GDLSG.cjs.map} +1 -1
- package/dist/{chunk-JLO2O5R4.js → chunk-LL4C2NXG.js} +5388 -5249
- package/dist/chunk-LL4C2NXG.js.map +1 -0
- package/dist/{chunk-DPFQWIZJ.cjs → chunk-LQ2R7IA2.cjs} +32 -32
- package/dist/{chunk-DPFQWIZJ.cjs.map → chunk-LQ2R7IA2.cjs.map} +1 -1
- package/dist/{chunk-P63LOLTB.js → chunk-MI7WNVWX.js} +6 -6
- package/dist/{chunk-BXRB4MQI.cjs → chunk-MKN6S7SU.cjs} +381 -242
- package/dist/chunk-MKN6S7SU.cjs.map +1 -0
- package/dist/{chunk-ZKVARGSO.js → chunk-MOZUJ7IN.js} +3 -3
- package/dist/{chunk-MIFJLUZK.js → chunk-MVY3WDFZ.js} +2 -2
- package/dist/{chunk-FXT2OZ5Q.js → chunk-NJJWY7SO.js} +3 -3
- package/dist/{chunk-H6K73RK2.cjs → chunk-O4XLTA5G.cjs} +40 -40
- package/dist/{chunk-H6K73RK2.cjs.map → chunk-O4XLTA5G.cjs.map} +1 -1
- package/dist/{chunk-MEXZZOBO.js → chunk-P6M5MN3L.js} +9 -9
- package/dist/{chunk-5KBQECAY.js → chunk-PUBL2NCH.js} +2 -2
- package/dist/{chunk-NBJ7L65H.js → chunk-PV3LXEHJ.js} +2 -2
- package/dist/{chunk-XZ6WTSVQ.js → chunk-QJHBYNHI.js} +6 -6
- package/dist/{chunk-Z3ADCYC5.js → chunk-RCBRCZUF.js} +2 -2
- package/dist/{chunk-KP4JRPUE.js → chunk-RJU7YCN3.js} +2 -2
- package/dist/{chunk-GA7BHFXD.cjs → chunk-RLVJISO4.cjs} +77 -77
- package/dist/{chunk-GA7BHFXD.cjs.map → chunk-RLVJISO4.cjs.map} +1 -1
- package/dist/{chunk-OGVIGAMZ.cjs → chunk-SXLEPNY2.cjs} +31 -31
- package/dist/{chunk-OGVIGAMZ.cjs.map → chunk-SXLEPNY2.cjs.map} +1 -1
- package/dist/{chunk-WI4XHZ2B.js → chunk-TFIPJAA5.js} +3 -3
- package/dist/{chunk-HPPCPGBR.cjs → chunk-URU6YKOA.cjs} +29 -29
- package/dist/{chunk-HPPCPGBR.cjs.map → chunk-URU6YKOA.cjs.map} +1 -1
- package/dist/{chunk-WSRPNLTY.cjs → chunk-WQDDSJWN.cjs} +18 -18
- package/dist/{chunk-WSRPNLTY.cjs.map → chunk-WQDDSJWN.cjs.map} +1 -1
- package/dist/{chunk-56OUH3UF.js → chunk-XARCNHWZ.js} +2 -2
- package/dist/{chunk-J7ZJ4KM2.cjs → chunk-YH627NWE.cjs} +4 -4
- package/dist/{chunk-J7ZJ4KM2.cjs.map → chunk-YH627NWE.cjs.map} +1 -1
- package/dist/{chunk-AI7WIW4E.js → chunk-YUQNJXSC.js} +4 -4
- package/dist/components/about-icon.d.ts +9 -0
- package/dist/components/about-icon.d.ts.map +1 -0
- package/dist/components/aspect-ratio.d.ts +4 -0
- package/dist/components/aspect-ratio.d.ts.map +1 -0
- package/dist/components/avatar.d.ts +7 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/case-studies/index.cjs +14 -14
- package/dist/components/case-studies/index.js +4 -4
- package/dist/components/chart.d.ts +72 -0
- package/dist/components/chart.d.ts.map +1 -0
- package/dist/components/chat/hooks/use-jetstream-dialog-subscription.d.ts +7 -1
- package/dist/components/chat/hooks/use-jetstream-dialog-subscription.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.js +5 -3
- package/dist/components/chat/types/api.types.d.ts +22 -4
- package/dist/components/chat/types/api.types.d.ts.map +1 -1
- package/dist/components/check-circle-icon.d.ts +7 -0
- package/dist/components/check-circle-icon.d.ts.map +1 -0
- package/dist/components/checkbox.d.ts +5 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/claude-icon.d.ts +6 -0
- package/dist/components/claude-icon.d.ts.map +1 -0
- package/dist/components/coins-icon.d.ts +9 -0
- package/dist/components/coins-icon.d.ts.map +1 -0
- package/dist/components/command.d.ts +81 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/community-hub-icon.d.ts +9 -0
- package/dist/components/community-hub-icon.d.ts.map +1 -0
- package/dist/components/community-icon.d.ts +9 -0
- package/dist/components/community-icon.d.ts.map +1 -0
- package/dist/components/compare-icon.d.ts +9 -0
- package/dist/components/compare-icon.d.ts.map +1 -0
- package/dist/components/contact/index.cjs +5 -5
- package/dist/components/contact/index.js +4 -4
- package/dist/components/context-menu.d.ts +28 -0
- package/dist/components/context-menu.d.ts.map +1 -0
- package/dist/components/custom-external-link-icon.d.ts +9 -0
- package/dist/components/custom-external-link-icon.d.ts.map +1 -0
- package/dist/components/custom-fork-icon.d.ts +9 -0
- package/dist/components/custom-fork-icon.d.ts.map +1 -0
- package/dist/components/custom-icons.d.ts +8 -0
- package/dist/components/custom-icons.d.ts.map +1 -0
- package/dist/components/custom-license-icon.d.ts +9 -0
- package/dist/components/custom-license-icon.d.ts.map +1 -0
- package/dist/components/custom-star-icon.d.ts +9 -0
- package/dist/components/custom-star-icon.d.ts.map +1 -0
- package/dist/components/custom-time-icon.d.ts +9 -0
- package/dist/components/custom-time-icon.d.ts.map +1 -0
- package/dist/components/docs/index.cjs +7 -7
- package/dist/components/docs/index.js +6 -6
- package/dist/components/donut-icon.d.ts +4 -0
- package/dist/components/donut-icon.d.ts.map +1 -0
- package/dist/components/edit-profile-icon.d.ts +7 -0
- package/dist/components/edit-profile-icon.d.ts.map +1 -0
- package/dist/components/elestio-logo.d.ts +9 -0
- package/dist/components/elestio-logo.d.ts.map +1 -0
- package/dist/components/embeds/index.cjs +5 -5
- package/dist/components/embeds/index.js +4 -4
- package/dist/components/empty-vendor-icon.d.ts +7 -0
- package/dist/components/empty-vendor-icon.d.ts.map +1 -0
- 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/features/provider-button.d.ts +1 -1
- package/dist/components/features/provider-button.d.ts.map +1 -1
- package/dist/components/flamingo-logo.d.ts +9 -0
- package/dist/components/flamingo-logo.d.ts.map +1 -0
- package/dist/components/form.d.ts +26 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/github-icon.d.ts +9 -0
- package/dist/components/github-icon.d.ts.map +1 -0
- package/dist/components/google-logo.d.ts +5 -0
- package/dist/components/google-logo.d.ts.map +1 -0
- package/dist/components/hamburger-icon.d.ts +9 -0
- package/dist/components/hamburger-icon.d.ts.map +1 -0
- package/dist/components/help-center-pages/index.cjs +25 -25
- package/dist/components/help-center-pages/index.js +16 -16
- package/dist/components/hubspot-icon.d.ts +7 -0
- package/dist/components/hubspot-icon.d.ts.map +1 -0
- package/dist/components/icon-utils.d.ts +7 -0
- package/dist/components/icon-utils.d.ts.map +1 -0
- package/dist/components/icons/apple-icon.d.ts +10 -0
- package/dist/components/icons/apple-icon.d.ts.map +1 -0
- package/dist/components/icons/index.cjs +4 -2
- package/dist/components/icons/index.cjs.map +1 -1
- package/dist/components/icons/index.d.ts +1 -0
- package/dist/components/icons/index.d.ts.map +1 -1
- package/dist/components/icons/index.js +3 -1
- package/dist/components/index.cjs +222 -266
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +374 -418
- package/dist/components/index.js.map +1 -1
- package/dist/components/interactive-wrapper.d.ts +84 -0
- package/dist/components/interactive-wrapper.d.ts.map +1 -0
- package/dist/components/join-waitlist-button-stub.d.ts +10 -0
- package/dist/components/join-waitlist-button-stub.d.ts.map +1 -0
- package/dist/components/made-with-love.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.cjs +41 -41
- package/dist/components/meeting-scheduler/index.js +5 -5
- package/dist/components/menu-icon.d.ts +9 -0
- package/dist/components/menu-icon.d.ts.map +1 -0
- package/dist/components/minus-circle-icon.d.ts +7 -0
- package/dist/components/minus-circle-icon.d.ts.map +1 -0
- package/dist/components/moon-icon.d.ts +9 -0
- package/dist/components/moon-icon.d.ts.map +1 -0
- package/dist/components/ms-icon.d.ts +9 -0
- package/dist/components/ms-icon.d.ts.map +1 -0
- package/dist/components/navigation/index.cjs +4 -4
- package/dist/components/navigation/index.js +3 -3
- package/dist/components/onboarding-guides/index.cjs +8 -8
- package/dist/components/onboarding-guides/index.js +7 -7
- package/dist/components/open-source-features.d.ts +1 -1
- package/dist/components/open-source-features.d.ts.map +1 -1
- package/dist/components/open-source-icon.d.ts +9 -0
- package/dist/components/open-source-icon.d.ts.map +1 -0
- package/dist/components/openframe-logo.d.ts +7 -0
- package/dist/components/openframe-logo.d.ts.map +1 -0
- package/dist/components/openmsp-logo.d.ts +11 -0
- package/dist/components/openmsp-logo.d.ts.map +1 -0
- package/dist/components/plus-circle-icon.d.ts +9 -0
- package/dist/components/plus-circle-icon.d.ts.map +1 -0
- package/dist/components/progress.d.ts +7 -0
- package/dist/components/progress.d.ts.map +1 -0
- package/dist/components/provider-button.d.ts +10 -0
- package/dist/components/provider-button.d.ts.map +1 -0
- package/dist/components/reddit-icon.d.ts +10 -0
- package/dist/components/reddit-icon.d.ts.map +1 -0
- package/dist/components/related-content/index.cjs +6 -6
- package/dist/components/related-content/index.js +5 -5
- package/dist/components/resizable.d.ts +24 -0
- package/dist/components/resizable.d.ts.map +1 -0
- package/dist/components/scroll-area.d.ts +13 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/send-icon.d.ts +7 -0
- package/dist/components/send-icon.d.ts.map +1 -0
- package/dist/components/separator.d.ts +5 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/skeleton.d.ts +4 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/slack-icon.d.ts +9 -0
- package/dist/components/slack-icon.d.ts.map +1 -0
- package/dist/components/slider.d.ts +5 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/smooth-accordion.d.ts +12 -0
- package/dist/components/smooth-accordion.d.ts.map +1 -0
- package/dist/components/steps.d.ts +17 -0
- package/dist/components/steps.d.ts.map +1 -0
- package/dist/components/sun-icon.d.ts +9 -0
- package/dist/components/sun-icon.d.ts.map +1 -0
- package/dist/components/switch.d.ts +5 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/textarea.d.ts +6 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/tickets/index.cjs +8 -8
- package/dist/components/tickets/index.js +7 -7
- package/dist/components/ui/index.cjs +6 -4
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +5 -3
- package/dist/components/ui/pagination-stub.d.ts +6 -0
- package/dist/components/ui/pagination-stub.d.ts.map +1 -0
- package/dist/components/ui/responsive-icons-block-stub.d.ts +7 -0
- package/dist/components/ui/responsive-icons-block-stub.d.ts.map +1 -0
- package/dist/components/user-icon.d.ts +9 -0
- package/dist/components/user-icon.d.ts.map +1 -0
- package/dist/components/vendor-directory-icon.d.ts +9 -0
- package/dist/components/vendor-directory-icon.d.ts.map +1 -0
- package/dist/components/vendors-icon.d.ts +9 -0
- package/dist/components/vendors-icon.d.ts.map +1 -0
- package/dist/components/why-it-matters.d.ts +1 -1
- package/dist/components/why-it-matters.d.ts.map +1 -1
- package/dist/components/x-icon.d.ts +9 -0
- package/dist/components/x-icon.d.ts.map +1 -0
- package/dist/components/x-logo.d.ts +7 -0
- package/dist/components/x-logo.d.ts.map +1 -0
- package/dist/hooks/index.cjs +3 -3
- package/dist/hooks/index.js +2 -2
- package/dist/index.cjs +8 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -3
- package/package.json +1 -1
- package/src/components/about-icon.tsx +29 -0
- package/src/components/aspect-ratio.tsx +7 -0
- package/src/components/avatar.tsx +40 -0
- package/src/components/chart.tsx +364 -0
- package/src/components/chat/chat-container.tsx +1 -1
- package/src/components/chat/hooks/.use-jetstream-dialog-subscription.md +11 -4
- package/src/components/chat/hooks/use-jetstream-dialog-subscription.ts +71 -6
- package/src/components/chat/types/api.types.ts +22 -4
- package/src/components/chat/utils/__tests__/history-merge.test.ts +99 -0
- package/src/components/check-circle-icon.tsx +29 -0
- package/src/components/checkbox.tsx +30 -0
- package/src/components/claude-icon.tsx +24 -0
- package/src/components/coins-icon.tsx +29 -0
- package/src/components/command.tsx +153 -0
- package/src/components/community-hub-icon.tsx +27 -0
- package/src/components/community-icon.tsx +27 -0
- package/src/components/compare-icon.tsx +27 -0
- package/src/components/context-menu.tsx +200 -0
- package/src/components/custom-external-link-icon.tsx +33 -0
- package/src/components/custom-fork-icon.tsx +33 -0
- package/src/components/custom-icons.tsx +47 -0
- package/src/components/custom-license-icon.tsx +33 -0
- package/src/components/custom-star-icon.tsx +29 -0
- package/src/components/custom-time-icon.tsx +33 -0
- package/src/components/donut-icon.tsx +21 -0
- package/src/components/edit-profile-icon.tsx +23 -0
- package/src/components/elestio-logo.tsx +67 -0
- package/src/components/empty-vendor-icon.tsx +44 -0
- package/src/components/features/auth-providers-list.tsx +1 -1
- package/src/components/features/platform-badge.tsx +2 -2
- package/src/components/features/provider-button.tsx +6 -2
- package/src/components/flamingo-logo.tsx +27 -0
- package/src/components/form.tsx +138 -0
- package/src/components/github-icon.tsx +26 -0
- package/src/components/google-logo.tsx +32 -0
- package/src/components/hamburger-icon.tsx +29 -0
- package/src/components/hubspot-icon.tsx +20 -0
- package/src/components/icon-utils.tsx +36 -0
- package/src/components/icons/apple-icon.tsx +30 -0
- package/src/components/icons/index.ts +1 -0
- package/src/components/interactive-wrapper.tsx +336 -0
- package/src/components/join-waitlist-button-stub.tsx +30 -0
- package/src/components/loading/openmsp-heartbeat.tsx +1 -1
- package/src/components/made-with-love.tsx +3 -4
- package/src/components/menu-icon.tsx +22 -0
- package/src/components/minus-circle-icon.tsx +28 -0
- package/src/components/moon-icon.tsx +26 -0
- package/src/components/ms-icon.tsx +31 -0
- package/src/components/open-source-features.tsx +1 -1
- package/src/components/open-source-icon.tsx +27 -0
- package/src/components/openframe-logo.tsx +46 -0
- package/src/components/openmsp-logo.tsx +36 -0
- package/src/components/plus-circle-icon.tsx +30 -0
- package/src/components/progress.tsx +27 -0
- package/src/components/provider-button.tsx +40 -0
- package/src/components/reddit-icon.tsx +50 -0
- package/src/components/resizable.tsx +45 -0
- package/src/components/scroll-area.tsx +49 -0
- package/src/components/send-icon.tsx +26 -0
- package/src/components/separator.tsx +22 -0
- package/src/components/skeleton.tsx +8 -0
- package/src/components/slack-icon.tsx +43 -0
- package/src/components/slider.tsx +28 -0
- package/src/components/smooth-accordion.tsx +124 -0
- package/src/components/steps.tsx +98 -0
- package/src/components/sun-icon.tsx +27 -0
- package/src/components/switch.tsx +29 -0
- package/src/components/textarea.tsx +22 -0
- package/src/components/ui/pagination-stub.tsx +38 -0
- package/src/components/ui/responsive-icons-block-stub.tsx +14 -0
- package/src/components/user-icon.tsx +33 -0
- package/src/components/vendor-directory-icon.tsx +27 -0
- package/src/components/vendor-tag.tsx +1 -1
- package/src/components/vendors-icon.tsx +27 -0
- package/src/components/why-it-matters.tsx +1 -1
- package/src/components/x-icon.tsx +29 -0
- package/src/components/x-logo.tsx +22 -0
- package/dist/chunk-BXRB4MQI.cjs.map +0 -1
- package/dist/chunk-JLO2O5R4.js.map +0 -1
- package/dist/chunk-NJADHL2G.cjs.map +0 -1
- package/dist/chunk-XURRAFIB.js.map +0 -1
- /package/dist/{chunk-FS3YSNSU.js.map → chunk-GS4HJA2G.js.map} +0 -0
- /package/dist/{chunk-43ZZYJ3M.js.map → chunk-KRBH3PI4.js.map} +0 -0
- /package/dist/{chunk-P63LOLTB.js.map → chunk-MI7WNVWX.js.map} +0 -0
- /package/dist/{chunk-ZKVARGSO.js.map → chunk-MOZUJ7IN.js.map} +0 -0
- /package/dist/{chunk-MIFJLUZK.js.map → chunk-MVY3WDFZ.js.map} +0 -0
- /package/dist/{chunk-FXT2OZ5Q.js.map → chunk-NJJWY7SO.js.map} +0 -0
- /package/dist/{chunk-MEXZZOBO.js.map → chunk-P6M5MN3L.js.map} +0 -0
- /package/dist/{chunk-5KBQECAY.js.map → chunk-PUBL2NCH.js.map} +0 -0
- /package/dist/{chunk-NBJ7L65H.js.map → chunk-PV3LXEHJ.js.map} +0 -0
- /package/dist/{chunk-XZ6WTSVQ.js.map → chunk-QJHBYNHI.js.map} +0 -0
- /package/dist/{chunk-Z3ADCYC5.js.map → chunk-RCBRCZUF.js.map} +0 -0
- /package/dist/{chunk-KP4JRPUE.js.map → chunk-RJU7YCN3.js.map} +0 -0
- /package/dist/{chunk-WI4XHZ2B.js.map → chunk-TFIPJAA5.js.map} +0 -0
- /package/dist/{chunk-56OUH3UF.js.map → chunk-XARCNHWZ.js.map} +0 -0
- /package/dist/{chunk-AI7WIW4E.js.map → chunk-YUQNJXSC.js.map} +0 -0
|
@@ -930,3 +930,102 @@ describe('mid-stream refetch (turn partially persisted)', () => {
|
|
|
930
930
|
expect(ids(merged)).toEqual([U0.id, A0.id, PERSISTED_PARTIAL.id, unrelatedLive.id])
|
|
931
931
|
})
|
|
932
932
|
})
|
|
933
|
+
|
|
934
|
+
describe('ordering of surviving realtime messages', () => {
|
|
935
|
+
// The merge concatenates: all persisted history, then every realtime message
|
|
936
|
+
// the coverage rules kept, each side in its own order. These pin that
|
|
937
|
+
// contract, which nothing asserted before — the suite tested only WHICH
|
|
938
|
+
// messages survive, never where they land — and which an attempt to
|
|
939
|
+
// chronologically interleave the two sides repeatedly broke.
|
|
940
|
+
const H_U0: TestMessage = { ...U0, streamSeq: 5 }
|
|
941
|
+
const H_A0: TestMessage = { ...A0, streamSeq: 10 }
|
|
942
|
+
/**
|
|
943
|
+
* Sent from a notification while the window was away, and persisted. NO
|
|
944
|
+
* `streamSeq`: the backend does not stamp user MESSAGE_REQUEST rows, which is
|
|
945
|
+
* the missing signal that makes interleaving guesswork.
|
|
946
|
+
*/
|
|
947
|
+
const AWAY_U: TestMessage = {
|
|
948
|
+
id: 'bbbb0001',
|
|
949
|
+
role: 'user',
|
|
950
|
+
content: 'replied from a notification',
|
|
951
|
+
timestamp: t(3000),
|
|
952
|
+
}
|
|
953
|
+
/** Mingo's answer to it. Assistant rows DO carry a sequence. */
|
|
954
|
+
const AWAY_A: TestMessage = {
|
|
955
|
+
id: 'bbbb0002',
|
|
956
|
+
role: 'assistant',
|
|
957
|
+
content: txt('answered while the window was away'),
|
|
958
|
+
timestamp: t(3100),
|
|
959
|
+
streamSeq: 80,
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
it('appends surviving realtime messages after all persisted history', () => {
|
|
963
|
+
// A technician direct message the snapshot has not caught up with. Its own
|
|
964
|
+
// role's persisted max (H_U0, seq 5) is below it, so coverage keeps it.
|
|
965
|
+
const unpersistedDirect: TestMessage = {
|
|
966
|
+
id: 'direct-1500-old',
|
|
967
|
+
role: 'user',
|
|
968
|
+
content: 'a direct message history has not persisted yet',
|
|
969
|
+
timestamp: t(1500),
|
|
970
|
+
streamSeq: 40,
|
|
971
|
+
}
|
|
972
|
+
const merged = mergeHistoryWithRealtime({
|
|
973
|
+
processedHistory: [H_U0, H_A0, AWAY_U, AWAY_A],
|
|
974
|
+
existingMessages: [H_U0, H_A0, unpersistedDirect],
|
|
975
|
+
streamingMessageId: null,
|
|
976
|
+
historyFetchedAt: 9000,
|
|
977
|
+
historyMaxStreamSeq: 80,
|
|
978
|
+
realtimeSeenStreamSeq: 40,
|
|
979
|
+
})
|
|
980
|
+
|
|
981
|
+
expect(ids(merged)).toEqual([H_U0.id, H_A0.id, AWAY_U.id, AWAY_A.id, unpersistedDirect.id])
|
|
982
|
+
})
|
|
983
|
+
|
|
984
|
+
it('keeps survivors in store order, sequence or no sequence', () => {
|
|
985
|
+
// The guard against reordering the two kinds against each other: an
|
|
986
|
+
// optimistic bubble carries no sequence and a replayed direct message does,
|
|
987
|
+
// and sorting by sequence would render the user's question below the reply
|
|
988
|
+
// that came after it.
|
|
989
|
+
const optimistic: TestMessage = {
|
|
990
|
+
id: 'optimistic-9400-x',
|
|
991
|
+
role: 'user',
|
|
992
|
+
content: 'just typed, no seq of its own',
|
|
993
|
+
timestamp: t(9400),
|
|
994
|
+
}
|
|
995
|
+
const laterDirect: TestMessage = {
|
|
996
|
+
id: 'direct-9500-x',
|
|
997
|
+
role: 'user',
|
|
998
|
+
content: 'and a direct message after it',
|
|
999
|
+
timestamp: t(9500),
|
|
1000
|
+
streamSeq: 40,
|
|
1001
|
+
}
|
|
1002
|
+
const merged = mergeHistoryWithRealtime({
|
|
1003
|
+
processedHistory: [H_U0, H_A0, AWAY_U, AWAY_A],
|
|
1004
|
+
existingMessages: [H_U0, H_A0, optimistic, laterDirect],
|
|
1005
|
+
streamingMessageId: null,
|
|
1006
|
+
// Before either was minted, so neither can be in the snapshot.
|
|
1007
|
+
historyFetchedAt: 9000,
|
|
1008
|
+
historyMaxStreamSeq: 80,
|
|
1009
|
+
realtimeSeenStreamSeq: 40,
|
|
1010
|
+
})
|
|
1011
|
+
|
|
1012
|
+
expect(ids(merged)).toEqual([H_U0.id, H_A0.id, AWAY_U.id, AWAY_A.id, optimistic.id, laterDirect.id])
|
|
1013
|
+
})
|
|
1014
|
+
|
|
1015
|
+
it('keeps history in snapshot order even when its sequences do not climb', () => {
|
|
1016
|
+
// The snapshot is the server's account of the conversation; the merge is
|
|
1017
|
+
// not entitled to second-guess it from a `streamSeq` that looks out of
|
|
1018
|
+
// order, which is what any sort of the two sides together would do.
|
|
1019
|
+
const outOfOrder: TestMessage = { ...H_A0, id: 'aaaa0009', streamSeq: 3 }
|
|
1020
|
+
const merged = mergeHistoryWithRealtime({
|
|
1021
|
+
processedHistory: [H_U0, outOfOrder, AWAY_U, AWAY_A],
|
|
1022
|
+
existingMessages: [H_U0],
|
|
1023
|
+
streamingMessageId: null,
|
|
1024
|
+
historyFetchedAt: 9000,
|
|
1025
|
+
historyMaxStreamSeq: 80,
|
|
1026
|
+
realtimeSeenStreamSeq: 0,
|
|
1027
|
+
})
|
|
1028
|
+
|
|
1029
|
+
expect(ids(merged)).toEqual([H_U0.id, outOfOrder.id, AWAY_U.id, AWAY_A.id])
|
|
1030
|
+
})
|
|
1031
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
|
|
3
|
+
interface CheckCircleIconProps extends React.SVGProps<SVGSVGElement> {
|
|
4
|
+
className?: string
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function CheckCircleIcon({ className, color = '#1A1A1A', ...props }: CheckCircleIconProps) {
|
|
8
|
+
return (
|
|
9
|
+
<svg
|
|
10
|
+
width="24"
|
|
11
|
+
height="24"
|
|
12
|
+
viewBox="0 0 24 24"
|
|
13
|
+
fill="none"
|
|
14
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
15
|
+
className={className}
|
|
16
|
+
color={color}
|
|
17
|
+
{...props}
|
|
18
|
+
>
|
|
19
|
+
<path
|
|
20
|
+
d="M20.8745 12.0005C20.8745 7.09912 16.9018 3.12526 12.0005 3.125C7.09896 3.125 3.125 7.09896 3.125 12.0005C3.12526 16.9018 7.09912 20.8745 12.0005 20.8745C16.9016 20.8742 20.8742 16.9016 20.8745 12.0005ZM23.1245 12.0005C23.1242 18.1443 18.1443 23.1242 12.0005 23.1245C5.85648 23.1245 0.875264 18.1444 0.875 12.0005C0.875 5.85632 5.85632 0.875 12.0005 0.875C18.1444 0.875264 23.1245 5.85648 23.1245 12.0005Z"
|
|
21
|
+
fill={color}
|
|
22
|
+
/>
|
|
23
|
+
<path
|
|
24
|
+
d="M15.7046 8.20459C16.1439 7.76525 16.8561 7.76525 17.2954 8.20459C17.7347 8.64393 17.7347 9.35607 17.2954 9.79541L11.2954 15.7954C10.8561 16.2347 10.1439 16.2347 9.70459 15.7954L6.70459 12.7954L6.62695 12.7104C6.26649 12.2686 6.29268 11.6165 6.70459 11.2046C7.1165 10.7927 7.76858 10.7665 8.21045 11.127L8.29541 11.2046L10.5 13.4092L15.7046 8.20459Z"
|
|
25
|
+
fill={color}
|
|
26
|
+
/>
|
|
27
|
+
</svg>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
|
|
5
|
+
|
|
6
|
+
import { cn } from "../utils/cn"
|
|
7
|
+
import { CheckboxCheckmarkIcon } from "./icons-v2-generated/signs-and-symbols/checkbox-checkmark-icon"
|
|
8
|
+
|
|
9
|
+
const Checkbox = React.forwardRef<
|
|
10
|
+
React.ElementRef<typeof CheckboxPrimitive.Root>,
|
|
11
|
+
React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>
|
|
12
|
+
>(({ className, ...props }, ref) => (
|
|
13
|
+
<CheckboxPrimitive.Root
|
|
14
|
+
ref={ref}
|
|
15
|
+
className={cn(
|
|
16
|
+
"peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
|
|
17
|
+
className
|
|
18
|
+
)}
|
|
19
|
+
{...props}
|
|
20
|
+
>
|
|
21
|
+
<CheckboxPrimitive.Indicator
|
|
22
|
+
className={cn("flex items-center justify-center text-current")}
|
|
23
|
+
>
|
|
24
|
+
<CheckboxCheckmarkIcon size={10} />
|
|
25
|
+
</CheckboxPrimitive.Indicator>
|
|
26
|
+
</CheckboxPrimitive.Root>
|
|
27
|
+
))
|
|
28
|
+
Checkbox.displayName = CheckboxPrimitive.Root.displayName
|
|
29
|
+
|
|
30
|
+
export { Checkbox }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
interface ClaudeIconProps extends React.SVGProps<SVGSVGElement> {}
|
|
6
|
+
|
|
7
|
+
export function ClaudeIcon(props: ClaudeIconProps) {
|
|
8
|
+
return (
|
|
9
|
+
<svg
|
|
10
|
+
height="1em"
|
|
11
|
+
width="1em"
|
|
12
|
+
viewBox="0 0 24 24"
|
|
13
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
14
|
+
aria-label="Claude"
|
|
15
|
+
{...props}
|
|
16
|
+
>
|
|
17
|
+
<path
|
|
18
|
+
d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z"
|
|
19
|
+
fill="#D97757"
|
|
20
|
+
fillRule="nonzero"
|
|
21
|
+
/>
|
|
22
|
+
</svg>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
interface CoinsIconProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const CoinsIcon: React.FC<CoinsIconProps> = ({
|
|
10
|
+
className = "",
|
|
11
|
+
width = 20,
|
|
12
|
+
height = 20
|
|
13
|
+
}) => {
|
|
14
|
+
return (
|
|
15
|
+
<svg
|
|
16
|
+
width={width}
|
|
17
|
+
height={height}
|
|
18
|
+
viewBox="0 0 20 20"
|
|
19
|
+
fill="none"
|
|
20
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
21
|
+
className={className}
|
|
22
|
+
>
|
|
23
|
+
<circle cx="7" cy="8" r="4" stroke="currentColor" strokeWidth="1.5" fill="none"/>
|
|
24
|
+
<circle cx="13" cy="12" r="4" stroke="currentColor" strokeWidth="1.5" fill="none"/>
|
|
25
|
+
<path d="M9 6c0-1.1.9-2 2-2s2 .9 2 2" stroke="currentColor" strokeWidth="1.5" fill="none"/>
|
|
26
|
+
<path d="M15 10c0-1.1.9-2 2-2s2 .9 2 2" stroke="currentColor" strokeWidth="1.5" fill="none"/>
|
|
27
|
+
</svg>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { type DialogProps } from "@radix-ui/react-dialog"
|
|
5
|
+
import { Command as CommandPrimitive } from "cmdk"
|
|
6
|
+
import { Search } from "lucide-react"
|
|
7
|
+
|
|
8
|
+
import { cn } from "../utils/cn"
|
|
9
|
+
import { Dialog, DialogContent } from "./ui/dialog"
|
|
10
|
+
|
|
11
|
+
const Command = React.forwardRef<
|
|
12
|
+
React.ElementRef<typeof CommandPrimitive>,
|
|
13
|
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive>
|
|
14
|
+
>(({ className, ...props }, ref) => (
|
|
15
|
+
<CommandPrimitive
|
|
16
|
+
ref={ref}
|
|
17
|
+
className={cn(
|
|
18
|
+
"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
|
|
19
|
+
className
|
|
20
|
+
)}
|
|
21
|
+
{...props}
|
|
22
|
+
/>
|
|
23
|
+
))
|
|
24
|
+
Command.displayName = CommandPrimitive.displayName
|
|
25
|
+
|
|
26
|
+
const CommandDialog = ({ children, ...props }: DialogProps) => {
|
|
27
|
+
return (
|
|
28
|
+
<Dialog {...props}>
|
|
29
|
+
<DialogContent className="overflow-hidden p-0 shadow-lg">
|
|
30
|
+
<Command className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
|
|
31
|
+
{children}
|
|
32
|
+
</Command>
|
|
33
|
+
</DialogContent>
|
|
34
|
+
</Dialog>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const CommandInput = React.forwardRef<
|
|
39
|
+
React.ElementRef<typeof CommandPrimitive.Input>,
|
|
40
|
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>
|
|
41
|
+
>(({ className, ...props }, ref) => (
|
|
42
|
+
<div className="flex items-center border-b px-3" cmdk-input-wrapper="">
|
|
43
|
+
<Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
|
|
44
|
+
<CommandPrimitive.Input
|
|
45
|
+
ref={ref}
|
|
46
|
+
className={cn(
|
|
47
|
+
"flex h-11 w-full rounded-md bg-transparent py-3 text-h6 outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
|
|
48
|
+
className
|
|
49
|
+
)}
|
|
50
|
+
{...props}
|
|
51
|
+
/>
|
|
52
|
+
</div>
|
|
53
|
+
))
|
|
54
|
+
|
|
55
|
+
CommandInput.displayName = CommandPrimitive.Input.displayName
|
|
56
|
+
|
|
57
|
+
const CommandList = React.forwardRef<
|
|
58
|
+
React.ElementRef<typeof CommandPrimitive.List>,
|
|
59
|
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>
|
|
60
|
+
>(({ className, ...props }, ref) => (
|
|
61
|
+
<CommandPrimitive.List
|
|
62
|
+
ref={ref}
|
|
63
|
+
className={cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)}
|
|
64
|
+
{...props}
|
|
65
|
+
/>
|
|
66
|
+
))
|
|
67
|
+
|
|
68
|
+
CommandList.displayName = CommandPrimitive.List.displayName
|
|
69
|
+
|
|
70
|
+
const CommandEmpty = React.forwardRef<
|
|
71
|
+
React.ElementRef<typeof CommandPrimitive.Empty>,
|
|
72
|
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>
|
|
73
|
+
>((props, ref) => (
|
|
74
|
+
<CommandPrimitive.Empty
|
|
75
|
+
ref={ref}
|
|
76
|
+
className="py-6 text-center text-h6"
|
|
77
|
+
{...props}
|
|
78
|
+
/>
|
|
79
|
+
))
|
|
80
|
+
|
|
81
|
+
CommandEmpty.displayName = CommandPrimitive.Empty.displayName
|
|
82
|
+
|
|
83
|
+
const CommandGroup = React.forwardRef<
|
|
84
|
+
React.ElementRef<typeof CommandPrimitive.Group>,
|
|
85
|
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>
|
|
86
|
+
>(({ className, ...props }, ref) => (
|
|
87
|
+
<CommandPrimitive.Group
|
|
88
|
+
ref={ref}
|
|
89
|
+
className={cn(
|
|
90
|
+
"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
|
|
91
|
+
className
|
|
92
|
+
)}
|
|
93
|
+
{...props}
|
|
94
|
+
/>
|
|
95
|
+
))
|
|
96
|
+
|
|
97
|
+
CommandGroup.displayName = CommandPrimitive.Group.displayName
|
|
98
|
+
|
|
99
|
+
const CommandSeparator = React.forwardRef<
|
|
100
|
+
React.ElementRef<typeof CommandPrimitive.Separator>,
|
|
101
|
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>
|
|
102
|
+
>(({ className, ...props }, ref) => (
|
|
103
|
+
<CommandPrimitive.Separator
|
|
104
|
+
ref={ref}
|
|
105
|
+
className={cn("-mx-1 h-px bg-border", className)}
|
|
106
|
+
{...props}
|
|
107
|
+
/>
|
|
108
|
+
))
|
|
109
|
+
CommandSeparator.displayName = CommandPrimitive.Separator.displayName
|
|
110
|
+
|
|
111
|
+
const CommandItem = React.forwardRef<
|
|
112
|
+
React.ElementRef<typeof CommandPrimitive.Item>,
|
|
113
|
+
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>
|
|
114
|
+
>(({ className, ...props }, ref) => (
|
|
115
|
+
<CommandPrimitive.Item
|
|
116
|
+
ref={ref}
|
|
117
|
+
className={cn(
|
|
118
|
+
"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-h6 outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
119
|
+
className
|
|
120
|
+
)}
|
|
121
|
+
{...props}
|
|
122
|
+
/>
|
|
123
|
+
))
|
|
124
|
+
|
|
125
|
+
CommandItem.displayName = CommandPrimitive.Item.displayName
|
|
126
|
+
|
|
127
|
+
const CommandShortcut = ({
|
|
128
|
+
className,
|
|
129
|
+
...props
|
|
130
|
+
}: React.HTMLAttributes<HTMLSpanElement>) => {
|
|
131
|
+
return (
|
|
132
|
+
<span
|
|
133
|
+
className={cn(
|
|
134
|
+
"ml-auto text-xs tracking-widest text-muted-foreground",
|
|
135
|
+
className
|
|
136
|
+
)}
|
|
137
|
+
{...props}
|
|
138
|
+
/>
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
CommandShortcut.displayName = "CommandShortcut"
|
|
142
|
+
|
|
143
|
+
export {
|
|
144
|
+
Command,
|
|
145
|
+
CommandDialog,
|
|
146
|
+
CommandInput,
|
|
147
|
+
CommandList,
|
|
148
|
+
CommandEmpty,
|
|
149
|
+
CommandGroup,
|
|
150
|
+
CommandItem,
|
|
151
|
+
CommandShortcut,
|
|
152
|
+
CommandSeparator,
|
|
153
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
interface CommunityHubIconProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const CommunityHubIcon: React.FC<CommunityHubIconProps> = ({
|
|
10
|
+
className = "",
|
|
11
|
+
width = 19,
|
|
12
|
+
height = 16
|
|
13
|
+
}) => {
|
|
14
|
+
return (
|
|
15
|
+
<svg
|
|
16
|
+
width={width}
|
|
17
|
+
height={height}
|
|
18
|
+
viewBox="0 0 19 16"
|
|
19
|
+
fill="none"
|
|
20
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
21
|
+
className={className}
|
|
22
|
+
>
|
|
23
|
+
<path d="M2.26831 10.5006C2.7145 10.2384 3.28877 10.3878 3.55127 10.8339C3.81375 11.28 3.66521 11.8542 3.21924 12.1168C2.7743 12.3786 2.44807 12.8134 2.32568 13.3266C2.76754 13.4022 3.10443 13.786 3.10449 14.2494C3.10449 14.7349 2.73505 15.1341 2.26221 15.182L2.16699 15.1869H1.80933C1.02862 15.1868 0.395752 14.5541 0.395752 13.7733C0.395757 12.3777 1.14996 11.1587 2.26831 10.5006ZM15.812 4.24941C15.8119 3.75414 15.582 3.31222 15.22 3.02504L15.0576 2.91152L14.9771 2.85781C14.5977 2.5719 14.489 2.03884 14.7402 1.62367C14.9917 1.20828 15.5145 1.05828 15.9438 1.26235L16.0281 1.30751L16.21 1.42592C17.1011 2.04549 17.6869 3.07846 17.687 4.24941C17.687 5.49852 17.0207 6.59175 16.0281 7.19252L15.9438 7.23769C15.5145 7.44157 14.9916 7.29049 14.7402 6.87514C14.4724 6.43223 14.6148 5.85655 15.0576 5.58852L15.22 5.47499C15.5823 5.18777 15.812 4.74494 15.812 4.24941ZM1.64575 4.24941C1.64584 2.99822 2.31536 1.90392 3.31079 1.30385C3.75403 1.03697 4.33009 1.17947 4.59741 1.62245C4.86469 2.06583 4.72213 2.64295 4.27881 2.9103C3.82282 3.18518 3.52084 3.68236 3.52075 4.24941C3.52075 4.74455 3.75095 5.18653 4.11279 5.47377L4.27515 5.5873L4.35449 5.64101C4.73432 5.92694 4.84293 6.45981 4.59131 6.87514C4.33984 7.29016 3.81804 7.44014 3.38892 7.23647L3.30347 7.1913L3.12158 7.07289C2.23118 6.45318 1.64575 5.41987 1.64575 4.24941ZM18.937 13.7733C18.937 14.5541 18.3042 15.1869 17.5234 15.1869H17.167C16.6492 15.1869 16.2295 14.7672 16.2295 14.2494C16.2296 13.7861 16.5654 13.4023 17.0071 13.3266C16.9045 12.8965 16.6603 12.5213 16.321 12.2572L16.1172 12.1193L16.0366 12.0656C15.6544 11.7838 15.5399 11.2529 15.7864 10.8351C16.0332 10.4172 16.5537 10.2614 16.9851 10.4603L17.0706 10.5043L17.2756 10.6349C18.2769 11.3166 18.937 12.4673 18.937 13.7733Z" fill="currentColor"/>
|
|
24
|
+
<path d="M9.0717 11.4368C7.73301 11.4368 6.62961 12.4363 6.46183 13.7292H12.8717C12.704 12.4363 11.6006 11.4368 10.2619 11.4368H9.0717ZM11.6462 4.24927C11.6459 3.15639 10.7591 2.27051 9.66618 2.27051C8.57344 2.27073 7.68764 3.15653 7.68742 4.24927C7.68742 5.3422 8.5733 6.22903 9.66618 6.22925C10.7592 6.22925 11.6462 5.34233 11.6462 4.24927ZM14.7712 14.071C14.7712 14.9176 14.0845 15.6042 13.238 15.6042H6.09562C5.24911 15.6042 4.56242 14.9176 4.56242 14.071C4.5625 11.5809 6.58154 9.56177 9.0717 9.56177H10.2619C12.752 9.5618 14.7711 11.5809 14.7712 14.071ZM13.5212 4.24927C13.5212 6.37787 11.7948 8.10425 9.66618 8.10425C7.53777 8.10403 5.81242 6.37773 5.81242 4.24927C5.81264 2.12099 7.5379 0.395727 9.66618 0.395508C11.7946 0.395508 13.5209 2.12086 13.5212 4.24927Z" fill="currentColor"/>
|
|
25
|
+
</svg>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
interface CommunityIconProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const CommunityIcon: React.FC<CommunityIconProps> = ({
|
|
10
|
+
className = "",
|
|
11
|
+
width = 24,
|
|
12
|
+
height = 24
|
|
13
|
+
}) => {
|
|
14
|
+
return (
|
|
15
|
+
<svg
|
|
16
|
+
width={width}
|
|
17
|
+
height={height}
|
|
18
|
+
viewBox="0 0 24 24"
|
|
19
|
+
fill="none"
|
|
20
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
21
|
+
className={className}
|
|
22
|
+
>
|
|
23
|
+
<path d="M18.124 7.75024C18.124 6.5895 17.3704 5.60113 16.3223 5.25561L16.6753 4.18774L17.0269 3.11987C18.9698 3.76042 20.374 5.58968 20.374 7.75024C20.3739 10.17 18.6127 12.1762 16.3018 12.5593C15.6889 12.6609 15.1085 12.2464 15.0068 11.6335C14.9053 11.0208 15.3201 10.442 15.9326 10.3401C17.1758 10.1341 18.1239 9.05156 18.124 7.75024ZM15.606 3.83618C15.8005 3.2461 16.4368 2.92535 17.0269 3.11987L16.3223 5.25561C15.7326 5.06102 15.4119 4.42595 15.606 3.83618ZM23.125 19.2859C23.1249 20.3016 22.3009 21.1243 21.2852 21.1243H20.0005C19.3792 21.1243 18.8755 20.6206 18.8755 19.9993C18.8759 19.3783 19.3794 18.8743 20.0005 18.8743H20.8457C20.6676 17.5065 19.617 16.4113 18.269 16.1731C17.6574 16.0648 17.2498 15.4811 17.3579 14.8694C17.4662 14.258 18.0487 13.8505 18.6602 13.9583C21.1971 14.4066 23.125 16.6199 23.125 19.2859Z" fill="currentColor"/>
|
|
24
|
+
<path d="M7.14307 16.125C5.01417 16.125 3.27616 17.781 3.13818 19.875H14.8613C14.7233 17.781 12.9853 16.125 10.8564 16.125H7.14307ZM12.125 7.24951C12.1247 5.52401 10.726 4.12526 9.00049 4.125C7.27476 4.125 5.87478 5.52385 5.87451 7.24951C5.87451 8.9754 7.2746 10.3755 9.00049 10.3755C10.7262 10.3752 12.125 8.97524 12.125 7.24951ZM17.1245 20.1431C17.1244 21.2377 16.2372 22.125 15.1426 22.125H2.85693C1.76239 22.1249 0.875113 21.2376 0.875 20.1431C0.875 16.6814 3.68142 13.875 7.14307 13.875H10.8564C14.3181 13.875 17.1245 16.6814 17.1245 20.1431ZM14.375 7.24951C14.375 10.2179 11.9688 12.6252 9.00049 12.6255C6.03196 12.6255 3.62451 10.218 3.62451 7.24951C3.62478 4.28121 6.03212 1.875 9.00049 1.875C11.9686 1.87526 14.3747 4.28137 14.375 7.24951Z" fill="currentColor"/>
|
|
25
|
+
</svg>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
interface CompareIconProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
width?: number;
|
|
6
|
+
height?: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const CompareIcon: React.FC<CompareIconProps> = ({
|
|
10
|
+
className = "",
|
|
11
|
+
width = 24,
|
|
12
|
+
height = 24
|
|
13
|
+
}) => {
|
|
14
|
+
return (
|
|
15
|
+
<svg
|
|
16
|
+
width={width}
|
|
17
|
+
height={height}
|
|
18
|
+
viewBox="0 0 24 24"
|
|
19
|
+
fill="none"
|
|
20
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
21
|
+
className={className}
|
|
22
|
+
>
|
|
23
|
+
<path d="M12 1C13.3059 1 14.4141 1.83532 14.8262 3H18.5C19.0523 3 19.5 3.44772 19.5 4C19.5 4.55228 19.0523 5 18.5 5H14.8262C14.5249 5.85152 13.8515 6.5238 13 6.8252V21H18.5C19.0523 21 19.5 21.4477 19.5 22C19.5 22.5523 19.0523 23 18.5 23H5.5C4.94772 23 4.5 22.5523 4.5 22C4.5 21.4477 4.94772 21 5.5 21H11V6.8252C10.1485 6.5238 9.47513 5.85152 9.17383 5H5.5C4.94772 5 4.5 4.55228 4.5 4C4.5 3.44772 4.94772 3 5.5 3H9.17383C9.58594 1.83532 10.6941 1 12 1ZM12 3C11.4477 3 11 3.44772 11 4C11 4.55228 11.4477 5 12 5C12.5523 5 13 4.55228 13 4C13 3.44772 12.5523 3 12 3Z" fill="currentColor"/>
|
|
24
|
+
<path d="M3.67383 7.56812C4.229 6.50318 5.771 6.50317 6.32617 7.56812L6.37891 7.67847L8.91895 13.6062C8.97225 13.7306 8.99997 13.8644 9 13.9998C9 15.7352 7.69135 17.9998 5 17.9998C2.30865 17.9998 1 15.7352 1 13.9998C1.00003 13.8644 1.02775 13.7306 1.08105 13.6062L3.62109 7.67847L3.67383 7.56812ZM17.6738 7.56812C18.229 6.50317 19.771 6.50317 20.3262 7.56812L20.3789 7.67847L22.9189 13.6062C22.9723 13.7306 23 13.8644 23 13.9998C23 15.7352 21.6914 17.9998 19 17.9998C16.3086 17.9998 15 15.7352 15 13.9998C15 13.8644 15.0277 13.7306 15.0811 13.6062L17.6211 7.67847L17.6738 7.56812ZM3.00879 14.1833C3.09268 15.0659 3.77658 15.9998 5 15.9998C6.22338 15.9998 6.9063 15.0659 6.99023 14.1833L5 9.53882L3.00879 14.1833ZM17.0088 14.1833C17.0927 15.0659 17.7766 15.9998 19 15.9998C20.2234 15.9998 20.9063 15.0659 20.9902 14.1833L19 9.53882L17.0088 14.1833Z" fill="currentColor"/>
|
|
25
|
+
</svg>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import * as ContextMenuPrimitive from "@radix-ui/react-context-menu"
|
|
5
|
+
import { Check, ChevronRight, Circle } from "lucide-react"
|
|
6
|
+
|
|
7
|
+
import { cn } from "../utils/cn"
|
|
8
|
+
|
|
9
|
+
const ContextMenu = ContextMenuPrimitive.Root
|
|
10
|
+
|
|
11
|
+
const ContextMenuTrigger = ContextMenuPrimitive.Trigger
|
|
12
|
+
|
|
13
|
+
const ContextMenuGroup = ContextMenuPrimitive.Group
|
|
14
|
+
|
|
15
|
+
const ContextMenuPortal = ContextMenuPrimitive.Portal
|
|
16
|
+
|
|
17
|
+
const ContextMenuSub = ContextMenuPrimitive.Sub
|
|
18
|
+
|
|
19
|
+
const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup
|
|
20
|
+
|
|
21
|
+
const ContextMenuSubTrigger = React.forwardRef<
|
|
22
|
+
React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,
|
|
23
|
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {
|
|
24
|
+
inset?: boolean
|
|
25
|
+
}
|
|
26
|
+
>(({ className, inset, children, ...props }, ref) => (
|
|
27
|
+
<ContextMenuPrimitive.SubTrigger
|
|
28
|
+
ref={ref}
|
|
29
|
+
className={cn(
|
|
30
|
+
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-h6 outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
|
|
31
|
+
inset && "pl-8",
|
|
32
|
+
className
|
|
33
|
+
)}
|
|
34
|
+
{...props}
|
|
35
|
+
>
|
|
36
|
+
{children}
|
|
37
|
+
<ChevronRight className="ml-auto h-4 w-4" />
|
|
38
|
+
</ContextMenuPrimitive.SubTrigger>
|
|
39
|
+
))
|
|
40
|
+
ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName
|
|
41
|
+
|
|
42
|
+
const ContextMenuSubContent = React.forwardRef<
|
|
43
|
+
React.ElementRef<typeof ContextMenuPrimitive.SubContent>,
|
|
44
|
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>
|
|
45
|
+
>(({ className, ...props }, ref) => (
|
|
46
|
+
<ContextMenuPrimitive.SubContent
|
|
47
|
+
ref={ref}
|
|
48
|
+
className={cn(
|
|
49
|
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
50
|
+
className
|
|
51
|
+
)}
|
|
52
|
+
{...props}
|
|
53
|
+
/>
|
|
54
|
+
))
|
|
55
|
+
ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName
|
|
56
|
+
|
|
57
|
+
const ContextMenuContent = React.forwardRef<
|
|
58
|
+
React.ElementRef<typeof ContextMenuPrimitive.Content>,
|
|
59
|
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>
|
|
60
|
+
>(({ className, ...props }, ref) => (
|
|
61
|
+
<ContextMenuPrimitive.Portal>
|
|
62
|
+
<ContextMenuPrimitive.Content
|
|
63
|
+
ref={ref}
|
|
64
|
+
className={cn(
|
|
65
|
+
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
66
|
+
className
|
|
67
|
+
)}
|
|
68
|
+
{...props}
|
|
69
|
+
/>
|
|
70
|
+
</ContextMenuPrimitive.Portal>
|
|
71
|
+
))
|
|
72
|
+
ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName
|
|
73
|
+
|
|
74
|
+
const ContextMenuItem = React.forwardRef<
|
|
75
|
+
React.ElementRef<typeof ContextMenuPrimitive.Item>,
|
|
76
|
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {
|
|
77
|
+
inset?: boolean
|
|
78
|
+
}
|
|
79
|
+
>(({ className, inset, ...props }, ref) => (
|
|
80
|
+
<ContextMenuPrimitive.Item
|
|
81
|
+
ref={ref}
|
|
82
|
+
className={cn(
|
|
83
|
+
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-h6 outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
84
|
+
inset && "pl-8",
|
|
85
|
+
className
|
|
86
|
+
)}
|
|
87
|
+
{...props}
|
|
88
|
+
/>
|
|
89
|
+
))
|
|
90
|
+
ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName
|
|
91
|
+
|
|
92
|
+
const ContextMenuCheckboxItem = React.forwardRef<
|
|
93
|
+
React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,
|
|
94
|
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>
|
|
95
|
+
>(({ className, children, checked, ...props }, ref) => (
|
|
96
|
+
<ContextMenuPrimitive.CheckboxItem
|
|
97
|
+
ref={ref}
|
|
98
|
+
className={cn(
|
|
99
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-h6 outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
100
|
+
className
|
|
101
|
+
)}
|
|
102
|
+
checked={checked}
|
|
103
|
+
{...props}
|
|
104
|
+
>
|
|
105
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
106
|
+
<ContextMenuPrimitive.ItemIndicator>
|
|
107
|
+
<Check className="h-4 w-4" />
|
|
108
|
+
</ContextMenuPrimitive.ItemIndicator>
|
|
109
|
+
</span>
|
|
110
|
+
{children}
|
|
111
|
+
</ContextMenuPrimitive.CheckboxItem>
|
|
112
|
+
))
|
|
113
|
+
ContextMenuCheckboxItem.displayName =
|
|
114
|
+
ContextMenuPrimitive.CheckboxItem.displayName
|
|
115
|
+
|
|
116
|
+
const ContextMenuRadioItem = React.forwardRef<
|
|
117
|
+
React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,
|
|
118
|
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>
|
|
119
|
+
>(({ className, children, ...props }, ref) => (
|
|
120
|
+
<ContextMenuPrimitive.RadioItem
|
|
121
|
+
ref={ref}
|
|
122
|
+
className={cn(
|
|
123
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-h6 outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
124
|
+
className
|
|
125
|
+
)}
|
|
126
|
+
{...props}
|
|
127
|
+
>
|
|
128
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
129
|
+
<ContextMenuPrimitive.ItemIndicator>
|
|
130
|
+
<Circle className="h-2 w-2 fill-current" />
|
|
131
|
+
</ContextMenuPrimitive.ItemIndicator>
|
|
132
|
+
</span>
|
|
133
|
+
{children}
|
|
134
|
+
</ContextMenuPrimitive.RadioItem>
|
|
135
|
+
))
|
|
136
|
+
ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName
|
|
137
|
+
|
|
138
|
+
const ContextMenuLabel = React.forwardRef<
|
|
139
|
+
React.ElementRef<typeof ContextMenuPrimitive.Label>,
|
|
140
|
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {
|
|
141
|
+
inset?: boolean
|
|
142
|
+
}
|
|
143
|
+
>(({ className, inset, ...props }, ref) => (
|
|
144
|
+
<ContextMenuPrimitive.Label
|
|
145
|
+
ref={ref}
|
|
146
|
+
className={cn(
|
|
147
|
+
"px-2 py-1.5 text-h6 font-semibold text-foreground",
|
|
148
|
+
inset && "pl-8",
|
|
149
|
+
className
|
|
150
|
+
)}
|
|
151
|
+
{...props}
|
|
152
|
+
/>
|
|
153
|
+
))
|
|
154
|
+
ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName
|
|
155
|
+
|
|
156
|
+
const ContextMenuSeparator = React.forwardRef<
|
|
157
|
+
React.ElementRef<typeof ContextMenuPrimitive.Separator>,
|
|
158
|
+
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>
|
|
159
|
+
>(({ className, ...props }, ref) => (
|
|
160
|
+
<ContextMenuPrimitive.Separator
|
|
161
|
+
ref={ref}
|
|
162
|
+
className={cn("-mx-1 my-1 h-px bg-border", className)}
|
|
163
|
+
{...props}
|
|
164
|
+
/>
|
|
165
|
+
))
|
|
166
|
+
ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName
|
|
167
|
+
|
|
168
|
+
const ContextMenuShortcut = ({
|
|
169
|
+
className,
|
|
170
|
+
...props
|
|
171
|
+
}: React.HTMLAttributes<HTMLSpanElement>) => {
|
|
172
|
+
return (
|
|
173
|
+
<span
|
|
174
|
+
className={cn(
|
|
175
|
+
"ml-auto text-xs tracking-widest text-muted-foreground",
|
|
176
|
+
className
|
|
177
|
+
)}
|
|
178
|
+
{...props}
|
|
179
|
+
/>
|
|
180
|
+
)
|
|
181
|
+
}
|
|
182
|
+
ContextMenuShortcut.displayName = "ContextMenuShortcut"
|
|
183
|
+
|
|
184
|
+
export {
|
|
185
|
+
ContextMenu,
|
|
186
|
+
ContextMenuTrigger,
|
|
187
|
+
ContextMenuContent,
|
|
188
|
+
ContextMenuItem,
|
|
189
|
+
ContextMenuCheckboxItem,
|
|
190
|
+
ContextMenuRadioItem,
|
|
191
|
+
ContextMenuLabel,
|
|
192
|
+
ContextMenuSeparator,
|
|
193
|
+
ContextMenuShortcut,
|
|
194
|
+
ContextMenuGroup,
|
|
195
|
+
ContextMenuPortal,
|
|
196
|
+
ContextMenuSub,
|
|
197
|
+
ContextMenuSubContent,
|
|
198
|
+
ContextMenuSubTrigger,
|
|
199
|
+
ContextMenuRadioGroup,
|
|
200
|
+
}
|