Simulating a split-flap display with CSS animations, advancing the letters on each animationiteration event.
| javascript:(function()%7B%5B...document.querySelectorAll('.usertext-body%20*')%5D.forEach(p%20%3D%3E%5B...p.childNodes%5D.filter(n%20%3D%3E%20n.nodeType%20%3D%3D%3D%203).forEach(n%20%3D%3E%20%7Bconst%20re%20%3D%20%2F%5CS%7B16%2C%7D%2Fg%3Bif%20(re.test(n.nodeValue))%20%7Btry%20%7Blet%20isHtml%2C%20child%3Bconst%20s%20%3D%20n.nodeValue.replace(re%2C%20s%20%3D%3E%20%7Bs%20%3D%20atob(s)%3Bif%20(%2F%5Ehttps%3F%3A%5C%2F%5C%2F%2F.test(s))%20%7Bs%20%3D%20%60%3Ca%20href%3D%22%24%7Bs%7D%22%20target%3D_blank%3E%24%7Bs%7D%3C%2Fa%3E%60%3BisHtml%20%3D%20true%3B%7Dreturn%20s%3B%7D)%3Bif%20(isHtml)%20%7Bconst%20tmp%20%3D%20document.createElement('div')%3Btmp.innerHTML%20%3D%20s%3Bchild%20%3D%20document.createDocumentFragment()%3B%5B...tmp.childNodes%5D.forEach(c%20%3D%3E%20child.append(c))%3B%7D%20else%20%7Bchild%20%3D%20document.createTextNode(s)%3B%7Dp.replaceChild(child%2C%20n)%3B%7D%20catch%20(e)%20%7B%7D%7D%7D))%7D)() |
| { | |
| "name": "flare", | |
| "children": [ | |
| { | |
| "name": "analytics", | |
| "children": [ | |
| { | |
| "name": "cluster", | |
| "children": [ | |
| { "name": "AgglomerativeCluster", "size": 3938 }, |
| FROM ubuntu | |
| RUN apt-get update | |
| RUN apt-get install -y build-essential curl | |
| # NodeJS >= 6.0 | |
| RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - | |
| RUN apt-get install -y nodejs | |
| # ttfautohint |
A method for automatically finding the best eligible label position and font size for a label that's going to go along a path inside of an area, similar to this example but with two embellishments:
- Using d3plus.polygonRayCast() to more accurately measure the vertical clearance available at a given x position with any rotation.
- Avoiding label positions that would cause the text to be overlapped by another shape for a case like this bump chart.
The measurement gets thrown off a little bit by the curve function and the fact that text is rotated letter by letter instead of continuously, but the results seem good enough.
See also: Automatic label placement along a path Streamgraph label positions #2
| import axios from 'axios' | |
| let mockingEnabled = false | |
| const mocks = {} | |
| export function addMock(url, data) { | |
| mocks[url] = data | |
| } |
| 'bird' | |
| .split(/^(.)(.)(.)/) | |
| .map(''.constructor.call.bind(''.repeat)) | |
| .filter(''.constructor) | |
| .map(''.constructor.call.bind(''.charCodeAt)) | |
| .map(n=>n<100?100:n<101?107:n<106?111:n) | |
| .map(''.constructor.fromCharCode) | |
| .join('') |
| _toggles = {} | |
| makeToggle = (id, fn, delay = 250) => { | |
| const elem = document.querySelector('#' + id) | |
| elem.onclick = () => { | |
| if (_toggles[id]) { | |
| clearInterval(_toggles[id]) | |
| _toggles[id] = null | |
| } else { | |
| _toggles[id] = setInterval(() => elem.disabled || fn(), delay) | |
| } |
Click-to-zoom using projection.fitSize() to interpolate a projection's scale and translate instead of modifying the SVG transform. Has the advantage of leaving stroke-widths alone and the disadvantage of probably being a lot slower.
See also: click-to-zoom via transform
Converting an SVG animation to a video with the MediaRecorder API and a hidden canvas.
Drawing frames from img elements can introduce an extra delay, so this version generates all the frames upfront and then renders them in a loop with requestAnimationFrame().
See also: Canvas animation to video