Factorise colours + tidy

This commit is contained in:
Timothy Armes
2023-07-19 12:12:54 +02:00
parent 7348b8da4e
commit e8dd1c935a
6 changed files with 50 additions and 56 deletions
+1
View File
@@ -5,6 +5,7 @@
"colours", "colours",
"contactez", "contactez",
"defaulticon", "defaulticon",
"Depfu",
"Échecs", "Échecs",
"Fédération", "Fédération",
"Florifourchette", "Florifourchette",
+1 -1
View File
@@ -26,4 +26,4 @@ and is deployed on [Vercel](https://vercel.com/)
## Contributions ## Contributions
Contributions are encouraged. Please open an issue to discuss your ideas. Contributions are encouraged. Please open an issue to discuss your ideas.
Add your code into a feature branch such as `feature/feature-name`. We utilise a [GitHub Flow](https://www.gitkraken.com/learn/git/best-practices/git-branch-strategy#github-flow-considerations) branching strategy. Add your code into a feature branch such as `feature/feature-name`. We use the [GitHub Flow](https://www.gitkraken.com/learn/git/best-practices/git-branch-strategy#github-flow-considerations) branching strategy.
+10 -10
View File
@@ -6,6 +6,7 @@ import { useAtomValue } from "jotai";
import { TimeControl } from "@/types"; import { TimeControl } from "@/types";
import { filteredTournamentsByTimeControlAtom } from "@/app/atoms"; import { filteredTournamentsByTimeControlAtom } from "@/app/atoms";
import { TimeControlColours } from "@/app/constants";
const Legend = () => { const Legend = () => {
const t = useTranslations("Tournaments"); const t = useTranslations("Tournaments");
@@ -15,11 +16,11 @@ const Legend = () => {
const timeControls = useMemo( const timeControls = useMemo(
() => () =>
[ [
{ tc: TimeControl.Classic, colour: "#00ac39" }, TimeControl.Classic,
{ tc: TimeControl.Rapid, colour: "#0086c7" }, TimeControl.Rapid,
{ tc: TimeControl.Blitz, colour: "#cec348" }, TimeControl.Blitz,
{ tc: TimeControl.Other, colour: "#d10c3e" }, TimeControl.Other,
].filter(({ tc }) => tournaments.some((t) => t.timeControl === tc)), ].filter((tc) => tournaments.some((t) => t.timeControl === tc)),
[tournaments], [tournaments],
); );
@@ -39,12 +40,11 @@ const Legend = () => {
<ul> <ul>
${timeControls ${timeControls
.map( .map(
({ tc, colour }) => ` (tc) => `
<li> <li>
<span class="block h-4 w-7 border border-[#999] float-left mr-1" style="background: ${colour}"></span>${t( <span class="block h-4 w-7 border border-[#999] float-left mr-1" style="background: ${
"timeControlEnum", TimeControlColours[tc]
{ tc }, }"></span>${t("timeControlEnum", { tc })}
)}
</li> </li>
`, `,
) )
+16 -22
View File
@@ -26,7 +26,8 @@ import {
filteredTournamentsByTimeControlAtom, filteredTournamentsByTimeControlAtom,
normsOnlyAtom, normsOnlyAtom,
} from "@/app/atoms"; } from "@/app/atoms";
import { pie } from "@/lib/pie"; import { generatePieSVG } from "@/lib/pie";
import { TimeControlColours } from "@/app/constants";
import Legend from "./Legend"; import Legend from "./Legend";
import { TournamentMarker } from "./TournamentMarker"; import { TournamentMarker } from "./TournamentMarker";
@@ -234,8 +235,7 @@ export default function TournamentMap() {
}, [expandAndBounceIfNeeded, hoveredListTournamentId]); }, [expandAndBounceIfNeeded, hoveredListTournamentId]);
const createClusterCustomIcon = useCallback((cluster: any) => { const createClusterCustomIcon = useCallback((cluster: any) => {
let childCount = cluster.getChildCount(); const childCount = cluster.getChildCount();
const children = cluster.getAllChildMarkers(); const children = cluster.getAllChildMarkers();
// We added the time control to the icon options when creating the marker // We added the time control to the icon options when creating the marker
@@ -246,25 +246,19 @@ export default function TournamentMap() {
const html = ` const html = `
<div> <div>
${generatePieSVG(
${pie("absolute w-[30px] -z-10", 15, [ "absolute w-[30px]",
{ 15,
value: timeControlCounts[TimeControl.Classic] ?? 0, [
colour: "#00ac39", TimeControl.Classic,
}, TimeControl.Rapid,
{ TimeControl.Blitz,
value: timeControlCounts[TimeControl.Rapid] ?? 0, TimeControl.Other,
colour: "#0086c7", ].map((tc) => ({
}, value: timeControlCounts[tc] ?? 0,
{ colour: TimeControlColours[tc],
value: timeControlCounts[TimeControl.Blitz] ?? 0, })),
colour: "#cec348", )}
},
{
value: timeControlCounts[TimeControl.Other] ?? 0,
colour: "#d10c3e",
},
])}
<span class="text-white font-semibold relative z-[300]">${childCount}</span> <span class="text-white font-semibold relative z-[300]">${childCount}</span>
</div> </div>
`; `;
+8
View File
@@ -0,0 +1,8 @@
import { TimeControl } from "@/types"
export const TimeControlColours = {
[TimeControl.Classic]: "#00ac39",
[TimeControl.Rapid]: "#0086c7",
[TimeControl.Blitz]: "#cec348",
[TimeControl.Other]: "#d10c3e",
}
+11 -20
View File
@@ -14,9 +14,7 @@ function polarToCartesian(radius: number, angleInDegrees: number) {
function getDAttribute(radius: number, startAngle: number, endAngle: number) { function getDAttribute(radius: number, startAngle: number, endAngle: number) {
const isCircle = endAngle - startAngle === 360; const isCircle = endAngle - startAngle === 360;
if (isCircle) { if (isCircle) endAngle--;
endAngle--;
}
const start = polarToCartesian(radius, startAngle); const start = polarToCartesian(radius, startAngle);
const end = polarToCartesian(radius, endAngle); const end = polarToCartesian(radius, endAngle);
@@ -24,14 +22,14 @@ function getDAttribute(radius: number, startAngle: number, endAngle: number) {
const largeArcFlag = endAngle - startAngle <= 180 ? 0 : 1; const largeArcFlag = endAngle - startAngle <= 180 ? 0 : 1;
const d = [ const d = [
"M", start.x, start.y, "M", start.x, start.y,
"A", radius, radius, 0, largeArcFlag, 1, end.x, end.y]; "A", radius, radius, 0, largeArcFlag, 1, end.x, end.y
];
if (isCircle) { if (isCircle) {
d.push("Z"); d.push("Z");
} else { } else {
d.push("L", radius, radius, "L", start.x, start.y, "Z"); d.push("L", radius, radius, "L", start.x, start.y, "Z");
} }
return d.join(" "); return d.join(" ");
} }
@@ -43,35 +41,28 @@ function svg(className: string, width: number, content: string ) {
return `<svg class="${className}" viewBox="0 0 ${width} ${width}"><g class='pie'>${content}</g></svg>`; return `<svg class="${className}" viewBox="0 0 ${width} ${width}"><g class='pie'>${content}</g></svg>`;
} }
type PieSector = { type PieSlice = {
value: number; value: number;
colour: string; colour: string;
} }
export function pie(className: string, radius: number, values: PieSector[]) { export function generatePieSVG(className: string, radius: number, values: PieSlice[]) {
type Sector = { type Sector = {
colour: string; colour: string;
degrees: number; degrees: number;
from?: number; from?: number;
to?: number; to?: number;
path?: string;
} }
const total = values.reduce((a, b) => a + b.value, 0); const total = values.reduce((a, b) => a + b.value, 0);
const data: Sector[] = values.map(({ value, colour }) => ({ colour, degrees: value / total * 360 })); const data: Sector[] = values.map(({ value, colour }) => ({ colour, degrees: value / total * 360 }));
data.forEach((value, i, arr) => { const paths = data.reduce<[number, string][]>((prev, value, i) => {
if (i === 0) { const from = i === 0 ? 0 : prev[i - 1][0];
value.from = 0; const to = from + value.degrees;
value.to = value.degrees;
} else {
value.from = arr[i - 1].to!;
value.to = value.from + value.degrees;
}
value.path = path(getDAttribute(radius, value.from, value.to ), value.colour); return [...prev, [to, path(getDAttribute(radius, from, to ), value.colour)]];
}); }, []);
return svg(className, radius * 2, data.map(o => o.path).join('')); return svg(className, radius * 2, paths.map(([to, path]) => path) .join(''));
} }