padding: 1px; | padding: 1px; | ||||
grid-gap: 1px; | grid-gap: 1px; | ||||
grid-template-columns: repeat(var(--ncols), 1fr); | grid-template-columns: repeat(var(--ncols), 1fr); | ||||
height: 40vh; | |||||
height: 30vh; | |||||
} | } | ||||
.col:before { | .col:before { | ||||
position: relative; | position: relative; | ||||
.counter { | .counter { | ||||
font-family: monospace; | font-family: monospace; | ||||
} | } | ||||
.drag-target { | |||||
background-color: orange !important; | |||||
} |
ev.dataTransfer.setData('idx', card.id) | ev.dataTransfer.setData('idx', card.id) | ||||
ev.dataTransfer.dropEffect = 'move' | ev.dataTransfer.dropEffect = 'move' | ||||
}, | }, | ||||
ondragend: (ev) => { | |||||
for(const el of document.querySelectorAll('.drag-target')) { | |||||
el.classList.remove('drag-target') | |||||
} | |||||
}, | |||||
class: ['card', card.color, card.faceUp && 'face-up'].join(' '), | class: ['card', card.color, card.faceUp && 'face-up'].join(' '), | ||||
draggable: true, | draggable: true, | ||||
} | } | ||||
ondragenter: (ev) => { | ondragenter: (ev) => { | ||||
/* needed for drag-drop shim */ | /* needed for drag-drop shim */ | ||||
ev.preventDefault() | ev.preventDefault() | ||||
for(const el of document.querySelectorAll('.drag-target')) { | |||||
el.classList.remove('drag-target') | |||||
} | |||||
ev.target.classList.add('drag-target') | |||||
}, | }, | ||||
ondragover: (ev) => { | ondragover: (ev) => { | ||||
ev.preventDefault() | ev.preventDefault() |
grid-auto-flow: column; | grid-auto-flow: column; | ||||
justify-content: start; | justify-content: start; | ||||
overflow-x: scroll; | overflow-x: scroll; | ||||
height: 200px; | |||||
height: 50px; | |||||
resize: vertical; | resize: vertical; | ||||
position: relative; | position: relative; | ||||
} | } |
<script src="/pico.js" defer></script> | <script src="/pico.js" defer></script> | ||||
<script> | <script> | ||||
MobileDragDrop.polyfill({}) | |||||
MobileDragDrop.polyfill({ | |||||
dragImageOffset: {x: 0, y: -15}, | |||||
elementFromPoint: (x, y) => document.elementFromPoint(x, y - 15), | |||||
}) | |||||
addEventListener('touchmove', () => {}) | addEventListener('touchmove', () => {}) | ||||
</script> | </script> | ||||
if(message.online) { | if(message.online) { | ||||
const difference = (l1, l2) => l1.filter(u => !l2.includes(u)) | const difference = (l1, l2) => l1.filter(u => !l2.includes(u)) | ||||
difference(message.online, State.online).forEach(username => { | difference(message.online, State.online).forEach(username => { | ||||
State.posts.push({ts: message.ts, value: `${username} joined`}) | |||||
signal({kind: 'post', ts: message.ts, value: `${username} joined`}) | |||||
signal({kind: 'join', username: username}) | signal({kind: 'join', username: username}) | ||||
}) | }) | ||||
difference(State.online, message.online).forEach(username => { | difference(State.online, message.online).forEach(username => { | ||||
State.posts.push({ts: message.ts, value: `${username} left`}) | |||||
signal({kind: 'post', ts: message.ts, value: `${username} left`}) | |||||
signal({kind: 'leave', username: username}) | signal({kind: 'leave', username: username}) | ||||
}) | }) | ||||
} | } |