diff options
| author | Hsieh Chin Fan <pham@topo.tw> | 2024-09-20 15:58:22 +0800 |
|---|---|---|
| committer | Hsieh Chin Fan <pham@topo.tw> | 2024-09-20 16:14:16 +0800 |
| commit | e1996ae9067555c4b774c8de800d1b4d647c4085 (patch) | |
| tree | 9f753d0002f8cc73b728915130ef871a97762ef5 | |
| parent | b3cabd0868db0b90b98e6ee6bb80943e0f4ede4d (diff) | |
feat: enable onscroll event from plain-draggable
ref: https://github.com/anseki/plain-draggable/issues/148
* put CSS properties resize and overflow-y to content of draggable item
* refine CSS for handle animation
| -rw-r--r-- | rollup.config.js | 10 | ||||
| -rw-r--r-- | src/css/dumbymap.css | 77 | ||||
| -rw-r--r-- | src/dumbymap.mjs | 6 |
3 files changed, 48 insertions, 45 deletions
diff --git a/rollup.config.js b/rollup.config.js index 78a4123..d04eb4e 100644 --- a/rollup.config.js +++ b/rollup.config.js | |||
| @@ -29,16 +29,6 @@ const general = { | |||
| 29 | }, | 29 | }, |
| 30 | }, | 30 | }, |
| 31 | { | 31 | { |
| 32 | name: 'plain-draggable', | ||
| 33 | transform(code, id) { | ||
| 34 | if (id.includes('node_modules/plain-draggable/')) { | ||
| 35 | const removePattern = /window\.addEventListener\('scroll'[^\)]*\)/ | ||
| 36 | return `${code.replace(removePattern, "")}`; | ||
| 37 | } | ||
| 38 | return null; | ||
| 39 | }, | ||
| 40 | }, | ||
| 41 | { | ||
| 42 | name: 'mapclay', | 32 | name: 'mapclay', |
| 43 | resolveId(source) { | 33 | resolveId(source) { |
| 44 | if (source === 'mapclay' && existsSync(join('.', 'mapclay'))) { | 34 | if (source === 'mapclay' && existsSync(join('.', 'mapclay'))) { |
diff --git a/src/css/dumbymap.css b/src/css/dumbymap.css index 40397c1..005a8f9 100644 --- a/src/css/dumbymap.css +++ b/src/css/dumbymap.css | |||
| @@ -65,6 +65,12 @@ | |||
| 65 | } | 65 | } |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | .dumby-block { | ||
| 69 | border-left: #f0f0f0 0.5em solid; | ||
| 70 | padding-left: 0.5em; | ||
| 71 | margin-left: -0.5em; | ||
| 72 | margin-bottom: 3rem; | ||
| 73 | } | ||
| 68 | 74 | ||
| 69 | .DumbyMap { | 75 | .DumbyMap { |
| 70 | position: relative; | 76 | position: relative; |
| @@ -101,12 +107,6 @@ | |||
| 101 | overflow-y: scroll; | 107 | overflow-y: scroll; |
| 102 | width: 100%; | 108 | width: 100%; |
| 103 | 109 | ||
| 104 | .dumby-block { | ||
| 105 | border-left: #f0f0f0 0.5em solid; | ||
| 106 | padding-left: 0.5em; | ||
| 107 | margin-left: -0.5em; | ||
| 108 | } | ||
| 109 | |||
| 110 | pre { | 110 | pre { |
| 111 | width: 100%; | 111 | width: 100%; |
| 112 | 112 | ||
| @@ -189,58 +189,65 @@ | |||
| 189 | 189 | ||
| 190 | .draggable-block { | 190 | .draggable-block { |
| 191 | background-color: white; | 191 | background-color: white; |
| 192 | margin-bottom: 3rem; | ||
| 193 | font-size: 12px; | 192 | font-size: 12px; |
| 194 | pointer-events: auto; | 193 | pointer-events: auto; |
| 195 | box-sizing: content-box; | 194 | box-sizing: content-box; |
| 196 | position: absolute; | 195 | position: absolute; |
| 197 | width: fit-content; | 196 | width: fit-content; |
| 198 | max-height: 50vh; | ||
| 199 | max-width: 25vw; | ||
| 200 | overflow: scroll; | ||
| 201 | border: solid gray; | 197 | border: solid gray; |
| 202 | border-radius: 0.5rem; | 198 | border-radius: 0.5rem; |
| 203 | padding-top: 0.5rem; | 199 | overflow: clip; |
| 204 | padding-bottom: 0; | ||
| 205 | resize: both; | ||
| 206 | |||
| 207 | &[style*="height"], | ||
| 208 | &[style*="width"] { | ||
| 209 | max-height: unset; | ||
| 210 | max-width: unset; | ||
| 211 | } | ||
| 212 | 200 | ||
| 213 | .dumby-block { | 201 | .dumby-block { |
| 214 | border: none; | 202 | border: none; |
| 215 | padding: 0; | 203 | resize: both; |
| 216 | } | 204 | padding-inline: 1em; |
| 205 | margin: 0; | ||
| 206 | overflow: scroll; | ||
| 207 | max-height: 50vh; | ||
| 208 | max-width: 25vw; | ||
| 209 | position: relative; | ||
| 217 | 210 | ||
| 218 | .map-container { | 211 | /* allow random width/height after resize */ |
| 219 | min-width: 200px; | 212 | &[style*="height"], |
| 220 | } | 213 | &[style*="width"] { |
| 214 | max-height: unset; | ||
| 215 | max-width: unset; | ||
| 216 | } | ||
| 221 | 217 | ||
| 222 | > :not(.draggable) { | 218 | /* gray out top of content, make draggable part easy to be seen */ |
| 223 | margin-inline: 0.5rem; | 219 | &::before { |
| 220 | display: block; | ||
| 221 | position: sticky; | ||
| 222 | top: 0; | ||
| 223 | content: ''; | ||
| 224 | width: 100%; | ||
| 225 | height: 1.5rem; | ||
| 226 | background: linear-gradient(0deg, rgb(255 255 255 / 0%), rgb(255 255 255 / 100%) 60%); | ||
| 227 | } | ||
| 228 | |||
| 229 | .map-container { | ||
| 230 | min-width: 200px; | ||
| 231 | } | ||
| 224 | } | 232 | } |
| 225 | 233 | ||
| 226 | .draggable { | 234 | .draggable { |
| 227 | display: block; | 235 | display: block; |
| 236 | position: absolute; | ||
| 237 | width: 100%; | ||
| 228 | top: 0; | 238 | top: 0; |
| 229 | left: 0; | 239 | left: 0; |
| 230 | position: sticky; | 240 | font-size: 1.1rem; |
| 231 | background: linear-gradient(0deg, rgb(255 255 255 / 0%), rgb(255 255 255 / 100%) 60%); | 241 | z-index: 1; |
| 232 | margin-bottom: -18px; | 242 | |
| 233 | transform: translate(0, -16px); | ||
| 234 | width: 100%; | ||
| 235 | padding-inline: 0; | ||
| 236 | padding-bottom: 2em; | ||
| 237 | text-align: center; | 243 | text-align: center; |
| 238 | z-index: 9999; | 244 | |
| 239 | transition: all 0.3s ease-in-out; | 245 | transition: all 0.3s ease-in-out; |
| 246 | transform: translate(0, -0.6rem); | ||
| 240 | 247 | ||
| 241 | &:hover { | 248 | &:hover { |
| 242 | background: #e1e1e1; | 249 | background: #e1e1e1; |
| 243 | padding-block: 1em 0.5em; | 250 | transform: unset; |
| 244 | 251 | ||
| 245 | & ~ * { | 252 | & ~ * { |
| 246 | opacity: 0.7; | 253 | opacity: 0.7; |
diff --git a/src/dumbymap.mjs b/src/dumbymap.mjs index bdb7ee8..f8ce1d7 100644 --- a/src/dumbymap.mjs +++ b/src/dumbymap.mjs | |||
| @@ -231,6 +231,7 @@ export const generateMaps = async (container, callback) => { | |||
| 231 | const draggableContainer = block.closest('.draggable-block') | 231 | const draggableContainer = block.closest('.draggable-block') |
| 232 | if (!draggableContainer) return | 232 | if (!draggableContainer) return |
| 233 | htmlHolder.appendChild(block) | 233 | htmlHolder.appendChild(block) |
| 234 | block.removeAttribute('style') | ||
| 234 | draggableContainer.draggableInstance.remove() | 235 | draggableContainer.draggableInstance.remove() |
| 235 | draggableContainer.remove() | 236 | draggableContainer.remove() |
| 236 | } | 237 | } |
| @@ -377,6 +378,11 @@ export const generateMaps = async (container, callback) => { | |||
| 377 | y += 200 | 378 | y += 200 |
| 378 | x = x % window.innerWidth | 379 | x = x % window.innerWidth |
| 379 | } | 380 | } |
| 381 | |||
| 382 | const resizeObserver = new ResizeObserver(() => { | ||
| 383 | c.draggableInstance.position(); | ||
| 384 | }).observe(c); | ||
| 385 | onRemove(c, () => resizeObserver.disconnect()) | ||
| 380 | }) | 386 | }) |
| 381 | } else { | 387 | } else { |
| 382 | dumbyBlocks.forEach(resumeFromDraggableContainer) | 388 | dumbyBlocks.forEach(resumeFromDraggableContainer) |