Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@
"posthog-js": "^1.215.3",
"solid-js": "^1.9.3",
"solid-markdown": "^2.0.13",
"solid-motionone": "^1.0.4",
"solid-presence": "^0.1.8",
"solid-toast": "^0.5.0",
"solid-transition-group": "^0.2.3",
Expand Down
80 changes: 47 additions & 33 deletions apps/desktop/src/routes/(window-chrome)/new-main/TargetMenuGrid.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { cx } from "cva";
import { createMemo, For, Match, Switch } from "solid-js";
import { Motion } from "solid-motionone";
import { Transition } from "solid-transition-group";
import type {
CaptureDisplayWithThumbnail,
CaptureWindowWithThumbnail,
Expand Down Expand Up @@ -134,23 +134,30 @@ export default function TargetMenuGrid(props: TargetMenuGridProps) {
return (
<For each={items() as CaptureDisplayWithThumbnail[]}>
{(item, index) => (
<Motion.div
initial={{ scale: 0.95, opacity: 0 }}
animate={{ scale: 1, opacity: 1 }}
exit={{ scale: 0.95 }}
transition={{ duration: 0.2, delay: index() * 0.1 }}
<Transition
appear
enterActiveClass="transition duration-200"
enterClass="scale-95 opacity-0"
enterToClass="scale-100 opacity-100"
exitActiveClass="transition duration-200"
exitClass="scale-100"
exitToClass="scale-95"
>
<TargetCard
variant="display"
target={item}
onClick={() => displayProps.onSelect?.(item)}
disabled={displayProps.disabled}
onKeyDown={handleKeyDown}
class="w-full"
data-target-menu-card="true"
highlightQuery={displayProps.highlightQuery}
/>
</Motion.div>
<div
style={{ "transition-delay": `${index() * 100}ms` }}
>
<TargetCard
variant="display"
target={item}
onClick={() => displayProps.onSelect?.(item)}
disabled={displayProps.disabled}
onKeyDown={handleKeyDown}
class="w-full"
data-target-menu-card="true"
highlightQuery={displayProps.highlightQuery}
/>
</div>
</Transition>
)}
</For>
);
Expand All @@ -162,23 +169,30 @@ export default function TargetMenuGrid(props: TargetMenuGridProps) {
return (
<For each={items() as CaptureWindowWithThumbnail[]}>
{(item, index) => (
<Motion.div
initial={{ scale: 0.95, opacity: 0 }}
animate={{ scale: 1, opacity: 1 }}
exit={{ scale: 0.95 }}
transition={{ duration: 0.2, delay: index() * 0.1 }}
<Transition
appear
enterActiveClass="transition duration-200"
enterClass="scale-95 opacity-0"
enterToClass="scale-100 opacity-100"
exitActiveClass="transition duration-200"
exitClass="scale-100"
exitToClass="scale-95"
>
<TargetCard
variant="window"
target={item}
onClick={() => windowProps.onSelect?.(item)}
disabled={windowProps.disabled}
onKeyDown={handleKeyDown}
class="w-full"
data-target-menu-card="true"
highlightQuery={windowProps.highlightQuery}
/>
</Motion.div>
<div
style={{ "transition-delay": `${index() * 100}ms` }}
>
<TargetCard
variant="window"
target={item}
onClick={() => windowProps.onSelect?.(item)}
disabled={windowProps.disabled}
onKeyDown={handleKeyDown}
class="w-full"
data-target-menu-card="true"
highlightQuery={windowProps.highlightQuery}
/>
</div>
</Transition>
)}
</For>
);
Expand Down
194 changes: 99 additions & 95 deletions apps/desktop/src/routes/(window-chrome)/new-main/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import {
Suspense,
} from "solid-js";
import { reconcile } from "solid-js/store";
import { Motion, Presence } from "solid-motionone";
// Removed solid-motionone in favor of solid-transition-group
import { Transition } from "solid-transition-group";
import Tooltip from "~/components/Tooltip";
import { Input } from "~/routes/editor/ui";
Expand Down Expand Up @@ -622,111 +622,115 @@ function Page() {
);

const TargetSelectionHome = () => (
<Motion.div
initial={{ scale: 0.95 }}
animate={{ scale: 1 }}
exit={{ scale: 0.95 }}
transition={{ duration: 0.2 }}
class="flex flex-col gap-2 w-full"
<Transition
appear
enterActiveClass="transition-transform duration-200"
enterClass="scale-95"
enterToClass="scale-100"
exitActiveClass="transition-transform duration-200"
exitClass="scale-100"
exitToClass="scale-95"
>
<div class="flex flex-row gap-2 items-stretch w-full text-xs text-gray-11">
<div
class={cx(
"flex flex-1 overflow-hidden rounded-lg bg-gray-3 ring-1 ring-transparent ring-offset-2 ring-offset-gray-1 transition focus-within:ring-blue-9 focus-within:ring-offset-2 focus-within:ring-offset-gray-1",
(rawOptions.targetMode === "display" || displayMenuOpen()) &&
"ring-blue-9",
)}
>
<TargetTypeButton
selected={rawOptions.targetMode === "display"}
Component={IconMdiMonitor}
disabled={isRecording()}
onClick={() => {
if (isRecording()) return;
setOptions("targetMode", (v) =>
v === "display" ? null : "display",
);
}}
name="Display"
class="flex-1 rounded-none focus-visible:ring-0 focus-visible:ring-offset-0"
/>
<TargetDropdownButton
<div class="flex flex-col gap-2 w-full">
<div class="flex flex-row gap-2 items-stretch w-full text-xs text-gray-11">
<div
class={cx(
"rounded-none border-l border-gray-6 focus-visible:ring-0 focus-visible:ring-offset-0",
displayMenuOpen() && "bg-gray-5",
"flex flex-1 overflow-hidden rounded-lg bg-gray-3 ring-1 ring-transparent ring-offset-2 ring-offset-gray-1 transition focus-within:ring-blue-9 focus-within:ring-offset-2 focus-within:ring-offset-gray-1",
(rawOptions.targetMode === "display" || displayMenuOpen()) &&
"ring-blue-9",
)}
ref={(el) => (displayTriggerRef = el)}
disabled={isRecording()}
expanded={displayMenuOpen()}
onClick={() => {
setDisplayMenuOpen((prev) => {
const next = !prev;
if (next) {
setWindowMenuOpen(false);
setHasOpenedDisplayMenu(true);
}
return next;
});
}}
aria-haspopup="menu"
aria-label="Choose display"
/>
</div>
<div
class={cx(
"flex flex-1 overflow-hidden rounded-lg bg-gray-3 ring-1 ring-transparent ring-offset-2 ring-offset-gray-1 transition focus-within:ring-blue-9 focus-within:ring-offset-2 focus-within:ring-offset-gray-1",
(rawOptions.targetMode === "window" || windowMenuOpen()) &&
"ring-blue-9",
)}
>
<TargetTypeButton
selected={rawOptions.targetMode === "window"}
Component={IconLucideAppWindowMac}
disabled={isRecording()}
onClick={() => {
if (isRecording()) return;
setOptions("targetMode", (v) =>
v === "window" ? null : "window",
);
}}
name="Window"
class="flex-1 rounded-none focus-visible:ring-0 focus-visible:ring-offset-0"
/>
<TargetDropdownButton
>
<TargetTypeButton
selected={rawOptions.targetMode === "display"}
Component={IconMdiMonitor}
disabled={isRecording()}
onClick={() => {
if (isRecording()) return;
setOptions("targetMode", (v) =>
v === "display" ? null : "display",
);
}}
name="Display"
class="flex-1 rounded-none focus-visible:ring-0 focus-visible:ring-offset-0"
/>
<TargetDropdownButton
class={cx(
"rounded-none border-l border-gray-6 focus-visible:ring-0 focus-visible:ring-offset-0",
displayMenuOpen() && "bg-gray-5",
)}
ref={(el) => (displayTriggerRef = el)}
disabled={isRecording()}
expanded={displayMenuOpen()}
onClick={() => {
setDisplayMenuOpen((prev) => {
const next = !prev;
if (next) {
setWindowMenuOpen(false);
setHasOpenedDisplayMenu(true);
}
return next;
});
}}
aria-haspopup="menu"
aria-label="Choose display"
/>
</div>
<div
class={cx(
"rounded-none border-l border-gray-6 focus-visible:ring-0 focus-visible:ring-offset-0",
windowMenuOpen() && "bg-gray-5",
"flex flex-1 overflow-hidden rounded-lg bg-gray-3 ring-1 ring-transparent ring-offset-2 ring-offset-gray-1 transition focus-within:ring-blue-9 focus-within:ring-offset-2 focus-within:ring-offset-gray-1",
(rawOptions.targetMode === "window" || windowMenuOpen()) &&
"ring-blue-9",
)}
ref={(el) => (windowTriggerRef = el)}
>
<TargetTypeButton
selected={rawOptions.targetMode === "window"}
Component={IconLucideAppWindowMac}
disabled={isRecording()}
onClick={() => {
if (isRecording()) return;
setOptions("targetMode", (v) =>
v === "window" ? null : "window",
);
}}
name="Window"
class="flex-1 rounded-none focus-visible:ring-0 focus-visible:ring-offset-0"
/>
<TargetDropdownButton
class={cx(
"rounded-none border-l border-gray-6 focus-visible:ring-0 focus-visible:ring-offset-0",
windowMenuOpen() && "bg-gray-5",
)}
ref={(el) => (windowTriggerRef = el)}
disabled={isRecording()}
expanded={windowMenuOpen()}
onClick={() => {
setWindowMenuOpen((prev) => {
const next = !prev;
if (next) {
setDisplayMenuOpen(false);
setHasOpenedWindowMenu(true);
}
return next;
});
}}
aria-haspopup="menu"
aria-label="Choose window"
/>
</div>
<TargetTypeButton
selected={rawOptions.targetMode === "area"}
Component={IconMaterialSymbolsScreenshotFrame2Rounded}
disabled={isRecording()}
expanded={windowMenuOpen()}
onClick={() => {
setWindowMenuOpen((prev) => {
const next = !prev;
if (next) {
setDisplayMenuOpen(false);
setHasOpenedWindowMenu(true);
}
return next;
});
if (isRecording()) return;
setOptions("targetMode", (v) => (v === "area" ? null : "area"));
}}
aria-haspopup="menu"
aria-label="Choose window"
name="Area"
/>
</div>
<TargetTypeButton
selected={rawOptions.targetMode === "area"}
Component={IconMaterialSymbolsScreenshotFrame2Rounded}
disabled={isRecording()}
onClick={() => {
if (isRecording()) return;
setOptions("targetMode", (v) => (v === "area" ? null : "area"));
}}
name="Area"
/>
<BaseControls />
</div>
<BaseControls />
</Motion.div>
</Transition>
);

const startSignInCleanup = listen("start-sign-in", async () => {
Expand Down
Loading