Navigation
Action | Keys |
---|---|
move view around | WASD / arrow keys / right click drag |
rotate view | middle mouse drag |
zoom view | scroll wheel |
Action | Keys |
---|---|
move view around | WASD / arrow keys / right click drag |
rotate view | middle mouse drag |
zoom view | scroll wheel |
const SPECIAL_CHARS = /[-\/\\^$*+?.()|[\]{}]/g; | |
const ESCAPED_CHAR = "\\$&"; | |
const escapeRegExp = (s: string) => s.replace(SPECIAL_CHARS, ESCAPED_CHAR); | |
const regexp = (flags?: string) => | |
(strings: string[], ...values: string[]) => | |
new RegExp(strings[0] + values.map((value, index) => escapeRegExp(value) + strings[index + 1]).join(""), flags); |
const isPrimitive = (obj) => { | |
if (typeof obj === 'number' || typeof obj === 'boolean' || typeof obj === 'string') return true; | |
if (Number.isNaN(obj) || obj === null || obj === undefined) return true; | |
return false; | |
} | |
const isIterable = (obj) => !isPrimitive(obj); | |
const clone = (obj) => { | |
if (isIterable(obj)) { |
import { h, Component } from 'preact'; | |
const withState = Wrapped => class extends Component { | |
constructor(props) { | |
super(props); | |
this.state = props; | |
} | |
componentWillReceiveProps(nextProps) { | |
this.setState(nextProps); |
import { options } from 'preact'; | |
import cx from 'classnames'; | |
let old = options.vnode; | |
options.vnode = vnode => { | |
let isElement = typeof vnode.nodeName==='string', | |
props = vnode.attributes || {}, | |
key = props.class ? 'class' : 'className'; | |
if (isElement && props[key] && typeof props[key]==='object') { | |
props[key] = cx(props[key]); |
class Vec2d { | |
constructor(x, y) { this.reset(x, y); } | |
get mag() { return Math.sqrt(this.dot(this)); } | |
clone() { return new Vec2d(this.x, this.y); } | |
reset(x, y) { this.x = x; this.y = y; return this; } | |
neg() { return this.scale(-1); } | |
norm() { | |
let m = this.mag; | |
if (m > 0) return this.scale(1 / m); | |
return this; |
scrolling: yes | |
height: 800 |
// Use `<% ... %>` to execute blocks of JavaScript, `<%= ... %>` to write | |
// out the result of the embedded expression. | |
function tmpl(str, params) { | |
if (!str) return ''; | |
function generateOutput(str) { | |
return " p.push('" + str.replace(/'/g, "\\'").split(/\r?\n/g).join("\\n');\n p.push('") + "');\n"; | |
} | |
var fn; |
I hereby claim:
To claim this, I am signing this object:
(function(global) { | |
function extend(obj) { | |
for (var i = 1; i < arguments.length; i++) { | |
var source = arguments[i]; | |
for (var name in source) if (source.hasOwnProperty(name)) | |
obj[name] = source[name]; | |
} | |
return obj; | |
} |