UNPKG

d3-visualize

Version:

d3-view components for data visualization

108 lines (80 loc) 2.54 kB
import {select} from 'd3-selection'; import round from './round'; import minmax from './minmax'; const WIDTH = 400; const HEIGHT = '75%'; export function sizeValue (value, size) { if (typeof(value) === "string" && value.indexOf('%') === value.length-1) return round(0.01*parseFloat(value)*size); return +value; } // Internal function for evaluating paper dom size export function getSize (element, options) { var size = { width: options.width, height: options.height }; if (!size.width) { size.width = getWidth(element); if (size.width) size.widthElement = getWidthElement(element); else size.width = WIDTH; } if (!size.height) { size.height = getHeight(element); if (size.height) size.heightElement = getHeightElement(element); else size.height = HEIGHT; } // Allow to specify height as a percentage of width size.height = minmax(sizeValue(size.height, size.width), undefined, windowHeight()); return size; } export function getWidth (element) { var el = getParentElementRect(element, 'width'); if (el) return elementWidth(el); } export function getHeight (element) { var el = getParentElementRect(element, 'width'); if (el) return elementHeight(el); } export function getWidthElement (element) { return getParentElementRect(element, 'width'); } export function getHeightElement (element) { return getParentElementRect(element, 'height'); } function windowHeight () { return window.innerHeight; } function elementWidth (el) { var w = el.getBoundingClientRect()['width'], s = select(el), left = padding(s.style('padding-left')), right = padding(s.style('padding-right')); return w - left - right; } function elementHeight (el) { var w = el.getBoundingClientRect()['height'], s = select(el), top = padding(s.style('padding-top')), bottom = padding(s.style('padding-bottom')); return w - top - bottom; } function getParentElementRect (element, key) { let parent = element.node ? element.node() : element, v; while (parent && parent.tagName !== 'BODY') { v = parent.getBoundingClientRect()[key]; if (v) return parent; parent = parent.parentNode; } } function padding (value) { if (value && value.substring(value.length-2) == 'px') return +value.substring(0, value.length-2); return 0; }