| 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}) | ||||
| }) | }) | ||||
| } | } |