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 @@