createFAIconFactory = async () => {
const fa_styles_class = 'fa-stylesheet'
const fa_styles_id = DOM.uid('fa-styles')
d3.selectAll(`style.${fa_styles_class}`).remove()
const fa_styles = faStyle({solid:true}).then(styles =>
d3.select(document.head)
.append(() => styles)
.attr('id', fa_styles_id.id)
.attr('class', fa_styles_class)
)
const width_test_div_class = 'fa-icon-width-test-div'
d3.selectAll(`div.${width_test_div_class}`).remove()
const width_test_div_id = DOM.uid('fa-icon-width-test-div')
let width_test_div
function makeWidthTestDiv(id) {
const div = d3.create('div')
.attr('id', id)
.attr('class', width_test_div_class)
.attr('width', 0)
.attr('height', 0)
.attr('visibility', 'hidden')
document.body.appendChild(div.node())
return div
}
await fa_styles
return function (options = {}) {
width_test_div = d3.select(`#${width_test_div_id.id}`).empty() ?
makeWidthTestDiv(width_test_div_id) :
width_test_div
const size = options.size ?? 25
const fa_name = options.fa_name ?? 'circle'
const color = options.color ?? 'black'
const temp_id = DOM.uid('icon-temp-id')
const icon = d3.create("xhtml:i")
.attr('class', `fas fa-${fa_name}`)
.attr('id', temp_id.id)
.attr('padding', 2)
.style('color', d3.color(color))
.style('font-size', `${size}px`)
.style('display', 'inline-block')
.style('vertical-align', 'middle')
const container = d3.create('svg:foreignObject')
const container_class = 'svg-faicon-container'
const test_element = width_test_div.append(() => icon.node().cloneNode(true))
elementReady(`#${temp_id.id}`, width_test_div.node()).then(el => {
const icon_width = el.getBoundingClientRect().width
const container_height = size + 4
const container_width = icon_width + 2
container
.attr('class', container_class)
.attr("height", container_height)
.attr("width", container_width)
.attr('y', -size/2 -3)
.attr("x", -container_width/2)
.style('text-align', 'center')
.style('line-height', container_height+'px')
})
// const element = elementReady(`#${temp_id.id}`, width_test_div.node())
// const icon_width = element.getBoundingClientRect().width
// const container_height = size + 4
// const container_width = icon_width + 2
// container
// .attr('class', container_class)
// .attr("height", container_height)
// .attr("width", container_width)
// .attr('y', -size/2 -3)
// .attr("x", -container_width/2)
// .style('text-align', 'center')
// .style('line-height', container_height+'px')
container.append(() => icon.node())
return container
}
}