diff options
| author | Hsieh Chin Fan <pham@topo.tw> | 2024-09-22 12:17:04 +0800 |
|---|---|---|
| committer | Hsieh Chin Fan <pham@topo.tw> | 2024-09-22 12:17:04 +0800 |
| commit | 6d930d449f78b952d11ba524e33fe39c52d6e2df (patch) | |
| tree | f185b5ffec895459c4675a6589961e5a669b13cb /src | |
| parent | 698262eb4f618ec6f6ae5b3389b935d7b34f1701 (diff) | |
feat: add close button for draggable block
Diffstat (limited to 'src')
| -rw-r--r-- | src/Layout.mjs | 18 | ||||
| -rw-r--r-- | src/css/dumbymap.css | 49 |
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 { |