diff options
| author | David Hill <[email protected]> | 2026-01-19 17:01:56 +0000 |
|---|---|---|
| committer | David Hill <[email protected]> | 2026-01-19 17:10:27 +0000 |
| commit | 2dbdd18483a6cfbda7c965e8f7b4df89d39d5432 (patch) | |
| tree | 3e31a0493f8d8435608f35da75b00554db3af21a /packages/app/src | |
| parent | b0794172bffd58bc7e1d1fef6b999259f798edf9 (diff) | |
| download | opencode-2dbdd18483a6cfbda7c965e8f7b4df89d39d5432.tar.gz opencode-2dbdd18483a6cfbda7c965e8f7b4df89d39d5432.zip | |
add hover overlay with upload/trash icons to project icon in edit dialog
Diffstat (limited to 'packages/app/src')
| -rw-r--r-- | packages/app/src/components/dialog-edit-project.tsx | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/packages/app/src/components/dialog-edit-project.tsx b/packages/app/src/components/dialog-edit-project.tsx index f6e07df60..091f00702 100644 --- a/packages/app/src/components/dialog-edit-project.tsx +++ b/packages/app/src/components/dialog-edit-project.tsx @@ -27,11 +27,15 @@ export function DialogEditProject(props: { project: LocalProject }) { }) const [dragOver, setDragOver] = createSignal(false) + const [iconHover, setIconHover] = createSignal(false) function handleFileSelect(file: File) { if (!file.type.startsWith("image/")) return const reader = new FileReader() - reader.onload = (e) => setStore("iconUrl", e.target?.result as string) + reader.onload = (e) => { + setStore("iconUrl", e.target?.result as string) + setIconHover(false) + } reader.readAsDataURL(file) } @@ -92,9 +96,9 @@ export function DialogEditProject(props: { project: LocalProject }) { <div class="flex flex-col gap-2"> <label class="text-12-medium text-text-weak">Icon</label> <div class="flex gap-3 items-start"> - <div class="relative"> + <div class="relative" onMouseEnter={() => setIconHover(true)} onMouseLeave={() => setIconHover(false)}> <div - class="size-16 rounded-md transition-colors cursor-pointer" + class="relative size-16 rounded-md transition-colors cursor-pointer" classList={{ "border-text-interactive-base bg-surface-info-base/20": dragOver(), "border-border-base hover:border-border-strong": !dragOver(), @@ -103,7 +107,13 @@ export function DialogEditProject(props: { project: LocalProject }) { onDrop={handleDrop} onDragOver={handleDragOver} onDragLeave={handleDragLeave} - onClick={() => document.getElementById("icon-upload")?.click()} + onClick={() => { + if (store.iconUrl && iconHover()) { + clearIcon() + } else { + document.getElementById("icon-upload")?.click() + } + }} > <Show when={store.iconUrl} @@ -120,15 +130,44 @@ export function DialogEditProject(props: { project: LocalProject }) { <img src={store.iconUrl} alt="Project icon" class="size-full object-cover" /> </Show> </div> - <Show when={store.iconUrl}> - <button - type="button" - class="absolute -top-1.5 -right-1.5 size-5 rounded-full bg-surface-raised-base border border-border-base flex items-center justify-center hover:bg-surface-raised-base-hover" - onClick={clearIcon} - > - <Icon name="close" class="size-3 text-icon-base" /> - </button> - </Show> + <div + style={{ + position: "absolute", + top: 0, + left: 0, + width: "64px", + height: "64px", + background: "rgba(0,0,0,0.6)", + "border-radius": "6px", + "z-index": 10, + "pointer-events": "none", + opacity: iconHover() && !store.iconUrl ? 1 : 0, + display: "flex", + "align-items": "center", + "justify-content": "center", + }} + > + <Icon name="cloud-upload" size="large" class="text-icon-invert-base" /> + </div> + <div + style={{ + position: "absolute", + top: 0, + left: 0, + width: "64px", + height: "64px", + background: "rgba(0,0,0,0.6)", + "border-radius": "6px", + "z-index": 10, + "pointer-events": "none", + opacity: iconHover() && store.iconUrl ? 1 : 0, + display: "flex", + "align-items": "center", + "justify-content": "center", + }} + > + <Icon name="trash" size="large" class="text-icon-invert-base" /> + </div> </div> <input id="icon-upload" type="file" accept="image/*" class="hidden" onChange={handleInputChange} /> <div class="flex flex-col gap-1.5 text-12-regular text-text-weak self-center"> |
