@johnmorrisdotca/taisen-brackets 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -1
- package/NOTICE.md +5 -2
- package/README.md +195 -23
- package/dist/background.d.ts +19 -0
- package/dist/background.js +66 -0
- package/dist/backgrounds-entry.d.ts +2 -0
- package/dist/backgrounds-entry.js +1 -0
- package/dist/family-backgrounds.d.ts +61 -0
- package/dist/family-backgrounds.js +453 -0
- package/dist/index.d.ts +9 -3
- package/dist/index.js +5 -2
- package/dist/locales.js +30 -0
- package/dist/marks.d.ts +18 -1
- package/dist/marks.js +89 -3
- package/dist/matchup.js +1 -0
- package/dist/render.d.ts +1 -1
- package/dist/render.js +473 -87
- package/dist/road-entry.d.ts +2 -0
- package/dist/road-entry.js +1 -0
- package/dist/road.d.ts +28 -0
- package/dist/road.draw.d.ts +4 -0
- package/dist/road.draw.js +259 -0
- package/dist/road.js +58 -0
- package/dist/road.model.d.ts +63 -0
- package/dist/road.model.js +312 -0
- package/dist/road.types.d.ts +115 -0
- package/dist/road.types.js +1 -0
- package/dist/text.d.ts +14 -1
- package/dist/text.js +50 -4
- package/dist/theme.d.ts +29 -2
- package/dist/theme.js +50 -11
- package/dist/types.d.ts +120 -5
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +18 -3
package/dist/locales.js
CHANGED
|
@@ -13,6 +13,12 @@ const EN = {
|
|
|
13
13
|
tieVs: "{a} v {b}", tieScore: "{a} {sa}, {b} {sb}", scoreText: "{a}–{b}", winnerIs: "Winner: {name}", championIs: "Champion: {name}", finalLine: "{round}: {tie}",
|
|
14
14
|
summary: "{n} teams, {r} rounds", summaryOne: "{n} teams, 1 round", sep: ". ", end: ".", note: " ({notes})", noteJoin: ", ",
|
|
15
15
|
columnRound: "Round", columnTie: "Tie", columnNote: "Note", columnDate: "Date", title: "Knockout bracket",
|
|
16
|
+
roadTitle: "Road to the final", roadVs: "v", roadGroup: "Group stage", roadFt: "FT", roadAet: "AET", roadPens: "{a}–{b} pens",
|
|
17
|
+
roadWon: "Won", roadLost: "Lost", roadDrew: "Drew", roadQuarterFinal: "Quarter-final", roadSemiFinal: "Semi-final",
|
|
18
|
+
roadTableTeam: "Team", roadTableOpponent: "Opponent", roadTableScore: "Score", roadTableDecided: "Decided", roadTableResult: "Result",
|
|
19
|
+
roadCaption: "{a} and {b}: every match on the way to the final. Scores are written with the team in the first column first.",
|
|
20
|
+
roadName: "{a} and {b}: {title}", roadSummary: "Matches played before the final: {a} ({an}) and {b} ({bn}).",
|
|
21
|
+
roadFinal: "The final: {a} {score} {b} ({how}).", roadChampion: "{name} won the final.", roadToPlay: "The final is still to be played.",
|
|
16
22
|
};
|
|
17
23
|
const FR = {
|
|
18
24
|
tbd: "À déterminer", bye: "exempt", walkover: "forfait", champion: "Champion", thirdPlace: "Match pour la troisième place", other: "Autres rencontres",
|
|
@@ -22,6 +28,12 @@ const FR = {
|
|
|
22
28
|
tieVs: "{a} contre {b}", tieScore: "{a} {sa}, {b} {sb}", scoreText: "{a}–{b}", winnerIs: "Vainqueur : {name}", championIs: "Champion : {name}", finalLine: "{round} : {tie}",
|
|
23
29
|
summary: "{n} équipes, {r} tours", summaryOne: "{n} équipes, 1 tour", sep: ". ", end: ".", note: " ({notes})", noteJoin: ", ",
|
|
24
30
|
columnRound: "Tour", columnTie: "Rencontre", columnNote: "Note", columnDate: "Date", title: "Tableau à élimination directe",
|
|
31
|
+
roadTitle: "Parcours vers la finale", roadVs: "vs", roadGroup: "Phase de groupes", roadFt: "t.r.", roadAet: "a.p.", roadPens: "{a}–{b} t.a.b.",
|
|
32
|
+
roadWon: "Victoire", roadLost: "Défaite", roadDrew: "Nul", roadQuarterFinal: "Quart de finale", roadSemiFinal: "Demi-finale",
|
|
33
|
+
roadTableTeam: "Équipe", roadTableOpponent: "Adversaire", roadTableScore: "Score", roadTableDecided: "Décidé en", roadTableResult: "Résultat",
|
|
34
|
+
roadCaption: "{a} et {b} : tous les matchs jusqu’à la finale. Chaque score commence par celui de l’équipe de la première colonne.",
|
|
35
|
+
roadName: "{a} et {b} : {title}", roadSummary: "Matchs joués avant la finale : {a} ({an}) et {b} ({bn}).",
|
|
36
|
+
roadFinal: "La finale : {a} {score} {b} ({how}).", roadChampion: "{name} a remporté la finale.", roadToPlay: "La finale reste à jouer.",
|
|
25
37
|
};
|
|
26
38
|
const JA = {
|
|
27
39
|
tbd: "未定", bye: "シード", walkover: "不戦勝", champion: "優勝", thirdPlace: "3位決定戦", other: "その他の対戦",
|
|
@@ -31,6 +43,12 @@ const JA = {
|
|
|
31
43
|
tieVs: "{a} 対 {b}", tieScore: "{a} {sa}–{sb} {b}", scoreText: "{a}–{b}", winnerIs: "勝者:{name}", championIs: "優勝:{name}", finalLine: "{round}:{tie}",
|
|
32
44
|
summary: "{n}チーム、{r}ラウンド", summaryOne: "{n}チーム、1ラウンド", sep: "。", end: "。", note: "({notes})", noteJoin: "、",
|
|
33
45
|
columnRound: "ラウンド", columnTie: "対戦", columnNote: "備考", columnDate: "日付", title: "トーナメント表",
|
|
46
|
+
roadTitle: "決勝への道", roadVs: "対", roadGroup: "グループステージ", roadFt: "規定時間", roadAet: "延長", roadPens: "PK戦 {a}–{b}",
|
|
47
|
+
roadWon: "勝ち", roadLost: "負け", roadDrew: "引き分け", roadQuarterFinal: "準々決勝", roadSemiFinal: "準決勝",
|
|
48
|
+
roadTableTeam: "チーム", roadTableOpponent: "対戦相手", roadTableScore: "スコア", roadTableDecided: "決着", roadTableResult: "結果",
|
|
49
|
+
roadCaption: "{a}と{b}:決勝までの全試合。スコアは「チーム」列のチームの得点を先に書いています。",
|
|
50
|
+
roadName: "{a}と{b}:{title}", roadSummary: "{a}は決勝までに{an}試合、{b}は{bn}試合を戦いました。",
|
|
51
|
+
roadFinal: "決勝は{a} {score} {b}({how})でした。", roadChampion: "{name}が優勝しました。", roadToPlay: "決勝はまだ行われていません。",
|
|
34
52
|
};
|
|
35
53
|
const ES = {
|
|
36
54
|
tbd: "Por definir", bye: "exento", walkover: "incomparecencia", champion: "Campeón", thirdPlace: "Partido por el tercer puesto", other: "Otros partidos",
|
|
@@ -40,6 +58,12 @@ const ES = {
|
|
|
40
58
|
tieVs: "{a} vs. {b}", tieScore: "{a} {sa}, {b} {sb}", scoreText: "{a}–{b}", winnerIs: "Ganador: {name}", championIs: "Campeón: {name}", finalLine: "{round}: {tie}",
|
|
41
59
|
summary: "{n} equipos, {r} rondas", summaryOne: "{n} equipos, 1 ronda", sep: ". ", end: ".", note: " ({notes})", noteJoin: ", ",
|
|
42
60
|
columnRound: "Ronda", columnTie: "Partido", columnNote: "Nota", columnDate: "Fecha", title: "Cuadro de eliminatorias",
|
|
61
|
+
roadTitle: "El camino a la final", roadVs: "vs.", roadGroup: "Fase de grupos", roadFt: "T. reg.", roadAet: "Prórroga", roadPens: "{a}–{b} en los penales",
|
|
62
|
+
roadWon: "Ganó", roadLost: "Perdió", roadDrew: "Empató", roadQuarterFinal: "Cuartos de final", roadSemiFinal: "Semifinal",
|
|
63
|
+
roadTableTeam: "Equipo", roadTableOpponent: "Rival", roadTableScore: "Marcador", roadTableDecided: "Decidido en", roadTableResult: "Resultado",
|
|
64
|
+
roadCaption: "{a} y {b}: todos los partidos hasta la final. Los marcadores empiezan por el equipo de la primera columna.",
|
|
65
|
+
roadName: "{a} y {b}: {title}", roadSummary: "Partidos jugados hasta la final: {a} ({an}) y {b} ({bn}).",
|
|
66
|
+
roadFinal: "La final: {a} {score} {b} ({how}).", roadChampion: "{name} ganó la final.", roadToPlay: "La final aún no se ha jugado.",
|
|
43
67
|
};
|
|
44
68
|
const DE = {
|
|
45
69
|
tbd: "offen", bye: "Freilos", walkover: "kampflos", champion: "Turniersieger", thirdPlace: "Spiel um Platz 3", other: "Weitere Begegnungen",
|
|
@@ -49,6 +73,12 @@ const DE = {
|
|
|
49
73
|
tieVs: "{a} gegen {b}", tieScore: "{a} {sa}, {b} {sb}", scoreText: "{a}:{b}", winnerIs: "Sieger: {name}", championIs: "Turniersieger: {name}", finalLine: "{round}: {tie}",
|
|
50
74
|
summary: "{n} Teams, {r} Runden", summaryOne: "{n} Teams, 1 Runde", sep: ". ", end: ".", note: " ({notes})", noteJoin: ", ",
|
|
51
75
|
columnRound: "Runde", columnTie: "Begegnung", columnNote: "Hinweis", columnDate: "Datum", title: "Turnierbaum",
|
|
76
|
+
roadTitle: "Der Weg ins Finale", roadVs: "vs.", roadGroup: "Gruppenphase", roadFt: "reg. Zeit", roadAet: "n. V.", roadPens: "{a}:{b} i. E.",
|
|
77
|
+
roadWon: "Sieg", roadLost: "Niederlage", roadDrew: "Remis", roadQuarterFinal: "Viertelfinale", roadSemiFinal: "Halbfinale",
|
|
78
|
+
roadTableTeam: "Team", roadTableOpponent: "Gegner", roadTableScore: "Ergebnis", roadTableDecided: "Entschieden", roadTableResult: "Ausgang",
|
|
79
|
+
roadCaption: "{a} und {b}: alle Spiele auf dem Weg ins Finale. Die Ergebnisse beginnen mit dem Team der ersten Spalte.",
|
|
80
|
+
roadName: "{a} und {b}: {title}", roadSummary: "Spiele bis zum Finale: {a} ({an}) und {b} ({bn}).",
|
|
81
|
+
roadFinal: "Das Finale: {a} {score} {b} ({how}).", roadChampion: "{name} gewann das Finale.", roadToPlay: "Das Finale steht noch aus.",
|
|
52
82
|
};
|
|
53
83
|
/**
|
|
54
84
|
* The round names, English name first. The football rounds are the terms of each language's Wikipedia article on the World Cup;
|
package/dist/marks.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DrawOptions, Team } from "./types.ts";
|
|
1
|
+
import type { DrawOptions, FlagRenderer, FlagRequest, Team } from "./types.ts";
|
|
2
2
|
/**
|
|
3
3
|
* Takes inline SVG markup from a caller and makes it safe to put inside a drawing: the outer `<svg>`'s viewBox is kept,
|
|
4
4
|
* and scripts, event handlers, `<style>`, `<foreignObject>`, comments and `javascript:` addresses are removed. Returns the
|
|
@@ -34,7 +34,24 @@ export interface MarkContext {
|
|
|
34
34
|
}>;
|
|
35
35
|
prefix: string;
|
|
36
36
|
shape: "round" | "square" | "none";
|
|
37
|
+
/** The look: `road` draws a team's mark with a wide ring and a hairline outside it. */
|
|
38
|
+
look?: "classic" | "road";
|
|
39
|
+
/** Draws a team's `flag` code; with none a team's `mark` or initials are drawn. */
|
|
40
|
+
flags?: FlagRenderer;
|
|
41
|
+
/** The address of a team's flag by its `flag` code, for a flag that is a picture to load and not markup to inline; tried where `flags` gives none. */
|
|
42
|
+
flagHref?: (code: string) => string | null | undefined;
|
|
43
|
+
/** The theme a flag renderer is told about. */
|
|
44
|
+
theme?: FlagRequest["theme"];
|
|
45
|
+
/** The flags already asked for, by code, shape and size, so that a renderer is called once for each. */
|
|
46
|
+
flagCache?: Map<string, {
|
|
47
|
+
viewBox: string;
|
|
48
|
+
inner: string;
|
|
49
|
+
} | null>;
|
|
37
50
|
}
|
|
51
|
+
/** Whether an address may be a link in a drawing: http(s), a relative path or a `#` fragment. `javascript:`, `data:` and every other scheme are refused. */
|
|
52
|
+
export declare function safeHref(url: string): boolean;
|
|
53
|
+
/** The `<defs>` content the marks drawn with a context need: a circular clip for each radius, and each inline mark or flag once as a `<symbol>`. Written after the marks are drawn. */
|
|
54
|
+
export declare function markDefs(ctx: MarkContext): string;
|
|
38
55
|
/** The id of the circular clip for a radius. */
|
|
39
56
|
export declare const clipId: (prefix: string, r: number) => string;
|
|
40
57
|
/**
|
package/dist/marks.js
CHANGED
|
@@ -78,6 +78,44 @@ export function safeUrl(url) {
|
|
|
78
78
|
return true;
|
|
79
79
|
return !/^[a-z][a-z0-9+.-]*:/i.test(u) && !u.startsWith("//") ? u.length > 0 : false;
|
|
80
80
|
}
|
|
81
|
+
/** Whether an address may be a link in a drawing: http(s), a relative path or a `#` fragment. `javascript:`, `data:` and every other scheme are refused. */
|
|
82
|
+
export function safeHref(url) {
|
|
83
|
+
const u = url.trim();
|
|
84
|
+
// eslint-disable-next-line no-control-regex
|
|
85
|
+
if (u.length === 0 || /[\u0000-\u001f\u007f]/.test(u))
|
|
86
|
+
return false;
|
|
87
|
+
if (/^https?:\/\//i.test(u))
|
|
88
|
+
return true;
|
|
89
|
+
return !/^[a-z][a-z0-9+.-]*:/i.test(u) && !u.startsWith("//");
|
|
90
|
+
}
|
|
91
|
+
/** The flag a renderer makes for a code, cleaned like any inline SVG, or `null` when there is no renderer, it has no flag for the code, it throws, or what it returns is not an `<svg>`. */
|
|
92
|
+
function flagOf(code, size, ctx) {
|
|
93
|
+
if (typeof ctx.flags !== "function" || typeof code !== "string" || code.trim() === "")
|
|
94
|
+
return null;
|
|
95
|
+
const shape = ctx.shape === "square" ? "square" : "round";
|
|
96
|
+
const key = `${code.trim()}|${shape}|${Math.round(size)}`;
|
|
97
|
+
const cache = ctx.flagCache;
|
|
98
|
+
if (cache?.has(key))
|
|
99
|
+
return cache.get(key) ?? null;
|
|
100
|
+
let made = null;
|
|
101
|
+
try {
|
|
102
|
+
const markup = ctx.flags(code.trim(), { shape, size: Math.round(size), theme: ctx.theme ?? "inherit" });
|
|
103
|
+
if (typeof markup === "string")
|
|
104
|
+
made = cleanSvg(markup);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
made = null;
|
|
108
|
+
}
|
|
109
|
+
cache?.set(key, made);
|
|
110
|
+
return made;
|
|
111
|
+
}
|
|
112
|
+
/** The `<defs>` content the marks drawn with a context need: a circular clip for each radius, and each inline mark or flag once as a `<symbol>`. Written after the marks are drawn. */
|
|
113
|
+
export function markDefs(ctx) {
|
|
114
|
+
return [
|
|
115
|
+
...[...ctx.radii].sort((a, b) => a - b).map((r) => `<clipPath id="${clipId(ctx.prefix, r)}"><circle r="${num(r)}"/></clipPath>`),
|
|
116
|
+
...[...ctx.symbols.values()].map((s) => `<symbol id="${s.id}" viewBox="${esc(s.viewBox)}" preserveAspectRatio="xMidYMid slice">${s.inner}</symbol>`),
|
|
117
|
+
].join("");
|
|
118
|
+
}
|
|
81
119
|
/** The id of the circular clip for a radius. */
|
|
82
120
|
export const clipId = (prefix, r) => `${prefix}-c${String(num(r)).replace(".", "_")}`;
|
|
83
121
|
/**
|
|
@@ -94,8 +132,39 @@ export function drawMark(team, cx, cy, size, ctx, abbrText) {
|
|
|
94
132
|
ctx.radii.add(r);
|
|
95
133
|
const wrapOpen = clip ? `<g class="tb-mark" transform="translate(${num(cx)} ${num(cy)})" clip-path="url(#${clipId(ctx.prefix, r)})">` : `<g class="tb-mark">`;
|
|
96
134
|
const ox = clip ? -r : x, oy = clip ? -r : y;
|
|
97
|
-
const
|
|
98
|
-
const
|
|
135
|
+
const road = ctx.look === "road";
|
|
136
|
+
const rw = Math.max(r * 0.09, 0.5);
|
|
137
|
+
const hair = num(Math.max(rw * 0.3, 0.3));
|
|
138
|
+
const ring = road
|
|
139
|
+
? clip
|
|
140
|
+
? `<circle class="tb-ring tb-ring-r" cx="${num(cx)}" cy="${num(cy)}" r="${num(r - rw / 2)}" stroke-width="${num(rw)}"/><circle class="tb-edge" cx="${num(cx)}" cy="${num(cy)}" r="${num(r)}" stroke-width="${hair}"/>`
|
|
141
|
+
: `<rect class="tb-ring tb-ring-r" x="${num(x + rw / 2)}" y="${num(y + rw / 2)}" width="${num(size - rw)}" height="${num(size - rw)}" rx="2" stroke-width="${num(rw)}"/><rect class="tb-edge" x="${num(x)}" y="${num(y)}" width="${num(size)}" height="${num(size)}" rx="2" stroke-width="${hair}"/>`
|
|
142
|
+
: clip
|
|
143
|
+
? `<circle class="tb-ring" cx="${num(cx)}" cy="${num(cy)}" r="${num(r)}"/>`
|
|
144
|
+
: `<rect class="tb-ring" x="${num(x)}" y="${num(y)}" width="${num(size)}" height="${num(size)}" rx="2"/>`;
|
|
145
|
+
const flag = flagOf(team.flag, size, ctx);
|
|
146
|
+
if (flag) {
|
|
147
|
+
const key = `flag:${flag.viewBox}:${flag.inner}`;
|
|
148
|
+
let symbol = ctx.symbols.get(key);
|
|
149
|
+
if (!symbol) {
|
|
150
|
+
symbol = { id: `${ctx.prefix}-m${ctx.symbols.size + 1}`, ...flag };
|
|
151
|
+
ctx.symbols.set(key, symbol);
|
|
152
|
+
}
|
|
153
|
+
return `${wrapOpen}<use href="#${symbol.id}" x="${num(ox)}" y="${num(oy)}" width="${num(size)}" height="${num(size)}"/></g>${ring}`;
|
|
154
|
+
}
|
|
155
|
+
// A flag that is an address (`flagHref`) is the mark in place of the team's own, and, like every picture address, is written once.
|
|
156
|
+
let fromCode;
|
|
157
|
+
if (typeof ctx.flagHref === "function" && typeof team.flag === "string" && team.flag.trim() !== "") {
|
|
158
|
+
try {
|
|
159
|
+
const href = ctx.flagHref(team.flag.trim());
|
|
160
|
+
if (typeof href === "string" && !href.trim().startsWith("<") && safeUrl(href))
|
|
161
|
+
fromCode = href;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
fromCode = undefined;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const mark = (fromCode ?? team.mark)?.trim();
|
|
99
168
|
if (mark) {
|
|
100
169
|
if (mark.startsWith("<")) {
|
|
101
170
|
const svg = cleanSvg(mark);
|
|
@@ -109,10 +178,27 @@ export function drawMark(team, cx, cy, size, ctx, abbrText) {
|
|
|
109
178
|
}
|
|
110
179
|
}
|
|
111
180
|
else if (safeUrl(mark)) {
|
|
112
|
-
|
|
181
|
+
// Each distinct address is written once, as a symbol that holds the image, and used wherever the team appears: a long data address or a URL repeated per use would be written again and again.
|
|
182
|
+
const key = `url:${mark}`;
|
|
183
|
+
let symbol = ctx.symbols.get(key);
|
|
184
|
+
if (!symbol) {
|
|
185
|
+
symbol = { id: `${ctx.prefix}-m${ctx.symbols.size + 1}`, viewBox: "0 0 100 100", inner: `<image href="${esc(mark)}" x="0" y="0" width="100" height="100" preserveAspectRatio="xMidYMid slice"/>` };
|
|
186
|
+
ctx.symbols.set(key, symbol);
|
|
187
|
+
}
|
|
188
|
+
return `${wrapOpen}<use href="#${symbol.id}" x="${num(ox)}" y="${num(oy)}" width="${num(size)}" height="${num(size)}"/></g>${ring}`;
|
|
113
189
|
}
|
|
114
190
|
}
|
|
115
191
|
const text = (abbrText ?? team.abbr ?? abbreviate(team.name)).slice(0, 3);
|
|
192
|
+
if (road) {
|
|
193
|
+
// No flag or logo: the road look draws a tile with the abbreviation on it, so that a team without a picture looks meant. A team colour fills the tile (the letters are white or
|
|
194
|
+
// near-black, whichever reads on it); with none the tile is neutral.
|
|
195
|
+
const rx = size * 0.24;
|
|
196
|
+
const tile = `<rect class="tb-plain tb-tile" x="${num(x)}" y="${num(y)}" width="${num(size)}" height="${num(size)}" rx="${num(rx)}"${team.color ? ` style="fill:${esc(team.color)}"` : ""}/>`;
|
|
197
|
+
const tileInk = team.color ? inkOn(team.color) : null;
|
|
198
|
+
const tileRing = `<rect class="tb-ring tb-ring-r" x="${num(x + rw / 2)}" y="${num(y + rw / 2)}" width="${num(size - rw)}" height="${num(size - rw)}" rx="${num(Math.max(rx - rw / 2, 1))}" stroke-width="${num(rw)}"/><rect class="tb-edge" x="${num(x)}" y="${num(y)}" width="${num(size)}" height="${num(size)}" rx="${num(rx)}" stroke-width="${hair}"/>`;
|
|
199
|
+
const letters = [...text].length;
|
|
200
|
+
return `<g class="tb-mark">${tile}<text class="tb-initials" x="${num(cx)}" y="${num(cy + size * 0.13)}" font-size="${num(size * (letters <= 2 ? 0.4 : 0.31))}" font-weight="800" letter-spacing=".02em" text-anchor="middle"${tileInk ? ` style="fill:${tileInk}"` : ""}>${esc(text)}</text></g>${tileRing}`;
|
|
201
|
+
}
|
|
116
202
|
const fill = team.color ? ` style="fill:${esc(team.color)}"` : "";
|
|
117
203
|
const shape = clip ? `<circle class="tb-plain" cx="${num(cx)}" cy="${num(cy)}" r="${num(r)}"${fill}/>` : `<rect class="tb-plain" x="${num(x)}" y="${num(y)}" width="${num(size)}" height="${num(size)}" rx="2"${fill}/>`;
|
|
118
204
|
const ink = team.color ? inkOn(team.color) : null;
|
package/dist/matchup.js
CHANGED
package/dist/render.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { BracketInput, BracketLayout, DrawOptions, Matchup, Size, SizeName } from "./types.ts";
|
|
2
2
|
import { type Voice } from "./locales.ts";
|
|
3
|
-
/** The sizes by name. A phone's drawing is 390 wide and as tall as the bracket needs. */
|
|
3
|
+
/** The sizes by name. A phone's drawing is 390 wide and as tall as the bracket needs; a card is 1080 by 1350, a tall post. */
|
|
4
4
|
export declare const SIZES: Readonly<Record<SizeName, Size>>;
|
|
5
5
|
/** The layout with each team's name in the language: what the drawing, the table and the description are written from. */
|
|
6
6
|
export declare function localizedLayout(layout: BracketLayout, v: Voice): BracketLayout;
|