From 6c6a2bdbee4ffe0507b830f74cf345d49f4a2439 Mon Sep 17 00:00:00 2001
From: E44 <129310925+programmer-44@users.noreply.github.com>
Date: Sat, 8 Nov 2025 21:47:44 +0100
Subject: [PATCH] add svelte splitpanes for pinned display view
---
control/frontend/package-lock.json | 24 +-
control/frontend/package.json | 3 +-
control/frontend/src/app.css | 78 +++++
.../src/components/DisplayGroupObject.svelte | 20 +-
.../src/components/DisplayObject.svelte | 7 +-
.../src/components/DisplayView.svelte | 313 ++++++++++--------
6 files changed, 288 insertions(+), 157 deletions(-)
diff --git a/control/frontend/package-lock.json b/control/frontend/package-lock.json
index 7bad98d..61c92d0 100644
--- a/control/frontend/package-lock.json
+++ b/control/frontend/package-lock.json
@@ -9,7 +9,8 @@
"version": "0.0.1",
"dependencies": {
"@thisux/sveltednd": "^0.0.20",
- "lucide-svelte": "^0.545.0"
+ "lucide-svelte": "^0.545.0",
+ "svelte-splitpanes": "^8.0.9"
},
"devDependencies": {
"@eslint/compat": "^1.2.5",
@@ -2352,6 +2353,15 @@
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
"license": "MIT"
},
+ "node_modules/esm-env-robust": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/esm-env-robust/-/esm-env-robust-0.0.3.tgz",
+ "integrity": "sha512-90Gnuw2DALOqlL1581VxP3GHPUNHX9U+fQ+8FNcTTFClhY5gEggAAnJ3q1b2Oq23knRsjv8YpNeMRPaMLUymOA==",
+ "license": "MIT",
+ "dependencies": {
+ "esm-env": "^1.0.0"
+ }
+ },
"node_modules/espree": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
@@ -3848,6 +3858,18 @@
"node": ">=4"
}
},
+ "node_modules/svelte-splitpanes": {
+ "version": "8.0.9",
+ "resolved": "https://registry.npmjs.org/svelte-splitpanes/-/svelte-splitpanes-8.0.9.tgz",
+ "integrity": "sha512-L3oLXTC99M191FInTXJ/f/2i0welRql1QuVbPaU8iy6nvCR6X9VyjHCsCpLqKGWHwqkWo/AM9CQ1c0nzlb+MkA==",
+ "license": "MIT",
+ "dependencies": {
+ "esm-env-robust": "0.0.3"
+ },
+ "peerDependencies": {
+ "svelte": "^4.2.19 || ^5.1.0"
+ }
+ },
"node_modules/tailwindcss": {
"version": "4.1.14",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.14.tgz",
diff --git a/control/frontend/package.json b/control/frontend/package.json
index c790c09..198dafd 100644
--- a/control/frontend/package.json
+++ b/control/frontend/package.json
@@ -38,6 +38,7 @@
},
"dependencies": {
"@thisux/sveltednd": "^0.0.20",
- "lucide-svelte": "^0.545.0"
+ "lucide-svelte": "^0.545.0",
+ "svelte-splitpanes": "^8.0.9"
}
}
diff --git a/control/frontend/src/app.css b/control/frontend/src/app.css
index e14c6c0..2638b11 100644
--- a/control/frontend/src/app.css
+++ b/control/frontend/src/app.css
@@ -12,4 +12,82 @@
--color-stone-650: oklch(0.409 0.0105 70.599);
--color-stone-750: oklch(0.321 0.0085 50.928);
--color-stone-850: oklch(0.242 0.0065 45.171);
+}
+
+
+
+
+
+
+
+
+
+/* Splitpanes */
+.splitpanes.mudics-stone-theme {
+ .splitpanes__pane {
+ @apply bg-stone-900;
+ }
+
+ .splitpanes__splitter {
+ @apply bg-transparent hover:bg-stone-600 transition-colors duration-200 shrink-0 relative box-border rounded mx-5;
+ /* box-sizing: border-box;
+ position: relative;
+ flex-shrink: 0; */
+
+ &:before,
+ &:after {
+ @apply bg-stone-750 transition-colors duration-200 absolute top-[50%] left-[50%] content-[''] rounded;
+ }
+
+ &:hover:before,
+ &:hover:after {
+ @apply bg-stone-300;
+ }
+
+ &:first-child {
+ /* cursor: auto; */
+ }
+ }
+}
+
+.mudics-stone-theme {
+ &.splitpanes .splitpanes .splitpanes__splitter {
+ @apply z-10;
+ }
+
+ &.splitpanes--vertical>.splitpanes__splitter,
+ .splitpanes--vertical>.splitpanes__splitter {
+ @apply w-2.5 cursor-col-resize;
+
+ &:before,
+ &:after {
+ @apply w-0.5 h-10 translate-y-[-50%];
+ }
+
+ &:before {
+ @apply ml-[calc(-0.75*var(--spacing))];
+ }
+
+ &:after {
+ @apply ml-[calc(0.25*var(--spacing))];
+ }
+ }
+
+ &.splitpanes--horizontal>.splitpanes__splitter,
+ .splitpanes--horizontal>.splitpanes__splitter {
+ @apply h-2 cursor-row-resize;
+
+ &:before,
+ &:after {
+ @apply h-0.5 w-10 translate-x-[-50%];
+ }
+
+ &:before {
+ @apply mt-[calc(-0.7*var(--spacing))];
+ }
+
+ &:after {
+ @apply mt-[calc(0.1*var(--spacing))];
+ }
+ }
}
\ No newline at end of file
diff --git a/control/frontend/src/components/DisplayGroupObject.svelte b/control/frontend/src/components/DisplayGroupObject.svelte
index 51b0cf9..a030f4c 100644
--- a/control/frontend/src/components/DisplayGroupObject.svelte
+++ b/control/frontend/src/components/DisplayGroupObject.svelte
@@ -1,6 +1,11 @@
@@ -65,7 +71,7 @@
items: display_group.data,
type: 'item',
flipDurationMs: dnd_flip_duration_ms,
- dropTargetStyle: { outline: 'none' },
+ dropTargetStyle: { outline: 'none' }
}}
onconsider={handle_consider}
onfinalize={handle_finalize}
@@ -77,7 +83,7 @@
class="outline-none"
role="figure"
>
-
+
{/each}
diff --git a/control/frontend/src/components/DisplayObject.svelte b/control/frontend/src/components/DisplayObject.svelte
index e42224d..70631cd 100644
--- a/control/frontend/src/components/DisplayObject.svelte
+++ b/control/frontend/src/components/DisplayObject.svelte
@@ -12,9 +12,10 @@
import { is_selected, select, selected_display_ids } from '../ts/stores/select';
import { update_screenshot } from '../ts/stores/displays';
- let { display, get_display_menu_options } = $props<{
+ let { display, get_display_menu_options, close_pinned_display } = $props<{
display: Display;
get_display_menu_options: (display_id: string) => MenuOption[];
+ close_pinned_display: () => void;
}>();
let hovering_unselectable = $state(false);
@@ -26,11 +27,11 @@
function on_preview_click(e: MouseEvent) {
if ($pinned_display_id === display.id) {
- $pinned_display_id = null;
+ close_pinned_display();
} else {
$pinned_display_id = display.id;
}
- update_screenshot(display.id);
+ // update_screenshot(display.id); DEBUG
e.stopPropagation();
}
diff --git a/control/frontend/src/components/DisplayView.svelte b/control/frontend/src/components/DisplayView.svelte
index 318d661..2e87329 100644
--- a/control/frontend/src/components/DisplayView.svelte
+++ b/control/frontend/src/components/DisplayView.svelte
@@ -1,5 +1,5 @@