aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorHsieh Chin Fan <pham@topo.tw>2024-09-22 12:17:04 +0800
committerHsieh Chin Fan <pham@topo.tw>2024-09-22 12:17:04 +0800
commit6d930d449f78b952d11ba524e33fe39c52d6e2df (patch)
treef185b5ffec895459c4675a6589961e5a669b13cb
parent698262eb4f618ec6f6ae5b3389b935d7b34f1701 (diff)
feat: add close button for draggable block
-rw-r--r--src/Layout.mjs18
-rw-r--r--src/css/dumbymap.css49
2 files changed, 44 insertions, 23 deletions
diff --git a/src/Layout.mjs b/src/Layout.mjs
index 5673722..c81225f 100644
--- a/src/Layout.mjs
+++ b/src/Layout.mjs
@@ -66,6 +66,7 @@ export class Overlay extends Layout {
66 <div class="handle">\u2630</div> 66 <div class="handle">\u2630</div>
67 </div> 67 </div>
68 <div class="utils"> 68 <div class="utils">
69 <div id="close">\u274C</div>
69 <div id="plus-font-size" ">\u2795</div> 70 <div id="plus-font-size" ">\u2795</div>
70 <div id="minus-font-size">\u2796</div> 71 <div id="minus-font-size">\u2796</div>
71 </div> 72 </div>
@@ -92,24 +93,25 @@ export class Overlay extends Layout {
92 snap: { x: { step: 20 }, y: { step: 20 } }, 93 snap: { x: { step: 20 }, y: { step: 20 } },
93 }) 94 })
94 95
96 // Close button
97 draggableBlock.querySelector('#close').onclick = () => {
98 draggableBlock.setAttribute("data-hide", "true")
99 }
95 // Plus/Minus font-size of content 100 // Plus/Minus font-size of content
96 const plusButton = draggableBlock.querySelector('#plus-font-size') 101 draggableBlock.querySelector('#plus-font-size').onclick = () => {
97 plusButton.onclick = () => {
98 const fontSize = parseFloat(getComputedStyle(block).fontSize) / 16 102 const fontSize = parseFloat(getComputedStyle(block).fontSize) / 16
99 block.style.fontSize = `${fontSize + 0.1}rem` 103 block.style.fontSize = `${fontSize + 0.1}rem`
100 } 104 }
101 const minusButton = draggableBlock.querySelector('#minus-font-size') 105 draggableBlock.querySelector('#minus-font-size').onclick = () => {
102 minusButton.onclick = () => {
103 const fontSize = parseFloat(getComputedStyle(block).fontSize) / 16 106 const fontSize = parseFloat(getComputedStyle(block).fontSize) / 16
104 block.style.fontSize = `${fontSize - 0.1}rem` 107 block.style.fontSize = `${fontSize - 0.1}rem`
105 } 108 }
109 const utils = draggableBlock.querySelector('.utils')
106 draggableInstance.onDragStart = () => { 110 draggableInstance.onDragStart = () => {
107 plusButton.style.opacity = '0' 111 utils.style.opacity = 0
108 minusButton.style.opacity = '0'
109 } 112 }
110 draggableInstance.onDragEnd = () => { 113 draggableInstance.onDragEnd = () => {
111 plusButton.style = '' 114 utils.style = ''
112 minusButton.style = ''
113 } 115 }
114 116
115 // Reposition draggable instance when resized 117 // Reposition draggable instance when resized
diff --git a/src/css/dumbymap.css b/src/css/dumbymap.css
index f1aa02c..b2e73ab 100644
--- a/src/css/dumbymap.css
+++ b/src/css/dumbymap.css
@@ -3,12 +3,22 @@
3} 3}
4 4
5@keyframes fade-in { 5@keyframes fade-in {
6 from { opacity: 0.3; } 6 from { opacity: 0; }
7 to { opacity: 1; } 7 to { opacity: 1; }
8} 8}
9 9
10@keyframes fade-out { 10@keyframes fade-out {
11 from { opacity: 1; } 11 from { opacity: 1; }
12 to { opacity: 0; }
13}
14
15@keyframes map-fade-in {
16 from { opacity: 0.3; }
17 to { opacity: 1; }
18}
19
20@keyframes map-fade-out {
21 from { opacity: 1; }
12 to { opacity: 0.3; } 22 to { opacity: 0.3; }
13} 23}
14 24
@@ -110,7 +120,7 @@
110 border: 3px solid transparent; 120 border: 3px solid transparent;
111 121
112 background: white; 122 background: white;
113 animation: fade-in 1s; 123 animation: map-fade-in 1s;
114 124
115 &[data-focus="true"] { 125 &[data-focus="true"] {
116 border: 3px solid gray; 126 border: 3px solid gray;
@@ -123,7 +133,7 @@
123 border: 3px solid gray; 133 border: 3px solid gray;
124 134
125 opacity: 0.3; 135 opacity: 0.3;
126 animation: fade-out 1s; 136 animation: map-fade-out 1s;
127 } 137 }
128 } 138 }
129 139
@@ -139,8 +149,8 @@
139 height: 100%; 149 height: 100%;
140 150
141 position: absolute; 151 position: absolute;
142 top: 0;
143 left: 0; 152 left: 0;
153 top: 0;
144 } 154 }
145 155
146 [data-focus="true"] { 156 [data-focus="true"] {
@@ -192,17 +202,17 @@
192 height: 60px; 202 height: 60px;
193 203
194 position: absolute; 204 position: absolute;
195 top: calc(50% - 30px);
196 left: -30px; 205 left: -30px;
206 top: calc(50% - 30px);
197 207
198 border-radius: 50%; 208 border-radius: 50%;
199 209
200 background-color: #3887be; 210 background-color: #3887be;
201 background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiICAgd2lkdGg9IjYwIiAgIGhlaWdodD0iNjAiICAgdmVyc2lvbj0iMS4xIiAgIHZpZXdCb3g9IjAgMCA2MCA2MCIgICBpZD0ic3ZnNTQzNCIgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxK2RldmVsK29zeG1lbnUgcjEyOTExIiAgIHNvZGlwb2RpOmRvY25hbWU9Imwtci5zdmciPiAgPG1ldGFkYXRhICAgICBpZD0ibWV0YWRhdGE1NDQ0Ij4gICAgPHJkZjpSREY+ICAgICAgPGNjOldvcmsgICAgICAgICByZGY6YWJvdXQ9IiI+ICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4gICAgICAgIDxkYzp0eXBlICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+ICAgICAgPC9jYzpXb3JrPiAgICA8L3JkZjpSREY+ICA8L21ldGFkYXRhPiAgPGRlZnMgICAgIGlkPSJkZWZzNTQ0MiIgLz4gIDxzb2RpcG9kaTpuYW1lZHZpZXcgICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IiAgICAgYm9yZGVyb3BhY2l0eT0iMSIgICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiICAgICBncmlkdG9sZXJhbmNlPSIxMCIgICAgIGd1aWRldG9sZXJhbmNlPSIxMCIgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIgICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTI4NiIgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijc1MSIgICAgIGlkPSJuYW1lZHZpZXc1NDQwIiAgICAgc2hvd2dyaWQ9InRydWUiICAgICBpbmtzY2FwZTp6b29tPSI0IiAgICAgaW5rc2NhcGU6Y3g9IjI1Ljg4OTgzMSIgICAgIGlua3NjYXBlOmN5PSIzNC4zODE4MzMiICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIgICAgIGlua3NjYXBlOndpbmRvdy15PSIyMyIgICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmc1NDM0IiAgICAgaW5rc2NhcGU6b2JqZWN0LW5vZGVzPSJ0cnVlIiAgICAgaW5rc2NhcGU6c25hcC1zbW9vdGgtbm9kZXM9InRydWUiPiAgICA8aW5rc2NhcGU6Z3JpZCAgICAgICB0eXBlPSJ4eWdyaWQiICAgICAgIGlkPSJncmlkNTk4OSIgLz4gIDwvc29kaXBvZGk6bmFtZWR2aWV3PiAgPHBhdGggICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiAgICAgZD0iTSAyNSAyNCBMIDE2IDMwIEwgMjUgMzYgTCAyNSAyNCB6IE0gMzUgMjQgTCAzNSAzNiBMIDQ0IDMwIEwgMzUgMjQgeiAiICAgICBpZD0icGF0aDU5OTUiIC8+PC9zdmc+"); 211 background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiICAgd2lkdGg9IjYwIiAgIGhlaWdodD0iNjAiICAgdmVyc2lvbj0iMS4xIiAgIHZpZXdCb3g9IjAgMCA2MCA2MCIgICBpZD0ic3ZnNTQzNCIgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxK2RldmVsK29zeG1lbnUgcjEyOTExIiAgIHNvZGlwb2RpOmRvY25hbWU9Imwtci5zdmciPiAgPG1ldGFkYXRhICAgICBpZD0ibWV0YWRhdGE1NDQ0Ij4gICAgPHJkZjpSREY+ICAgICAgPGNjOldvcmsgICAgICAgICByZGY6YWJvdXQ9IiI+ICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4gICAgICAgIDxkYzp0eXBlICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+ICAgICAgPC9jYzpXb3JrPiAgICA8L3JkZjpSREY+ICA8L21ldGFkYXRhPiAgPGRlZnMgICAgIGlkPSJkZWZzNTQ0MiIgLz4gIDxzb2RpcG9kaTpuYW1lZHZpZXcgICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IiAgICAgYm9yZGVyb3BhY2l0eT0iMSIgICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiICAgICBncmlkdG9sZXJhbmNlPSIxMCIgICAgIGd1aWRldG9sZXJhbmNlPSIxMCIgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIgICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTI4NiIgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijc1MSIgICAgIGlkPSJuYW1lZHZpZXc1NDQwIiAgICAgc2hvd2dyaWQ9InRydWUiICAgICBpbmtzY2FwZTp6b29tPSI0IiAgICAgaW5rc2NhcGU6Y3g9IjI1Ljg4OTgzMSIgICAgIGlua3NjYXBlOmN5PSIzNC4zODE4MzMiICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIgICAgIGlua3NjYXBlOndpbmRvdy15PSIyMyIgICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmc1NDM0IiAgICAgaW5rc2NhcGU6b2JqZWN0LW5vZGVzPSJ0cnVlIiAgICAgaW5rc2NhcGU6c25hcC1zbW9vdGgtbm9kZXM9InRydWUiPiAgICA8aW5rc2NhcGU6Z3JpZCAgICAgICB0eXBlPSJ4eWdyaWQiICAgICAgIGlkPSJncmlkNTk4OSIgLz4gIDwvc29kaXBvZGk6bmFtZWR2aWV3PiAgPHBhdGggICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjFweDtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIiAgICAgZD0iTSAyNSAyNCBMIDE2IDMwIEwgMjUgMzYgTCAyNSAyNCB6IE0gMzUgMjQgTCAzNSAzNiBMIDQ0IDMwIEwgMzUgMjQgeiAiICAgICBpZD0icGF0aDU5OTUiIC8+PC9zdmc+");
202 212
203 cursor: grab;
204 transition: transform 0.3s ease-in-out;
205 transform: scale(0.5, 0.5); 213 transform: scale(0.5, 0.5);
214 transition: transform 0.3s ease-in-out;
215 cursor: grab;
206 box-shadow: inset 0 0 0 2px white; 216 box-shadow: inset 0 0 0 2px white;
207 217
208 &:hover { 218 &:hover {
@@ -223,8 +233,8 @@
223 padding: 0; 233 padding: 0;
224 234
225 position: fixed; 235 position: fixed;
226 top: 0;
227 left: 0; 236 left: 0;
237 top: 0;
228 } 238 }
229 239
230 .Showcase { 240 .Showcase {
@@ -252,6 +262,8 @@
252 font-size: 0.8rem; 262 font-size: 0.8rem;
253 pointer-events: auto; 263 pointer-events: auto;
254 264
265 transition: visibility 1s;
266
255 .dumby-block { 267 .dumby-block {
256 overflow: auto; 268 overflow: auto;
257 margin: 0; 269 margin: 0;
@@ -299,8 +311,8 @@
299 width: 100%; 311 width: 100%;
300 312
301 position: absolute; 313 position: absolute;
302 top: 0;
303 left: 0; 314 left: 0;
315 top: 0;
304 z-index: 1; 316 z-index: 1;
305 border-top-left-radius: 0.3rem; 317 border-top-left-radius: 0.3rem;
306 border-top-right-radius: 0.3rem; 318 border-top-right-radius: 0.3rem;
@@ -309,8 +321,8 @@
309 font-size: 1.1rem; 321 font-size: 1.1rem;
310 text-align: center; 322 text-align: center;
311 323
312 transition: all 0.3s ease-in-out;
313 transform: translate(0, -0.6rem); 324 transform: translate(0, -0.6rem);
325 transition: all 0.3s ease-in-out;
314 } 326 }
315 } 327 }
316 328
@@ -319,7 +331,10 @@
319 } 331 }
320 332
321 &[data-hide="true"] { 333 &[data-hide="true"] {
322 display: none; 334 animation: fade-out 0.3s;
335
336 opacity: 0;
337 visibility: hidden;
323 } 338 }
324 339
325 &:has(.draggable:hover, .utils:hover) { 340 &:has(.draggable:hover, .utils:hover) {
@@ -341,16 +356,18 @@
341 display: flex; 356 display: flex;
342 357
343 position: absolute; 358 position: absolute;
359 left: 100%;
344 top: 0; 360 top: 0;
345 top: -0.5rem; 361 top: -0.5rem;
346 left: 100%;
347 362
348 font-size: 1.5rem; 363 font-size: 1.5rem;
364
365 transition: opacity 1s linear;
349 gap: 6px; 366 gap: 6px;
350 animation: fade-in 1.5s; 367 animation: fade-in 1.5s;
351 padding-left: 1rem; 368 padding-left: 1rem;
352 369
353 [id$="-font-size"]{ 370 > * {
354 padding: 0.2rem 0.4rem; 371 padding: 0.2rem 0.4rem;
355 372
356 border: 3px gray solid; 373 border: 3px gray solid;
@@ -358,13 +375,15 @@
358 375
359 background: white; 376 background: white;
360 377
361 transition: opacity 1s linear;
362 user-select: none; 378 user-select: none;
363 } 379 }
364 380
381 #close {
382 cursor: pointer;
383 }
384
365 #plus-font-size { 385 #plus-font-size {
366 cursor: zoom-in; 386 cursor: zoom-in;
367 user-select: none;
368 } 387 }
369 388
370 #minus-font-size { 389 #minus-font-size {