| <script lang="ts"> |
| import { onDestroy, onMount, tick } from 'svelte'; |
| import { Pane, PaneResizer } from 'paneforge'; |
| |
| import Drawer from '../common/Drawer.svelte'; |
| import EllipsisVertical from '../icons/EllipsisVertical.svelte'; |
| |
| export let show = false; |
| export let pane = null; |
| |
| export let containerId = 'note-container'; |
| |
| let mediaQuery; |
| let largeScreen = false; |
| |
| let minSize = 0; |
| |
| const handleMediaQuery = async (e) => { |
| if (e.matches) { |
| largeScreen = true; |
| } else { |
| largeScreen = false; |
| pane = null; |
| } |
| }; |
| |
| onMount(() => { |
| |
| mediaQuery = window.matchMedia('(min-width: 1000px)'); |
| |
| mediaQuery.addEventListener('change', handleMediaQuery); |
| handleMediaQuery(mediaQuery); |
| |
| |
| const container = document.getElementById(containerId); |
| |
| |
| minSize = Math.floor((400 / container.clientWidth) * 100); |
| |
| |
| const resizeObserver = new ResizeObserver((entries) => { |
| for (let entry of entries) { |
| const width = entry.contentRect.width; |
| |
| const percentage = (400 / width) * 100; |
| |
| minSize = Math.floor(percentage); |
| |
| if (show) { |
| if (pane && pane.isExpanded() && pane.getSize() < minSize) { |
| pane.resize(minSize); |
| } |
| } |
| } |
| }); |
| |
| |
| resizeObserver.observe(container); |
| }); |
| |
| onDestroy(() => { |
| mediaQuery.removeEventListener('change', handleMediaQuery); |
| }); |
| </script> |
|
|
| {#if !largeScreen} |
| {#if show} |
| <Drawer |
| {show} |
| onClose={() => { |
| show = false; |
| }} |
| > |
| <div class=" px-3.5 py-2.5 h-screen max-h-dvh flex flex-col"> |
| <slot /> |
| </div> |
| </Drawer> |
| {/if} |
| {:else if show} |
| <PaneResizer |
| class="relative flex items-center justify-center group border-l border-gray-50 dark:border-gray-850/30 hover:border-gray-200 dark:hover:border-gray-800 transition z-20" |
| id="controls-resizer" |
| > |
| <div |
| class=" absolute -left-1.5 -right-1.5 -top-0 -bottom-0 z-20 cursor-col-resize bg-transparent" |
| /> |
| </PaneResizer> |
|
|
| <Pane |
| bind:pane |
| defaultSize={Math.max(20, minSize)} |
| {minSize} |
| onCollapse={() => { |
| show = false; |
| }} |
| collapsible={true} |
| class=" z-10 " |
| > |
| {#if show} |
| <div class="flex max-h-full min-h-full"> |
| <div |
| class="w-full pt-2 bg-white dark:shadow-lg dark:bg-gray-850 z-40 pointer-events-auto overflow-y-auto scrollbar-hidden flex flex-col px-2" |
| > |
| <slot /> |
| </div> |
| </div> |
| {/if} |
| </Pane> |
| {/if} |
|
|