From 0e1ba80025c3e03f9f6df4e6a30ed777062eb3f8 Mon Sep 17 00:00:00 2001 From: John Jeong Date: Sat, 18 Oct 2025 16:40:32 +0900 Subject: [PATCH 01/12] add video chat icons --- apps/desktop2/public/assets/meet.png | Bin 0 -> 1318 bytes apps/desktop2/public/assets/webex.png | Bin 0 -> 2860 bytes apps/desktop2/public/assets/zoom.png | Bin 0 -> 10918 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/desktop2/public/assets/meet.png create mode 100644 apps/desktop2/public/assets/webex.png create mode 100644 apps/desktop2/public/assets/zoom.png diff --git a/apps/desktop2/public/assets/meet.png b/apps/desktop2/public/assets/meet.png new file mode 100644 index 0000000000000000000000000000000000000000..35f282ec7835d63bd0eefea4825d32d72197e867 GIT binary patch literal 1318 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 A#Q*>R literal 0 HcmV?d00001 diff --git a/apps/desktop2/public/assets/zoom.png b/apps/desktop2/public/assets/zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..dd86fb66c4d8ac3c68af438327659b8b328d1fd2 GIT binary patch literal 10918 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 literal 0 HcmV?d00001 From 207c5f971624a9cd0d7c4c050c1ec86bbb98a4ff Mon Sep 17 00:00:00 2001 From: John Jeong Date: Sat, 18 Oct 2025 16:41:21 +0900 Subject: [PATCH 02/12] apply icons to listen cta button --- .../main/body/sessions/floating/listen.tsx | 19 +++++++++++++++---- .../main/body/sessions/floating/shared.tsx | 14 ++++---------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/apps/desktop2/src/components/main/body/sessions/floating/listen.tsx b/apps/desktop2/src/components/main/body/sessions/floating/listen.tsx index 873347eb7..a4b31fef1 100644 --- a/apps/desktop2/src/components/main/body/sessions/floating/listen.tsx +++ b/apps/desktop2/src/components/main/body/sessions/floating/listen.tsx @@ -12,7 +12,8 @@ import { FloatingButton, formatTime } from "./shared"; type RemoteMeeting = | { type: "zoom"; url: string | null } - | { type: "google-meet"; url: string | null }; + | { type: "google-meet"; url: string | null } + | { type: "webex"; url: string | null }; export function ListenButton({ tab }: { tab: Extract }) { const { status, loading, stop } = useListener((state) => ({ @@ -56,7 +57,7 @@ function BeforeMeeingButton({ tab }: { tab: Extract } return ( } + icon={Zoom} > {isNarrow ? "Join & Listen" : "Join Zoom & Start listening"} @@ -67,17 +68,27 @@ function BeforeMeeingButton({ tab }: { tab: Extract } return ( } + icon={Google Meet} > {isNarrow ? "Join & Listen" : "Join Google Meet & Start listening"} ); } + if (remote?.type === "webex") { + return ( + } + > + {isNarrow ? "Join & Listen" : "Join Webex & Start listening"} + + ); + } + return ( } > Start listening diff --git a/apps/desktop2/src/components/main/body/sessions/floating/shared.tsx b/apps/desktop2/src/components/main/body/sessions/floating/shared.tsx index 8a10a6834..23d503d9b 100644 --- a/apps/desktop2/src/components/main/body/sessions/floating/shared.tsx +++ b/apps/desktop2/src/components/main/body/sessions/floating/shared.tsx @@ -1,7 +1,6 @@ -import { type ReactNode } from "react"; - import { Button } from "@hypr/ui/components/ui/button"; -import { cn } from "@hypr/ui/lib/utils"; + +import { type ReactNode } from "react"; export function FloatingButton({ icon, @@ -18,17 +17,12 @@ export function FloatingButton({ }) { return ( ); From aefee4935cd3d2025b9ee498495dfc33a122fa34 Mon Sep 17 00:00:00 2001 From: John Jeong Date: Sat, 18 Oct 2025 16:41:41 +0900 Subject: [PATCH 03/12] remove responsive for profile --- apps/desktop2/src/components/main/sidebar/profile/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop2/src/components/main/sidebar/profile/index.tsx b/apps/desktop2/src/components/main/sidebar/profile/index.tsx index 657e29db0..54502af74 100644 --- a/apps/desktop2/src/components/main/sidebar/profile/index.tsx +++ b/apps/desktop2/src/components/main/sidebar/profile/index.tsx @@ -194,7 +194,7 @@ function ProfileButton({ isExpanded, onClick }: { isExpanded: boolean; onClick: >
Date: Sun, 19 Oct 2025 15:57:14 +0900 Subject: [PATCH 04/12] profile banner --- apps/desktop2/public/assets/hyprnote-pro.png | Bin 0 -> 2157 bytes .../main/sidebar/profile/banner.tsx | 86 ++++++------------ .../components/main/sidebar/profile/index.tsx | 15 +-- .../main/sidebar/profile/notification.tsx | 42 ++++----- .../components/main/sidebar/profile/ota.tsx | 28 +++--- .../main/sidebar/profile/shared.tsx | 6 +- 6 files changed, 76 insertions(+), 101 deletions(-) create mode 100644 apps/desktop2/public/assets/hyprnote-pro.png diff --git a/apps/desktop2/public/assets/hyprnote-pro.png b/apps/desktop2/public/assets/hyprnote-pro.png new file mode 100644 index 0000000000000000000000000000000000000000..5381b4edd895e29f6c41fae027fa1f8d06130e86 GIT binary patch literal 2157 zcmV-z2$J`SP)^PO|gePh6J zba!`WGnq^`U3U7u-%4c`5o_tJqZ9Znl}bTfagTIs>^m;`u-DAMDz->ku{QqcbZyj6m6IZfilxl7WOk<+T%h*hWrPPUrzW>m$&oCB7O3 z_6KVG8C||&8%yTG2^tF|99S}CCnBGtvWR^i^$jILU!I$soID=^Cb0Xc_*}3fnM#1P z0}C0*K~MmVw5-7@P%i1o_N@&K4Kq_yQzM2Q%oy`0y~qjeNxHLds?A(6CmBwF6xw!16Wf=|I$~T@1o6ATe zim^m{%aSOK0v>Zbb*AaM%fm|eGRmAt_ofQFF>kj63ji|YMeQW3VZW}i?f3xku-VFh zb9Nx81b!5QYeprTC>dS4bSb>CW({CaRZg(n`HeqrxR^x6I-o;#VOh(7Yc(hd-oYqf zik5qOdtv+b?H~wFWaq%WX>K$e}YsXNZF^^qQ`&E)>9Adox#T3_CaB&p-*wdo#K=YuB#Dfq@^5 z=Xnv>e0~Pr-@O|q9*+~)0!0QN7Rk4bqXZYjsjQ-k)xk1bioZ7|18r?>u~lzwZXWvk z`{D89aU=~J0*itO7sH8IZ{K?k?{w}KEKu2@YjC*wTtXa;+&=Cz><7>hoTsVRX zYImSJOIt{!)36?3!-fq}T)ut#4)paMA(jiwEbBG~1}Z5f=)NUL6#0gyI*1xd=Toyz zGigwdoH$4^*~tzbJOtz9WE>ULw+cx}ETzQC4n}^rh~CFEETe(|uK~s;DBtrK?d|O_ zKTl5fRX;o$e;9$aUw9A`8%|J+JF(aadtnbofkNF_07D0}!S!pewNPI1DtvSNxOFnp zu5WCf0BR#zihrO%jBj9_mNXq59ayCkXAsw><($GYyycxOaOKMHSa|u8mfn}BrI6N- zBuV;_t!FXG4IS3N%9Sf&cxafN%kb_39rBSrqQ-RX+G8@|_Zh_0 z4|^y&Hjb@SP+{-h4+8UFy?PZcUAhPxH*TaCB_2&r7DPYM_CIBNWLb?#knc0r1nBm9 zSIjlCLyo!Y)~$nvhWa3!tzNyFmg#a{VOg3Pp(!#hqm$CPg88bFE zh7%JLy!;wk*&qyMI^RW%`^+NQAb`SfpBes(&Ndwn!^*m`d=`}XeBKOQ{*5u2AjPbt zjUdb(G#3#<>N}B!+VtaQqO{u9fxyUj=6rZ80EP(g)FI$fwsMk z7AlHJwvBR9u6jO0o;`@=e{Nz9fx=;AY1tE=Z2wrXc`l;EyD{kpS`wBRME62-pZXuH zdGh4RJpG5TKo7PGkg<<)YQ-^fuO;qf{Isz;;bbZIQi{^iwU0)0GK>EXDq`tm> z6
-
- + -
-
- -
+
+ Hyprnote Pro +

+ Try Hyprnote Pro +

+
-
-

- Try Hyprnote Pro -

-

- Experience smarter meetings -

-
-
+

+ Sign up now and experience smarter meetings with a 1-week free trial of Hyprnote Pro. +

- -
+
)} diff --git a/apps/desktop2/src/components/main/sidebar/profile/index.tsx b/apps/desktop2/src/components/main/sidebar/profile/index.tsx index 54502af74..36e8edc23 100644 --- a/apps/desktop2/src/components/main/sidebar/profile/index.tsx +++ b/apps/desktop2/src/components/main/sidebar/profile/index.tsx @@ -1,9 +1,10 @@ +import { commands as windowsCommands } from "@hypr/plugin-windows"; + import { clsx } from "clsx"; import { Calendar, ChevronUpIcon, FolderOpen, Settings, Users } from "lucide-react"; import { AnimatePresence, motion } from "motion/react"; import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react"; -import { commands as windowsCommands } from "@hypr/plugin-windows"; import { useAutoCloser } from "../../../../hooks/useAutoCloser"; import { useTabs } from "../../../../store/zustand/tabs"; import { TryProBanner } from "./banner"; @@ -122,7 +123,7 @@ export function ProfileSection() {
@@ -205,13 +206,13 @@ function ProfileButton({ isExpanded, onClick }: { isExpanded: boolean; onClick: Profile
-
-
John Jeong
+
+
John Jeong
-
+
void }) { icon={Bell} label="Notifications" onClick={onClick} + suffixIcon={ArrowRight} /> ); } @@ -37,22 +40,17 @@ const MOCK_NOTIFICATIONS: Notification[] = [ export function NotificationsMenuContent({ onBack }: { onBack: () => void }) { return ( -
- - -
-

Notifications

+
+
+ + Notifications
@@ -66,8 +64,8 @@ export function NotificationsMenuContent({ onBack }: { onBack: () => void }) { {MOCK_NOTIFICATIONS.length === 0 && (
- -

No notifications

+ +

No notifications

)} @@ -96,7 +94,7 @@ function NotificationItem({ notification }: { notification: Notification }) { "flex w-full gap-3 rounded-lg", "px-4 py-2.5", "text-left", - "transition-colors hover:bg-slate-100", + "transition-colors hover:bg-neutral-100", !notification.read && "bg-blue-50/50", ])} > @@ -131,10 +129,10 @@ function NotificationItem({ notification }: { notification: Notification }) {

{!notification.read && }
-

+

{notification.description}

-

{notification.timestamp}

+

{notification.timestamp}

); diff --git a/apps/desktop2/src/components/main/sidebar/profile/ota.tsx b/apps/desktop2/src/components/main/sidebar/profile/ota.tsx index 00d0e82b4..4bfa3cd34 100644 --- a/apps/desktop2/src/components/main/sidebar/profile/ota.tsx +++ b/apps/desktop2/src/components/main/sidebar/profile/ota.tsx @@ -1,9 +1,11 @@ +import { Spinner } from "@hypr/ui/components/ui/spinner"; + import { relaunch } from "@tauri-apps/plugin-process"; import { check, type Update } from "@tauri-apps/plugin-updater"; import { createStore } from "@xstate/store"; import { useSelector } from "@xstate/store/react"; import { clsx } from "clsx"; -import { AlertCircle, CheckCircle, Download, Loader2, RefreshCw, X } from "lucide-react"; +import { AlertCircle, CheckCircle, Download, RefreshCw, X } from "lucide-react"; import { MenuItem } from "./shared"; @@ -74,7 +76,7 @@ const updateStore = createStore({ ? Math.round( ((context.downloadProgress.downloaded + event.chunkLength) / (event.contentLength ?? context.downloadProgress.total ?? 1)) - * 100, + * 100, ) : 0, }, @@ -205,10 +207,10 @@ export function UpdateChecker() { className={clsx( "flex w-full items-center gap-2.5", "px-4 py-1.5", - "text-sm text-slate-700", + "text-sm text-neutral-700", )} > - + Checking for updates...
); @@ -220,7 +222,7 @@ export function UpdateChecker() { className={clsx( "flex w-full items-center gap-2.5", "px-4 py-1.5", - "text-sm text-slate-700", + "text-sm text-neutral-700", )} > @@ -251,7 +253,7 @@ export function UpdateChecker() { Retry } - onClick={() => {}} + onClick={() => { }} /> ); } @@ -269,9 +271,9 @@ export function UpdateChecker() { if (state === "downloading") { return ( -
+
- + Downloading... {downloadProgress.percentage}% @@ -280,15 +282,15 @@ export function UpdateChecker() { className={clsx( "flex h-6 w-6 items-center justify-center", "rounded-full", - "hover:bg-slate-100", + "hover:bg-neutral-100", "transition-colors", )} title="Cancel download" > - +
-
+
- + Installing...
); diff --git a/apps/desktop2/src/components/main/sidebar/profile/shared.tsx b/apps/desktop2/src/components/main/sidebar/profile/shared.tsx index bea47873c..3e279886d 100644 --- a/apps/desktop2/src/components/main/sidebar/profile/shared.tsx +++ b/apps/desktop2/src/components/main/sidebar/profile/shared.tsx @@ -1,10 +1,11 @@ import { clsx } from "clsx"; export function MenuItem( - { icon: Icon, label, badge, onClick }: { + { icon: Icon, label, badge, suffixIcon: SuffixIcon, onClick }: { icon: any; label: string; badge?: number | React.ReactNode; + suffixIcon?: any; onClick: () => void; }, ) { @@ -14,7 +15,7 @@ export function MenuItem( "flex w-full items-center gap-2.5 rounded-lg", "px-4 py-1.5", "text-sm text-black", - "transition-colors hover:bg-slate-100", + "transition-colors hover:bg-neutral-100", )} onClick={onClick} > @@ -36,6 +37,7 @@ export function MenuItem( ) : badge )} + {SuffixIcon && } ); } From 8d182e7e20ceb5a85c66def9a646d67b13e893e5 Mon Sep 17 00:00:00 2001 From: John Jeong Date: Sun, 19 Oct 2025 01:17:53 +0900 Subject: [PATCH 05/12] use tailwind colors --- .../src/components/main/body/index.tsx | 2 +- .../body/sessions/outer-header/folder.tsx | 6 +-- .../src/components/main/body/shared.tsx | 8 ++-- .../src/components/main/sidebar/index.tsx | 2 +- .../components/main/sidebar/search/index.tsx | 2 +- apps/desktop2/tailwind.config.ts | 6 --- .../ui/src/components/block/event-chip.tsx | 14 +++--- .../block/meeting-metadata-chip.tsx | 46 +++++++++---------- .../components/block/participants-chip.tsx | 30 ++++++------ 9 files changed, 55 insertions(+), 61 deletions(-) diff --git a/apps/desktop2/src/components/main/body/index.tsx b/apps/desktop2/src/components/main/body/index.tsx index fa980d17a..e1d46c082 100644 --- a/apps/desktop2/src/components/main/body/index.tsx +++ b/apps/desktop2/src/components/main/body/index.tsx @@ -142,7 +142,7 @@ function Header({ tabs }: { tabs: Tab[] }) { onClick={handleNewNote} variant="ghost" size="icon" - className="text-color3" + className="text-neutral-500" > diff --git a/apps/desktop2/src/components/main/body/sessions/outer-header/folder.tsx b/apps/desktop2/src/components/main/body/sessions/outer-header/folder.tsx index 2d1e558dd..23a712876 100644 --- a/apps/desktop2/src/components/main/body/sessions/outer-header/folder.tsx +++ b/apps/desktop2/src/components/main/body/sessions/outer-header/folder.tsx @@ -33,7 +33,7 @@ export function FolderChain({ sessionId }: { sessionId: string }) { return ( - + {folderId && } {!folderId ? @@ -106,7 +106,7 @@ function RenderIfRootNotExist( <> - + Select folder @@ -143,7 +143,7 @@ function TitleInput({ title, handleChangeTitle }: { title: string; handleChangeT handleChangeTitle(e.target.value)} /> diff --git a/apps/desktop2/src/components/main/body/shared.tsx b/apps/desktop2/src/components/main/body/shared.tsx index 4820ba6ca..311712435 100644 --- a/apps/desktop2/src/components/main/body/shared.tsx +++ b/apps/desktop2/src/components/main/body/shared.tsx @@ -59,8 +59,8 @@ export function TabItemBase( className={clsx([ "flex items-center gap-2 cursor-pointer group", "w-48 h-full pl-2 pr-1", - "bg-color1 rounded-lg border", - active ? "text-black border-black" : "text-color3 border-transparent", + "bg-neutral-50 rounded-lg border", + active ? "text-black border-black" : "text-neutral-500 border-transparent", ])} >
@@ -75,8 +75,8 @@ export function TabItemBase( className={clsx([ "flex-shrink-0 transition-opacity", active - ? "opacity-100 text-color4" - : "opacity-0 group-hover:opacity-100 text-color3", + ? "opacity-100 text-neutral-700" + : "opacity-0 group-hover:opacity-100 text-neutral-500", ])} size="icon" variant="ghost" diff --git a/apps/desktop2/src/components/main/sidebar/index.tsx b/apps/desktop2/src/components/main/sidebar/index.tsx index 102467e40..53748b512 100644 --- a/apps/desktop2/src/components/main/sidebar/index.tsx +++ b/apps/desktop2/src/components/main/sidebar/index.tsx @@ -23,7 +23,7 @@ export function LeftSidebar() { "flex flex-row shrink-0", "flex w-full items-center justify-end h-9 py-1", "rounded-lg", - "pl-[72px] bg-color1", + "pl-[72px] bg-neutral-50", ])} > diff --git a/packages/ui/src/components/block/meeting-metadata-chip.tsx b/packages/ui/src/components/block/meeting-metadata-chip.tsx index 5aa72d94a..b35fecf74 100644 --- a/packages/ui/src/components/block/meeting-metadata-chip.tsx +++ b/packages/ui/src/components/block/meeting-metadata-chip.tsx @@ -121,7 +121,7 @@ export function MeetingMetadataChip({ @@ -347,7 +347,7 @@ function ParticipantsSection({ > {participant.full_name || "Unknown"} {participant.organization?.name && ( - + {participant.organization.name} )} @@ -355,7 +355,7 @@ function ParticipantsSection({ )) ) : ( -
+
No matching participants found
)} @@ -387,26 +387,26 @@ function ParticipantChip({ participant, currentUserId, onClick, onRemove }: Part || (participant.id === currentUserId ? "You" : "Unknown"); return ( -
-
- - +
+
+ + {participant.full_name ? getInitials(participant.full_name) : "?"} - + {displayName}
-
+
{participant.email && ( e.stopPropagation()} - className="text-color3 transition-colors hover:text-color4 opacity-0 group-hover:opacity-100" + className="text-neutral-500 transition-colors hover:text-neutral-700 opacity-0 group-hover:opacity-100" > - + )} {participant.linkedin_username && ( @@ -415,9 +415,9 @@ function ParticipantChip({ participant, currentUserId, onClick, onRemove }: Part onClick={(e) => e.stopPropagation()} target="_blank" rel="noopener noreferrer" - className="text-color3 transition-colors hover:text-color4 opacity-0 group-hover:opacity-100" + className="text-neutral-500 transition-colors hover:text-neutral-700 opacity-0 group-hover:opacity-100" > - + )}
diff --git a/packages/ui/src/components/block/participants-chip.tsx b/packages/ui/src/components/block/participants-chip.tsx index b7c7679d3..01b7d26d9 100644 --- a/packages/ui/src/components/block/participants-chip.tsx +++ b/packages/ui/src/components/block/participants-chip.tsx @@ -82,9 +82,9 @@ export function ParticipantsChip({ isVeryNarrow ? "px-1.5" : "px-2", )} > - - {getButtonText()} - {count > 1 && !isVeryNarrow && !isNarrow && + {count - 1}} + + {getButtonText()} + {count > 1 && !isVeryNarrow && !isNarrow && + {count - 1}}
@@ -141,7 +141,7 @@ function ParticipantList({
{participants.map((group, index) => (
-
+
{group.organization?.name || "No organization"}
@@ -199,7 +199,7 @@ function ParticipantItem({ )} > - + {participant.full_name ? getInitials(participant.full_name) : "?"} @@ -217,10 +217,10 @@ function ParticipantItem({ )}
- + {participant.full_name || (participant.id === currentUserId ? "You" : "Unknown")} - {participant.job_title && {participant.job_title}} + {participant.job_title && {participant.job_title}}
@@ -229,7 +229,7 @@ function ParticipantItem({ e.stopPropagation()} - className="text-color3 transition-colors hover:text-color4 p-1 rounded-full hover:bg-neutral-200" + className="text-neutral-500 transition-colors hover:text-neutral-700 p-1 rounded-full hover:bg-neutral-200" > @@ -238,7 +238,7 @@ function ParticipantItem({ e.stopPropagation()} - className="text-color3 transition-colors hover:text-color4 p-1 rounded-full hover:bg-neutral-200" + className="text-neutral-500 transition-colors hover:text-neutral-700 p-1 rounded-full hover:bg-neutral-200" > @@ -272,18 +272,18 @@ function AddParticipantInput({ >
- + onChange?.(e.target.value)} placeholder="Find person" - className="w-full bg-transparent text-sm focus:outline-none placeholder:text-color3" + className="w-full bg-transparent text-sm focus:outline-none placeholder:text-neutral-500" /> {value.trim() && ( @@ -301,7 +301,7 @@ function AddParticipantInput({ > {participant.full_name} {participant.organization?.name && ( - + {participant.organization.name} )} @@ -312,8 +312,8 @@ function AddParticipantInput({ type="submit" className="flex items-center px-3 py-2 text-sm text-left hover:bg-neutral-100 transition-colors w-full" > - - Create "{value.trim()}" + + Create "{value.trim()}" )} From 68b4907ac3e8b0281fac76559acbf10d2651e7e3 Mon Sep 17 00:00:00 2001 From: John Jeong Date: Sun, 19 Oct 2025 02:05:20 +0900 Subject: [PATCH 06/12] added separator --- packages/ui/src/components/ui/separator.tsx | 31 ++++++++ pnpm-lock.yaml | 79 ++++++--------------- 2 files changed, 51 insertions(+), 59 deletions(-) create mode 100644 packages/ui/src/components/ui/separator.tsx diff --git a/packages/ui/src/components/ui/separator.tsx b/packages/ui/src/components/ui/separator.tsx new file mode 100644 index 000000000..e1e51f19c --- /dev/null +++ b/packages/ui/src/components/ui/separator.tsx @@ -0,0 +1,31 @@ +"use client"; + +import * as SeparatorPrimitive from "@radix-ui/react-separator"; +import * as React from "react"; + +import { cn } from "@hypr/ui/lib/utils"; + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref, + ) => ( + + ), +); +Separator.displayName = SeparatorPrimitive.Root.displayName; + +export { Separator }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 496731f4b..48cf526a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -177,10 +177,10 @@ importers: version: 10.1.0 '@tanstack/react-router-devtools': specifier: ^1.133.3 - version: 1.133.3(@tanstack/react-router@1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.3)(@types/node@24.8.0)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + version: 1.133.3(@tanstack/react-router@1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.3)(@types/node@24.8.0)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/router-plugin': specifier: ^1.133.4 - version: 1.133.4(@tanstack/react-router@1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.133.4(@tanstack/react-router@1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@tauri-apps/cli': specifier: ^2.8.4 version: 2.8.4 @@ -195,7 +195,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.7.0(vite@7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) @@ -210,10 +210,10 @@ importers: version: 5.8.3 vite: specifier: ^7.1.10 - version: 7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.8.0)(jiti@1.21.7)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.4(@types/node@24.8.0)(typescript@5.8.3))(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.8.0)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.4(@types/node@24.8.0)(typescript@5.8.3))(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) apps/pro: dependencies: @@ -10832,13 +10832,13 @@ snapshots: - tsx - yaml - '@tanstack/react-router-devtools@1.133.3(@tanstack/react-router@1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.3)(@types/node@24.8.0)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.133.3(@tanstack/react-router@1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.3)(@types/node@24.8.0)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/react-router': 1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-devtools-core': 1.133.3(@tanstack/router-core@1.133.3)(@types/node@24.8.0)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.1)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/router-devtools-core': 1.133.3(@tanstack/router-core@1.133.3)(@types/node@24.8.0)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@tanstack/router-core' - '@types/node' @@ -10966,14 +10966,14 @@ snapshots: - tsx - yaml - '@tanstack/router-devtools-core@1.133.3(@tanstack/router-core@1.133.3)(@types/node@24.8.0)(csstype@3.1.3)(jiti@1.21.7)(lightningcss@1.30.1)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.133.3(@tanstack/router-core@1.133.3)(@types/node@24.8.0)(csstype@3.1.3)(jiti@2.6.1)(lightningcss@1.30.1)(solid-js@1.9.7)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/router-core': 1.133.3 clsx: 2.1.1 goober: 2.1.18(csstype@3.1.3) solid-js: 1.9.7 tiny-invariant: 1.3.3 - vite: 7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: csstype: 3.1.3 transitivePeerDependencies: @@ -11024,7 +11024,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.133.4(@tanstack/react-router@1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.133.4(@tanstack/react-router@1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -11042,7 +11042,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.133.3(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - vite: 7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -11724,7 +11724,7 @@ snapshots: '@vercel/oidc@3.0.3': {} - '@vitejs/plugin-react@4.7.0(vite@7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@4.7.0(vite@7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -11732,7 +11732,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -11765,14 +11765,14 @@ snapshots: msw: 2.10.4(@types/node@22.18.10)(typescript@5.9.3) vite: 7.1.10(@types/node@22.18.10)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@3.2.4(msw@2.10.4(@types/node@24.8.0)(typescript@5.8.3))(vite@7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.10.4(@types/node@24.8.0)(typescript@5.8.3))(vite@7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: msw: 2.10.4(@types/node@24.8.0)(typescript@5.8.3) - vite: 7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@vitest/mocker@3.2.4(msw@2.10.4(@types/node@24.8.0)(typescript@5.9.3))(vite@7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: @@ -15948,27 +15948,6 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite-node@3.2.4(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 @@ -16019,24 +15998,6 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - esbuild: 0.25.11 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.52.4 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.8.0 - fsevents: 2.3.3 - jiti: 1.21.7 - lightningcss: 1.30.1 - sugarss: 5.0.1(postcss@8.5.6) - terser: 5.44.0 - tsx: 4.20.6 - yaml: 2.8.1 - vite@7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.11 @@ -16102,11 +16063,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.8.0)(jiti@1.21.7)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.4(@types/node@24.8.0)(typescript@5.8.3))(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.8.0)(jiti@2.6.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.4(@types/node@24.8.0)(typescript@5.8.3))(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.10.4(@types/node@24.8.0)(typescript@5.8.3))(vite@7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.4(@types/node@24.8.0)(typescript@5.8.3))(vite@7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -16124,8 +16085,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.10(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.8.0)(jiti@1.21.7)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.10(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.8.0)(jiti@2.6.1)(lightningcss@1.30.1)(sugarss@5.0.1(postcss@8.5.6))(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 From 6c69e25fabf959b3ef95bc8a29f15e7af309d4ef Mon Sep 17 00:00:00 2001 From: John Jeong Date: Sun, 19 Oct 2025 02:05:55 +0900 Subject: [PATCH 07/12] make rounded-lg for modals --- packages/ui/src/components/ui/dropdown-menu.tsx | 4 ++-- packages/ui/src/components/ui/popover.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/components/ui/dropdown-menu.tsx b/packages/ui/src/components/ui/dropdown-menu.tsx index cb10bc24b..060c81424 100644 --- a/packages/ui/src/components/ui/dropdown-menu.tsx +++ b/packages/ui/src/components/ui/dropdown-menu.tsx @@ -44,7 +44,7 @@ const DropdownMenuSubContent = React.forwardRef< Date: Sun, 19 Oct 2025 02:06:10 +0900 Subject: [PATCH 08/12] prevent toggle from closing --- .../src/components/main/body/sessions/outer-header/other.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop2/src/components/main/body/sessions/outer-header/other.tsx b/apps/desktop2/src/components/main/body/sessions/outer-header/other.tsx index 8e2116095..affdb8106 100644 --- a/apps/desktop2/src/components/main/body/sessions/outer-header/other.tsx +++ b/apps/desktop2/src/components/main/body/sessions/outer-header/other.tsx @@ -105,7 +105,7 @@ export function OthersButton(_: { sessionId: string }) { - + e.preventDefault()}> Lock note From d50a8db7ccafb7ae2ea05484a8d062876a914ae2 Mon Sep 17 00:00:00 2001 From: John Jeong Date: Sun, 19 Oct 2025 02:07:06 +0900 Subject: [PATCH 09/12] added share modal --- .../main/body/sessions/outer-header/share.tsx | 259 +++++++++++++++++- 1 file changed, 256 insertions(+), 3 deletions(-) diff --git a/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx b/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx index 00be6c60a..86723c9f9 100644 --- a/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx +++ b/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx @@ -1,9 +1,262 @@ +import { Avatar, AvatarFallback } from "@hypr/ui/components/ui/avatar"; import { Button } from "@hypr/ui/components/ui/button"; +import { Popover, PopoverContent, PopoverTrigger } from "@hypr/ui/components/ui/popover"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@hypr/ui/components/ui/select"; +import { Separator } from "@hypr/ui/components/ui/separator"; + +import { CircleMinus, Link2Icon, SearchIcon } from "lucide-react"; +import { useState } from "react"; + +interface Person { + id: string; + name: string; + email?: string; + role: "viewer" | "editor"; + isParticipant?: boolean; +} export function ShareButton(_: { sessionId: string }) { + const [searchQuery, setSearchQuery] = useState(""); + const [selectedPeople, setSelectedPeople] = useState([]); + const [invitedPeople, setInvitedPeople] = useState([ + { id: "1", name: "John Doe", email: "john@example.com", role: "editor", isParticipant: true }, + { id: "2", name: "Jane Smith", email: "jane@example.com", role: "editor", isParticipant: true }, + ]); + + const searchResults: Person[] = searchQuery.trim() + ? [ + { id: "3", name: "Alice Johnson", email: "alice@example.com", role: "viewer" as const }, + { id: "4", name: "Bob Wilson", email: "bob@example.com", role: "viewer" as const }, + ].filter((person) => person.name.toLowerCase().includes(searchQuery.toLowerCase())) + : []; + + const handleSelectPerson = (person: Person) => { + if (!selectedPeople.find((p) => p.id === person.id)) { + setSelectedPeople([...selectedPeople, person]); + } + setSearchQuery(""); + }; + + const handleRemoveSelected = (personId: string) => { + setSelectedPeople(selectedPeople.filter((p) => p.id !== personId)); + }; + + const handleInvite = () => { + const newInvites = selectedPeople.filter( + (selected) => !invitedPeople.find((invited) => invited.id === selected.id), + ); + setInvitedPeople([...invitedPeople, ...newInvites]); + setSelectedPeople([]); + // TODO: Implement actual invite functionality + console.log("Invite:", newInvites); + }; + + const handleRemovePerson = (personId: string) => { + setInvitedPeople(invitedPeople.filter((p) => p.id !== personId)); + }; + + const handleRoleChange = (personId: string, role: "viewer" | "editor") => { + setInvitedPeople( + invitedPeople.map((p) => (p.id === personId ? { ...p, role } : p)), + ); + }; + + const handleCopyLink = () => { + // TODO: Implement copy link functionality + console.log("Copy link"); + }; + + const getInitials = (name: string) => { + return name + .split(" ") + .map((n) => n[0]) + .join("") + .toUpperCase() + .slice(0, 2); + }; + return ( - + + + + + + +
+
+
+ + setSearchQuery(e.target.value)} + placeholder="Search for people" + className="w-full bg-transparent text-sm focus:outline-none placeholder:text-neutral-500" + /> +
+ + {searchQuery.trim() && searchResults.length > 0 && ( +
+ {searchResults.map((person) => ( + + ))} +
+ )} +
+ + {selectedPeople.length > 0 && ( +
+
+ {selectedPeople.map((person) => ( +
+
+
+
+ + + {getInitials(person.name)} + + +
+ +
+
+ + {person.name} + + {person.email && ( + {person.email} + )} +
+
+
+ ))} +
+
+ )} + + {selectedPeople.length > 0 && ( + + )} + + {selectedPeople.length > 0 && } + + {invitedPeople.length > 0 && ( +
+
+ People with access +
+
+ {invitedPeople.map((person) => ( +
+
+
+
+ + + {getInitials(person.name)} + + +
+ +
+
+ + {person.name} + + {person.email && ( + {person.email} + )} +
+
+ + +
+ ))} +
+
+ )} + + +
+
+
); } From bf55e855ddf67bc3d0a6235f13addcf38c343c10 Mon Sep 17 00:00:00 2001 From: John Jeong Date: Sun, 19 Oct 2025 15:56:33 +0900 Subject: [PATCH 10/12] coderabbit fix --- .../main/body/sessions/outer-header/share.tsx | 10 +--------- .../src/components/main/sidebar/profile/banner.tsx | 4 ++-- .../src/components/main/sidebar/profile/index.tsx | 10 +++++----- packages/ui/src/components/block/event-chip.tsx | 2 +- .../ui/src/components/block/meeting-metadata-chip.tsx | 4 ++-- 5 files changed, 11 insertions(+), 19 deletions(-) diff --git a/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx b/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx index 86723c9f9..f9c5a0fb0 100644 --- a/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx +++ b/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx @@ -12,6 +12,7 @@ import { Separator } from "@hypr/ui/components/ui/separator"; import { CircleMinus, Link2Icon, SearchIcon } from "lucide-react"; import { useState } from "react"; +import { getInitials } from "../../contacts/shared"; interface Person { id: string; @@ -72,15 +73,6 @@ export function ShareButton(_: { sessionId: string }) { console.log("Copy link"); }; - const getInitials = (name: string) => { - return name - .split(" ") - .map((n) => n[0]) - .join("") - .toUpperCase() - .slice(0, 2); - }; - return ( diff --git a/apps/desktop2/src/components/main/sidebar/profile/banner.tsx b/apps/desktop2/src/components/main/sidebar/profile/banner.tsx index bb25cd6ed..7418bfb0c 100644 --- a/apps/desktop2/src/components/main/sidebar/profile/banner.tsx +++ b/apps/desktop2/src/components/main/sidebar/profile/banner.tsx @@ -9,7 +9,7 @@ export function TryProBanner({ isDismissed, onDismiss }: { isDismissed: boolean; onDismiss(); }; - const handleSignUp = () => {}; + const handleSignUp = () => { }; return ( @@ -61,7 +61,7 @@ export function TryProBanner({ isDismissed, onDismiss }: { isDismissed: boolean; onClick={handleSignUp} className="w-full" > - Start 2 week Free Trial + Start 1 week Free Trial
diff --git a/apps/desktop2/src/components/main/sidebar/profile/index.tsx b/apps/desktop2/src/components/main/sidebar/profile/index.tsx index 36e8edc23..de6e046a7 100644 --- a/apps/desktop2/src/components/main/sidebar/profile/index.tsx +++ b/apps/desktop2/src/components/main/sidebar/profile/index.tsx @@ -151,7 +151,7 @@ export function ProfileSection() { -
+
{menuItems.map((item) => )} @@ -189,7 +189,7 @@ function ProfileButton({ isExpanded, onClick }: { isExpanded: boolean; onClick: "text-left", "transition-all duration-300", "hover:bg-gray-100", - isExpanded && "bg-neutral-50 border-t border-slate-100", + isExpanded && "bg-neutral-50 border-t border-neutral-100", )} onClick={onClick} > @@ -217,10 +217,10 @@ function ProfileButton({ isExpanded, onClick }: { isExpanded: boolean; onClick: className={clsx( "hidden md:inline-block", "rounded-full", - "border border-slate-900", + "border border-neutral-900", "bg-white", "px-2.5 py-0.5", - "text-[11px] font-medium text-slate-900", + "text-[11px] font-medium text-neutral-900", )} > Pro trial @@ -229,7 +229,7 @@ function ProfileButton({ isExpanded, onClick }: { isExpanded: boolean; onClick: className={clsx( "h-4 w-4", "transition-transform duration-300", - isExpanded ? "rotate-180 text-slate-500" : "text-slate-400", + isExpanded ? "rotate-180 text-neutral-500" : "text-neutral-400", )} />
diff --git a/packages/ui/src/components/block/event-chip.tsx b/packages/ui/src/components/block/event-chip.tsx index 37ef8e58f..423353653 100644 --- a/packages/ui/src/components/block/event-chip.tsx +++ b/packages/ui/src/components/block/event-chip.tsx @@ -264,7 +264,7 @@ function EventSearch({ placeholder="Search past events..." value={searchQuery} onChange={(e) => onSearchChange?.(e.target.value)} - className="w-full bg-transparent text-sm focus:outline-none placeholder:text-color3" + className="w-full bg-transparent text-sm focus:outline-none placeholder:text-neutral-500" />
diff --git a/packages/ui/src/components/block/meeting-metadata-chip.tsx b/packages/ui/src/components/block/meeting-metadata-chip.tsx index b35fecf74..dff36c8fe 100644 --- a/packages/ui/src/components/block/meeting-metadata-chip.tsx +++ b/packages/ui/src/components/block/meeting-metadata-chip.tsx @@ -313,7 +313,7 @@ function ParticipantsSection({ setTimeout(() => setIsFocused(false), 200); }} placeholder="Add participant" - className="w-full bg-transparent text-sm focus:outline-none placeholder:text-color3" + className="w-full bg-transparent text-sm focus:outline-none placeholder:text-neutral-500" /> {searchQuery.trim() && ( From a75bc8eec088d6d6f2c32ac1a624787b1db8c59b Mon Sep 17 00:00:00 2001 From: John Jeong Date: Sun, 19 Oct 2025 16:16:13 +0900 Subject: [PATCH 11/12] fmt --- .../main/body/sessions/outer-header/share.tsx | 29 +++++-------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx b/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx index f9c5a0fb0..8001a0c87 100644 --- a/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx +++ b/apps/desktop2/src/components/main/body/sessions/outer-header/share.tsx @@ -1,13 +1,7 @@ import { Avatar, AvatarFallback } from "@hypr/ui/components/ui/avatar"; import { Button } from "@hypr/ui/components/ui/button"; import { Popover, PopoverContent, PopoverTrigger } from "@hypr/ui/components/ui/popover"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "@hypr/ui/components/ui/select"; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@hypr/ui/components/ui/select"; import { Separator } from "@hypr/ui/components/ui/separator"; import { CircleMinus, Link2Icon, SearchIcon } from "lucide-react"; @@ -103,10 +97,8 @@ export function ShareButton(_: { sessionId: string }) { type="button" onClick={() => handleSelectPerson(person)} className="flex items-center justify-between px-3 py-2 text-sm text-left hover:bg-neutral-100 transition-colors w-full disabled:opacity-50" - disabled={ - selectedPeople.some((p) => p.id === person.id) - || invitedPeople.some((p) => p.id === person.id) - } + disabled={selectedPeople.some((p) => p.id === person.id) + || invitedPeople.some((p) => p.id === person.id)} >
@@ -116,9 +108,7 @@ export function ShareButton(_: { sessionId: string }) {
{person.name} - {person.email && ( - {person.email} - )} + {person.email && {person.email}}
@@ -158,9 +148,7 @@ export function ShareButton(_: { sessionId: string }) { {person.name} - {person.email && ( - {person.email} - )} + {person.email && {person.email}}
@@ -211,16 +199,13 @@ export function ShareButton(_: { sessionId: string }) { {person.name} - {person.email && ( - {person.email} - )} + {person.email && {person.email}}