You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
snabbdom/examples/carousel-svg/index.js

75 lines
2.1 KiB
JavaScript

import { init } from '../../build/package/init.js'
import { attributesModule } from '../../build/package/modules/attributes.js'
import { styleModule } from '../../build/package/modules/style.js'
import { eventListenersModule } from '../../build/package/modules/eventlisteners.js'
import { h } from '../../build/package/h.js'
var patch = init([attributesModule, styleModule, eventListenersModule])
var vnode
var data = {
degRotation: 0
}
function gRotation () {
// console.log("gRotation: %s", data.degRotation);
return 'rotate(' + data.degRotation + 'deg)'
}
function triangleClick (id) {
console.log('triangleClick: %s', id)
render()
}
function handleRotate (degs) {
data.degRotation += degs
console.log('handleRotate: %s, %s', degs, data.degRotation)
render()
}
function handleReset (degs) {
data.degRotation = degs
console.log('handleReset: %s', degs)
render()
}
function render () {
vnode = patch(vnode, view(data))
}
const hTriangle = (id, degRotation) =>
h('polygon#' + id, {
attrs: {
points: '-50,-88 0,-175 50,-88',
transform: 'rotate(' + degRotation + ')',
'stroke-width': 3
},
on: { click: () => { triangleClick(id) } }
})
const view = (data) =>
h('div.view', [
h('h1', 'Snabbdom SVG Carousel'),
h('svg', { attrs: { width: 380, height: 380, viewBox: [-190, -190, 380, 380] } }, [
h('g#carousel',
{ style: { '-webkit-transform': gRotation(), transform: gRotation() } }, [
hTriangle('yellow', 0),
hTriangle('green', 60),
hTriangle('magenta', 120),
hTriangle('red', 180),
hTriangle('cyan', 240),
hTriangle('blue', 300)
])
]),
h('button', { on: { click: () => { handleRotate(60) } } }, 'Rotate Clockwise'),
h('button', { on: { click: () => { handleRotate(-60) } } }, 'Rotate Anticlockwise'),
h('button', { on: { click: () => { handleReset(0) } } }, 'Reset')
])
window.addEventListener('DOMContentLoaded', () => {
var container = document.getElementById('container')
vnode = patch(container, view(data))
render()
})