UNPKG

highcharts

Version:
109 lines (108 loc) 3.84 kB
/* * * * (c) 2009-2019 Øystein Moseng * * Extend SVG and Chart classes with focus border capabilities. * * License: www.highcharts.com/license * * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!! * * */ 'use strict'; import H from '../../parts/Globals.js'; var addEvent = H.addEvent; import U from '../../parts/Utilities.js'; var extend = U.extend, pick = U.pick; /* eslint-disable no-invalid-this, valid-jsdoc */ /* * Add focus border functionality to SVGElements. Draws a new rect on top of * element around its bounding box. This is used by multiple components. */ extend(H.SVGElement.prototype, { /** * @private * @function Highcharts.SVGElement#addFocusBorder * * @param {number} margin * * @param {Highcharts.CSSObject} style */ addFocusBorder: function (margin, style) { // Allow updating by just adding new border if (this.focusBorder) { this.removeFocusBorder(); } // Add the border rect var bb = this.getBBox(), pad = pick(margin, 3); bb.x += this.translateX ? this.translateX : 0; bb.y += this.translateY ? this.translateY : 0; this.focusBorder = this.renderer.rect(bb.x - pad, bb.y - pad, bb.width + 2 * pad, bb.height + 2 * pad, parseInt((style && style.borderRadius || 0).toString(), 10)) .addClass('highcharts-focus-border') .attr({ zIndex: 99 }) .add(this.parentGroup); if (!this.renderer.styledMode) { this.focusBorder.attr({ stroke: style && style.stroke, 'stroke-width': style && style.strokeWidth }); } }, /** * @private * @function Highcharts.SVGElement#removeFocusBorder */ removeFocusBorder: function () { if (this.focusBorder) { this.focusBorder.destroy(); delete this.focusBorder; } } }); /** * Set chart's focus to an SVGElement. Calls focus() on it, and draws the focus * border. This is used by multiple components. * * @private * @function Highcharts.Chart#setFocusToElement * * @param {Highcharts.SVGElement} svgElement * Element to draw the border around. * * @param {SVGDOMElement|HTMLDOMElement} [focusElement] * If supplied, it draws the border around svgElement and sets the focus * to focusElement. */ H.Chart.prototype.setFocusToElement = function (svgElement, focusElement) { var focusBorderOptions = this.options.accessibility.keyboardNavigation.focusBorder, browserFocusElement = focusElement || svgElement.element; // Set browser focus if possible if (browserFocusElement && browserFocusElement.focus) { // If there is no focusin-listener, add one to work around Edge issue // where Narrator is not reading out points despite calling focus(). if (!(browserFocusElement.hcEvents && browserFocusElement.hcEvents.focusin)) { addEvent(browserFocusElement, 'focusin', function () { }); } browserFocusElement.focus(); // Hide default focus ring if (focusBorderOptions.hideBrowserFocusOutline) { browserFocusElement.style.outline = 'none'; } } if (focusBorderOptions.enabled) { // Remove old focus border if (this.focusElement) { this.focusElement.removeFocusBorder(); } // Draw focus border (since some browsers don't do it automatically) svgElement.addFocusBorder(focusBorderOptions.margin, { stroke: focusBorderOptions.style.color, strokeWidth: focusBorderOptions.style.lineWidth, borderRadius: focusBorderOptions.style.borderRadius }); this.focusElement = svgElement; } };