books = {
const bookWidth = 50;
const minHeight = 250;
const maxHeight = 300;
const bookPadding = 3;
const fadeColor = "#43464A";
const svgWidth = NUMBOOKS * bookWidth + bookPadding * 2;
const usableWidth = NUMBOOKS * bookWidth;
const svgHeight = maxHeight + bookPadding * 2;
const usableHeight = maxHeight;
const svg = d3
.create("svg")
.attr("width", svgWidth)
.attr("height", svgHeight)
.attr("font-size", "10");
const bookWidthRange = d3.extent(BOOKDATA, (d) => d.NumPages);
const bookWidthScale = d3.scaleLinear().domain(bookWidthRange).range([1, 10]);
const bookHeightScale = d3.randomUniform(minHeight, maxHeight);
const booksData = _.map(BOOKDATA, (d, i) => {
const title = d.Title;
const id = i;
const thickness = bookWidthScale(d.NumPages);
const titleLength = d.Title.length;
const height = bookHeightScale();
const coverColor = d.CoverColor;
const accentColor = d.AccentColor;
return {
id,
title,
thickness,
titleLength,
height,
coverColor,
accentColor
};
});
var xScale = d3
.scaleLinear()
.domain([0, Math.PI * 2])
.range([0, usableWidth]);
var pie = d3
.pie()
.sortValues(null)
.value((d) => d.thickness);
var adjustedData = pie(booksData);
const books = svg.selectAll("g").data(adjustedData).enter().append("g");
const bookRects = books.data(adjustedData);
var gradients = books
.append("linearGradient")
.attr("id", (d) => `${d.data.id}-gradient`)
.attr("y1", "0%")
.attr("y2", "0%")
.attr("x1", "0%")
.attr("x2", "100%");
//.attr('gradientUnits', 'userSpaceOnUse')
gradients.append("stop").attr("offset", "0%").attr("stop-color", fadeColor);
gradients
.append("stop")
.attr("offset", "7%")
.attr("stop-color", (d) => d.data.coverColor);
gradients
.append("stop")
.attr("offset", "93%")
.attr("stop-color", (d) => d.data.coverColor);
gradients.append("stop").attr("offset", "100%").attr("stop-color", fadeColor);
books
.append("rect")
.style("fill", (d) => `url(#${d.data.id}-gradient)`)
.style("stroke", fadeColor)
.style("stroke-width", bookPadding)
.merge(bookRects)
.attr("x", function (d) {
return xScale(d.startAngle) + bookPadding;
})
.attr("width", function (d) {
return xScale(d.endAngle) - xScale(d.startAngle);
})
.attr("y", (d) => maxHeight - d.data.height)
.attr("height", (d) => d.data.height);
books
.append("text")
.text((d) => d.data.title)
.attr(
"x",
(d) =>
d.data.height / 2 +
(maxHeight - d.data.height) -
d.data.titleLength * 1.7
) // pretty weird approximation of correct
.attr("y", function (d) {
return -(xScale(d.startAngle) + xScale(d.endAngle)) / 2;
})
.attr("fill", (d) => d.data.accentColor)
.attr("transform", (d) => `rotate(90)`)
.attr("font-family", FONT);
return svg.node();
}