馃悕馃悕馃悕
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at dev 231 lines 5.9 kB view raw
1<script lang="ts"> 2 import Workspace from "./workspace.svelte"; 3 import PaneRow from "./pane_row.svelte"; 4 import PaneColumn from "./pane_column.svelte"; 5 import feather from "feather-icons"; 6 import { onMount } from "svelte"; 7 import { tick } from "svelte"; 8 import RadialMenu from "../general/radial_menu.svelte"; 9 import FicsuitSession from "../ficsuit_session.svelte"; 10 import SimpleMenu from "../general/simple_menu.svelte"; 11 12 export let fillable = true; 13 14 function onMenuOpen(event: MouseEvent) { 15 if (event.button !== 2) return; 16 if (!fillable) return; 17 18 showLayoutMenu = false; 19 showCreateMenu = false; 20 21 if (event.ctrlKey) { 22 showLayoutMenu = true; 23 } 24 else { 25 showCreateMenu = true; 26 } 27 menuX = event.offsetX; 28 menuY = event.offsetY; 29 event.stopPropagation(); 30 event.preventDefault(); 31 } 32 33 function addWorkspace() { 34 let workspace = new Workspace({ 35 target: emptiness.parentElement!, 36 props: { 37 } 38 }); 39 40 emptiness.parentNode?.removeChild(emptiness); 41 showLayoutMenu = false; 42 } 43 44 function addSession() { 45 let session = new FicsuitSession({ 46 target: emptiness.parentElement!, 47 props: { 48 49 } 50 }); 51 52 emptiness.parentNode?.removeChild(emptiness); 53 showCreateMenu = false; 54 } 55 56 function addRow2() { 57 let row = new PaneRow({ 58 target: emptiness.parentElement!, 59 props: { 60 leftPercent: 50, 61 rightPercent: 50 62 } 63 }); 64 65 emptiness.parentNode?.removeChild(emptiness); 66 showLayoutMenu = false; 67 } 68 69 function addRow3() { 70 let row = new PaneRow({ 71 target: emptiness.parentElement!, 72 props: { 73 leftPercent: 33.3, 74 centerPercent: 33.2, 75 rightPercent: 33.3 76 } 77 }); 78 79 emptiness.parentNode?.removeChild(emptiness); 80 showLayoutMenu = false; 81 } 82 83 function addColumn2() { 84 let row = new PaneColumn({ 85 target: emptiness.parentElement!, 86 props: { 87 topPercent: 50, 88 bottomPercent: 50 89 } 90 }); 91 92 emptiness.parentNode?.removeChild(emptiness); 93 showLayoutMenu = false; 94 } 95 96 function addColumn3() { 97 let row = new PaneColumn({ 98 target: emptiness.parentElement!, 99 props: { 100 topPercent: 33.3, 101 middlePercent: 33.2, 102 bottomPercent: 33.3 103 } 104 }); 105 106 emptiness.parentNode?.removeChild(emptiness); 107 showLayoutMenu = false; 108 } 109 110 let createMenuOptions = [ 111 {label: "FictionSuit Session", action: addSession}, 112 {label: "Workspace", action: addWorkspace} 113 ] 114 115 let emptiness: HTMLDivElement; 116 117 let showLayoutMenu = false; 118 let showCreateMenu = false; 119 120 let menuX = 0, menuY = 0; 121 122 $: { 123 if (showLayoutMenu) { 124 tick().then(() => { 125 feather.replace(); 126 }); 127 } 128 } 129</script> 130 131<div class=emptiness 132 bind:this={emptiness}> 133 <div class=backdrop 134 on:contextmenu={onMenuOpen} 135 on:mousedown={() => {showLayoutMenu = false; showCreateMenu = false;}} /> 136 <div class=nothing> 137 nothing 138 </div> 139 {#if showLayoutMenu} 140 <RadialMenu xPosition={menuX} yPosition={menuY} 141 center={addWorkspace} 142 right={addRow2} 143 left={addRow3} 144 top={addColumn2} 145 bottom={addColumn3}> 146 <div data-feather=maximize class="icon center" slot=center /> 147 <div data-feather=columns class="icon right" slot=right /> 148 <svelte:fragment slot=left> 149 <div data-feather=sidebar class="icon left" /> 150 <div data-feather=sidebar class="icon left-b" /> 151 </svelte:fragment> 152 <div data-feather=columns class="icon top" slot=top /> 153 <svelte:fragment slot=bottom> 154 <div data-feather=sidebar class="icon bottom" /> 155 <div data-feather=sidebar class="icon bottom-b" /> 156 </svelte:fragment> 157 </RadialMenu> 158 {/if} 159 {#if showCreateMenu} 160 <SimpleMenu x={menuX} y={menuY} 161 title="New" 162 options={createMenuOptions} /> 163 {/if} 164</div> 165 166<style> 167 .emptiness { 168 position: relative; 169 width: 100%; 170 height: 100%; 171 z-index: 0; 172 } 173 174 .backdrop { 175 position: absolute; 176 width: 100%; 177 height: 100%; 178 z-index: 0; 179 user-select: none; 180 /* background: radial-gradient(var(--pane-background), var(--pane-background) 30%, #FF00FF00 100%); */ 181 } 182 183 .nothing { 184 position: absolute; 185 top: calc(50% - 0.35em); 186 left: 50%; 187 transform: translate(-50%, -50%); 188 white-space: pre; 189 190 user-select: none; 191 pointer-events: none; 192 193 color: #446666; 194 font-size: 1em; 195 } 196 197 .icon { 198 position: absolute; 199 top: 50%; 200 left: 50%; 201 --center: translate(-50%, -50%); 202 } 203 204 .icon.center { 205 transform: var(--center) scale(200%); 206 } 207 208 .icon.left { 209 transform: var(--center) rotate(-45deg) translate(15%, 0%); 210 } 211 212 .icon.left-b { 213 transform: var(--center) rotate(135deg) translate(-15%, 0%); 214 } 215 216 .icon.right { 217 transform: var(--center) rotate(-45deg) translate(15%, 0%); 218 } 219 220 .icon.bottom { 221 transform: var(--center) rotate(-45deg) translate(15%, 0%); 222 } 223 224 .icon.bottom-b { 225 transform: var(--center) rotate(135deg) translate(-15%, 0%); 226 } 227 228 .icon.top { 229 transform: var(--center) rotate(-45deg) translate(15%, 0%); 230 } 231</style>