@johnmorrisdotca/dougu-sports 0.4.1 → 0.5.1
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 +42 -1
- package/NOTICE.md +6 -4
- package/README.md +10 -8
- package/dist/emblems/ball/ball.baseball.vintage.d.ts +10 -0
- package/dist/emblems/ball/ball.baseball.vintage.js +70 -0
- package/dist/emblems/ball/ball.core.d.ts +4 -0
- package/dist/emblems/ball/ball.core.js +11 -1
- package/dist/emblems/ball/ball.decal.d.ts +56 -0
- package/dist/emblems/ball/ball.decal.js +146 -0
- package/dist/emblems/ball/ball.engine.d.ts +7 -1
- package/dist/emblems/ball/ball.engine.js +10 -2
- package/dist/emblems/ball/ball.family.panelled.d.ts +5 -0
- package/dist/emblems/ball/ball.family.panelled.js +12 -5
- package/dist/emblems/ball/ball.family.seamed.d.ts +8 -1
- package/dist/emblems/ball/ball.family.seamed.js +13 -3
- package/dist/emblems/ball/ball.index.js +6 -1
- package/dist/emblems/ball/ball.soccer.era.d.ts +23 -0
- package/dist/emblems/ball/ball.soccer.era.js +302 -0
- package/dist/emblems/ball/ball.soccer.store.d.ts +19 -0
- package/dist/emblems/ball/ball.soccer.store.js +176 -0
- package/dist/emblems/ball/ball.soccer.vintage.d.ts +11 -0
- package/dist/emblems/ball/ball.soccer.vintage.js +135 -0
- package/dist/emblems/ball/ball.tilings.d.ts +26 -0
- package/dist/emblems/ball/ball.tilings.js +87 -0
- package/dist/emblems/ball/ball.volleyball.flag.d.ts +12 -0
- package/dist/emblems/ball/ball.volleyball.flag.js +36 -0
- package/dist/emblems/emblem.core.d.ts +2 -0
- package/dist/emblems/emblem.descriptions.js +72 -5
- package/dist/emblems/emblem.ids.d.ts +5 -5
- package/dist/emblems/emblem.ids.js +8 -4
- package/dist/emblems/gear/gear.budo.d.ts +39 -3
- package/dist/emblems/gear/gear.budo.js +311 -50
- package/dist/emblems/gear/gear.index.js +2 -2
- package/dist/emblems/sport/cfl.js +3 -3
- package/dist/emblems/sport/ifaf.js +3 -3
- package/dist/emblems/sport/judo.js +11 -6
- package/dist/emblems/sport/karate.js +10 -6
- package/dist/emblems/sport/nfl.d.ts +2 -0
- package/dist/emblems/sport/nfl.js +31 -12
- package/dist/index.d.ts +7 -2
- package/dist/index.js +6 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { drawn,
|
|
2
|
-
/**
|
|
1
|
+
import { drawn, rect } from "./gear.core.js";
|
|
2
|
+
/**
|
|
3
|
+
* The colours of the judo belts, which `tint` takes: the six kyu colours in order, black (1st to 5th dan), `kohaku` (the red of the red-and-white belt of the 6th to 8th dan, whose white panels are the accent) and
|
|
4
|
+
* `red` (9th and 10th dan). The Kodokan's own kyu belts are white and brown only; the colours between are a later, national addition, so a country's order may differ.
|
|
5
|
+
*/
|
|
3
6
|
export const OBI_RANKS = {
|
|
4
7
|
white: "#f2efe8",
|
|
5
8
|
yellow: "#f2c21b",
|
|
@@ -8,53 +11,311 @@ export const OBI_RANKS = {
|
|
|
8
11
|
blue: "#2b64c8",
|
|
9
12
|
brown: "#7a4a24",
|
|
10
13
|
black: "#1f2228",
|
|
14
|
+
kohaku: "#c4202e",
|
|
15
|
+
red: "#c4202e",
|
|
11
16
|
};
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
/** Judogi colours: the IJF white ("snow white") and blue (between Pantone 285M and 286M). */
|
|
18
|
+
export const JUDOGI_WHITE = "#f6f4ee";
|
|
19
|
+
export const JUDOGI_BLUE = "#1456b6";
|
|
20
|
+
const f = (n) => String(Math.round(n * 10) / 10);
|
|
21
|
+
const path = (pts, close = true) => `M${pts.map((p) => `${f(p[0])} ${f(p[1])}`).join("L")}${close ? "z" : ""}`;
|
|
22
|
+
const mirror = (pts) => pts.map((p) => [64 - p[0], p[1]]);
|
|
23
|
+
/** A rectangle of width `w` along the segment from `a` to `b`, as a polygon. */
|
|
24
|
+
const strip = (a, b, w) => {
|
|
25
|
+
const dx = b[0] - a[0], dy = b[1] - a[1];
|
|
26
|
+
const l = Math.hypot(dx, dy) || 1;
|
|
27
|
+
const nx = (-dy / l) * (w / 2), ny = (dx / l) * (w / 2);
|
|
28
|
+
return [[a[0] + nx, a[1] + ny], [b[0] + nx, b[1] + ny], [b[0] - nx, b[1] - ny], [a[0] - nx, a[1] - ny]];
|
|
29
|
+
};
|
|
30
|
+
const lerp = (a, b, t) => [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];
|
|
31
|
+
/** A line parallel to the segment from `a` to `b`, `off` to its side, between the fractions `t0` and `t1` of its length. */
|
|
32
|
+
const along = (a, b, off, t0, t1) => {
|
|
33
|
+
const dx = b[0] - a[0], dy = b[1] - a[1];
|
|
34
|
+
const l = Math.hypot(dx, dy) || 1;
|
|
35
|
+
const nx = (-dy / l) * off, ny = (dx / l) * off;
|
|
36
|
+
const p0 = lerp(a, b, t0), p1 = lerp(a, b, t1);
|
|
37
|
+
return `M${f(p0[0] + nx)} ${f(p0[1] + ny)}L${f(p1[0] + nx)} ${f(p1[1] + ny)}`;
|
|
38
|
+
};
|
|
39
|
+
/** Horizontal rows (every `step`, from `y0` to `y1`) clipped to a convex polygon, as one path. */
|
|
40
|
+
function rows(poly, y0, y1, step, inset = 0) {
|
|
41
|
+
let d = "";
|
|
42
|
+
for (let y = y0; y <= y1 + 1e-6; y += step) {
|
|
43
|
+
const xs = [];
|
|
44
|
+
for (let i = 0; i < poly.length; i++) {
|
|
45
|
+
const a = poly[i], b = poly[(i + 1) % poly.length];
|
|
46
|
+
if ((a[1] <= y && b[1] > y) || (b[1] <= y && a[1] > y))
|
|
47
|
+
xs.push(a[0] + ((y - a[1]) / (b[1] - a[1])) * (b[0] - a[0]));
|
|
48
|
+
}
|
|
49
|
+
if (xs.length >= 2) {
|
|
50
|
+
const xa = Math.min(...xs) + inset, xb = Math.max(...xs) - inset;
|
|
51
|
+
if (xb > xa)
|
|
52
|
+
d += `M${f(xa)} ${f(y)}H${f(xb)}`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return d;
|
|
56
|
+
}
|
|
57
|
+
// Cloth lines are laid over the cloth as ink at low opacity (dark rows) or as light rows, so they follow any tint.
|
|
58
|
+
const INK = "#0d1522";
|
|
59
|
+
/** The edge of a black belt: light enough to show on a dark page. */
|
|
60
|
+
const BELT_EDGE = "#5d6672";
|
|
61
|
+
const dark = (d, w = 0.3, op = 0.2) => ({ d, fill: "none", stroke: INK, w, op, line: "none" });
|
|
62
|
+
const light = (d, w = 0.3, op = 0.3) => ({ d, fill: "none", stroke: "#ffffff", w, op, line: "none" });
|
|
63
|
+
/** A belt tied at the front: two wraps, a flat square knot and two equal ends hanging a little apart. Parts, back to front. */
|
|
64
|
+
function belt(s) {
|
|
65
|
+
const parts = [];
|
|
66
|
+
const hw = (s.x1 - s.x0) / 2;
|
|
67
|
+
const w = s.w;
|
|
68
|
+
const alt = s.alt ?? s.main;
|
|
69
|
+
const edge = (x, y) => y + s.sag * (1 - ((x - s.cx) / hw) ** 2);
|
|
70
|
+
const sample = (xa, xb) => {
|
|
71
|
+
const n = Math.max(2, Math.ceil((xb - xa) / 9));
|
|
72
|
+
return Array.from({ length: n + 1 }, (_, i) => xa + ((xb - xa) * i) / n);
|
|
73
|
+
};
|
|
74
|
+
/** The wrap between `xa` and `xb`, from the fraction `f0` to `f1` of its width, whose top is at `y`, as a polygon that follows the sag. */
|
|
75
|
+
const band = (xa, xb, y, f0 = 0, f1 = 1) => {
|
|
76
|
+
const xs = sample(xa, xb);
|
|
77
|
+
return [...xs.map((x) => [x, edge(x, y + w * f0)]), ...xs.map((x) => [x, edge(x, y + w * f1)]).reverse()];
|
|
78
|
+
};
|
|
79
|
+
const line = (y, xa, xb) => path(sample(xa, xb).map((x) => [x, edge(x, y)]), false);
|
|
80
|
+
const colourAt = (cuts, start, other) => {
|
|
81
|
+
const xs = [s.x0, ...cuts, s.x1];
|
|
82
|
+
return xs.slice(0, -1).map((x, i) => [x, xs[i + 1], i % 2 === 0 ? start : other]);
|
|
83
|
+
};
|
|
84
|
+
const yU = s.y, yL = s.y + w - 0.3;
|
|
85
|
+
const wraps = [
|
|
86
|
+
[yL, s.panels === undefined ? [[s.x0, s.x1, s.main]] : colourAt(s.panels.lower, alt, s.main)],
|
|
87
|
+
[yU, s.panels === undefined ? [[s.x0, s.x1, s.main]] : colourAt(s.panels.upper, s.main, alt)],
|
|
88
|
+
];
|
|
89
|
+
const stitches = (y, xa, xb) => {
|
|
90
|
+
parts.push(dark(line(y + w * 0.3, xa, xb) + line(y + w * 0.7, xa, xb), 0.28, 0.3));
|
|
91
|
+
parts.push(light(line(y + w * 0.3 + 0.35, xa, xb) + line(y + w * 0.7 + 0.35, xa, xb), 0.25, 0.2));
|
|
92
|
+
};
|
|
93
|
+
for (const [y, segments] of wraps) {
|
|
94
|
+
for (const [xa, xb, fill] of segments)
|
|
95
|
+
parts.push({ d: path(band(xa, xb, y)), fill, stroke: s.edge, cyl: 0.5, shade: 0.25 });
|
|
96
|
+
if (s.half === true)
|
|
97
|
+
parts.push({ d: path(band(s.x0, s.x1, y, 0.5, 1)), fill: alt, stroke: "none", cyl: 0.5, shade: 0.25, line: "none" });
|
|
98
|
+
stitches(y, s.x0 + 0.8, s.x1 - 0.8);
|
|
99
|
+
if (s.stripe === true)
|
|
100
|
+
parts.push({ d: path(band(s.x0, s.x1, y, 0.425, 0.575)), fill: "#f6f4ee", stroke: "none", line: "none" });
|
|
101
|
+
}
|
|
102
|
+
// The knot sits over both wraps. The two ends come out from under it, a little apart and of one length; the knot is a flat blob closed across the middle by the turn of the second end.
|
|
103
|
+
const yc = (yU + yL + w) / 2 + s.sag;
|
|
104
|
+
const hh = w * 1.2;
|
|
105
|
+
const kw = s.knot;
|
|
106
|
+
const yt = yc - hh, yb = yc + hh;
|
|
107
|
+
const rad = (s.splay * Math.PI) / 180;
|
|
108
|
+
const tw = w * 1.02;
|
|
109
|
+
const tailFill = s.panels?.tail ?? s.main;
|
|
110
|
+
for (const side of [-1, 1]) {
|
|
111
|
+
const a = [s.cx + side * kw * 0.2, yc + hh * 0.2];
|
|
112
|
+
const b = [a[0] + side * Math.sin(rad) * s.tail, a[1] + Math.cos(rad) * s.tail];
|
|
113
|
+
parts.push({ d: path(strip(a, b, tw)), fill: tailFill, stroke: s.edge, cyl: 0.55, shade: 0.25 });
|
|
114
|
+
if (s.half === true) {
|
|
115
|
+
const q = strip(a, b, tw);
|
|
116
|
+
parts.push({ d: path([lerp(q[0], q[3], 0.5), lerp(q[1], q[2], 0.5), q[2], q[3]]), fill: alt, stroke: "none", cyl: 0.55, shade: 0.25, line: "none" });
|
|
117
|
+
}
|
|
118
|
+
parts.push(dark(along(a, b, -tw * 0.18, 0.3, 0.98) + along(a, b, tw * 0.18, 0.3, 0.98), 0.28, 0.3));
|
|
119
|
+
parts.push(light(along(a, b, -tw * 0.18 + 0.35, 0.3, 0.98) + along(a, b, tw * 0.18 + 0.35, 0.3, 0.98), 0.25, 0.2));
|
|
120
|
+
if (s.stripe === true)
|
|
121
|
+
parts.push({ d: path(strip(lerp(a, b, 0.25), lerp(a, b, 1), tw * 0.15)), fill: "#f6f4ee", stroke: "none", line: "none" });
|
|
122
|
+
if (s.bars === true)
|
|
123
|
+
parts.push({ d: path(strip(lerp(a, b, 1 - 3.4 / s.tail), lerp(a, b, 1 - 2.2 / s.tail), tw)), fill: "$accent", stroke: "none", op: 0.9, line: "none" });
|
|
124
|
+
}
|
|
125
|
+
const kfill = s.panels === undefined ? s.main : alt;
|
|
126
|
+
const blob = rect(s.cx - kw / 2, yt, kw, hh * 2, Math.min(2.4, kw * 0.22));
|
|
127
|
+
parts.push({ d: blob, fill: kfill, stroke: s.edge, cyl: 0.6, shade: 0.3 });
|
|
128
|
+
if (s.half === true)
|
|
129
|
+
parts.push({ d: rect(s.cx - kw / 2, yc, kw, hh, Math.min(2.4, kw * 0.22)), fill: alt, stroke: "none", cyl: 0.6, shade: 0.3, line: "none" });
|
|
130
|
+
// the folds of the knot: two diagonals that cross, from the top corners to the foot of the knot
|
|
131
|
+
const fx0 = s.cx - kw / 2, fx1 = s.cx + kw / 2;
|
|
132
|
+
parts.push(dark(`M${f(fx0 + 0.9)} ${f(yt + 0.9)}L${f(fx1 - 1.6)} ${f(yb - 0.9)}M${f(fx1 - 0.9)} ${f(yt + 0.9)}L${f(fx0 + 1.6)} ${f(yb - 0.9)}`, 0.34, 0.42));
|
|
133
|
+
parts.push(light(`M${f(fx0 + 1.5)} ${f(yt + 0.9)}L${f(fx1 - 1)} ${f(yb - 0.9)}M${f(fx1 - 1.5)} ${f(yt + 0.9)}L${f(fx0 + 1)} ${f(yb - 0.9)}`, 0.3, 0.3));
|
|
134
|
+
const wt = yc - w * 0.46, wh = w * 0.92;
|
|
135
|
+
parts.push({ d: rect(fx0 - 0.5, wt, kw + 1, wh, 0.9), fill: s.main, stroke: s.edge, cyl: 0.9, shade: 0.3 });
|
|
136
|
+
if (s.half === true)
|
|
137
|
+
parts.push({ d: rect(fx0 - 0.5, yc, kw + 1, wh / 2, 0.5), fill: alt, stroke: "none", cyl: 0.9, shade: 0.3, line: "none" });
|
|
138
|
+
parts.push(dark(`M${f(fx0)} ${f(yc)}H${f(fx1)}`, 0.28, 0.3));
|
|
139
|
+
if (s.stripe === true)
|
|
140
|
+
parts.push({ d: rect(fx0 - 0.3, yc - w * 0.075, kw + 0.6, w * 0.15), fill: "#f6f4ee", stroke: "none", line: "none" });
|
|
141
|
+
return parts;
|
|
142
|
+
}
|
|
143
|
+
// ───────────────────────────── the judogi ─────────────────────────────
|
|
144
|
+
/**
|
|
145
|
+
* The judogi laid flat: jacket (sleeves out to the sides, lapels crossed left over right, thick stitched collar, quilted upper body, vented skirt), the belt tied over it and the trousers below with a drawstring
|
|
146
|
+
* waist and reinforced knees. `$main` is the cloth, `$accent` the belt.
|
|
147
|
+
*/
|
|
148
|
+
function judogiFlat() {
|
|
149
|
+
const parts = [];
|
|
150
|
+
// Trousers, behind everything: straight legs, a waistband with its drawstring, reinforced knees.
|
|
151
|
+
const trousers = [[18.4, 37], [45.6, 37], [46.6, 62], [34.6, 62], [32, 43.6], [29.4, 62], [17.4, 62]];
|
|
152
|
+
parts.push({ d: path(trousers), fill: "$main", shade: 0.3, cyl: 0.25 });
|
|
153
|
+
parts.push({ d: path([[18.4, 37], [45.6, 37], [45.7, 39.8], [18.3, 39.8]]), fill: "$main", shade: 0.2 });
|
|
154
|
+
parts.push(dark("M18.6 38.9H45.4", 0.3, 0.35));
|
|
155
|
+
parts.push({ d: "M40.6 39.8Q39.4 42.8 40.4 45.2M42 39.8Q43 42.6 42.2 45", fill: "none", stroke: INK, w: 0.4, op: 0.5, line: "none" });
|
|
156
|
+
const knees = [[[19.2, 49.8], [30.8, 49.8], [30, 57.6], [18.8, 57.6]], [[33.2, 49.8], [44.8, 49.8], [45.2, 57.6], [34, 57.6]]];
|
|
157
|
+
for (const k of knees) {
|
|
158
|
+
parts.push({ d: path(k), fill: "$main", stroke: "none", shade: 0, line: "none" });
|
|
159
|
+
parts.push(dark(path(k) + rows(k, 51.4, 56.4, 1.6, 0.3), 0.28, 0.35));
|
|
160
|
+
}
|
|
161
|
+
parts.push(dark("M17.6 60.2H29.6M34.4 60.2H46.4", 0.3, 0.3));
|
|
162
|
+
// Sleeves: long, wide, ending past the wrist, laid out and down.
|
|
163
|
+
const sleeve = [[19.8, 6.4], [1.4, 20.2], [4.6, 27.6], [18.6, 22.4]];
|
|
164
|
+
for (const pts of [sleeve, mirror(sleeve)])
|
|
165
|
+
parts.push({ d: path(pts), fill: "$main", cyl: 0.15, shade: 0.35 });
|
|
166
|
+
const jacket = [[19.4, 6.6], [26.2, 4], [32, 3.2], [37.8, 4], [44.6, 6.6], [45.6, 8], [45.6, 36], [18.4, 36], [18.4, 8]];
|
|
167
|
+
parts.push({ d: path(jacket), fill: "$main", shade: 0.35, cyl: 0.18 });
|
|
168
|
+
// Quilting: rows over the shoulders, chest and sleeves (the cloth of a judogi is heavy and woven double).
|
|
169
|
+
const body = [[19, 7], [45, 7], [45.6, 26], [18.4, 26]];
|
|
170
|
+
parts.push(dark(rows(body, 8, 25, 1.4, 0.5), 0.28, 0.1));
|
|
171
|
+
parts.push(light(rows(body, 8.5, 25.5, 1.4, 0.5), 0.24, 0.2));
|
|
172
|
+
for (const pts of [sleeve, mirror(sleeve)]) {
|
|
173
|
+
let d = "";
|
|
174
|
+
for (let t = 0.1; t <= 0.9; t += 0.08) {
|
|
175
|
+
const a = lerp(pts[0], pts[1], t), b = lerp(pts[3], pts[2], t);
|
|
176
|
+
const a2 = lerp(a, b, 0.07), b2 = lerp(a, b, 0.93);
|
|
177
|
+
d += `M${f(a2[0])} ${f(a2[1])}L${f(b2[0])} ${f(b2[1])}`;
|
|
178
|
+
}
|
|
179
|
+
parts.push(dark(d, 0.28, 0.1));
|
|
180
|
+
}
|
|
181
|
+
// The neck: the collar goes round the back of the neck, and the opening is a V that ends under 10 cm below the sternum.
|
|
182
|
+
parts.push({ d: path([[26.4, 4.2], [37.6, 4.2], [33.4, 14]]), fill: INK, stroke: INK, w: 0.3, op: 0.62, line: "none" });
|
|
183
|
+
parts.push({ d: "M25.4 5.4Q32 2 38.6 5.4L37.6 8.2Q32 5.4 26.4 8.2Z", fill: "$main", cyl: 0.4, shade: 0.3 });
|
|
184
|
+
// Under lapel (the right front, worn under), its band running down to where the left front covers it.
|
|
185
|
+
parts.push({ d: path(strip([26.8, 5.4], [33.8, 14.4], 2.9)), fill: "$main", cyl: 0.5, shade: 0.3 });
|
|
186
|
+
// The left front, laid over: its panel and its thick, stitched lapel from the right of the neck to the hem.
|
|
187
|
+
const over = [[36.4, 4.4], [44.6, 6.6], [45.6, 8], [45.6, 36], [22.8, 36]];
|
|
188
|
+
parts.push({ d: path(over), fill: "$main", shade: 0.35, cyl: 0.1 });
|
|
189
|
+
const overBody = [[36, 5], [45.6, 8], [45.6, 26], [28.8, 26]];
|
|
190
|
+
parts.push(dark(rows(overBody, 8, 25, 1.4, 0.5), 0.3, 0.14));
|
|
191
|
+
parts.push(light(rows(overBody, 8.5, 25.5, 1.4, 0.5), 0.26, 0.22));
|
|
192
|
+
parts.push({ d: path(strip([37, 4.8], [24.4, 35], 3.9)), fill: "$main", cyl: 0.55, shade: 0.35 });
|
|
193
|
+
parts.push({ d: path(strip([37, 4.8], [24.4, 35], 3.9)), fill: "none", stroke: INK, w: 0.3, op: 0.5, line: "none" });
|
|
194
|
+
// Rows of stitching down both lapels.
|
|
195
|
+
const lapelRows = (a, b, shift = 0) => [-1.3, -0.45, 0.45, 1.3].map((o) => along([a[0] + shift, a[1]], [b[0] + shift, b[1]], o, 0, 1)).join("");
|
|
196
|
+
parts.push(dark(lapelRows([36.6, 7.4], [24.8, 34.4]), 0.28, 0.45));
|
|
197
|
+
parts.push(light(lapelRows([36.6, 7.4], [24.8, 34.4], 0.35), 0.25, 0.3));
|
|
198
|
+
parts.push(dark(lapelRows([27.2, 6.4], [33.4, 14]), 0.28, 0.45));
|
|
199
|
+
// Shadow of the lapel on the cloth under it.
|
|
200
|
+
parts.push({ d: path(strip([34.6, 5.4], [22.6, 36], 1.2)), fill: INK, stroke: "none", op: 0.14, fx: true });
|
|
201
|
+
// Hem: the skirt reaches past the belt, with short vents at the sides and a stitched edge.
|
|
202
|
+
parts.push(dark("M18.8 34.4H44.8", 0.3, 0.32));
|
|
203
|
+
parts.push(dark("M20.2 31.4V36M43.8 31.4V36", 0.4, 0.45));
|
|
204
|
+
// The belt, over the jacket, wrapped twice.
|
|
205
|
+
parts.push(...belt({ edge: BELT_EDGE, main: "$accent", cx: 32, x0: 18.2, x1: 45.8, y: 25.2, w: 2.5, sag: 0, knot: 6.4, tail: 11.4, splay: 6 }));
|
|
206
|
+
return parts;
|
|
207
|
+
}
|
|
208
|
+
/** The judogi folded into a neat rectangle: collar and lapel stitching on top, the belt tied round it. */
|
|
209
|
+
function judogiFolded() {
|
|
210
|
+
const parts = [];
|
|
211
|
+
// The front of the pile (its thickness) under the top.
|
|
212
|
+
const front = [[8.4, 41], [55.6, 41], [55.2, 52], [8.8, 52]];
|
|
213
|
+
parts.push({ d: path(front), fill: "$main", shade: 0.25, cyl: 0.4 });
|
|
214
|
+
parts.push({ d: path(front), fill: INK, stroke: "none", op: 0.12, fx: true });
|
|
215
|
+
parts.push(dark("M9 44.6H55M8.9 48.2H55.1", 0.3, 0.3));
|
|
216
|
+
parts.push(light("M9 45.2H55M8.9 48.8H55.1", 0.26, 0.25));
|
|
217
|
+
// The top: sleeves folded back at the sides, the body folded over in thirds.
|
|
218
|
+
const top = [[9, 9.4], [55, 9.4], [55.6, 41], [8.4, 41]];
|
|
219
|
+
parts.push({ d: path(top), fill: "$main", shade: 0.35, cyl: 0.18 });
|
|
220
|
+
parts.push(dark(rows(top, 10.4, 40, 1.4, 0.8), 0.3, 0.14));
|
|
221
|
+
parts.push(light(rows(top, 10.9, 40.5, 1.4, 0.8), 0.26, 0.22));
|
|
222
|
+
parts.push(dark("M14.6 10.4L14.2 40.4M49.4 10.4L49.8 40.4", 0.35, 0.28));
|
|
223
|
+
// The collar, lapels crossed left over right, with rows of stitching.
|
|
224
|
+
parts.push({ d: path([[27.2, 9.4], [36.8, 9.4], [32.8, 18]]), fill: INK, stroke: INK, w: 0.3, op: 0.34, line: "none" });
|
|
225
|
+
parts.push({ d: "M23.6 10.6Q32 5.6 40.4 10.6L39.2 14Q32 10.2 24.8 14Z", fill: "$main", cyl: 0.4, shade: 0.3 });
|
|
226
|
+
parts.push({ d: path(strip([27.2, 10.8], [33.4, 18.6], 3.1)), fill: "$main", cyl: 0.5, shade: 0.3 });
|
|
227
|
+
const over = [[36.4, 9.8], [55, 9.4], [55.6, 41], [22.4, 41]];
|
|
228
|
+
parts.push({ d: path(over), fill: "$main", shade: 0.35, cyl: 0.1 });
|
|
229
|
+
parts.push(dark(rows([[36.4, 10], [55, 10], [55, 26], [29, 26]], 10.4, 25.6, 1.4, 0.8), 0.3, 0.14));
|
|
230
|
+
parts.push({ d: path(strip([37.2, 10], [23.2, 40], 3.8)), fill: "$main", cyl: 0.55, shade: 0.35 });
|
|
231
|
+
parts.push({ d: path(strip([37.2, 10], [23.2, 40], 3.8)), fill: "none", stroke: INK, w: 0.3, op: 0.5, line: "none" });
|
|
232
|
+
const rowsAlong = (a, b) => [-1.3, -0.45, 0.45, 1.3].map((o) => along(a, b, o, 0, 1)).join("");
|
|
233
|
+
parts.push(dark(rowsAlong([37, 12], [24, 39]), 0.28, 0.45));
|
|
234
|
+
parts.push(dark(rowsAlong([28, 11.4], [33.2, 18]), 0.28, 0.45));
|
|
235
|
+
parts.push({ d: path(strip([36, 10.6], [22.6, 41], 1.4)), fill: INK, stroke: "none", op: 0.12, fx: true });
|
|
236
|
+
// The belt wrapped round it and tied on top.
|
|
237
|
+
parts.push(...belt({ edge: BELT_EDGE, main: "$accent", cx: 32, x0: 7.6, x1: 56.4, y: 26.4, w: 3, sag: 0, knot: 7.4, tail: 12.6, splay: 6 }));
|
|
238
|
+
return parts;
|
|
239
|
+
}
|
|
240
|
+
export const GEAR_JUDOGI = /* @__PURE__ */ drawn("gear:judogi", "Judo suit", "柔道衣", { main: JUDOGI_WHITE, accent: OBI_RANKS.black, parts: judogiFlat() });
|
|
241
|
+
export const GEAR_JUDOGI_BLUE = /* @__PURE__ */ drawn("gear:judogi-blue", "Blue judo suit", "青い柔道衣", { main: JUDOGI_BLUE, accent: OBI_RANKS.black, parts: judogiFlat() });
|
|
242
|
+
export const GEAR_JUDOGI_FOLDED = /* @__PURE__ */ drawn("gear:judogi-folded", "Folded judo suit", "畳んだ柔道衣", { main: JUDOGI_WHITE, accent: OBI_RANKS.black, parts: judogiFolded() });
|
|
243
|
+
export const GEAR_JUDOGI_BLUE_FOLDED = /* @__PURE__ */ drawn("gear:judogi-blue-folded", "Folded blue judo suit", "畳んだ青い柔道衣", { main: JUDOGI_BLUE, accent: OBI_RANKS.black, parts: judogiFolded() });
|
|
244
|
+
// ───────────────────────────── the karate-gi ─────────────────────────────
|
|
245
|
+
/** The karate-gi laid flat: lighter cloth (no quilting), a plain narrow collar, shorter jacket and sleeves than the judogi, tie strings, ankle-length trousers and the belt. `$main` is the cloth, `$accent` the belt. */
|
|
246
|
+
function karateFlat() {
|
|
247
|
+
const parts = [];
|
|
248
|
+
const trousers = [[19.4, 40], [44.6, 40], [45.4, 61.4], [34.4, 61.4], [32, 49], [29.6, 61.4], [18.6, 61.4]];
|
|
249
|
+
parts.push({ d: path(trousers), fill: "$main", shade: 0.3, cyl: 0.15 });
|
|
250
|
+
parts.push({ d: path([[19.4, 40], [44.6, 40], [44.6, 41.8], [19.4, 41.8]]), fill: "$main", shade: 0.15 });
|
|
251
|
+
parts.push(dark("M19.6 41.4H44.4", 0.3, 0.3));
|
|
252
|
+
parts.push({ d: "M26 41.8Q24.4 44.6 25.4 47M27.6 41.8Q28.4 44.4 27.4 46.8", fill: "none", stroke: INK, w: 0.35, op: 0.45, line: "none" });
|
|
253
|
+
parts.push(dark("M18.8 60H29.6M34.4 60H45.2", 0.3, 0.25));
|
|
254
|
+
// Sleeves reach the bend of the wrist at most (WKF 2.2.1 j), so they are shorter than a judogi's, with a wide cuff.
|
|
255
|
+
const sleeve = [[20.6, 8], [8.6, 16.6], [11.8, 23], [19.4, 22]];
|
|
256
|
+
for (const pts of [sleeve, mirror(sleeve)])
|
|
257
|
+
parts.push({ d: path(pts), fill: "$main", shade: 0.3, cyl: 0.12 });
|
|
258
|
+
const jacket = [[20.2, 8], [26.6, 5.2], [32, 4.4], [37.4, 5.2], [43.8, 8], [44.8, 38.6], [19.2, 38.6]];
|
|
259
|
+
parts.push({ d: path(jacket), fill: "$main", shade: 0.3, cyl: 0.15 });
|
|
260
|
+
// Neck: a wide V that ends lower than the judogi's, a plain thin collar.
|
|
261
|
+
parts.push({ d: path([[27.4, 5.4], [36.6, 5.4], [32, 19.6]]), fill: INK, stroke: INK, w: 0.3, op: 0.3, line: "none" });
|
|
262
|
+
parts.push({ d: "M26.4 6.2Q32 3.4 37.6 6.2L37 8Q32 5.6 27 8Z", fill: "$main", cyl: 0.3, shade: 0.2 });
|
|
263
|
+
parts.push({ d: path(strip([26.6, 6.6], [32.6, 19.8], 1.8)), fill: "$main", cyl: 0.3, shade: 0.2 });
|
|
264
|
+
const over = [[36.4, 6.2], [43.8, 8], [44.8, 38.6], [24.6, 38.6]];
|
|
265
|
+
parts.push({ d: path(over), fill: "$main", shade: 0.3, cyl: 0.08 });
|
|
266
|
+
parts.push({ d: path(strip([36.8, 6.4], [23.4, 38], 2)), fill: "$main", cyl: 0.35, shade: 0.25 });
|
|
267
|
+
parts.push({ d: path(strip([36.8, 6.4], [23.4, 38], 2)), fill: "none", stroke: INK, w: 0.3, op: 0.5, line: "none" });
|
|
268
|
+
parts.push({ d: path(strip([35.6, 7.2], [23, 38.6], 1)), fill: INK, stroke: "none", op: 0.1, fx: true });
|
|
269
|
+
// The ties of the jacket (WKF 2.2.1 i): two short strings at the chest.
|
|
270
|
+
parts.push({ d: "M29.6 21.6Q28 23.6 28.6 26M27.4 22.4Q26.2 24.4 26.4 26.4", fill: "none", stroke: INK, w: 0.4, op: 0.5, line: "none" });
|
|
271
|
+
parts.push(dark("M19.8 36.6H44.2", 0.3, 0.3));
|
|
272
|
+
// The belt: 5 cm wide, with 15 cm free on each side of the knot, tied low on the hips; red (AKA) by default.
|
|
273
|
+
parts.push(...belt({ main: "$accent", cx: 32, x0: 19, x1: 45, y: 27.4, w: 2.6, sag: 0, knot: 6.2, tail: 8.8, splay: 7 }));
|
|
274
|
+
return parts;
|
|
275
|
+
}
|
|
276
|
+
export const GEAR_KARATE_GI = /* @__PURE__ */ drawn("gear:karate-gi", "Karate suit", "空手衣", { main: "#fbfaf6", accent: "#c4202e", parts: karateFlat() });
|
|
277
|
+
// ───────────────────────────── the belts ─────────────────────────────
|
|
278
|
+
const obiSpec = (extra) => belt({ main: "$main", cx: 32, x0: 2.4, x1: 61.6, y: 13, w: 5, sag: 1.6, knot: 11.2, tail: 23, splay: 7, bars: true, ...extra });
|
|
279
|
+
const obiPiece = (id, en, ja, main, parts, accent) => drawn(id, en, ja, { main, accent, parts });
|
|
280
|
+
export const GEAR_OBI = /* @__PURE__ */ obiPiece("gear:obi", "Belt", "武道の帯", OBI_RANKS.black, obiSpec({ edge: BELT_EDGE }));
|
|
281
|
+
export const GEAR_OBI_WHITE = /* @__PURE__ */ obiPiece("gear:obi-white", "White belt", "白帯", OBI_RANKS.white, obiSpec());
|
|
282
|
+
export const GEAR_OBI_YELLOW = /* @__PURE__ */ obiPiece("gear:obi-yellow", "Yellow belt", "黄帯", OBI_RANKS.yellow, obiSpec());
|
|
283
|
+
export const GEAR_OBI_ORANGE = /* @__PURE__ */ obiPiece("gear:obi-orange", "Orange belt", "橙帯", OBI_RANKS.orange, obiSpec());
|
|
284
|
+
export const GEAR_OBI_GREEN = /* @__PURE__ */ obiPiece("gear:obi-green", "Green belt", "緑帯", OBI_RANKS.green, obiSpec());
|
|
285
|
+
export const GEAR_OBI_BLUE = /* @__PURE__ */ obiPiece("gear:obi-blue", "Blue belt", "青帯", OBI_RANKS.blue, obiSpec());
|
|
286
|
+
export const GEAR_OBI_BROWN = /* @__PURE__ */ obiPiece("gear:obi-brown", "Brown belt", "茶帯", OBI_RANKS.brown, obiSpec());
|
|
287
|
+
export const GEAR_OBI_RED = /* @__PURE__ */ obiPiece("gear:obi-red", "Red belt", "紅帯", OBI_RANKS.red, obiSpec());
|
|
288
|
+
/** The red-and-white belt of the 6th to 8th dan: panels of red and white (about 21 cm long), red at both ends. */
|
|
289
|
+
export const GEAR_OBI_KOHAKU = /* @__PURE__ */ obiPiece("gear:obi-kohaku", "Red and white belt", "紅白帯", OBI_RANKS.kohaku, obiSpec({ alt: "$accent", panels: { upper: [19, 45], lower: [11, 53], tail: "$main" }, bars: false }), "#f6f4ee");
|
|
290
|
+
/** The black belt of a woman in Japan: a white stripe down the middle of the belt along its whole length. */
|
|
291
|
+
export const GEAR_OBI_WOMEN = /* @__PURE__ */ obiPiece("gear:obi-women", "Women's black belt", "女子用の黒帯", OBI_RANKS.black, obiSpec({ stripe: true, edge: BELT_EDGE }));
|
|
292
|
+
const OBI_BY_RANK = { white: GEAR_OBI_WHITE, yellow: GEAR_OBI_YELLOW, orange: GEAR_OBI_ORANGE, green: GEAR_OBI_GREEN, blue: GEAR_OBI_BLUE, brown: GEAR_OBI_BROWN, black: GEAR_OBI, kohaku: GEAR_OBI_KOHAKU, red: GEAR_OBI_RED };
|
|
293
|
+
// Two-colour belts: the intermediate belts several countries give between two kyu (the IJF names white-yellow, yellow-orange, orange-green and green-blue; France has had them since 1990), drawn as two halves of the
|
|
294
|
+
// belt's width, running the whole length. `tint` is the colour of the upper half and `accent` the colour of the lower.
|
|
295
|
+
const SPLIT = obiSpec({ half: true, alt: "$accent", bars: false });
|
|
296
|
+
const split = (id, en, ja, a, b) => obiPiece(id, en, ja, OBI_RANKS[a], SPLIT, OBI_RANKS[b]);
|
|
297
|
+
export const GEAR_OBI_WHITE_YELLOW = /* @__PURE__ */ split("gear:obi-white-yellow", "White and yellow belt", "白と黄の二色帯", "white", "yellow");
|
|
298
|
+
export const GEAR_OBI_YELLOW_ORANGE = /* @__PURE__ */ split("gear:obi-yellow-orange", "Yellow and orange belt", "黄と橙の二色帯", "yellow", "orange");
|
|
299
|
+
export const GEAR_OBI_ORANGE_GREEN = /* @__PURE__ */ split("gear:obi-orange-green", "Orange and green belt", "橙と緑の二色帯", "orange", "green");
|
|
300
|
+
export const GEAR_OBI_GREEN_BLUE = /* @__PURE__ */ split("gear:obi-green-blue", "Green and blue belt", "緑と青の二色帯", "green", "blue");
|
|
301
|
+
export const GEAR_OBI_BLUE_BROWN = /* @__PURE__ */ split("gear:obi-blue-brown", "Blue and brown belt", "青と茶の二色帯", "blue", "brown");
|
|
302
|
+
/** Any two colours: the belt `obi` draws for a pair. */
|
|
303
|
+
const OBI_SPLIT = /* @__PURE__ */ split("gear:obi-split", "Two-colour belt", "二色の帯", "white", "yellow");
|
|
304
|
+
/**
|
|
305
|
+
* The belt of a rank: `"white"`, `"yellow"`, `"orange"`, `"green"`, `"blue"`, `"brown"` (the kyu), `"black"` (1st to 5th dan), `"kohaku"` (red and white panels, 6th to 8th dan) or `"red"` (9th and 10th dan), or
|
|
306
|
+
* a pair of ranks (`["white", "yellow"]`) for a two-colour belt. An unknown rank is the black belt. `tint` takes one colour, or a pair for a two-colour belt. `women: true` adds the white stripe that women wear on a
|
|
307
|
+
* black belt in Japan.
|
|
308
|
+
*/
|
|
309
|
+
export const obi = (rank, options) => {
|
|
310
|
+
const { women, tint, ...rest } = options ?? {};
|
|
311
|
+
const colour = (r) => (Object.hasOwn(OBI_RANKS, r) ? OBI_RANKS[r] : OBI_RANKS.black);
|
|
312
|
+
if (Array.isArray(tint) && tint.length === 2)
|
|
313
|
+
return OBI_SPLIT.svg({ ...rest, tint: tint[0], accent: tint[1] });
|
|
314
|
+
if (Array.isArray(rank))
|
|
315
|
+
return OBI_SPLIT.svg({ ...rest, tint: colour(rank[0]), accent: colour(rank[1]) });
|
|
316
|
+
const known = typeof rank === "string" && Object.hasOwn(OBI_RANKS, rank) ? rank : "black";
|
|
317
|
+
const one = typeof tint === "string" ? { ...rest, tint } : rest;
|
|
318
|
+
if (women === true && known === "black")
|
|
319
|
+
return GEAR_OBI_WOMEN.svg(one);
|
|
320
|
+
return OBI_BY_RANK[known].svg(one);
|
|
18
321
|
};
|
|
19
|
-
export const GEAR_JUDOGI = /* @__PURE__ */ drawn("gear:judogi", "Judo suit", "柔道衣", {
|
|
20
|
-
main: CLOTH,
|
|
21
|
-
accent: "#1f2228",
|
|
22
|
-
parts: [
|
|
23
|
-
{ d: "M22.4 44.4H31.6L30.8 61H21.2ZM32.4 44.4H41.6L42.8 61H33.2Z", fill: "$main", cyl: 0.6, shade: 0.3 },
|
|
24
|
-
{ d: "M23.6 9.4L8 36.4Q6.6 39.4 9.4 41.4L14.6 45Q17.4 46.4 19 43.4L29 27.4Z", fill: "$main", cyl: 0.5, shade: 0.4 },
|
|
25
|
-
{ d: "M40.4 9.4L56 36.4Q57.4 39.4 54.6 41.4L49.4 45Q46.6 46.4 45 43.4L35 27.4Z", fill: "$main", cyl: 0.5, shade: 0.4 },
|
|
26
|
-
{ d: "M23.6 9.4Q32 7 40.4 9.4L45 27.4V46H19V27.4Z", fill: "$main", cyl: 0.6, shade: 0.4 },
|
|
27
|
-
{ d: "M26 8.6L35.4 31M38 8.6L28.6 31", fill: "none", stroke: "#cfc8b8", w: 3.6, line: "none" },
|
|
28
|
-
{ d: "M26 8.6L35.4 31M38 8.6L28.6 31", fill: "none", stroke: "#8f98a3", w: 0.7, line: "stroke" },
|
|
29
|
-
{ d: "M29.2 9.4Q32 12 34.8 9.4L32 16Z", fill: "#3a414b", stroke: "none", op: 0.5, line: "none", fx: true },
|
|
30
|
-
{ d: "M13 31L19.4 39.4M11.4 34.4L17.6 42.4M47 31L40.6 39.4M48.6 34.4L42.4 42.4", fill: "none", stroke: "#a9b1bb", w: 0.7, line: "none" },
|
|
31
|
-
{ d: tied(19, 45, 40.4), fill: "$accent", stroke: EDGE, cyl: 0.8, shade: 0.2 },
|
|
32
|
-
],
|
|
33
|
-
});
|
|
34
|
-
export const GEAR_KARATE_GI = /* @__PURE__ */ drawn("gear:karate-gi", "Karate suit", "空手衣", {
|
|
35
|
-
main: CLOTH,
|
|
36
|
-
accent: "#1f2228",
|
|
37
|
-
parts: [
|
|
38
|
-
{ d: "M20.4 46H31.4L28.4 61H17.8ZM32.6 46H43.6L46.2 61H35.6Z", fill: "$main", cyl: 0.6, shade: 0.3 },
|
|
39
|
-
{ d: "M22.6 9.6L9 27.4Q7 30.4 9.6 32.4L13 34.6Q15.6 36.6 17.6 33.6L26 22Z", fill: "$main", cyl: 0.5, shade: 0.4 },
|
|
40
|
-
{ d: "M41.4 9.6L55 27.4Q57 30.4 54.4 32.4L51 34.6Q48.4 36.6 46.4 33.6L38 22Z", fill: "$main", cyl: 0.5, shade: 0.4 },
|
|
41
|
-
{ d: "M22.6 9.6Q32 7.4 41.4 9.6L44.8 28V48H19.2V28Z", fill: "$main", cyl: 0.6, shade: 0.4 },
|
|
42
|
-
{ d: "M25.4 8.8L37 37M38.6 8.8L27 37", fill: "none", stroke: "#8f98a3", w: 0.9, line: "stroke" },
|
|
43
|
-
{ d: "M28.8 9.6Q32 13 35.2 9.6L32 19Z", fill: "#3a414b", stroke: "none", op: 0.5, line: "none", fx: true },
|
|
44
|
-
{ d: tied(19.2, 44.8, 40), fill: "$accent", stroke: EDGE, cyl: 0.8, shade: 0.2 },
|
|
45
|
-
],
|
|
46
|
-
});
|
|
47
|
-
export const GEAR_OBI = /* @__PURE__ */ drawn("gear:obi", "Belt", "武道の帯", {
|
|
48
|
-
main: OBI_RANKS.black,
|
|
49
|
-
parts: [
|
|
50
|
-
{ d: "M35 34L24.4 57.6L30 61L40.6 36Z", fill: "$main", stroke: EDGE, cyl: 0.7, shade: 0.3 },
|
|
51
|
-
{ d: "M29 34L40.4 57.6L46 55.4L34.6 34Z", fill: "$main", stroke: EDGE, cyl: 0.7, shade: 0.3 },
|
|
52
|
-
{ d: seg(27.4, 55.6, 31.4, 58.4) + seg(38.4, 54.6, 42.4, 53), fill: "none", stroke: "$accent", w: 1.6, line: "none" },
|
|
53
|
-
{ d: "M2.6 23.4Q32 27.6 61.4 23.4V34.4Q32 38.6 2.6 34.4Z", fill: "$main", stroke: EDGE, cyl: 0.7, shade: 0.3 },
|
|
54
|
-
{ d: "M2.6 27.2Q32 31.4 61.4 27.2", fill: "none", stroke: "$accent", w: 1.4, line: "none" },
|
|
55
|
-
{ d: "M25.4 22.4h13.2v15.6H25.4z", fill: "$main", stroke: EDGE, cyl: 1, shade: 0.3 },
|
|
56
|
-
{ d: "M25.4 27.6h13.2M25.4 32.6h13.2", fill: "none", stroke: "$accent", w: 0.8, line: "none" },
|
|
57
|
-
],
|
|
58
|
-
});
|
|
59
|
-
/** The belt of a rank, `"white"` to `"black"`: the same as `GEAR_OBI.svg({ ...options, tint: OBI_RANKS[rank] })`. An unknown rank is the black belt. */
|
|
60
|
-
export const obi = (rank, options) => GEAR_OBI.svg({ ...options, tint: Object.hasOwn(OBI_RANKS, rank) ? OBI_RANKS[rank] : OBI_RANKS.black });
|
|
@@ -17,10 +17,10 @@ import { GEAR_STARTING_BLOCKS, GEAR_RELAY_BATON, GEAR_JAVELIN, GEAR_HURDLES } fr
|
|
|
17
17
|
import { GEAR_DIVING_BOARD, GEAR_SWIM_GOGGLES } from "./gear.water.js";
|
|
18
18
|
import { GEAR_GUNBAI, GEAR_MAWASHI } from "./gear.sumo.js";
|
|
19
19
|
import { GEAR_SHINAI, GEAR_KENDO_MEN } from "./gear.kendo.js";
|
|
20
|
-
import { GEAR_JUDOGI, GEAR_KARATE_GI, GEAR_OBI } from "./gear.budo.js";
|
|
20
|
+
import { GEAR_JUDOGI, GEAR_JUDOGI_BLUE, GEAR_JUDOGI_FOLDED, GEAR_JUDOGI_BLUE_FOLDED, GEAR_KARATE_GI, GEAR_OBI, GEAR_OBI_WHITE, GEAR_OBI_YELLOW, GEAR_OBI_ORANGE, GEAR_OBI_GREEN, GEAR_OBI_BLUE, GEAR_OBI_BROWN, GEAR_OBI_KOHAKU, GEAR_OBI_RED, GEAR_OBI_WOMEN, GEAR_OBI_WHITE_YELLOW, GEAR_OBI_YELLOW_ORANGE, GEAR_OBI_ORANGE_GREEN, GEAR_OBI_GREEN_BLUE, GEAR_OBI_BLUE_BROWN } from "./gear.budo.js";
|
|
21
21
|
import { GEAR_YUMI, GEAR_YA } from "./gear.kyudo.js";
|
|
22
22
|
/** Every piece of gear, in the order a gallery shows them. */
|
|
23
|
-
export const GEARS = [GEAR_HOCKEY_STICK, GEAR_GOALIE_STICK, GEAR_HOCKEY_SKATE, GEAR_GOALIE_MASK, GEAR_GOAL_NET, GEAR_FIELD_HOCKEY_STICK, GEAR_LACROSSE_STICK, GEAR_CRICKET_BAT, GEAR_WICKET, GEAR_TABLE_TENNIS_PADDLE, GEAR_BADMINTON_RACKET, GEAR_TENNIS_RACKET, GEAR_SQUASH_RACKET, GEAR_RACQUETBALL_RACKET, GEAR_PADEL_RACKET, GEAR_PICKLEBALL_PADDLE, GEAR_ROUNDNET_SET, GEAR_VOLLEYBALL_NET, GEAR_BASKETBALL_HOOP, GEAR_BASEBALL_BAT, GEAR_BASEBALL_GLOVE, GEAR_FOOTBALL_HELMET, GEAR_GOALPOSTS, GEAR_HURLEY, GEAR_CURLING_BROOM, GEAR_FIGURE_SKATE, GEAR_SPEED_SKATE, GEAR_DIVING_BOARD, GEAR_SWIM_GOGGLES, GEAR_STARTING_BLOCKS, GEAR_RELAY_BATON, GEAR_JAVELIN, GEAR_HURDLES, GEAR_GUNBAI, GEAR_MAWASHI, GEAR_SHINAI, GEAR_KENDO_MEN, GEAR_JUDOGI, GEAR_OBI, GEAR_YUMI, GEAR_YA, GEAR_KARATE_GI];
|
|
23
|
+
export const GEARS = [GEAR_HOCKEY_STICK, GEAR_GOALIE_STICK, GEAR_HOCKEY_SKATE, GEAR_GOALIE_MASK, GEAR_GOAL_NET, GEAR_FIELD_HOCKEY_STICK, GEAR_LACROSSE_STICK, GEAR_CRICKET_BAT, GEAR_WICKET, GEAR_TABLE_TENNIS_PADDLE, GEAR_BADMINTON_RACKET, GEAR_TENNIS_RACKET, GEAR_SQUASH_RACKET, GEAR_RACQUETBALL_RACKET, GEAR_PADEL_RACKET, GEAR_PICKLEBALL_PADDLE, GEAR_ROUNDNET_SET, GEAR_VOLLEYBALL_NET, GEAR_BASKETBALL_HOOP, GEAR_BASEBALL_BAT, GEAR_BASEBALL_GLOVE, GEAR_FOOTBALL_HELMET, GEAR_GOALPOSTS, GEAR_HURLEY, GEAR_CURLING_BROOM, GEAR_FIGURE_SKATE, GEAR_SPEED_SKATE, GEAR_DIVING_BOARD, GEAR_SWIM_GOGGLES, GEAR_STARTING_BLOCKS, GEAR_RELAY_BATON, GEAR_JAVELIN, GEAR_HURDLES, GEAR_GUNBAI, GEAR_MAWASHI, GEAR_SHINAI, GEAR_KENDO_MEN, GEAR_JUDOGI, GEAR_JUDOGI_BLUE, GEAR_JUDOGI_FOLDED, GEAR_JUDOGI_BLUE_FOLDED, GEAR_OBI, GEAR_OBI_WHITE, GEAR_OBI_YELLOW, GEAR_OBI_ORANGE, GEAR_OBI_GREEN, GEAR_OBI_BLUE, GEAR_OBI_BROWN, GEAR_OBI_KOHAKU, GEAR_OBI_RED, GEAR_OBI_WOMEN, GEAR_OBI_WHITE_YELLOW, GEAR_OBI_YELLOW_ORANGE, GEAR_OBI_ORANGE_GREEN, GEAR_OBI_GREEN_BLUE, GEAR_OBI_BLUE_BROWN, GEAR_YUMI, GEAR_YA, GEAR_KARATE_GI];
|
|
24
24
|
/** The id of every piece of gear: `"gear:hockey-stick"`. */
|
|
25
25
|
export const GEAR_IDS = GEARS.map((g) => g.id);
|
|
26
26
|
const TABLE = new Map(GEARS.map((g) => [g.id, g]));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// Canadian football:
|
|
1
|
+
// Canadian football: the pictogram of the ball with a white stripe all the way round near each end (CFL Rule 1, Section 2), drawn for this package from `ball:football-cfl`, in a 64 by 64 box.
|
|
2
2
|
import { defineIcon } from "../emblem.shapes.js";
|
|
3
|
-
import {
|
|
3
|
+
import { footballModel } from "./nfl.js";
|
|
4
4
|
/** Canadian football. */
|
|
5
|
-
export const SPORT_CFL = /* @__PURE__ */ defineIcon("sport:cfl", "Canadian football", "カナディアンフットボール", "ours",
|
|
5
|
+
export const SPORT_CFL = /* @__PURE__ */ defineIcon("sport:cfl", "Canadian football", "カナディアンフットボール", "ours", footballModel("ring"));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// International football:
|
|
1
|
+
// International football: the pictogram of the ball with a stripe near each end on the two panels next to the laces only (IFAF Rule 1, Section 3), drawn for this package from `ball:football-ifaf`, in a 64 by 64 box.
|
|
2
2
|
import { defineIcon } from "../emblem.shapes.js";
|
|
3
|
-
import {
|
|
3
|
+
import { footballModel } from "./nfl.js";
|
|
4
4
|
/** American football, international rules. */
|
|
5
|
-
export const SPORT_IFAF = /* @__PURE__ */ defineIcon("sport:ifaf", "International football", "国際アメフト", "ours",
|
|
5
|
+
export const SPORT_IFAF = /* @__PURE__ */ defineIcon("sport:ifaf", "International football", "国際アメフト", "ours", footballModel("top"));
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
-
// Judo: a pictogram of the
|
|
2
|
-
|
|
1
|
+
// Judo: a pictogram of the judogi, drawn for this package in a 64 by 64 box: the jacket with its sleeves out, the lapels crossed left over right, the belt tied in a flat knot with the two ends hanging, and the trousers.
|
|
2
|
+
// The metal style paints its main shapes with a grey sheet, the line style draws one outline.
|
|
3
|
+
import { bar, defineIcon } from "../emblem.shapes.js";
|
|
3
4
|
/** Judo. */
|
|
4
5
|
export const SPORT_JUDO = /* @__PURE__ */ defineIcon("sport:judo", "Judo", "柔道", "ours", {
|
|
5
6
|
metal: "flat",
|
|
6
7
|
ink: true,
|
|
7
8
|
front: [
|
|
8
|
-
["m", "
|
|
9
|
-
["
|
|
10
|
-
["k", "
|
|
11
|
-
["
|
|
9
|
+
["m", "M18.6 38H45.4L47.2 60H34.4L32 45.4L29.6 60H16.8Z"],
|
|
10
|
+
["m", "M26 6Q32 3.8 38 6L45 9L60.4 23L56.6 30.4L46.4 26.2L46 39H18L17.6 26.2L7.4 30.4L3.6 23L19 9Z"],
|
|
11
|
+
["k", "M27 5.6H37L32.8 16Z"],
|
|
12
|
+
["n", bar(37.2, 6.4, 24.8, 38, 4.6)],
|
|
13
|
+
["t", "M17.6 26.2L18 38M46.4 26.2L46 38"],
|
|
14
|
+
["k", "M17.8 27.6H46.2V32H17.8Z"],
|
|
15
|
+
["k", "M28 26.4H36V33H28Z"],
|
|
16
|
+
["k", "M29.4 32L26.6 46h4.4L32.6 32zM34.6 32L37.4 46h-4.4L31.4 32z"],
|
|
12
17
|
],
|
|
13
18
|
});
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
// Karate: a pictogram of
|
|
2
|
-
|
|
1
|
+
// Karate: a pictogram of the karate-gi, drawn for this package in a 64 by 64 box: a lighter suit than the judogi's, with shorter sleeves, a wide V of plain lapels, a short jacket, a belt tied low with its ends hanging
|
|
2
|
+
// and straight trousers. The metal style paints its main shapes with a grey sheet, the line style draws one outline.
|
|
3
|
+
import { bar, defineIcon } from "../emblem.shapes.js";
|
|
3
4
|
/** Karate. */
|
|
4
5
|
export const SPORT_KARATE = /* @__PURE__ */ defineIcon("sport:karate", "Karate", "空手", "ours", {
|
|
5
6
|
metal: "flat",
|
|
6
7
|
ink: true,
|
|
7
8
|
front: [
|
|
8
|
-
["m", "
|
|
9
|
-
["m", "
|
|
10
|
-
["
|
|
11
|
-
["
|
|
9
|
+
["m", "M20 36H44L45.6 61H34.6L32 46L29.4 61H18.4Z"],
|
|
10
|
+
["m", "M26 6Q32 3.8 38 6L45 8.6L56 18L52.6 24.6L45.4 21L45 40H19L18.6 21L11.4 24.6L8 18L19 8.6Z"],
|
|
11
|
+
["k", "M27 5.6H37L32 20Z"],
|
|
12
|
+
["n", bar(37, 6.4, 24, 40, 3)],
|
|
13
|
+
["k", "M18.8 31H45.2V35.4H18.8Z"],
|
|
14
|
+
["k", "M28.4 29.8H35.6V36.4H28.4Z"],
|
|
15
|
+
["k", "M29.6 36L27.2 48h4L32.6 36zM34.4 36L36.8 48h-4L31.4 36z"],
|
|
12
16
|
],
|
|
13
17
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import { type FlatModel } from "../emblem.shapes.ts";
|
|
2
|
+
/** The football pictogram: no stripes (the NFL), a ring near each end (the CFL) or the arcs on the laces' side only (IFAF). */
|
|
3
|
+
export declare function footballModel(stripes: "none" | "ring" | "top"): FlatModel;
|
|
2
4
|
/** American football. */
|
|
3
5
|
export declare const SPORT_NFL: import("../emblem.core.ts").Emblem<FlatModel>;
|
|
@@ -1,15 +1,34 @@
|
|
|
1
|
-
// American football: a pictogram of the ball, drawn for this package, in a 64 by 64 box
|
|
1
|
+
// American football: a pictogram of the ball, drawn for this package from the drawings of the balls (`ball:football`, `ball:football-cfl`, `ball:football-ifaf`), in a 64 by 64 box: a prolate ball whose ends come to
|
|
2
|
+
// a blunt point, lying on the diagonal with its laces on the upper side. The Canadian ball has a white stripe all the way round near each end (CFL Rule 1, Section 2); the IFAF ball has a stripe near each end on the
|
|
3
|
+
// two panels next to the laces only, which is the upper half of the picture (IFAF Rule 1, Section 3); the NFL ball has none.
|
|
2
4
|
import { defineIcon } from "../emblem.shapes.js";
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
const f = (n) => String(Math.round(n * 10) / 10);
|
|
6
|
+
const TURN = (40 * Math.PI) / 180;
|
|
7
|
+
/** A point of the ball's own frame (long axis along x, the laces on the upper side, y negative) put on the picture: turned 40 degrees about the centre of the box. */
|
|
8
|
+
const at = (x, y) => `${f(32 + x * Math.cos(TURN) - y * Math.sin(TURN))} ${f(32 + x * Math.sin(TURN) + y * Math.cos(TURN))}`;
|
|
9
|
+
const HALF = 29.6;
|
|
10
|
+
const WIDTH = 17.4;
|
|
11
|
+
/** The half width of the ball at `x` along its axis: an ellipse whose ends are drawn out a little, so they come to a blunt point as the real ball's do. */
|
|
12
|
+
const half = (x) => WIDTH * (1 - Math.min(1, Math.abs(x / HALF)) ** 2) ** 0.72;
|
|
13
|
+
const outline = () => {
|
|
14
|
+
const xs = Array.from({ length: 33 }, (_, i) => -HALF * Math.cos((Math.PI * i) / 32));
|
|
15
|
+
return `M${xs.map((x) => at(x, -half(x))).join("L")}L${[...xs].reverse().map((x) => at(x, half(x))).join("L")}z`;
|
|
13
16
|
};
|
|
17
|
+
/** The ball between `x0` and `x1` along its axis, over the part of its width from `y0` to `y1` (as fractions of the half width, -1 the upper edge): a stripe. */
|
|
18
|
+
const band = (x0, x1, y0, y1) => {
|
|
19
|
+
const xs = Array.from({ length: 7 }, (_, i) => x0 + ((x1 - x0) * i) / 6);
|
|
20
|
+
return `M${xs.map((x) => at(x, y0 * half(x))).join("L")}L${[...xs].reverse().map((x) => at(x, y1 * half(x))).join("L")}z`;
|
|
21
|
+
};
|
|
22
|
+
/** The football pictogram: no stripes (the NFL), a ring near each end (the CFL) or the arcs on the laces' side only (IFAF). */
|
|
23
|
+
export function footballModel(stripes) {
|
|
24
|
+
const front = [["m", outline()]];
|
|
25
|
+
if (stripes !== "none")
|
|
26
|
+
for (const sign of [-1, 1])
|
|
27
|
+
front.push(["f", band(sign * 15.6, sign * 20.6, stripes === "ring" ? -1 : -1, stripes === "ring" ? 1 : 0.05), "#f4f0e6"]);
|
|
28
|
+
// the laces: a row of short bars across a line, on the upper side of the middle
|
|
29
|
+
const rungs = [-8, -4.8, -1.6, 1.6, 4.8, 8].map((x) => `M${at(x, -9.4)}L${at(x, -3)}`).join("");
|
|
30
|
+
front.push(["t", `M${at(-9.6, -6.2)}L${at(9.6, -6.2)}${rungs}`]);
|
|
31
|
+
return { metal: "flat", ink: true, front };
|
|
32
|
+
}
|
|
14
33
|
/** American football. */
|
|
15
|
-
export const SPORT_NFL = /* @__PURE__ */ defineIcon("sport:nfl", "American football", "アメリカンフットボール", "ours",
|
|
34
|
+
export const SPORT_NFL = /* @__PURE__ */ defineIcon("sport:nfl", "American football", "アメリカンフットボール", "ours", footballModel("none"));
|
package/dist/index.d.ts
CHANGED
|
@@ -108,6 +108,11 @@ export { BALL_LACROSSE, BALL_RACQUETBALL, BALL_TABLE_TENNIS, BALL_SHOT } from ".
|
|
|
108
108
|
export { BALL_SOCCER, BALL_SOCCER_COLOUR } from "./emblems/ball/ball.soccer.ts";
|
|
109
109
|
export { BALL_SOCCER_26, BALL_SOCCER_18, BALL_SOCCER_14, BALL_SOCCER_12, BALL_SOCCER_6, BALL_SOCCER_ORANGE, BALL_SOCCER_26_ORANGE, BALL_SOCCER_18_ORANGE, BALL_SOCCER_14_ORANGE, BALL_SOCCER_12_ORANGE, BALL_SOCCER_6_ORANGE, BALL_SOCCER_YELLOW, BALL_SOCCER_26_YELLOW, BALL_SOCCER_18_YELLOW, BALL_SOCCER_14_YELLOW, BALL_SOCCER_12_YELLOW, BALL_SOCCER_6_YELLOW } from "./emblems/ball/ball.soccer.panels.ts";
|
|
110
110
|
export { BALL_FUTSAL, BALL_BEACH_SOCCER } from "./emblems/ball/ball.soccer.indoor.ts";
|
|
111
|
+
export { BALL_SOCCER_1870_HAND_STITCHED, BALL_SOCCER_1900_LACED, BALL_SOCCER_1930_18_PANEL, BALL_SOCCER_1950_12_PANEL, BALL_SOCCER_1960_32_PANEL_LEATHER } from "./emblems/ball/ball.soccer.vintage.ts";
|
|
112
|
+
export { BALL_SOCCER_1970_BLACK_WHITE, BALL_SOCCER_1978_TRIAD, BALL_SOCCER_1986_DECORATED_TRIAD, BALL_SOCCER_1998_COLOURED_TRIAD, BALL_SOCCER_2002_TRIANGLE_SWEEP, BALL_SOCCER_2006_PROPELLER, BALL_SOCCER_2010_GROOVED, BALL_SOCCER_2014_RIBBON, BALL_SOCCER_2018_PIXEL, BALL_SOCCER_2022_SPEED_SHELL, BALL_SOCCER_TRAINING_HIGH_VIS } from "./emblems/ball/ball.soccer.era.ts";
|
|
113
|
+
export { BALL_SOCCER_STARS_BLUE, BALL_SOCCER_STARS_RED, BALL_SOCCER_STARS_NIGHT, BALL_SOCCER_HEXAGONS_CYAN, BALL_SOCCER_HEXAGONS_MAGENTA, BALL_SOCCER_HEXAGONS_LIME, BALL_SOCCER_FLAMES_FIRE, BALL_SOCCER_FLAMES_ICE, BALL_SOCCER_FLAMES_TOXIC, BALL_SOCCER_CHEVRONS_RED, BALL_SOCCER_CHEVRONS_GREEN, BALL_SOCCER_CHEVRONS_BLUE, BALL_SOCCER_SWIRL_BLUE, BALL_SOCCER_SWIRL_RED, BALL_SOCCER_SWIRL_TEAL, BALL_SOCCER_METALLIC_GOLD, BALL_SOCCER_METALLIC_SILVER, BALL_SOCCER_METALLIC_COBALT } from "./emblems/ball/ball.soccer.store.ts";
|
|
114
|
+
export { BALL_BASEBALL_LEMON_PEEL, BALL_BASEBALL_RED_BLUE, BALL_BASEBALL_BLACK_RED, BALL_BASEBALL_VINTAGE_LEATHER, BALL_SOFTBALL_11_OPTIC } from "./emblems/ball/ball.baseball.vintage.ts";
|
|
115
|
+
export { BALL_VOLLEYBALL_COLOURS, BALL_VOLLEYBALL_BRAZIL, BALL_VOLLEYBALL_JAPAN, BALL_VOLLEYBALL_CANADA, BALL_VOLLEYBALL_USA, BALL_VOLLEYBALL_ITALY, BALL_VOLLEYBALL_POLAND, BALL_VOLLEYBALL_FRANCE, BALL_VOLLEYBALL_SERBIA, BALL_VOLLEYBALL_NETHERLANDS, BALL_VOLLEYBALL_GERMANY } from "./emblems/ball/ball.volleyball.flag.ts";
|
|
111
116
|
export { BALL_SOFTBALL } from "./emblems/ball/ball.softball.ts";
|
|
112
117
|
export { BALL_SQUASH_DOUBLE_YELLOW, BALL_SQUASH_YELLOW, BALL_SQUASH_RED, BALL_SQUASH_BLUE, BALL_SQUASH_GREEN } from "./emblems/ball/ball.squash.ts";
|
|
113
118
|
export { BALL_TENNIS } from "./emblems/ball/ball.tennis.ts";
|
|
@@ -133,7 +138,7 @@ export { GEAR_STARTING_BLOCKS, GEAR_RELAY_BATON, GEAR_JAVELIN, GEAR_HURDLES } fr
|
|
|
133
138
|
export { GEAR_DIVING_BOARD, GEAR_SWIM_GOGGLES } from "./emblems/gear/gear.water.ts";
|
|
134
139
|
export { GEAR_GUNBAI, GEAR_MAWASHI } from "./emblems/gear/gear.sumo.ts";
|
|
135
140
|
export { GEAR_SHINAI, GEAR_KENDO_MEN } from "./emblems/gear/gear.kendo.ts";
|
|
136
|
-
export { GEAR_JUDOGI, GEAR_KARATE_GI, GEAR_OBI, OBI_RANKS, obi } from "./emblems/gear/gear.budo.ts";
|
|
137
|
-
export type { ObiRank } from "./emblems/gear/gear.budo.ts";
|
|
141
|
+
export { GEAR_JUDOGI, GEAR_JUDOGI_BLUE, GEAR_JUDOGI_FOLDED, GEAR_JUDOGI_BLUE_FOLDED, GEAR_KARATE_GI, GEAR_OBI, GEAR_OBI_WHITE, GEAR_OBI_YELLOW, GEAR_OBI_ORANGE, GEAR_OBI_GREEN, GEAR_OBI_BLUE, GEAR_OBI_BROWN, GEAR_OBI_KOHAKU, GEAR_OBI_RED, GEAR_OBI_WOMEN, GEAR_OBI_WHITE_YELLOW, GEAR_OBI_YELLOW_ORANGE, GEAR_OBI_ORANGE_GREEN, GEAR_OBI_GREEN_BLUE, GEAR_OBI_BLUE_BROWN, JUDOGI_WHITE, JUDOGI_BLUE, OBI_RANKS, obi } from "./emblems/gear/gear.budo.ts";
|
|
142
|
+
export type { ObiRank, ObiOptions } from "./emblems/gear/gear.budo.ts";
|
|
138
143
|
export { GEAR_YUMI, GEAR_YA } from "./emblems/gear/gear.kyudo.ts";
|
|
139
144
|
export { VERSION } from "./version.ts";
|
package/dist/index.js
CHANGED
|
@@ -109,6 +109,11 @@ export { BALL_LACROSSE, BALL_RACQUETBALL, BALL_TABLE_TENNIS, BALL_SHOT } from ".
|
|
|
109
109
|
export { BALL_SOCCER, BALL_SOCCER_COLOUR } from "./emblems/ball/ball.soccer.js";
|
|
110
110
|
export { BALL_SOCCER_26, BALL_SOCCER_18, BALL_SOCCER_14, BALL_SOCCER_12, BALL_SOCCER_6, BALL_SOCCER_ORANGE, BALL_SOCCER_26_ORANGE, BALL_SOCCER_18_ORANGE, BALL_SOCCER_14_ORANGE, BALL_SOCCER_12_ORANGE, BALL_SOCCER_6_ORANGE, BALL_SOCCER_YELLOW, BALL_SOCCER_26_YELLOW, BALL_SOCCER_18_YELLOW, BALL_SOCCER_14_YELLOW, BALL_SOCCER_12_YELLOW, BALL_SOCCER_6_YELLOW } from "./emblems/ball/ball.soccer.panels.js";
|
|
111
111
|
export { BALL_FUTSAL, BALL_BEACH_SOCCER } from "./emblems/ball/ball.soccer.indoor.js";
|
|
112
|
+
export { BALL_SOCCER_1870_HAND_STITCHED, BALL_SOCCER_1900_LACED, BALL_SOCCER_1930_18_PANEL, BALL_SOCCER_1950_12_PANEL, BALL_SOCCER_1960_32_PANEL_LEATHER } from "./emblems/ball/ball.soccer.vintage.js";
|
|
113
|
+
export { BALL_SOCCER_1970_BLACK_WHITE, BALL_SOCCER_1978_TRIAD, BALL_SOCCER_1986_DECORATED_TRIAD, BALL_SOCCER_1998_COLOURED_TRIAD, BALL_SOCCER_2002_TRIANGLE_SWEEP, BALL_SOCCER_2006_PROPELLER, BALL_SOCCER_2010_GROOVED, BALL_SOCCER_2014_RIBBON, BALL_SOCCER_2018_PIXEL, BALL_SOCCER_2022_SPEED_SHELL, BALL_SOCCER_TRAINING_HIGH_VIS } from "./emblems/ball/ball.soccer.era.js";
|
|
114
|
+
export { BALL_SOCCER_STARS_BLUE, BALL_SOCCER_STARS_RED, BALL_SOCCER_STARS_NIGHT, BALL_SOCCER_HEXAGONS_CYAN, BALL_SOCCER_HEXAGONS_MAGENTA, BALL_SOCCER_HEXAGONS_LIME, BALL_SOCCER_FLAMES_FIRE, BALL_SOCCER_FLAMES_ICE, BALL_SOCCER_FLAMES_TOXIC, BALL_SOCCER_CHEVRONS_RED, BALL_SOCCER_CHEVRONS_GREEN, BALL_SOCCER_CHEVRONS_BLUE, BALL_SOCCER_SWIRL_BLUE, BALL_SOCCER_SWIRL_RED, BALL_SOCCER_SWIRL_TEAL, BALL_SOCCER_METALLIC_GOLD, BALL_SOCCER_METALLIC_SILVER, BALL_SOCCER_METALLIC_COBALT } from "./emblems/ball/ball.soccer.store.js";
|
|
115
|
+
export { BALL_BASEBALL_LEMON_PEEL, BALL_BASEBALL_RED_BLUE, BALL_BASEBALL_BLACK_RED, BALL_BASEBALL_VINTAGE_LEATHER, BALL_SOFTBALL_11_OPTIC } from "./emblems/ball/ball.baseball.vintage.js";
|
|
116
|
+
export { BALL_VOLLEYBALL_COLOURS, BALL_VOLLEYBALL_BRAZIL, BALL_VOLLEYBALL_JAPAN, BALL_VOLLEYBALL_CANADA, BALL_VOLLEYBALL_USA, BALL_VOLLEYBALL_ITALY, BALL_VOLLEYBALL_POLAND, BALL_VOLLEYBALL_FRANCE, BALL_VOLLEYBALL_SERBIA, BALL_VOLLEYBALL_NETHERLANDS, BALL_VOLLEYBALL_GERMANY } from "./emblems/ball/ball.volleyball.flag.js";
|
|
112
117
|
export { BALL_SOFTBALL } from "./emblems/ball/ball.softball.js";
|
|
113
118
|
export { BALL_SQUASH_DOUBLE_YELLOW, BALL_SQUASH_YELLOW, BALL_SQUASH_RED, BALL_SQUASH_BLUE, BALL_SQUASH_GREEN } from "./emblems/ball/ball.squash.js";
|
|
114
119
|
export { BALL_TENNIS } from "./emblems/ball/ball.tennis.js";
|
|
@@ -134,6 +139,6 @@ export { GEAR_STARTING_BLOCKS, GEAR_RELAY_BATON, GEAR_JAVELIN, GEAR_HURDLES } fr
|
|
|
134
139
|
export { GEAR_DIVING_BOARD, GEAR_SWIM_GOGGLES } from "./emblems/gear/gear.water.js";
|
|
135
140
|
export { GEAR_GUNBAI, GEAR_MAWASHI } from "./emblems/gear/gear.sumo.js";
|
|
136
141
|
export { GEAR_SHINAI, GEAR_KENDO_MEN } from "./emblems/gear/gear.kendo.js";
|
|
137
|
-
export { GEAR_JUDOGI, GEAR_KARATE_GI, GEAR_OBI, OBI_RANKS, obi } from "./emblems/gear/gear.budo.js";
|
|
142
|
+
export { GEAR_JUDOGI, GEAR_JUDOGI_BLUE, GEAR_JUDOGI_FOLDED, GEAR_JUDOGI_BLUE_FOLDED, GEAR_KARATE_GI, GEAR_OBI, GEAR_OBI_WHITE, GEAR_OBI_YELLOW, GEAR_OBI_ORANGE, GEAR_OBI_GREEN, GEAR_OBI_BLUE, GEAR_OBI_BROWN, GEAR_OBI_KOHAKU, GEAR_OBI_RED, GEAR_OBI_WOMEN, GEAR_OBI_WHITE_YELLOW, GEAR_OBI_YELLOW_ORANGE, GEAR_OBI_ORANGE_GREEN, GEAR_OBI_GREEN_BLUE, GEAR_OBI_BLUE_BROWN, JUDOGI_WHITE, JUDOGI_BLUE, OBI_RANKS, obi } from "./emblems/gear/gear.budo.js";
|
|
138
143
|
export { GEAR_YUMI, GEAR_YA } from "./emblems/gear/gear.kyudo.js";
|
|
139
144
|
export { VERSION } from "./version.js";
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.5.1";
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = "0.
|
|
1
|
+
export const VERSION = "0.5.1";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@johnmorrisdotca/dougu-sports",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Dougu Sports 道具, sports emblems as SVG strings: trophies, medals, crests, sport icons, and the ball and gear of every sport, in metal, line or flat colour, with optional 3D turning. Light and dark, accessible, tree-shakeable. Zero dependencies.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sports",
|