constructor(elementID, { width = 1000, height = 800,
  padding = 20, upm = 1000, fontSize = 100, lineHeight = 1.0 } = {}) {
    this.gridCanvas = new GridCanvas(elementID, 
      { bound: { minX: -padding, maxX: width + padding, 
        minY: -height - padding, maxY: padding } });
    Object.defineProperty(this, 'width', { value: width, writable: false });
    Object.defineProperty(this, 'height', { value: height, writable: false });
    Object.defineProperty(this, 'padding', { value: padding, writable: false });
    Object.defineProperty(this, 'upm', { value: upm, writable: false });
    this._fontSize = fontSize; this._lineHeight = lineHeight;
    // Drawing functions
    this.gridCanvas.redrawUpper = this.redrawUpper;
  }
@param { string } elementID  Element ID of the container `<div/>`
@param { number } width      Preview window available width
@param { number } height     Preview window available height
@param { number } padding    Preview window padding
@param { number } upm        Units per em
@param { number } fontSize   Font size displayed
@param { number } lineHeight Relative line height