import { Renderer } from './renderer'; import { makeSVGElement } from './utils'; /** * @param {Object} wireframe - Wireframe JSON * @param {Object} options - Config object * @param {number} [options.padding=5] - Padding for the SVG element * @param {string} [options.fontFamily=balsamiq] * @param {string} [options.fontURL=https://fonts.gstatic.com/s/balsamiqsans/v3/P5sEzZiAbNrN8SB3lQQX7Pncwd4XIA.woff2] * @returns {Promise} Resolves SVG element */ export async function wireframeJSONToSVG( wireframe: any, options: { padding?: number; fontFamily?: string; fontURL?: string } = {} ) { options = { padding: 5, fontFamily: 'balsamiq', fontURL: '/fonts/balsamiq.woff2', ...options, }; if (options.fontURL) { let font = new FontFace(options.fontFamily!, `url(${options.fontURL})`); await font.load(); document.fonts.add(font); } let mockup = wireframe.mockup; let x = mockup.measuredW - mockup.mockupW - options.padding!; let y = mockup.measuredH - mockup.mockupH - options.padding!; let width = parseInt(mockup.mockupW) + options.padding! * 2; let height = parseInt(mockup.mockupH) + options.padding! * 2; let svgRoot = makeSVGElement('svg', { xmlns: 'http://www.w3.org/2000/svg', 'xmlns:xlink': 'http://www.w3.org/1999/xlink', viewBox: `${x} ${y} ${width} ${height}`, style: 'font-family: balsamiq', }); let renderer = new Renderer(svgRoot, options.fontFamily!); mockup.controls.control .sort((a: any, b: any) => { return a.zOrder - b.zOrder; }) .forEach((control: any) => { renderer.render(control, svgRoot); }); return svgRoot; }