@wral/hsot-data 0.1.13 → 0.1.15
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/README.md +4 -1
- package/dist/define.mjs +1 -1
- package/dist/define.standalone.js +584 -487
- package/dist/{hsot-school-search-Cv_ZdUOs.js → hsot-school-search-CPsDpIgS.js} +628 -531
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
import { LitElement as
|
|
2
|
-
const
|
|
3
|
-
function
|
|
1
|
+
import { LitElement as ae, html as n, css as y, nothing as p, svg as Z } from "lit";
|
|
2
|
+
const pe = 50;
|
|
3
|
+
function fe(a = {}) {
|
|
4
4
|
const e = Object.entries(a).filter(([, s]) => s != null && s !== "");
|
|
5
5
|
if (!e.length) return "";
|
|
6
6
|
const t = new URLSearchParams();
|
|
7
|
-
return e.forEach(([s,
|
|
7
|
+
return e.forEach(([s, r]) => t.set(s, String(r))), `?${t.toString()}`;
|
|
8
8
|
}
|
|
9
|
-
function
|
|
9
|
+
function ue({ baseUrl: a, token: e = "", fetchFn: t } = {}) {
|
|
10
10
|
if (!a) throw new Error("createClient requires a baseUrl");
|
|
11
|
-
const s = a.replace(/\/+$/, ""),
|
|
12
|
-
async function
|
|
11
|
+
const s = a.replace(/\/+$/, ""), r = t || ((...i) => fetch(...i));
|
|
12
|
+
async function o(i) {
|
|
13
13
|
const h = { Accept: "application/json" };
|
|
14
14
|
e && (h.Authorization = `Bearer ${e}`);
|
|
15
|
-
const
|
|
16
|
-
if (!
|
|
17
|
-
const c = new Error(`api-hsot ${
|
|
18
|
-
throw c.status =
|
|
15
|
+
const d = await r(`${s}${i}`, { headers: h });
|
|
16
|
+
if (!d.ok) {
|
|
17
|
+
const c = new Error(`api-hsot ${d.status} on ${i}`);
|
|
18
|
+
throw c.status = d.status, c;
|
|
19
19
|
}
|
|
20
|
-
return
|
|
20
|
+
return d.json();
|
|
21
21
|
}
|
|
22
|
-
async function
|
|
23
|
-
const
|
|
22
|
+
async function l(i, h = {}) {
|
|
23
|
+
const d = [];
|
|
24
24
|
let c = null;
|
|
25
|
-
for (let m = 0; m <
|
|
26
|
-
const f =
|
|
27
|
-
if (
|
|
25
|
+
for (let m = 0; m < pe; m += 1) {
|
|
26
|
+
const f = fe(c ? { ...h, cursor: c } : h), u = await o(`${i}${f}`);
|
|
27
|
+
if (d.push(...u.items || []), c = u.nextCursor || null, !c) break;
|
|
28
28
|
}
|
|
29
|
-
return { items:
|
|
29
|
+
return { items: d, total: d.length, nextCursor: null };
|
|
30
30
|
}
|
|
31
31
|
return {
|
|
32
|
-
listSchools: (
|
|
33
|
-
getSchool: (
|
|
34
|
-
listTeams: (
|
|
35
|
-
getTeam: (
|
|
36
|
-
listConferences: (
|
|
37
|
-
listPlayers: (
|
|
38
|
-
listRosters: (
|
|
39
|
-
listGames: (
|
|
40
|
-
getGame: (
|
|
41
|
-
listTournaments: (
|
|
42
|
-
listSeedings: (
|
|
43
|
-
listRankings: (
|
|
44
|
-
listSports: () =>
|
|
32
|
+
listSchools: (i) => l("/schools", i),
|
|
33
|
+
getSchool: (i) => o(`/schools/${i}`),
|
|
34
|
+
listTeams: (i) => l("/teams", i),
|
|
35
|
+
getTeam: (i) => o(`/teams/${i}`),
|
|
36
|
+
listConferences: (i) => l("/conferences", i),
|
|
37
|
+
listPlayers: (i) => l("/players", i),
|
|
38
|
+
listRosters: (i) => l("/rosters", i),
|
|
39
|
+
listGames: (i) => l("/games", i),
|
|
40
|
+
getGame: (i) => o(`/games/${i}`),
|
|
41
|
+
listTournaments: (i) => l("/tournaments", i),
|
|
42
|
+
listSeedings: (i, h) => l(`/tournaments/${i}/seedings`, h),
|
|
43
|
+
listRankings: (i) => l("/rankings", i),
|
|
44
|
+
listSports: () => o("/sports")
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
-
const
|
|
47
|
+
const O = {
|
|
48
48
|
game: "/{sport}/game/{id}/",
|
|
49
49
|
school: "/school/{id}/",
|
|
50
50
|
section: "/{sport}/{view}/"
|
|
51
51
|
};
|
|
52
|
-
function
|
|
52
|
+
function g(a, e) {
|
|
53
53
|
return String(a).replace(/\{(\w+)\}/g, (t, s) => e[s] !== void 0 && e[s] !== null ? String(e[s]) : t);
|
|
54
54
|
}
|
|
55
|
-
function
|
|
55
|
+
function F(a) {
|
|
56
56
|
return {
|
|
57
|
-
game: a.getAttribute("game-href") ||
|
|
58
|
-
school: a.getAttribute("school-href") ||
|
|
59
|
-
section: a.getAttribute("section-href") ||
|
|
57
|
+
game: a.getAttribute("game-href") || O.game,
|
|
58
|
+
school: a.getAttribute("school-href") || O.school,
|
|
59
|
+
section: a.getAttribute("section-href") || O.section
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
|
-
const
|
|
63
|
-
function
|
|
62
|
+
const I = (a) => a ? a.charAt(0).toUpperCase() + a.slice(1) : "";
|
|
63
|
+
function $(a, e) {
|
|
64
64
|
if (!a) return "TBD";
|
|
65
|
-
const [t, s,
|
|
66
|
-
return !t || !s || !
|
|
65
|
+
const [t, s, r] = String(a).split("-").map(Number);
|
|
66
|
+
return !t || !s || !r ? "TBD" : new Date(t, s - 1, r).toLocaleDateString("en-US", e || { weekday: "short", month: "short", day: "numeric" });
|
|
67
67
|
}
|
|
68
68
|
function U(a) {
|
|
69
69
|
if (!a) return "";
|
|
@@ -72,103 +72,106 @@ function U(a) {
|
|
|
72
72
|
const s = e >= 12 ? "PM" : "AM";
|
|
73
73
|
return `${(e + 11) % 12 + 1}:${String(t || 0).padStart(2, "0")} ${s}`;
|
|
74
74
|
}
|
|
75
|
-
function
|
|
75
|
+
function ge(a) {
|
|
76
76
|
return a ? `${Math.floor(a / 12)}-${a % 12}` : "·";
|
|
77
77
|
}
|
|
78
|
-
function
|
|
78
|
+
function ve(a) {
|
|
79
79
|
return (Array.isArray(a?.positions) ? a.positions : String(a?.position ?? "").split(/[/,]/)).map((t) => String(t ?? "").trim()).filter(Boolean).join("/");
|
|
80
80
|
}
|
|
81
|
-
function
|
|
81
|
+
function M(a = /* @__PURE__ */ new Date()) {
|
|
82
82
|
const e = a.getFullYear();
|
|
83
83
|
return a.getMonth() >= 6 ? `${e}-${e + 1}` : `${e - 1}-${e}`;
|
|
84
84
|
}
|
|
85
|
-
function
|
|
85
|
+
function j(a = /* @__PURE__ */ new Date()) {
|
|
86
86
|
const e = (t) => String(t).padStart(2, "0");
|
|
87
87
|
return `${a.getFullYear()}-${e(a.getMonth() + 1)}-${e(a.getDate())}`;
|
|
88
88
|
}
|
|
89
|
-
function
|
|
89
|
+
function be(a, e = j()) {
|
|
90
90
|
const t = [...new Set((a || []).filter(Boolean))].sort();
|
|
91
91
|
if (!t.length || t.includes(e)) return e;
|
|
92
|
-
const s = t.filter((
|
|
92
|
+
const s = t.filter((r) => r < e);
|
|
93
93
|
return s.length ? s[s.length - 1] : t[0];
|
|
94
94
|
}
|
|
95
|
-
function
|
|
95
|
+
function q(a) {
|
|
96
96
|
return a ? (a.abbr || a.name || "?").slice(0, 4).toUpperCase() : "?";
|
|
97
97
|
}
|
|
98
|
-
function
|
|
98
|
+
function _(a) {
|
|
99
99
|
if (!a || !/^#[0-9a-fA-F]{6}$/.test(a)) return "#FFFFFF";
|
|
100
|
-
const e = parseInt(a.slice(1), 16), t = e >> 16 & 255, s = e >> 8 & 255,
|
|
101
|
-
return 0.299 * t + 0.587 * s + 0.114 *
|
|
100
|
+
const e = parseInt(a.slice(1), 16), t = e >> 16 & 255, s = e >> 8 & 255, r = e & 255;
|
|
101
|
+
return 0.299 * t + 0.587 * s + 0.114 * r > 150 ? "#0F1B33" : "#FFFFFF";
|
|
102
102
|
}
|
|
103
|
-
const
|
|
103
|
+
const ye = (a) => {
|
|
104
104
|
const e = ["th", "st", "nd", "rd"], t = a % 100;
|
|
105
105
|
return a + (e[(t - 20) % 10] || e[t] || e[0]);
|
|
106
106
|
};
|
|
107
|
-
function
|
|
108
|
-
const t = (
|
|
109
|
-
const
|
|
110
|
-
return
|
|
111
|
-
}, s = t(a),
|
|
112
|
-
return s !== null &&
|
|
107
|
+
function J(a, e) {
|
|
108
|
+
const t = (o) => {
|
|
109
|
+
const l = /^\d+/.exec(String(o ?? ""));
|
|
110
|
+
return l ? Number(l[0]) : null;
|
|
111
|
+
}, s = t(a), r = t(e);
|
|
112
|
+
return s !== null && r !== null && s !== r ? r - s : s !== null && r === null ? -1 : s === null && r !== null ? 1 : String(a ?? "").localeCompare(String(e ?? ""), "en", { sensitivity: "base" });
|
|
113
113
|
}
|
|
114
|
-
function
|
|
114
|
+
function $e(a, e) {
|
|
115
115
|
const t = (s) => String(s?.name ?? s ?? "");
|
|
116
116
|
return t(a).localeCompare(t(e), "en", { numeric: !0, sensitivity: "base" });
|
|
117
117
|
}
|
|
118
|
-
function
|
|
119
|
-
if (a.state === "live")
|
|
118
|
+
function re(a) {
|
|
119
|
+
if (a.state === "live") {
|
|
120
|
+
const e = [a.period, a.clock].filter(Boolean).join(" ");
|
|
121
|
+
return { kind: "live", label: e ? `Live · ${e}` : "Live" };
|
|
122
|
+
}
|
|
120
123
|
if (a.state === "final") {
|
|
121
124
|
const e = [];
|
|
122
125
|
return a.finish === "overtime" && e.push("OT"), a.finish === "shootout" && e.push("PK-SO"), a.forfeit && a.forfeit !== "none" && e.push("Forfeit"), { kind: "final", label: `Final${e.length ? ` · ${e.join(" · ")}` : ""}` };
|
|
123
126
|
}
|
|
124
|
-
return a.state === "postponed" ? { kind: "warn", label: "Postponed" } : a.state === "canceled" ? { kind: "warn", label: "Canceled" } : { kind: "sched", label: `${
|
|
127
|
+
return a.state === "postponed" ? { kind: "warn", label: "Postponed" } : a.state === "canceled" ? { kind: "warn", label: "Canceled" } : { kind: "sched", label: `${$(a.date, { month: "short", day: "numeric" })} · ${U(a.time)}`.replace(/ · $/, "") };
|
|
125
128
|
}
|
|
126
|
-
const
|
|
127
|
-
function
|
|
129
|
+
const we = /* @__PURE__ */ new Set(["game", "story", "page", "forum", "video", "gallery"]);
|
|
130
|
+
function S(a) {
|
|
128
131
|
let e = String(a || "").replace(/^[a-z][a-z0-9+.-]*:\/\/[^/#?]*/i, "");
|
|
129
132
|
const t = e.indexOf("#");
|
|
130
133
|
let s = "";
|
|
131
134
|
t !== -1 && (s = e.slice(t).split("?")[0], e = e.slice(0, t));
|
|
132
|
-
let
|
|
133
|
-
return
|
|
135
|
+
let r = e.split("?")[0] + s;
|
|
136
|
+
return r = r.replace(/([^:])\/{2,}/g, "$1/").replace(/^\/{2,}/, "/"), r = r.replace(/^\/(?=#)/, ""), r.length > 1 && (r = r.replace(/\/+$/, "")), r.toLowerCase();
|
|
134
137
|
}
|
|
135
|
-
function
|
|
138
|
+
function oe() {
|
|
136
139
|
const a = globalThis.location;
|
|
137
140
|
if (!a) return "";
|
|
138
141
|
const e = (a.hash || "").startsWith("#/") ? a.hash : "";
|
|
139
|
-
return
|
|
142
|
+
return S((a.pathname || "") + e);
|
|
140
143
|
}
|
|
141
|
-
function
|
|
144
|
+
function xe(a, e, t) {
|
|
142
145
|
if (!t) return null;
|
|
143
|
-
const s =
|
|
146
|
+
const s = S(a);
|
|
144
147
|
if (!s) return null;
|
|
145
|
-
const
|
|
146
|
-
if (s ===
|
|
147
|
-
const
|
|
148
|
-
if (s ===
|
|
149
|
-
if (!s.startsWith(`${
|
|
150
|
-
const
|
|
151
|
-
return h.length > 2 || h.some((
|
|
148
|
+
const r = S(g(e.game, { sport: t, id: "" })), o = S(g(e.school, { id: "" }));
|
|
149
|
+
if (s === r || s.startsWith(`${r}/`) || s === o || s.startsWith(`${o}/`)) return null;
|
|
150
|
+
const l = S(g(e.section, { sport: t, view: "" }));
|
|
151
|
+
if (s === l) return "";
|
|
152
|
+
if (!s.startsWith(`${l}/`)) return null;
|
|
153
|
+
const i = s.slice(l.length + 1), h = i.split("/");
|
|
154
|
+
return h.length > 2 || h.some((d) => !/^[a-z][a-z-]*$/.test(d)) || we.has(h[0]) ? null : i;
|
|
152
155
|
}
|
|
153
|
-
function
|
|
154
|
-
const s = (
|
|
156
|
+
function ke(a, e, t) {
|
|
157
|
+
const s = (l) => g(t.section, { sport: a, view: l }).replace(/([^:])\/{2,}/g, "$1/"), o = new Set((e || []).map((l) => l && l.gender).filter((l) => l === "boys" || l === "girls")).size === 2 ? [
|
|
155
158
|
{ label: "Boys Standings", href: s("boys/standings") },
|
|
156
159
|
{ label: "Girls Standings", href: s("girls/standings") }
|
|
157
160
|
] : [{ label: "Standings", href: s("standings") }];
|
|
158
161
|
return [
|
|
159
|
-
{ label: `${
|
|
162
|
+
{ label: `${I(a)} Home`, href: s("") },
|
|
160
163
|
{ label: "Scores/Schedule", href: s("scores") },
|
|
161
164
|
{ label: "Playoff Brackets", href: s("brackets") },
|
|
162
|
-
...
|
|
165
|
+
...o,
|
|
163
166
|
{ label: "Polls & Rankings", href: s("rankings") }
|
|
164
167
|
];
|
|
165
168
|
}
|
|
166
|
-
function
|
|
167
|
-
const t =
|
|
169
|
+
function Se(a, e = oe()) {
|
|
170
|
+
const t = S(e);
|
|
168
171
|
for (const s of a.querySelectorAll(':scope > a[slot="nav"]'))
|
|
169
|
-
t &&
|
|
172
|
+
t && S(s.getAttribute("href")) === t ? s.setAttribute("aria-current", "page") : s.removeAttribute("aria-current");
|
|
170
173
|
}
|
|
171
|
-
class
|
|
174
|
+
class w extends ae {
|
|
172
175
|
static properties = {
|
|
173
176
|
api: { type: String },
|
|
174
177
|
refreshInterval: { type: Number, attribute: "refresh-interval" },
|
|
@@ -187,7 +190,7 @@ class $ extends te {
|
|
|
187
190
|
this._client = e, this.isConnected && this.load();
|
|
188
191
|
}
|
|
189
192
|
get client() {
|
|
190
|
-
return this._client ? this._client : this.api ?
|
|
193
|
+
return this._client ? this._client : this.api ? ue({ baseUrl: this.api }) : null;
|
|
191
194
|
}
|
|
192
195
|
connectedCallback() {
|
|
193
196
|
super.connectedCallback(), this._setupInterval();
|
|
@@ -199,7 +202,7 @@ class $ extends te {
|
|
|
199
202
|
this.load();
|
|
200
203
|
}
|
|
201
204
|
updated(e) {
|
|
202
|
-
e.has("api") && e.get("api") !== void 0 && e.get("api") !== this.api && this.load(), e.has("refreshInterval") && this._setupInterval(),
|
|
205
|
+
e.has("api") && e.get("api") !== void 0 && e.get("api") !== this.api && this.load(), e.has("refreshInterval") && this._setupInterval(), Se(this);
|
|
203
206
|
}
|
|
204
207
|
async load() {
|
|
205
208
|
const e = this.client;
|
|
@@ -228,13 +231,13 @@ class $ extends te {
|
|
|
228
231
|
this._refreshId && (clearInterval(this._refreshId), this._refreshId = null);
|
|
229
232
|
}
|
|
230
233
|
render() {
|
|
231
|
-
return this.error === "not-configured" ?
|
|
234
|
+
return this.error === "not-configured" ? n`<div class="error">This component needs an <code>api</code> attribute (the api-hsot public read-surface base URL) or an injected client.</div>` : this.error ? n`<div class="error">Unable to load right now. <button class="chip" @click=${() => this.load()}>Retry</button></div>` : this.data ? this.renderView() : n`<div class="loading" role="status">Loading…</div>`;
|
|
232
235
|
}
|
|
233
236
|
renderView() {
|
|
234
|
-
return
|
|
237
|
+
return n``;
|
|
235
238
|
}
|
|
236
239
|
}
|
|
237
|
-
const v = (a) => Object.fromEntries((a || []).map((e) => [e.id, e])),
|
|
240
|
+
const v = (a) => Object.fromEntries((a || []).map((e) => [e.id, e])), Te = y`
|
|
238
241
|
:host {
|
|
239
242
|
--hsot-red: var(--color-red, #D1232A);
|
|
240
243
|
--hsot-red-deep: var(--color-red-dark, #951C21);
|
|
@@ -272,7 +275,7 @@ const v = (a) => Object.fromEntries((a || []).map((e) => [e.id, e])), we = b`
|
|
|
272
275
|
outline-offset: 1px;
|
|
273
276
|
}
|
|
274
277
|
.mut { color: var(--hsot-gray-5); }
|
|
275
|
-
`,
|
|
278
|
+
`, Ie = y`
|
|
276
279
|
.band { background: var(--hsot-white); color: var(--hsot-black); }
|
|
277
280
|
.band .inner { max-width: 1366px; margin: 0 auto; padding: 1.1rem 1.25rem 0; }
|
|
278
281
|
.band h1, .band h2.bandtitle {
|
|
@@ -321,7 +324,7 @@ const v = (a) => Object.fromEntries((a || []).map((e) => [e.id, e])), we = b`
|
|
|
321
324
|
@media (max-width: 720px) {
|
|
322
325
|
.band h1, .band h2.bandtitle, .band.section h1, .band.section h2.bandtitle { font-size: 1.8rem; }
|
|
323
326
|
}
|
|
324
|
-
`,
|
|
327
|
+
`, Ce = y`
|
|
325
328
|
.view { max-width: 1366px; margin: 0 auto; padding: 1.25rem; box-sizing: border-box; }
|
|
326
329
|
/* Optional right rail (slot="rail" light-DOM children): a divided 300px
|
|
327
330
|
column on desktop, stacked under the view content on smaller screens. */
|
|
@@ -385,7 +388,7 @@ const v = (a) => Object.fromEntries((a || []).map((e) => [e.id, e])), we = b`
|
|
|
385
388
|
.error { padding: 1.2rem 1rem; color: var(--hsot-red-deep); font-size: 0.9rem; }
|
|
386
389
|
.note { font-size: 0.8125rem; color: var(--hsot-gray-5); margin: 0.6rem 0 0; }
|
|
387
390
|
.loading { padding: 1.2rem; color: var(--hsot-gray-5); font-family: var(--hsot-heading-font); }
|
|
388
|
-
`,
|
|
391
|
+
`, De = y`
|
|
389
392
|
.pill {
|
|
390
393
|
display: inline-block; font-family: var(--hsot-heading-font); font-weight: 700;
|
|
391
394
|
font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.04em;
|
|
@@ -400,7 +403,7 @@ const v = (a) => Object.fromEntries((a || []).map((e) => [e.id, e])), we = b`
|
|
|
400
403
|
.pill.champ { background: var(--hsot-straw); color: #6b5900; }
|
|
401
404
|
@keyframes hsot-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } }
|
|
402
405
|
@media (prefers-reduced-motion: reduce) { .pill.live { animation: none; } }
|
|
403
|
-
`,
|
|
406
|
+
`, Fe = y`
|
|
404
407
|
.tablewrap { overflow-x: auto; }
|
|
405
408
|
table.data { font-family: var(--hsot-heading-font); font-size: 14px; border-collapse: collapse; width: 100%; }
|
|
406
409
|
table.data th {
|
|
@@ -418,7 +421,7 @@ const v = (a) => Object.fromEntries((a || []).map((e) => [e.id, e])), we = b`
|
|
|
418
421
|
table.data tbody tr.rowlink:hover { background: var(--hsot-gray-1); }
|
|
419
422
|
table.data td.teamcell a { color: inherit; text-decoration: none; font-weight: 500; }
|
|
420
423
|
table.data td.teamcell a:hover { text-decoration: underline; }
|
|
421
|
-
`,
|
|
424
|
+
`, ze = y`
|
|
422
425
|
.swatch {
|
|
423
426
|
display: inline-flex; align-items: center; justify-content: center;
|
|
424
427
|
width: 26px; height: 26px; border-radius: 50%;
|
|
@@ -442,7 +445,7 @@ const v = (a) => Object.fromEntries((a || []).map((e) => [e.id, e])), we = b`
|
|
|
442
445
|
.dot.W { background: var(--hsot-win); }
|
|
443
446
|
.dot.L { background: var(--hsot-loss); }
|
|
444
447
|
.dot.T { background: var(--hsot-tie); }
|
|
445
|
-
`,
|
|
448
|
+
`, Pe = y`
|
|
446
449
|
ul.gamelist { list-style: none; margin: 0; padding: 0; }
|
|
447
450
|
.gamelist li {
|
|
448
451
|
display: flex; align-items: center; gap: 0.7rem; padding: 0.55rem 1rem;
|
|
@@ -492,183 +495,183 @@ const v = (a) => Object.fromEntries((a || []).map((e) => [e.id, e])), we = b`
|
|
|
492
495
|
.gamelist .ff { color: var(--hsot-gray-5); font-size: 0.78rem; font-style: italic; }
|
|
493
496
|
.gamelist .where { color: var(--hsot-gray-5); font-size: 0.78rem; }
|
|
494
497
|
.gamelist a.box { font-size: 0.78rem; }
|
|
495
|
-
`,
|
|
498
|
+
`, z = [Te, Ie, Ce, De, Fe, ze, Pe];
|
|
496
499
|
function G(a) {
|
|
497
500
|
return a.state !== "final" ? null : a.forfeit === "home" ? "away" : a.forfeit === "away" || a.homeScore > a.awayScore ? "home" : a.awayScore > a.homeScore ? "away" : a.tiebreakWinner && a.tiebreakWinner !== "none" ? a.tiebreakWinner : "tie";
|
|
498
501
|
}
|
|
499
|
-
function
|
|
502
|
+
function Be(a) {
|
|
500
503
|
return a && (a.forfeit === "home" || a.forfeit === "away") ? a.forfeit : null;
|
|
501
504
|
}
|
|
502
|
-
function
|
|
503
|
-
const t = {}, s = (
|
|
504
|
-
for (const
|
|
505
|
-
const
|
|
505
|
+
function P(a, e) {
|
|
506
|
+
const t = {}, s = (o) => (t[o] = t[o] || { w: 0, l: 0, t: 0, cw: 0, cl: 0, ct: 0, pf: 0, pa: 0, results: [] }, t[o]), r = a.filter((o) => o.state === "final" && o.gameType !== "scrimmage" && (!e || o.date <= e)).sort((o, l) => String(o.date).localeCompare(String(l.date)));
|
|
507
|
+
for (const o of r) {
|
|
508
|
+
const l = G(o), i = o.gameType === "conference";
|
|
506
509
|
for (const h of ["home", "away"]) {
|
|
507
|
-
const
|
|
508
|
-
if (!
|
|
509
|
-
const c = s(
|
|
510
|
+
const d = h === "home" ? o.homeTeamId : o.awayTeamId;
|
|
511
|
+
if (!d) continue;
|
|
512
|
+
const c = s(d), m = h === "home" ? o.homeScore : o.awayScore, f = h === "home" ? o.awayScore : o.homeScore;
|
|
510
513
|
c.pf += m, c.pa += f;
|
|
511
|
-
let
|
|
512
|
-
|
|
514
|
+
let u = "T";
|
|
515
|
+
l === "tie" ? (c.t += 1, i && (c.ct += 1)) : l === h ? (c.w += 1, i && (c.cw += 1), u = "W") : (c.l += 1, i && (c.cl += 1), u = "L"), c.results.push({ gameId: o.id, date: o.date, mark: u, my: m, their: f, opp: h === "home" ? o.awayTeamId : o.homeTeamId, conf: i });
|
|
513
516
|
}
|
|
514
517
|
}
|
|
515
518
|
return t;
|
|
516
519
|
}
|
|
517
|
-
function
|
|
520
|
+
function H(a) {
|
|
518
521
|
if (!a || !a.length) return "";
|
|
519
522
|
const e = a[a.length - 1].mark;
|
|
520
523
|
let t = 0;
|
|
521
524
|
for (let s = a.length - 1; s >= 0 && a[s].mark === e; s -= 1) t += 1;
|
|
522
525
|
return e + t;
|
|
523
526
|
}
|
|
524
|
-
const
|
|
527
|
+
const ee = (a, e, t) => {
|
|
525
528
|
const s = a + e + t;
|
|
526
529
|
return s ? (a + t / 2) / s : 0;
|
|
527
|
-
},
|
|
528
|
-
function
|
|
530
|
+
}, te = (a) => a.toFixed(3).replace("0.", ".");
|
|
531
|
+
function k(a, e = !1) {
|
|
529
532
|
if (!a) return "0-0";
|
|
530
|
-
const t = e ? a.cw : a.w, s = e ? a.cl : a.l,
|
|
531
|
-
return `${t}-${s}${
|
|
533
|
+
const t = e ? a.cw : a.w, s = e ? a.cl : a.l, r = e ? a.ct : a.t;
|
|
534
|
+
return `${t}-${s}${r ? `-${r}` : ""}`;
|
|
532
535
|
}
|
|
533
|
-
function
|
|
536
|
+
function ne(a, e) {
|
|
534
537
|
return a.map((t) => {
|
|
535
538
|
const s = e[t.id] || { w: 0, l: 0, t: 0, cw: 0, cl: 0, ct: 0, pf: 0, pa: 0, results: [] };
|
|
536
|
-
return { team: t, rec: s, confPct:
|
|
539
|
+
return { team: t, rec: s, confPct: ee(s.cw, s.cl, s.ct), overallPct: ee(s.w, s.l, s.t) };
|
|
537
540
|
}).sort((t, s) => s.confPct - t.confPct || s.overallPct - t.overallPct || s.rec.pf - s.rec.pa - (t.rec.pf - t.rec.pa));
|
|
538
541
|
}
|
|
539
|
-
function
|
|
542
|
+
function W(a, e) {
|
|
540
543
|
return a.filter((t) => (t.homeTeamId === e || t.awayTeamId === e) && (t.state === "scheduled" || t.state === "live") && t.gameType !== "scrimmage").sort((t, s) => String(t.date).localeCompare(String(s.date)))[0] || null;
|
|
541
544
|
}
|
|
542
|
-
function
|
|
545
|
+
function se(a, e) {
|
|
543
546
|
const t = a[e];
|
|
544
547
|
return t && t.results.length ? t.results[t.results.length - 1] : null;
|
|
545
548
|
}
|
|
546
|
-
function
|
|
547
|
-
let
|
|
548
|
-
for (const
|
|
549
|
-
|
|
550
|
-
return
|
|
549
|
+
function st(a, e, t, s = "") {
|
|
550
|
+
let r = null;
|
|
551
|
+
for (const o of a || [])
|
|
552
|
+
o.sport === e && (t && o.effectiveDate > t || s && o.gender && o.gender !== s || (!r || o.effectiveDate > r.effectiveDate) && (r = o));
|
|
553
|
+
return r;
|
|
551
554
|
}
|
|
552
|
-
function
|
|
553
|
-
const
|
|
554
|
-
if (!
|
|
555
|
-
const
|
|
555
|
+
function V(a, e, t, s, r) {
|
|
556
|
+
const o = e[t];
|
|
557
|
+
if (!o) return null;
|
|
558
|
+
const l = /* @__PURE__ */ new Map();
|
|
556
559
|
for (const h of a || []) {
|
|
557
|
-
if (h.sport !== s ||
|
|
558
|
-
const
|
|
559
|
-
(!c || h.effectiveDate > c.effectiveDate) &&
|
|
560
|
+
if (h.sport !== s || r && h.effectiveDate > r || h.gender && o.gender !== h.gender && o.gender !== "coed") continue;
|
|
561
|
+
const d = h.gender || "", c = l.get(d);
|
|
562
|
+
(!c || h.effectiveDate > c.effectiveDate) && l.set(d, h);
|
|
560
563
|
}
|
|
561
|
-
let
|
|
562
|
-
for (const h of
|
|
563
|
-
const
|
|
564
|
-
|
|
564
|
+
let i = null;
|
|
565
|
+
for (const h of l.values()) {
|
|
566
|
+
const d = (h.teamIds || []).indexOf(t);
|
|
567
|
+
d !== -1 && (!i || h.effectiveDate > i.effectiveDate) && (i = { poll: h, rank: d + 1 });
|
|
565
568
|
}
|
|
566
|
-
return
|
|
569
|
+
return i ? i.rank : null;
|
|
567
570
|
}
|
|
568
|
-
function
|
|
571
|
+
function Ae(a, e, t) {
|
|
569
572
|
if (!a) return { kind: "none", delta: 0 };
|
|
570
573
|
const s = (a.teamIds || []).indexOf(t) + 1;
|
|
571
574
|
if (!s) return { kind: "none", delta: 0 };
|
|
572
575
|
if (!e) return { kind: "same", delta: 0 };
|
|
573
|
-
const
|
|
574
|
-
if (!
|
|
575
|
-
const
|
|
576
|
-
return
|
|
576
|
+
const r = (e.teamIds || []).indexOf(t) + 1;
|
|
577
|
+
if (!r) return { kind: "new", delta: 0 };
|
|
578
|
+
const o = r - s;
|
|
579
|
+
return o > 0 ? { kind: "up", delta: o } : o < 0 ? { kind: "down", delta: -o } : { kind: "same", delta: 0 };
|
|
577
580
|
}
|
|
578
|
-
function
|
|
581
|
+
function Ee(a) {
|
|
579
582
|
return /^https?:\/\//i.test(String(a || ""));
|
|
580
583
|
}
|
|
581
|
-
function
|
|
582
|
-
if (!
|
|
584
|
+
function ie(a, { w: e, h: t } = {}) {
|
|
585
|
+
if (!Ee(a)) return "";
|
|
583
586
|
const s = [];
|
|
584
587
|
e && s.push(`w=${Math.max(1, Math.round(e))}`), t && s.push(`h=${Math.max(1, Math.round(t))}`), s.push("f=webp");
|
|
585
|
-
const
|
|
586
|
-
return `${a}${
|
|
588
|
+
const r = a.includes("?") ? "&" : "?";
|
|
589
|
+
return `${a}${r}${s.join("&")}`;
|
|
587
590
|
}
|
|
588
|
-
function
|
|
591
|
+
function R(a, e) {
|
|
589
592
|
const t = e * 2;
|
|
590
|
-
return
|
|
593
|
+
return ie(a?.logoAssetId, { w: t, h: t });
|
|
591
594
|
}
|
|
592
|
-
function
|
|
593
|
-
return
|
|
595
|
+
function _e(a, e) {
|
|
596
|
+
return ie(a?.photoAssetId, { w: e * 2 });
|
|
594
597
|
}
|
|
595
|
-
function
|
|
596
|
-
const
|
|
597
|
-
return
|
|
598
|
+
function Y(a, e, { title: t, sub: s, teams: r }) {
|
|
599
|
+
const o = oe(), i = !!a.querySelector(':scope > a[slot="nav"]') || xe(o, e.hrefs, e.sport) !== null;
|
|
600
|
+
return n`
|
|
598
601
|
<div class="band section">
|
|
599
602
|
<div class="inner">
|
|
600
603
|
<h1>${t}</h1>
|
|
601
|
-
${s ?
|
|
604
|
+
${s ? n`<p class="sub">${s}</p>` : p}
|
|
602
605
|
</div>
|
|
603
|
-
${
|
|
604
|
-
<nav class="sectionnav" aria-label="${
|
|
606
|
+
${i ? n`
|
|
607
|
+
<nav class="sectionnav" aria-label="${I(e.sport)} section">
|
|
605
608
|
<div class="navrow">
|
|
606
609
|
<slot name="nav">
|
|
607
|
-
${
|
|
608
|
-
aria-current=${
|
|
610
|
+
${ke(e.sport, r, e.hrefs).map((h) => n`<a href=${h.href}
|
|
611
|
+
aria-current=${o && S(h.href) === o ? "page" : p}>${h.label}</a>`)}
|
|
609
612
|
</slot>
|
|
610
613
|
</div>
|
|
611
614
|
</nav>` : p}
|
|
612
615
|
</div>
|
|
613
616
|
`;
|
|
614
617
|
}
|
|
615
|
-
const
|
|
618
|
+
const C = (a, e) => {
|
|
616
619
|
const t = a.teamsById[e];
|
|
617
620
|
return t ? a.schoolsById[t.schoolId] : null;
|
|
618
|
-
}, T = (a, e) =>
|
|
619
|
-
function
|
|
621
|
+
}, T = (a, e) => C(a, e)?.name || "TBD", N = (a, e) => C(a, e)?.abbr || "TBD";
|
|
622
|
+
function D(a, e = 26) {
|
|
620
623
|
if (!a) return p;
|
|
621
|
-
const t =
|
|
624
|
+
const t = R(a, e);
|
|
622
625
|
if (t)
|
|
623
|
-
return
|
|
626
|
+
return n`<img class="swatch logo" aria-hidden="true" alt="" loading="lazy"
|
|
624
627
|
src=${t} style="width:${e}px;height:${e}px" />`;
|
|
625
|
-
const s = a.colorPrimary || "#030711",
|
|
626
|
-
return
|
|
627
|
-
style="width:${e}px;height:${e}px;background:${s};color:${
|
|
628
|
-
>${
|
|
628
|
+
const s = a.colorPrimary || "#030711", r = _(s);
|
|
629
|
+
return n`<span class="swatch" aria-hidden="true"
|
|
630
|
+
style="width:${e}px;height:${e}px;background:${s};color:${r};font-size:${Math.max(8, e * 0.28)}px"
|
|
631
|
+
>${q(a)}</span>`;
|
|
629
632
|
}
|
|
630
|
-
function
|
|
631
|
-
const s =
|
|
632
|
-
return s ?
|
|
633
|
+
function Q(a, e, t) {
|
|
634
|
+
const s = V(a.rankings, a.teamsById, e, a.sport, t);
|
|
635
|
+
return s ? n`<span class="rankbadge">#${s}</span>` : p;
|
|
633
636
|
}
|
|
634
|
-
function
|
|
635
|
-
const s =
|
|
636
|
-
return s ?
|
|
637
|
+
function le(a, e, t) {
|
|
638
|
+
const s = C(a, e);
|
|
639
|
+
return s ? n`${Q(a, e, t)}<a href=${g(a.hrefs.school, { id: s.id })}>${s.name}</a>` : n`<span class="mut">TBD</span>`;
|
|
637
640
|
}
|
|
638
641
|
function K(a, e, t = 5) {
|
|
639
642
|
const s = a.records[e];
|
|
640
|
-
if (!s || !s.results.length) return
|
|
641
|
-
const
|
|
642
|
-
return
|
|
643
|
-
${
|
|
644
|
-
title="${
|
|
645
|
-
href=${
|
|
643
|
+
if (!s || !s.results.length) return n`<span class="mut">·</span>`;
|
|
644
|
+
const r = s.results.slice(-1 * t);
|
|
645
|
+
return n`<span class="dots" role="img" aria-label="last ${r.length} results">
|
|
646
|
+
${r.map((o) => n`<a class="dot ${o.mark}"
|
|
647
|
+
title="${o.mark} ${o.my}-${o.their} vs ${T(a, o.opp)}"
|
|
648
|
+
href=${g(a.hrefs.game, { sport: a.sport, id: o.gameId })}>${o.mark}</a>`)}
|
|
646
649
|
</span>`;
|
|
647
650
|
}
|
|
648
651
|
function B(a, e) {
|
|
649
|
-
return a.querySelector(':scope > [slot="rail"]') ?
|
|
652
|
+
return a.querySelector(':scope > [slot="rail"]') ? n`<div class="view withrail">
|
|
650
653
|
<div class="viewmain">${e}</div>
|
|
651
654
|
<aside class="viewrail"><slot name="rail"></slot></aside>
|
|
652
|
-
</div>` :
|
|
655
|
+
</div>` : n`<div class="view">${e}</div>`;
|
|
653
656
|
}
|
|
654
|
-
function
|
|
657
|
+
function A(a) {
|
|
655
658
|
if (!a.promoImage) return p;
|
|
656
|
-
const e =
|
|
657
|
-
return
|
|
659
|
+
const e = n`<img src=${a.promoImage} alt=${a.promoAlt || "Sponsor"}>`;
|
|
660
|
+
return n`<div class="promo">${a.promoHref ? n`<a href=${a.promoHref} target="_blank" rel="sponsored noopener">${e}</a>` : e}</div>`;
|
|
658
661
|
}
|
|
659
|
-
function
|
|
660
|
-
const e =
|
|
661
|
-
return
|
|
662
|
+
function L(a) {
|
|
663
|
+
const e = re(a);
|
|
664
|
+
return n`<span class="pill ${e.kind}">${e.label}</span>`;
|
|
662
665
|
}
|
|
663
|
-
function
|
|
664
|
-
if (!e) return
|
|
665
|
-
const s = e.homeTeamId === t ? e.awayTeamId : e.homeTeamId,
|
|
666
|
-
return
|
|
666
|
+
function ce(a, e, t) {
|
|
667
|
+
if (!e) return n`<span class="mut">·</span>`;
|
|
668
|
+
const s = e.homeTeamId === t ? e.awayTeamId : e.homeTeamId, r = e.homeTeamId === t ? "vs" : "at";
|
|
669
|
+
return n`${e.state === "live" ? n`<span class="pill live">Live</span> ` : n`${$(e.date, { month: "numeric", day: "numeric" })} `}${r} ${N(a, s)}`;
|
|
667
670
|
}
|
|
668
|
-
class
|
|
669
|
-
static styles =
|
|
671
|
+
class Re extends w {
|
|
672
|
+
static styles = z;
|
|
670
673
|
static properties = {
|
|
671
|
-
|
|
674
|
+
...w.properties,
|
|
672
675
|
sport: { type: String },
|
|
673
676
|
season: { type: String },
|
|
674
677
|
date: { type: String }
|
|
@@ -684,57 +687,57 @@ class Pe extends $ {
|
|
|
684
687
|
this._datePinned = !!this.date;
|
|
685
688
|
}
|
|
686
689
|
async fetchData(e) {
|
|
687
|
-
const t = this.season ||
|
|
690
|
+
const t = this.season || M(), [s, r, o, l, i] = await Promise.all([
|
|
688
691
|
e.listSchools(),
|
|
689
692
|
e.listTeams({ sport: this.sport }),
|
|
690
693
|
e.listConferences(),
|
|
691
694
|
e.listGames({ sport: this.sport, season: t }),
|
|
692
695
|
e.listRankings({ sport: this.sport })
|
|
693
696
|
]);
|
|
694
|
-
return this._datePinned || (this.date =
|
|
697
|
+
return this._datePinned || (this.date = be(l.items.map((h) => h.date)), this._datePinned = !0), {
|
|
695
698
|
season: t,
|
|
696
699
|
schools: s.items,
|
|
697
|
-
teams:
|
|
698
|
-
conferences:
|
|
699
|
-
games:
|
|
700
|
-
rankings:
|
|
700
|
+
teams: r.items,
|
|
701
|
+
conferences: o.items,
|
|
702
|
+
games: l.items,
|
|
703
|
+
rankings: i.items
|
|
701
704
|
};
|
|
702
705
|
}
|
|
703
706
|
get ctx() {
|
|
704
707
|
return (!this._ctx || this._ctxData !== this.data) && (this._ctx = {
|
|
705
708
|
teamsById: v(this.data.teams),
|
|
706
709
|
schoolsById: v(this.data.schools),
|
|
707
|
-
records:
|
|
710
|
+
records: P(this.data.games),
|
|
708
711
|
rankings: this.data.rankings,
|
|
709
|
-
hrefs:
|
|
712
|
+
hrefs: F(this),
|
|
710
713
|
sport: this.sport
|
|
711
714
|
}, this._ctxData = this.data), this._ctx;
|
|
712
715
|
}
|
|
713
716
|
renderView() {
|
|
714
|
-
const e = this.ctx, t = v(this.data.conferences), s = [...new Set(this.data.games.map((
|
|
715
|
-
const c = [
|
|
716
|
-
return c.length ? Math.min(...c) :
|
|
717
|
-
},
|
|
718
|
-
|
|
717
|
+
const e = this.ctx, t = v(this.data.conferences), s = [...new Set(this.data.games.map((d) => d.date).filter(Boolean))].sort(), r = Number.MAX_SAFE_INTEGER, o = (d) => {
|
|
718
|
+
const c = [d.awayTeamId, d.homeTeamId].map((m) => V(e.rankings, e.teamsById, m, this.sport, d.date)).filter(Boolean);
|
|
719
|
+
return c.length ? Math.min(...c) : r;
|
|
720
|
+
}, l = this.data.games.filter((d) => d.date === this.date), i = new Map(l.map((d) => [d, o(d)]));
|
|
721
|
+
l.sort((d, c) => (d.state === "live" ? 0 : 1) - (c.state === "live" ? 0 : 1) || i.get(d) - i.get(c));
|
|
719
722
|
const h = /* @__PURE__ */ new Map();
|
|
720
|
-
return
|
|
721
|
-
const c =
|
|
722
|
-
h.has(c) || h.set(c, []), h.get(c).push(
|
|
723
|
-
}),
|
|
724
|
-
${
|
|
725
|
-
title:
|
|
726
|
-
sub:
|
|
723
|
+
return l.forEach((d) => {
|
|
724
|
+
const c = d.gameType === "conference" && d.conferenceId ? t[d.conferenceId]?.name || "Conference" : d.gameType === "playoff" ? "Playoffs" : d.gameType === "scrimmage" ? "Scrimmages" : "Nonconference";
|
|
725
|
+
h.has(c) || h.set(c, []), h.get(c).push(d);
|
|
726
|
+
}), n`
|
|
727
|
+
${Y(this, e, {
|
|
728
|
+
title: n`${I(this.sport)} scores & schedules`,
|
|
729
|
+
sub: n`${$(this.date, { weekday: "long", month: "long", day: "numeric", year: "numeric" })} · ${l.length} games`,
|
|
727
730
|
teams: this.data.teams
|
|
728
731
|
})}
|
|
729
|
-
${B(this,
|
|
730
|
-
${
|
|
732
|
+
${B(this, n`
|
|
733
|
+
${A(this)}
|
|
731
734
|
<div class="toolbar">
|
|
732
735
|
<label class="asof" for="datesel">Date</label>
|
|
733
|
-
<select id="datesel" @change=${(
|
|
734
|
-
this.date =
|
|
736
|
+
<select id="datesel" @change=${(d) => {
|
|
737
|
+
this.date = d.target.value;
|
|
735
738
|
}}>
|
|
736
|
-
${(s.includes(this.date) ? s : [...s, this.date].sort()).map((
|
|
737
|
-
${
|
|
739
|
+
${(s.includes(this.date) ? s : [...s, this.date].sort()).map((d) => n`<option value=${d} ?selected=${d === this.date}>
|
|
740
|
+
${$(d, { weekday: "short", month: "short", day: "numeric" })}${d === j() ? " · today" : ""}
|
|
738
741
|
</option>`)}
|
|
739
742
|
</select>
|
|
740
743
|
<button class="chip" ?disabled=${s.indexOf(this.date) <= 0}
|
|
@@ -748,9 +751,9 @@ class Pe extends $ {
|
|
|
748
751
|
<span class="spacer"></span>
|
|
749
752
|
<span class="asof">Live games first · report a score to see it update here</span>
|
|
750
753
|
</div>
|
|
751
|
-
${
|
|
752
|
-
${[...h.entries()].map(([
|
|
753
|
-
<div class="section-title">${
|
|
754
|
+
${l.length ? p : n`<p class="empty">No ${this.sport} games on this date.</p>`}
|
|
755
|
+
${[...h.entries()].map(([d, c]) => n`
|
|
756
|
+
<div class="section-title">${d}</div>
|
|
754
757
|
<div class="card"><ul class="gamelist">
|
|
755
758
|
${c.map((m) => this.renderGame(e, m))}
|
|
756
759
|
</ul></div>
|
|
@@ -762,24 +765,24 @@ class Pe extends $ {
|
|
|
762
765
|
// a lone score column on the far right read as detached from the teams).
|
|
763
766
|
// Scheduled games carry their start time on the status pill alone.
|
|
764
767
|
renderGame(e, t) {
|
|
765
|
-
const s = t.state === "final" || t.state === "live",
|
|
766
|
-
return
|
|
768
|
+
const s = t.state === "final" || t.state === "live", r = (l, i, h = p) => n`<span class="side">${le(e, l, t.date)}${s ? n`<span class="score">${i}</span>` : p}${h}</span>`, o = Be(t);
|
|
769
|
+
return n`
|
|
767
770
|
<li>
|
|
768
|
-
${
|
|
769
|
-
<span class="opp matchup">${
|
|
770
|
-
${
|
|
771
|
+
${L(t)}
|
|
772
|
+
<span class="opp matchup">${r(t.awayTeamId, t.awayScore, n`<span class="at">at</span>`)}${r(t.homeTeamId, t.homeScore)}</span>
|
|
773
|
+
${o ? n`<span class="ff">${T(e, o === "home" ? t.homeTeamId : t.awayTeamId)} forfeited</span>` : p}
|
|
771
774
|
<span class="where">${t.venue || ""}</span>
|
|
772
|
-
${t.broadcast ?
|
|
773
|
-
<a class="box" href=${
|
|
775
|
+
${t.broadcast ? n`<span class="pill class">${t.broadcast}</span>` : p}
|
|
776
|
+
<a class="box" href=${g(e.hrefs.game, { sport: this.sport, id: t.id })}>Box score →</a>
|
|
774
777
|
</li>
|
|
775
778
|
`;
|
|
776
779
|
}
|
|
777
780
|
}
|
|
778
|
-
globalThis?.customElements && !globalThis.customElements.get("hsot-scores") && globalThis.customElements.define("hsot-scores",
|
|
779
|
-
class
|
|
780
|
-
static styles =
|
|
781
|
+
globalThis?.customElements && !globalThis.customElements.get("hsot-scores") && globalThis.customElements.define("hsot-scores", Re);
|
|
782
|
+
class Ne extends w {
|
|
783
|
+
static styles = z;
|
|
781
784
|
static properties = {
|
|
782
|
-
|
|
785
|
+
...w.properties,
|
|
783
786
|
sport: { type: String },
|
|
784
787
|
season: { type: String },
|
|
785
788
|
classFilter: { state: !0 },
|
|
@@ -789,7 +792,7 @@ class Ee extends $ {
|
|
|
789
792
|
super(), this.sport = "football", this.season = "", this.classFilter = "All", this.query = "";
|
|
790
793
|
}
|
|
791
794
|
async fetchData(e) {
|
|
792
|
-
const t = this.season ||
|
|
795
|
+
const t = this.season || M(), [s, r, o, l, i] = await Promise.all([
|
|
793
796
|
e.listConferences({ active: !0 }),
|
|
794
797
|
e.listSchools(),
|
|
795
798
|
e.listTeams({ sport: this.sport }),
|
|
@@ -799,60 +802,60 @@ class Ee extends $ {
|
|
|
799
802
|
return {
|
|
800
803
|
season: t,
|
|
801
804
|
conferences: s.items,
|
|
802
|
-
schools:
|
|
803
|
-
teams:
|
|
804
|
-
games:
|
|
805
|
-
rankings:
|
|
805
|
+
schools: r.items,
|
|
806
|
+
teams: o.items,
|
|
807
|
+
games: l.items,
|
|
808
|
+
rankings: i.items
|
|
806
809
|
};
|
|
807
810
|
}
|
|
808
811
|
get ctx() {
|
|
809
812
|
return (!this._ctx || this._ctxData !== this.data) && (this._ctx = {
|
|
810
813
|
teamsById: v(this.data.teams),
|
|
811
814
|
schoolsById: v(this.data.schools),
|
|
812
|
-
records:
|
|
815
|
+
records: P(this.data.games),
|
|
813
816
|
rankings: this.data.rankings,
|
|
814
|
-
hrefs:
|
|
817
|
+
hrefs: F(this),
|
|
815
818
|
sport: this.sport
|
|
816
819
|
}, this._ctxData = this.data), this._ctx;
|
|
817
820
|
}
|
|
818
821
|
renderView() {
|
|
819
|
-
const e = this.ctx, t = ["All", ...[...new Set(this.data.conferences.flatMap((
|
|
820
|
-
return
|
|
821
|
-
${
|
|
822
|
-
title:
|
|
823
|
-
sub:
|
|
822
|
+
const e = this.ctx, t = ["All", ...[...new Set(this.data.conferences.flatMap((r) => r.classifications || []))].sort(J)].slice(0, 9), s = this.data.conferences.filter((r) => r.active !== !1).filter((r) => this.classFilter === "All" || (r.classifications || []).includes(this.classFilter)).sort($e);
|
|
823
|
+
return n`
|
|
824
|
+
${Y(this, e, {
|
|
825
|
+
title: n`${I(this.sport)} standings`,
|
|
826
|
+
sub: n`${this.data.season} season · every conference, computed live from reported results`,
|
|
824
827
|
teams: this.data.teams
|
|
825
828
|
})}
|
|
826
|
-
${B(this,
|
|
827
|
-
${
|
|
829
|
+
${B(this, n`
|
|
830
|
+
${A(this)}
|
|
828
831
|
<div class="toolbar">
|
|
829
832
|
<div role="group" aria-label="Classification filter">
|
|
830
|
-
${t.map((
|
|
833
|
+
${t.map((r) => n`<button class="chip ${this.classFilter === r ? "on" : ""}"
|
|
831
834
|
@click=${() => {
|
|
832
|
-
this.classFilter =
|
|
833
|
-
}}>${
|
|
835
|
+
this.classFilter = r;
|
|
836
|
+
}}>${r}</button>`)}
|
|
834
837
|
</div>
|
|
835
838
|
<input type="search" placeholder="Find a school…" aria-label="Find a school"
|
|
836
|
-
.value=${this.query} @input=${(
|
|
837
|
-
this.query =
|
|
839
|
+
.value=${this.query} @input=${(r) => {
|
|
840
|
+
this.query = r.target.value;
|
|
838
841
|
}}>
|
|
839
842
|
<span class="spacer"></span>
|
|
840
|
-
<span class="asof">Records through ${
|
|
843
|
+
<span class="asof">Records through ${$(j(), { month: "long", day: "numeric" })} · conference games count toward both records · scrimmages toward neither</span>
|
|
841
844
|
</div>
|
|
842
|
-
${s.map((
|
|
845
|
+
${s.map((r) => this.renderConference(e, r))}
|
|
843
846
|
`)}
|
|
844
847
|
`;
|
|
845
848
|
}
|
|
846
849
|
renderConference(e, t) {
|
|
847
|
-
const s = this.data.teams.filter((
|
|
850
|
+
const s = this.data.teams.filter((l) => l.conferenceId === t.id);
|
|
848
851
|
if (!s.length) return p;
|
|
849
|
-
const
|
|
850
|
-
return
|
|
852
|
+
const r = this.query.trim().toLowerCase(), o = ne(s, e.records);
|
|
853
|
+
return n`
|
|
851
854
|
<div class="card">
|
|
852
855
|
<div class="card-head">
|
|
853
856
|
<h2>${t.name}</h2>
|
|
854
|
-
${[...t.classifications || []].sort(
|
|
855
|
-
<span class="meta">${
|
|
857
|
+
${[...t.classifications || []].sort(J).map((l) => n`<span class="pill class">${l}</span>`)}
|
|
858
|
+
<span class="meta">${o.length} teams · membership derives from teams</span>
|
|
856
859
|
</div>
|
|
857
860
|
<div class="tablewrap"><table class="data">
|
|
858
861
|
<thead><tr>
|
|
@@ -861,43 +864,43 @@ class Ee extends $ {
|
|
|
861
864
|
<th>Streak</th><th>Last 5</th><th>Next</th>
|
|
862
865
|
</tr></thead>
|
|
863
866
|
<tbody>
|
|
864
|
-
${
|
|
867
|
+
${o.map((l, i) => this.renderRow(e, l, i, r))}
|
|
865
868
|
</tbody>
|
|
866
869
|
</table></div>
|
|
867
870
|
</div>
|
|
868
871
|
`;
|
|
869
872
|
}
|
|
870
|
-
renderRow(e, t, s,
|
|
871
|
-
const
|
|
872
|
-
if (
|
|
873
|
-
const
|
|
874
|
-
location.href =
|
|
873
|
+
renderRow(e, t, s, r) {
|
|
874
|
+
const o = e.schoolsById[t.team.schoolId], l = o?.name || t.team.name || "TBD";
|
|
875
|
+
if (r && !l.toLowerCase().includes(r)) return p;
|
|
876
|
+
const i = t.rec.pf - t.rec.pa, h = W(this.data.games, t.team.id), d = () => {
|
|
877
|
+
location.href = g(e.hrefs.school, { id: t.team.schoolId });
|
|
875
878
|
};
|
|
876
|
-
return
|
|
879
|
+
return n`
|
|
877
880
|
<tr class="rowlink" @click=${(c) => {
|
|
878
|
-
c.target.closest("a") ||
|
|
881
|
+
c.target.closest("a") || d();
|
|
879
882
|
}}>
|
|
880
883
|
<td class="mut">${s + 1}</td>
|
|
881
884
|
<td class="teamcell">
|
|
882
|
-
${
|
|
883
|
-
<a href=${
|
|
885
|
+
${D(o)}${Q(e, t.team.id, null)}
|
|
886
|
+
<a href=${g(e.hrefs.school, { id: t.team.schoolId })}>${l}</a>
|
|
884
887
|
</td>
|
|
885
|
-
<td class="num">${
|
|
886
|
-
<td class="num">${
|
|
887
|
-
<td class="num">${
|
|
888
|
-
<td class="num">${
|
|
888
|
+
<td class="num">${k(t.rec, !0)}</td>
|
|
889
|
+
<td class="num">${te(t.confPct)}</td>
|
|
890
|
+
<td class="num">${k(t.rec)}</td>
|
|
891
|
+
<td class="num">${te(t.overallPct)}</td>
|
|
889
892
|
<td class="num">${t.rec.pf}</td>
|
|
890
893
|
<td class="num">${t.rec.pa}</td>
|
|
891
|
-
<td class="num" style="color:${
|
|
892
|
-
<td>${
|
|
894
|
+
<td class="num" style="color:${i >= 0 ? "var(--hsot-win)" : "var(--hsot-loss)"}">${i > 0 ? "+" : ""}${i}</td>
|
|
895
|
+
<td>${H(t.rec.results) || "·"}</td>
|
|
893
896
|
<td>${K(e, t.team.id)}</td>
|
|
894
|
-
<td>${
|
|
897
|
+
<td>${ce(e, h, t.team.id)}</td>
|
|
895
898
|
</tr>
|
|
896
899
|
`;
|
|
897
900
|
}
|
|
898
901
|
}
|
|
899
|
-
globalThis?.customElements && !globalThis.customElements.get("hsot-standings") && globalThis.customElements.define("hsot-standings",
|
|
900
|
-
const
|
|
902
|
+
globalThis?.customElements && !globalThis.customElements.get("hsot-standings") && globalThis.customElements.define("hsot-standings", Ne);
|
|
903
|
+
const Le = y`
|
|
901
904
|
.hero1 {
|
|
902
905
|
border-radius: var(--hsot-radius-md); color: var(--hsot-white);
|
|
903
906
|
padding: 1.3rem 1.4rem; display: flex; align-items: center; gap: 1.2rem;
|
|
@@ -914,10 +917,10 @@ const Ae = b`
|
|
|
914
917
|
.delta.new { background: var(--hsot-straw); color: #6b5900; border-radius: var(--hsot-radius-xs); padding: 0.1rem 0.3rem; font-size: 0.7rem; }
|
|
915
918
|
.sparkline { vertical-align: middle; }
|
|
916
919
|
`;
|
|
917
|
-
class
|
|
918
|
-
static styles = [...
|
|
920
|
+
class Me extends w {
|
|
921
|
+
static styles = [...z, Le];
|
|
919
922
|
static properties = {
|
|
920
|
-
|
|
923
|
+
...w.properties,
|
|
921
924
|
sport: { type: String },
|
|
922
925
|
gender: { type: String },
|
|
923
926
|
season: { type: String },
|
|
@@ -932,73 +935,73 @@ class _e extends $ {
|
|
|
932
935
|
e && (this.pollDate = e);
|
|
933
936
|
}
|
|
934
937
|
async fetchData(e) {
|
|
935
|
-
const t = this.season ||
|
|
938
|
+
const t = this.season || M(), [s, r, o, l, i] = await Promise.all([
|
|
936
939
|
e.listRankings({ sport: this.sport, ...this.gender ? { gender: this.gender } : {} }),
|
|
937
940
|
e.listSchools(),
|
|
938
941
|
e.listTeams({ sport: this.sport }),
|
|
939
942
|
e.listConferences(),
|
|
940
943
|
e.listGames({ sport: this.sport, season: t })
|
|
941
|
-
]), h = s.items.filter((
|
|
944
|
+
]), h = s.items.filter((d) => !this.gender || !d.gender || d.gender === this.gender).sort((d, c) => c.effectiveDate.localeCompare(d.effectiveDate));
|
|
942
945
|
return {
|
|
943
946
|
season: t,
|
|
944
947
|
polls: h,
|
|
945
|
-
schools:
|
|
946
|
-
teams:
|
|
947
|
-
conferences:
|
|
948
|
-
games:
|
|
948
|
+
schools: r.items,
|
|
949
|
+
teams: o.items,
|
|
950
|
+
conferences: l.items,
|
|
951
|
+
games: i.items
|
|
949
952
|
};
|
|
950
953
|
}
|
|
951
954
|
get ctx() {
|
|
952
955
|
return (!this._ctx || this._ctxData !== this.data) && (this._ctx = {
|
|
953
956
|
teamsById: v(this.data.teams),
|
|
954
957
|
schoolsById: v(this.data.schools),
|
|
955
|
-
records:
|
|
958
|
+
records: P(this.data.games),
|
|
956
959
|
rankings: this.data.polls,
|
|
957
|
-
hrefs:
|
|
960
|
+
hrefs: F(this),
|
|
958
961
|
sport: this.sport
|
|
959
962
|
}, this._ctxData = this.data), this._ctx;
|
|
960
963
|
}
|
|
961
964
|
sparkline(e, t, s) {
|
|
962
|
-
const
|
|
963
|
-
const
|
|
964
|
-
if (
|
|
965
|
-
const
|
|
966
|
-
return { x:
|
|
965
|
+
const i = t.map((m, f) => {
|
|
966
|
+
const u = (m.teamIds || []).indexOf(e);
|
|
967
|
+
if (u === -1) return null;
|
|
968
|
+
const b = t.length === 1 ? 96 / 2 : f / (t.length - 1) * 90 + 3, x = 3 + u / 24 * 20;
|
|
969
|
+
return { x: b, y: x };
|
|
967
970
|
}), h = [];
|
|
968
|
-
let
|
|
969
|
-
if (
|
|
970
|
-
m ?
|
|
971
|
-
}),
|
|
972
|
-
const c =
|
|
973
|
-
return
|
|
974
|
-
${h.map((m) =>
|
|
971
|
+
let d = [];
|
|
972
|
+
if (i.forEach((m) => {
|
|
973
|
+
m ? d.push(m) : d.length && (h.push(d), d = []);
|
|
974
|
+
}), d.length && h.push(d), !h.length) return p;
|
|
975
|
+
const c = i[s];
|
|
976
|
+
return n`<svg class="sparkline" width=${96} height=${26} viewBox="0 0 ${96} ${26}" role="img" aria-label="rank history">
|
|
977
|
+
${h.map((m) => Z`<polyline fill="none" stroke="var(--hsot-red)" stroke-width="2"
|
|
975
978
|
points=${m.map((f) => `${f.x.toFixed(1)},${f.y.toFixed(1)}`).join(" ")}></polyline>`)}
|
|
976
|
-
${c ?
|
|
979
|
+
${c ? Z`<circle cx=${c.x.toFixed(1)} cy=${c.y.toFixed(1)} r="3" fill="var(--hsot-black)"></circle>` : p}
|
|
977
980
|
</svg>`;
|
|
978
981
|
}
|
|
979
982
|
movement(e, t, s) {
|
|
980
|
-
const
|
|
981
|
-
return
|
|
983
|
+
const r = Ae(e, t, s);
|
|
984
|
+
return r.kind === "up" ? n`<span class="delta up">▲ ${r.delta}</span>` : r.kind === "down" ? n`<span class="delta down">▼ ${r.delta}</span>` : r.kind === "new" ? n`<span class="delta new">NEW</span>` : r.kind === "same" ? n`<span class="delta same">—</span>` : n`<span class="delta same">·</span>`;
|
|
982
985
|
}
|
|
983
986
|
renderView() {
|
|
984
987
|
const e = this.ctx, t = this.data.polls;
|
|
985
|
-
if (!t.length) return
|
|
986
|
-
const s = Math.max(0, t.findIndex((m) => m.effectiveDate === this.pollDate)),
|
|
987
|
-
return
|
|
988
|
-
${
|
|
989
|
-
title:
|
|
990
|
-
sub:
|
|
988
|
+
if (!t.length) return n`<div class="view"><p class="empty">No ${this.sport} polls published yet this season.</p></div>`;
|
|
989
|
+
const s = Math.max(0, t.findIndex((m) => m.effectiveDate === this.pollDate)), r = t[s] || t[0], o = t[s + 1] || null, l = t.slice().reverse(), i = l.indexOf(r), h = v(this.data.conferences), d = (r.teamIds || [])[0], c = d ? C(e, d) : null;
|
|
990
|
+
return n`
|
|
991
|
+
${Y(this, e, {
|
|
992
|
+
title: n`${I(this.sport)} Top 25`,
|
|
993
|
+
sub: n`The HighSchoolOT poll · updated weekly · ${t.length} polls this season`,
|
|
991
994
|
teams: this.data.teams
|
|
992
995
|
})}
|
|
993
|
-
${B(this,
|
|
994
|
-
${
|
|
996
|
+
${B(this, n`
|
|
997
|
+
${A(this)}
|
|
995
998
|
<div class="toolbar">
|
|
996
999
|
<label class="asof" for="pollsel">Poll of</label>
|
|
997
1000
|
<select id="pollsel" @change=${(m) => {
|
|
998
1001
|
this.pollDate = m.target.value;
|
|
999
1002
|
}}>
|
|
1000
|
-
${t.map((m, f) =>
|
|
1001
|
-
${
|
|
1003
|
+
${t.map((m, f) => n`<option value=${m.effectiveDate} ?selected=${m === r}>
|
|
1004
|
+
${$(m.effectiveDate, { month: "long", day: "numeric", year: "numeric" })}${f === 0 ? " · current" : ""}
|
|
1002
1005
|
</option>`)}
|
|
1003
1006
|
</select>
|
|
1004
1007
|
<button class="chip" ?disabled=${s >= t.length - 1}
|
|
@@ -1012,65 +1015,65 @@ class _e extends $ {
|
|
|
1012
1015
|
<span class="spacer"></span>
|
|
1013
1016
|
<span class="asof">Movement vs. the previous poll · sparkline = season rank history</span>
|
|
1014
1017
|
</div>
|
|
1015
|
-
${c ? this.renderHero(e,
|
|
1018
|
+
${c ? this.renderHero(e, r, o, d, c, h) : p}
|
|
1016
1019
|
<div class="card"><div class="tablewrap"><table class="data">
|
|
1017
1020
|
<thead><tr>
|
|
1018
1021
|
<th class="num">Rk</th><th>Mvmt</th><th>Team</th><th class="num">Record</th>
|
|
1019
1022
|
<th>Conference</th><th>Last result</th><th>Next</th><th>Season</th>
|
|
1020
1023
|
</tr></thead>
|
|
1021
1024
|
<tbody>
|
|
1022
|
-
${(
|
|
1025
|
+
${(r.teamIds || []).map((m, f) => f === 0 || !m ? p : this.renderRow(e, r, o, l, i, h, m, f + 1))}
|
|
1023
1026
|
</tbody>
|
|
1024
1027
|
</table></div></div>
|
|
1025
1028
|
<p class="note">Ranks elsewhere on the site resolve the poll in effect on the game date, so past box scores keep the ranks they were played under.</p>
|
|
1026
1029
|
`)}
|
|
1027
1030
|
`;
|
|
1028
1031
|
}
|
|
1029
|
-
renderHero(e, t, s,
|
|
1030
|
-
const
|
|
1031
|
-
return
|
|
1032
|
+
renderHero(e, t, s, r, o, l) {
|
|
1033
|
+
const i = e.records[r], h = se(e.records, r), d = l[e.teamsById[r]?.conferenceId], c = `linear-gradient(120deg, ${o.colorPrimary || "#030711"} 0%, var(--hsot-black) 85%)`;
|
|
1034
|
+
return n`
|
|
1032
1035
|
<div class="hero1" style="background:${c}">
|
|
1033
1036
|
<div class="bigrank">#1</div>
|
|
1034
|
-
${
|
|
1037
|
+
${D(o, 64)}
|
|
1035
1038
|
<div>
|
|
1036
|
-
<h2><a href=${
|
|
1039
|
+
<h2><a href=${g(e.hrefs.school, { id: o.id })}>${o.name} ${o.mascot || ""}</a></h2>
|
|
1037
1040
|
<div class="facts">
|
|
1038
|
-
${
|
|
1039
|
-
· streak ${
|
|
1040
|
-
${h ?
|
|
1041
|
-
${this.movement(t, s,
|
|
1041
|
+
${k(i)} overall${d ? n` · ${k(i, !0)} ${d.name}` : p}
|
|
1042
|
+
· streak ${H(i?.results) || "·"}
|
|
1043
|
+
${h ? n` · last: ${h.mark} ${h.my}-${h.their} vs ${N(e, h.opp)}` : p}
|
|
1044
|
+
${this.movement(t, s, r)}
|
|
1042
1045
|
</div>
|
|
1043
1046
|
</div>
|
|
1044
1047
|
</div>
|
|
1045
1048
|
`;
|
|
1046
1049
|
}
|
|
1047
|
-
renderRow(e, t, s,
|
|
1048
|
-
const
|
|
1049
|
-
if (!
|
|
1050
|
-
const c = e.records[
|
|
1051
|
-
location.href =
|
|
1050
|
+
renderRow(e, t, s, r, o, l, i, h) {
|
|
1051
|
+
const d = C(e, i);
|
|
1052
|
+
if (!d) return p;
|
|
1053
|
+
const c = e.records[i], m = se(e.records, i), f = W(this.data.games, i), u = l[e.teamsById[i]?.conferenceId], b = () => {
|
|
1054
|
+
location.href = g(e.hrefs.school, { id: d.id });
|
|
1052
1055
|
};
|
|
1053
|
-
return
|
|
1054
|
-
<tr class="rowlink" @click=${(
|
|
1055
|
-
|
|
1056
|
+
return n`
|
|
1057
|
+
<tr class="rowlink" @click=${(x) => {
|
|
1058
|
+
x.target.closest("a") || b();
|
|
1056
1059
|
}}>
|
|
1057
1060
|
<td class="num" style="font-weight:700">${h}</td>
|
|
1058
|
-
<td>${this.movement(t, s,
|
|
1059
|
-
<td class="teamcell">${
|
|
1060
|
-
<span class="mut" style="font-size:0.78rem">${
|
|
1061
|
-
<td class="num">${
|
|
1062
|
-
<td class="mut">${
|
|
1063
|
-
<td>${m ?
|
|
1061
|
+
<td>${this.movement(t, s, i)}</td>
|
|
1062
|
+
<td class="teamcell">${D(d)}<a href=${g(e.hrefs.school, { id: d.id })}>${d.name}</a>
|
|
1063
|
+
<span class="mut" style="font-size:0.78rem">${d.mascot || ""}</span></td>
|
|
1064
|
+
<td class="num">${k(c)}</td>
|
|
1065
|
+
<td class="mut">${u?.name || "Independent"}</td>
|
|
1066
|
+
<td>${m ? n`<a class="box" style="text-decoration:none" href=${g(e.hrefs.game, { sport: this.sport, id: m.gameId })}>
|
|
1064
1067
|
<b style="color:${m.mark === "W" ? "var(--hsot-win)" : m.mark === "L" ? "var(--hsot-loss)" : "var(--hsot-tie)"}">${m.mark}</b>
|
|
1065
|
-
${m.my}-${m.their} vs ${
|
|
1066
|
-
<td>${
|
|
1067
|
-
<td>${this.sparkline(
|
|
1068
|
+
${m.my}-${m.their} vs ${N(e, m.opp)}</a>` : n`<span class="mut">·</span>`}</td>
|
|
1069
|
+
<td>${ce(e, f, i)}</td>
|
|
1070
|
+
<td>${this.sparkline(i, r, o)}</td>
|
|
1068
1071
|
</tr>
|
|
1069
1072
|
`;
|
|
1070
1073
|
}
|
|
1071
1074
|
}
|
|
1072
|
-
globalThis?.customElements && !globalThis.customElements.get("hsot-rankings") && globalThis.customElements.define("hsot-rankings",
|
|
1073
|
-
const
|
|
1075
|
+
globalThis?.customElements && !globalThis.customElements.get("hsot-rankings") && globalThis.customElements.define("hsot-rankings", Me);
|
|
1076
|
+
const He = y`
|
|
1074
1077
|
.schoolhero { color: var(--hsot-white); padding: 1.6rem 1.25rem 1.3rem; }
|
|
1075
1078
|
.schoolhero .inner { max-width: 1366px; margin: 0 auto; display: flex; gap: 1.2rem; align-items: center; flex-wrap: wrap; }
|
|
1076
1079
|
.schoolhero .crest {
|
|
@@ -1124,10 +1127,10 @@ const Re = b`
|
|
|
1124
1127
|
table.data.roster .sub { display: block; font-weight: 400; font-size: 0.78rem; color: var(--hsot-gray-5); }
|
|
1125
1128
|
}
|
|
1126
1129
|
`;
|
|
1127
|
-
class
|
|
1128
|
-
static styles = [...
|
|
1130
|
+
class Oe extends w {
|
|
1131
|
+
static styles = [...z, He];
|
|
1129
1132
|
static properties = {
|
|
1130
|
-
|
|
1133
|
+
...w.properties,
|
|
1131
1134
|
schoolId: { type: String, attribute: "school-id" },
|
|
1132
1135
|
sport: { type: String },
|
|
1133
1136
|
season: { type: String },
|
|
@@ -1142,38 +1145,38 @@ class Ne extends $ {
|
|
|
1142
1145
|
e && !this.sport && (this.sport = e);
|
|
1143
1146
|
}
|
|
1144
1147
|
async fetchData(e) {
|
|
1145
|
-
const t = this.season ||
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
+
const t = this.season || M(), s = await e.getSchool(this.schoolId), o = (await e.listTeams({ schoolId: this.schoolId })).items, l = o.find((b) => b.sport === (this.sport || "football")) || o[0] || null, [i, h, d, c, m, f, u] = await Promise.all([
|
|
1149
|
+
l ? e.listGames({ sport: l.sport, season: t }) : Promise.resolve({ items: [] }),
|
|
1150
|
+
l ? e.listTeams({ sport: l.sport }) : Promise.resolve({ items: [] }),
|
|
1148
1151
|
e.listSchools(),
|
|
1149
1152
|
e.listConferences(),
|
|
1150
|
-
|
|
1151
|
-
|
|
1153
|
+
l ? e.listRankings({ sport: l.sport }) : Promise.resolve({ items: [] }),
|
|
1154
|
+
l ? e.listRosters({ teamId: l.id }) : Promise.resolve({ items: [] }),
|
|
1152
1155
|
// teamId is the public surface's one players filter (roster
|
|
1153
1156
|
// membership) — never fetch the whole collection.
|
|
1154
|
-
|
|
1157
|
+
l ? e.listPlayers({ teamId: l.id }) : Promise.resolve({ items: [] })
|
|
1155
1158
|
]);
|
|
1156
1159
|
return {
|
|
1157
1160
|
season: t,
|
|
1158
1161
|
school: s,
|
|
1159
|
-
teams:
|
|
1160
|
-
active:
|
|
1161
|
-
games:
|
|
1162
|
+
teams: o,
|
|
1163
|
+
active: l,
|
|
1164
|
+
games: i.items,
|
|
1162
1165
|
allTeams: h.items,
|
|
1163
|
-
schools:
|
|
1166
|
+
schools: d.items,
|
|
1164
1167
|
conferences: c.items,
|
|
1165
1168
|
rankings: m.items,
|
|
1166
|
-
roster: f.items.find((
|
|
1167
|
-
players:
|
|
1169
|
+
roster: f.items.find((b) => b.season === t) || null,
|
|
1170
|
+
players: u.items
|
|
1168
1171
|
};
|
|
1169
1172
|
}
|
|
1170
1173
|
get ctx() {
|
|
1171
1174
|
return (!this._ctx || this._ctxData !== this.data) && (this._ctx = {
|
|
1172
1175
|
teamsById: v(this.data.allTeams.length ? this.data.allTeams : this.data.teams),
|
|
1173
1176
|
schoolsById: v(this.data.schools),
|
|
1174
|
-
records:
|
|
1177
|
+
records: P(this.data.games),
|
|
1175
1178
|
rankings: this.data.rankings,
|
|
1176
|
-
hrefs:
|
|
1179
|
+
hrefs: F(this),
|
|
1177
1180
|
sport: this.data.active?.sport || "football"
|
|
1178
1181
|
}, this._ctxData = this.data), this._ctx;
|
|
1179
1182
|
}
|
|
@@ -1181,116 +1184,116 @@ class Ne extends $ {
|
|
|
1181
1184
|
this.sport = e, this.load();
|
|
1182
1185
|
}
|
|
1183
1186
|
renderView() {
|
|
1184
|
-
const { school: e, teams: t, active: s, season:
|
|
1185
|
-
if (!e) return
|
|
1186
|
-
const
|
|
1187
|
-
return
|
|
1188
|
-
<div class="schoolhero" style="background:linear-gradient(115deg, ${e.colorPrimary || "#030711"} 0%, ${e.colorPrimary || "#030711"} 55%, var(--hsot-black) 100%);color:${
|
|
1187
|
+
const { school: e, teams: t, active: s, season: r } = this.data;
|
|
1188
|
+
if (!e) return n`<div class="view"><p class="empty">School not found.</p></div>`;
|
|
1189
|
+
const o = this.ctx, l = _(e.colorPrimary || "#030711"), i = (e.adm || [])[0], h = v(this.data.conferences), d = s ? h[s.conferenceId] : null;
|
|
1190
|
+
return n`
|
|
1191
|
+
<div class="schoolhero" style="background:linear-gradient(115deg, ${e.colorPrimary || "#030711"} 0%, ${e.colorPrimary || "#030711"} 55%, var(--hsot-black) 100%);color:${l}">
|
|
1189
1192
|
<div class="inner">
|
|
1190
|
-
${
|
|
1193
|
+
${R(e, 84) ? n`<img class="crest logo" alt="" loading="lazy" src=${R(e, 84)} />` : n`<div class="crest" style="background:${e.colorSecondary || "#7C7C7C"};color:${_(e.colorSecondary || "#7C7C7C")}">${q(e)}</div>`}
|
|
1191
1194
|
<div style="min-width:260px">
|
|
1192
1195
|
<h1>${e.name} <span class="mascot">${e.mascot || ""}</span></h1>
|
|
1193
1196
|
<div class="facts">
|
|
1194
|
-
${e.location ?
|
|
1195
|
-
${e.association ?
|
|
1196
|
-
${
|
|
1197
|
-
${
|
|
1198
|
-
${e.openingYear ?
|
|
1199
|
-
${e.areaCode ?
|
|
1197
|
+
${e.location ? n`<span><b>Location</b>${e.location}${e.county ? n` · ${e.county} County` : p}</span>` : p}
|
|
1198
|
+
${e.association ? n`<span><b>League</b>${e.association}${e.classification ? n` · ${e.classification}` : p}</span>` : p}
|
|
1199
|
+
${d ? n`<span><b>Conference</b>${d.name}</span>` : p}
|
|
1200
|
+
${i ? n`<span><b>Enrollment</b>${i.value.toLocaleString()} (${i.season} ADM)</span>` : p}
|
|
1201
|
+
${e.openingYear ? n`<span><b>Opened</b>${e.openingYear}</span>` : p}
|
|
1202
|
+
${e.areaCode ? n`<span><b>Area</b>${e.areaCode}</span>` : p}
|
|
1200
1203
|
</div>
|
|
1201
1204
|
</div>
|
|
1202
1205
|
</div>
|
|
1203
1206
|
</div>
|
|
1204
1207
|
<div class="band">
|
|
1205
1208
|
<nav class="tabs" aria-label="Teams">
|
|
1206
|
-
${t.map((c) => c.id === s?.id ?
|
|
1209
|
+
${t.map((c) => c.id === s?.id ? n`<a class="on" href="#" @click=${(m) => m.preventDefault()}>${c.name}</a>` : n`<a href="#" @click=${(m) => {
|
|
1207
1210
|
m.preventDefault(), this.switchSport(c.sport);
|
|
1208
1211
|
}}>${c.name}</a>`)}
|
|
1209
1212
|
</nav>
|
|
1210
1213
|
</div>
|
|
1211
|
-
${B(this,
|
|
1212
|
-
${
|
|
1213
|
-
${s ? this.renderTeam(
|
|
1214
|
+
${B(this, n`
|
|
1215
|
+
${A(this)}
|
|
1216
|
+
${s ? this.renderTeam(o, s, d, r) : n`<p class="empty">No teams recorded for this school yet.</p>`}
|
|
1214
1217
|
`)}
|
|
1215
1218
|
`;
|
|
1216
1219
|
}
|
|
1217
|
-
renderTeam(e, t, s,
|
|
1218
|
-
const
|
|
1219
|
-
return
|
|
1220
|
+
renderTeam(e, t, s, r) {
|
|
1221
|
+
const o = e.records[t.id] || { w: 0, l: 0, t: 0, cw: 0, cl: 0, ct: 0, pf: 0, pa: 0, results: [] }, l = o.w + o.l + o.t, i = s ? this.data.allTeams.filter((m) => m.conferenceId === s.id) : [], h = s ? ne(i, e.records).findIndex((m) => m.team.id === t.id) + 1 : 0, d = V(e.rankings, e.teamsById, t.id, t.sport, null), c = this.data.games.filter((m) => m.homeTeamId === t.id || m.awayTeamId === t.id).sort((m, f) => String(m.date).localeCompare(String(f.date)));
|
|
1222
|
+
return n`
|
|
1220
1223
|
<div class="tiles">
|
|
1221
|
-
<div class="tile"><div class="k">Overall</div><div class="v">${
|
|
1222
|
-
<div class="tile"><div class="k">${s?.name || "Conference"}</div><div class="v">${
|
|
1223
|
-
<div class="s">${h ? `${
|
|
1224
|
-
<div class="tile"><div class="k">Points</div><div class="v">${
|
|
1225
|
-
<div class="s">scored per game · ${
|
|
1226
|
-
<div class="tile"><div class="k">Streak</div><div class="v">${
|
|
1224
|
+
<div class="tile"><div class="k">Overall</div><div class="v">${k(o)}</div><div class="s">${l} games played</div></div>
|
|
1225
|
+
<div class="tile"><div class="k">${s?.name || "Conference"}</div><div class="v">${k(o, !0)}</div>
|
|
1226
|
+
<div class="s">${h ? `${ye(h)} of ${i.length}` : "·"}</div></div>
|
|
1227
|
+
<div class="tile"><div class="k">Points</div><div class="v">${l ? (o.pf / l).toFixed(1) : "0.0"}</div>
|
|
1228
|
+
<div class="s">scored per game · ${l ? (o.pa / l).toFixed(1) : "0.0"} allowed</div></div>
|
|
1229
|
+
<div class="tile"><div class="k">Streak</div><div class="v">${H(o.results) || "·"}</div>
|
|
1227
1230
|
<div class="s">last 5: ${K(e, t.id)}</div></div>
|
|
1228
|
-
<div class="tile"><div class="k">HSOT Top 25</div><div class="v">${
|
|
1229
|
-
<div class="s"><a href=${
|
|
1231
|
+
<div class="tile"><div class="k">HSOT Top 25</div><div class="v">${d ? `#${d}` : "NR"}</div>
|
|
1232
|
+
<div class="s"><a href=${g(e.hrefs.section, { sport: t.sport, view: "rankings" })}>full poll</a></div></div>
|
|
1230
1233
|
</div>
|
|
1231
|
-
${(t.championships || []).length ?
|
|
1234
|
+
${(t.championships || []).length ? n`
|
|
1232
1235
|
<div style="margin:-0.2rem 0 1rem;display:flex;gap:0.4rem;flex-wrap:wrap">
|
|
1233
|
-
${t.championships.map((m) =>
|
|
1236
|
+
${t.championships.map((m) => n`<span class="pill champ">★ ${m.season} ${m.title} champion${m.classification ? ` · ${m.classification}` : ""}${m.region ? ` · ${m.region}` : ""}</span>`)}
|
|
1234
1237
|
</div>` : p}
|
|
1235
1238
|
<div class="cols">
|
|
1236
1239
|
<div>
|
|
1237
1240
|
<div class="section-title">Schedule & results</div>
|
|
1238
1241
|
<div class="card">
|
|
1239
|
-
${c.length ?
|
|
1242
|
+
${c.length ? n`<ul class="gamelist">${c.map((m) => this.renderGameRow(e, t, m))}</ul>` : n`<p class="empty">No ${t.sport} games recorded for ${r}.</p>`}
|
|
1240
1243
|
</div>
|
|
1241
1244
|
</div>
|
|
1242
1245
|
<div>
|
|
1243
|
-
<div class="section-title">Roster · ${
|
|
1244
|
-
<div class="card">${this.renderRoster(t,
|
|
1246
|
+
<div class="section-title">Roster · ${r}</div>
|
|
1247
|
+
<div class="card">${this.renderRoster(t, r)}</div>
|
|
1245
1248
|
</div>
|
|
1246
1249
|
</div>
|
|
1247
1250
|
`;
|
|
1248
1251
|
}
|
|
1249
1252
|
renderGameRow(e, t, s) {
|
|
1250
|
-
const
|
|
1251
|
-
let h =
|
|
1253
|
+
const r = s.homeTeamId === t.id, o = r ? s.awayTeamId : s.homeTeamId, l = r ? s.homeScore : s.awayScore, i = r ? s.awayScore : s.homeScore;
|
|
1254
|
+
let h = n`<span class="mut">${U(s.time)}</span>`;
|
|
1252
1255
|
if (s.state === "final") {
|
|
1253
|
-
const c = G(s), m = c === "tie" ? "T" : c === (
|
|
1254
|
-
h =
|
|
1255
|
-
} else s.state === "live" && (h =
|
|
1256
|
-
const
|
|
1257
|
-
return
|
|
1256
|
+
const c = G(s), m = c === "tie" ? "T" : c === (r ? "home" : "away") ? "W" : "L";
|
|
1257
|
+
h = n`<span class=${m}>${m}</span> ${l}-${i}${s.finish === "overtime" ? n` <span class="mut">OT</span>` : p}${s.forfeit && s.forfeit !== "none" ? n` <span class="mut">FF</span>` : p}`;
|
|
1258
|
+
} else s.state === "live" && (h = n`<span style="color:var(--hsot-red)">${l}-${i}</span>`);
|
|
1259
|
+
const d = s.gameType === "conference" ? "Conf" : s.gameType === "nonconference" ? "Non-conf" : s.gameType === "playoff" ? `Playoff${s.label ? ` · ${s.label}` : ""}` : "Scrimmage";
|
|
1260
|
+
return n`
|
|
1258
1261
|
<li>
|
|
1259
|
-
<span class="d">${
|
|
1260
|
-
${
|
|
1262
|
+
<span class="d">${$(s.date)}</span>
|
|
1263
|
+
${re(s).kind === "sched" ? p : L(s)}
|
|
1261
1264
|
<span class="res">${h}</span>
|
|
1262
|
-
<span class="opp">${
|
|
1263
|
-
<span class="pill type">${
|
|
1264
|
-
${s.broadcast ?
|
|
1265
|
+
<span class="opp">${r ? "vs" : "at"} ${le(e, o, s.date)}
|
|
1266
|
+
<span class="pill type">${d}</span>
|
|
1267
|
+
${s.broadcast ? n`<span class="pill class">${s.broadcast}</span>` : p}
|
|
1265
1268
|
</span>
|
|
1266
1269
|
<span class="where">${s.venue || ""}</span>
|
|
1267
|
-
<a class="box" href=${
|
|
1270
|
+
<a class="box" href=${g(e.hrefs.game, { sport: t.sport, id: s.id })}>Box score →</a>
|
|
1268
1271
|
</li>
|
|
1269
1272
|
`;
|
|
1270
1273
|
}
|
|
1271
1274
|
renderRoster(e, t) {
|
|
1272
1275
|
const s = this.data.roster;
|
|
1273
1276
|
if (!s)
|
|
1274
|
-
return
|
|
1275
|
-
const
|
|
1276
|
-
return
|
|
1277
|
-
${
|
|
1278
|
-
alt="${
|
|
1277
|
+
return n`<p class="empty">Roster not published for ${t}.</p>`;
|
|
1278
|
+
const r = _e(s, 560), o = this.data.school?.name || "", l = v(this.data.players), i = s.entries.slice().sort((d, c) => (d.number || 0) - (c.number || 0)), h = i.some((d) => l[d.playerId]?.college);
|
|
1279
|
+
return n`
|
|
1280
|
+
${r ? n`<img class="rosterphoto" src=${r} loading="lazy" decoding="async"
|
|
1281
|
+
alt="${o} ${e.name} ${t} team photo" />` : p}
|
|
1279
1282
|
<div class="tablewrap"><table class="data roster">
|
|
1280
|
-
<thead><tr><th class="num">No.</th><th>Player</th><th class="pos">Pos</th><th class="cls">Class</th><th class="num">Ht</th><th class="num">Wt</th>${h ?
|
|
1283
|
+
<thead><tr><th class="num">No.</th><th>Player</th><th class="pos">Pos</th><th class="cls">Class</th><th class="num">Ht</th><th class="num">Wt</th>${h ? n`<th>College</th>` : p}</tr></thead>
|
|
1281
1284
|
<tbody>
|
|
1282
|
-
${
|
|
1283
|
-
const c = d
|
|
1285
|
+
${i.map((d) => {
|
|
1286
|
+
const c = l[d.playerId];
|
|
1284
1287
|
if (!c) return p;
|
|
1285
|
-
const m =
|
|
1286
|
-
return
|
|
1287
|
-
<td class="num mut">${
|
|
1288
|
+
const m = ve(d), f = [m, c.classOf].filter(Boolean).join(" · ") || "·";
|
|
1289
|
+
return n`<tr>
|
|
1290
|
+
<td class="num mut">${d.number ?? "·"}</td>
|
|
1288
1291
|
<td class="player" style="font-weight:500">${c.firstName} ${c.lastName}<span class="sub">${f}</span></td>
|
|
1289
1292
|
<td class="pos">${m || "·"}</td>
|
|
1290
1293
|
<td class="cls mut">${c.classOf || "·"}</td>
|
|
1291
|
-
<td class="num">${
|
|
1294
|
+
<td class="num">${ge(c.heightIn)}</td>
|
|
1292
1295
|
<td class="num">${c.weightLb || "·"}</td>
|
|
1293
|
-
${h ?
|
|
1296
|
+
${h ? n`<td class="college">${c.college || "·"}</td>` : p}
|
|
1294
1297
|
</tr>`;
|
|
1295
1298
|
})}
|
|
1296
1299
|
</tbody>
|
|
@@ -1298,16 +1301,69 @@ class Ne extends $ {
|
|
|
1298
1301
|
`;
|
|
1299
1302
|
}
|
|
1300
1303
|
}
|
|
1301
|
-
globalThis?.customElements && !globalThis.customElements.get("hsot-school") && globalThis.customElements.define("hsot-school",
|
|
1302
|
-
const
|
|
1303
|
-
|
|
1304
|
+
globalThis?.customElements && !globalThis.customElements.get("hsot-school") && globalThis.customElements.define("hsot-school", Oe);
|
|
1305
|
+
const de = {
|
|
1306
|
+
football: ["quarters", 4],
|
|
1307
|
+
flag_football: ["quarters", 4],
|
|
1308
|
+
basketball: ["quarters", 4],
|
|
1309
|
+
lacrosse: ["quarters", 4],
|
|
1310
|
+
field_hockey: ["quarters", 4],
|
|
1311
|
+
soccer: ["halves", 2],
|
|
1312
|
+
baseball: ["innings", 7],
|
|
1313
|
+
softball: ["innings", 7],
|
|
1314
|
+
volleyball: ["sets", 3]
|
|
1315
|
+
};
|
|
1316
|
+
function he(a) {
|
|
1317
|
+
return (de[a] || ["quarters", 4])[0];
|
|
1318
|
+
}
|
|
1319
|
+
function X(a) {
|
|
1320
|
+
return (de[a] || ["quarters", 4])[1];
|
|
1321
|
+
}
|
|
1322
|
+
function Ue(a, e) {
|
|
1323
|
+
const t = he(a), s = X(a);
|
|
1324
|
+
if (e <= s || t === "innings" || t === "sets") return String(e);
|
|
1325
|
+
const r = e - s;
|
|
1326
|
+
return `OT${r > 1 ? r : ""}`;
|
|
1327
|
+
}
|
|
1328
|
+
function je(a, e) {
|
|
1329
|
+
const t = String(a ?? "").trim();
|
|
1330
|
+
let s;
|
|
1331
|
+
return (s = /^(\d+)Q$/i.exec(t)) || (s = /^(\d+)H$/i.exec(t)) ? Number(s[1]) : /^half$/i.test(t) ? he(e) === "halves" ? 1 : 2 : (s = /^(\d*)OT(\d*)$/i.exec(t)) ? X(e) + Number(s[1] || s[2] || 1) : (s = /^[TB](\d+)$/i.exec(t)) || (s = /^(\d+)(?:st|nd|rd|th)\s*set$/i.exec(t)) || (s = /^set\s*(\d+)$/i.exec(t)) ? Number(s[1]) : null;
|
|
1332
|
+
}
|
|
1333
|
+
const E = (a) => Number.isInteger(a) && a >= 0 ? a : null;
|
|
1334
|
+
function qe(a) {
|
|
1335
|
+
const e = Array.isArray(a?.scoringPlays) ? a.scoringPlays : [];
|
|
1336
|
+
if (!e.length) return null;
|
|
1337
|
+
const t = a.sport, s = /* @__PURE__ */ new Map();
|
|
1338
|
+
for (const m of e) {
|
|
1339
|
+
const f = je(m?.period, t), u = E(m?.homeScore), b = E(m?.awayScore);
|
|
1340
|
+
if (!f || u === null || b === null) return null;
|
|
1341
|
+
const x = s.get(f) || { home: 0, away: 0 };
|
|
1342
|
+
x.home = Math.max(x.home, u), x.away = Math.max(x.away, b), s.set(f, x);
|
|
1343
|
+
}
|
|
1344
|
+
const r = Math.max(...s.keys()), o = [];
|
|
1345
|
+
let l = !0, i = { home: 0, away: 0 };
|
|
1346
|
+
for (let m = 1; m <= r; m += 1) {
|
|
1347
|
+
const f = s.get(m) || i, u = f.home - i.home, b = f.away - i.away;
|
|
1348
|
+
(u < 0 || b < 0) && (l = !1), o.push({ period: m, home: Math.max(u, 0), away: Math.max(b, 0) }), i = { home: Math.max(f.home, i.home), away: Math.max(f.away, i.away) };
|
|
1349
|
+
}
|
|
1350
|
+
const h = E(a.homeScore) ?? 0, d = E(a.awayScore) ?? 0, c = l && i.home === h && i.away === d;
|
|
1351
|
+
return l = l && i.home <= h && i.away <= d, { periods: o, reconciled: c, consistent: l };
|
|
1352
|
+
}
|
|
1353
|
+
function Ge(a) {
|
|
1354
|
+
if (Array.isArray(a?.periodScores) && a.periodScores.length) return a.periodScores;
|
|
1355
|
+
const e = qe(a);
|
|
1356
|
+
return e ? a.state === "final" ? e.reconciled ? e.periods : null : e.consistent ? e.periods : null : null;
|
|
1357
|
+
}
|
|
1358
|
+
const We = "https://api.wral.com/search";
|
|
1359
|
+
function Ve(a) {
|
|
1304
1360
|
return a.map((e) => `uri:"${e}"`).join(" OR ");
|
|
1305
1361
|
}
|
|
1306
|
-
function
|
|
1307
|
-
const t = String(a ||
|
|
1362
|
+
function Ye(a, e) {
|
|
1363
|
+
const t = String(a || We).replace(/\/+$/, ""), s = new URLSearchParams({ query: Ve(e), sort: "score", lang: "en" });
|
|
1308
1364
|
return `${t}/v1/query?${s}`;
|
|
1309
1365
|
}
|
|
1310
|
-
function
|
|
1366
|
+
function me(a) {
|
|
1311
1367
|
try {
|
|
1312
1368
|
const e = new URL(a);
|
|
1313
1369
|
if (/(^|\.)smugmug\.com$/i.test(e.hostname)) {
|
|
@@ -1322,13 +1378,13 @@ function le(a) {
|
|
|
1322
1378
|
}
|
|
1323
1379
|
return { uri: a, title: a };
|
|
1324
1380
|
}
|
|
1325
|
-
async function
|
|
1326
|
-
const
|
|
1327
|
-
if (!
|
|
1328
|
-
const
|
|
1329
|
-
return e.map((
|
|
1381
|
+
async function Qe(a, e, t) {
|
|
1382
|
+
const r = await ((...i) => fetch(...i))(Ye(a, e));
|
|
1383
|
+
if (!r.ok) throw new Error(`search answered ${r.status}`);
|
|
1384
|
+
const o = await r.json(), l = new Map((o.items || []).map((i) => [i.uri, i]));
|
|
1385
|
+
return e.map((i) => l.get(i) || me(i));
|
|
1330
1386
|
}
|
|
1331
|
-
const
|
|
1387
|
+
const Ke = y`
|
|
1332
1388
|
.breadcrumbs { font-size: 0.8125rem; margin: 0.9rem 0 0; color: var(--hsot-gray-5); }
|
|
1333
1389
|
.breadcrumbs a { text-decoration: none; }
|
|
1334
1390
|
.scorehead { display: grid; grid-template-columns: 1fr auto 1fr; gap: 1rem; align-items: center; padding: 1.4rem 1rem; }
|
|
@@ -1357,6 +1413,20 @@ const Me = b`
|
|
|
1357
1413
|
.covtitle { font-family: var(--hsot-heading-font); font-weight: 700; font-size: 1.05rem; line-height: 1.25; overflow-wrap: anywhere; }
|
|
1358
1414
|
.covdesc { margin: 0.35rem 0 0; font-size: 0.85rem; color: var(--hsot-gray-5); line-height: 1.4; }
|
|
1359
1415
|
.covmeta { margin-top: 0.45rem; font-size: 0.78rem; color: var(--hsot-gray-5); }
|
|
1416
|
+
/* Scoring plays: a compact log under the line score. The play cell is the
|
|
1417
|
+
one table.data cell allowed to wrap — a 60-yard touchdown description
|
|
1418
|
+
must fit a phone. */
|
|
1419
|
+
.plays { border-top: 1px solid var(--hsot-gray-2); padding: 0.7rem 1rem 0.9rem; }
|
|
1420
|
+
.plays-title {
|
|
1421
|
+
font-family: var(--hsot-heading-font); font-weight: 700; font-size: 0.9rem;
|
|
1422
|
+
text-transform: uppercase; letter-spacing: 0.03em; color: var(--hsot-gray-6);
|
|
1423
|
+
text-align: center; margin: 0 0 0.4rem;
|
|
1424
|
+
}
|
|
1425
|
+
table.plays-table { max-width: 720px; margin: 0 auto; }
|
|
1426
|
+
table.plays-table td.when { color: var(--hsot-gray-5); font-variant-numeric: tabular-nums; }
|
|
1427
|
+
table.plays-table td.play { white-space: normal; min-width: 12rem; }
|
|
1428
|
+
/* Game notes are typed with line breaks the desk means to keep. */
|
|
1429
|
+
.gamenote { padding: 0 1rem 0.9rem; text-align: center; white-space: pre-line; }
|
|
1360
1430
|
.cols { display: grid; grid-template-columns: 1fr 1fr; gap: 1.25rem; }
|
|
1361
1431
|
.ctxcard { padding: 0.85rem 1rem; }
|
|
1362
1432
|
.ctxcard .who { font-family: var(--hsot-heading-font); font-weight: 700; margin-bottom: 0.4rem; }
|
|
@@ -1367,10 +1437,10 @@ const Me = b`
|
|
|
1367
1437
|
.cols { grid-template-columns: 1fr; }
|
|
1368
1438
|
}
|
|
1369
1439
|
`;
|
|
1370
|
-
class
|
|
1371
|
-
static styles = [...
|
|
1440
|
+
class Xe extends w {
|
|
1441
|
+
static styles = [...z, Ke];
|
|
1372
1442
|
static properties = {
|
|
1373
|
-
|
|
1443
|
+
...w.properties,
|
|
1374
1444
|
gameId: { type: String, attribute: "game-id" },
|
|
1375
1445
|
// The public site search that resolves Game.coverageUrls into cards
|
|
1376
1446
|
// (DEV-1236). Shared cross-stage by design — see the studio host's
|
|
@@ -1382,7 +1452,7 @@ class je extends $ {
|
|
|
1382
1452
|
super(), this.gameId = "", this.searchApi = "";
|
|
1383
1453
|
}
|
|
1384
1454
|
async fetchData(e) {
|
|
1385
|
-
const t = await e.getGame(this.gameId), s = Array.isArray(t.coverageUrls) ? t.coverageUrls : [], [
|
|
1455
|
+
const t = await e.getGame(this.gameId), s = Array.isArray(t.coverageUrls) ? t.coverageUrls : [], [r, o, l, i, h, d] = await Promise.all([
|
|
1386
1456
|
e.listSchools(),
|
|
1387
1457
|
e.listTeams({ sport: t.sport }),
|
|
1388
1458
|
e.listConferences(),
|
|
@@ -1390,73 +1460,74 @@ class je extends $ {
|
|
|
1390
1460
|
e.listGames({ sport: t.sport, season: t.season }),
|
|
1391
1461
|
// A search outage must not blank the box score — degrade to bare
|
|
1392
1462
|
// links (fetchCoverage already degrades per-URL index misses).
|
|
1393
|
-
s.length ?
|
|
1463
|
+
s.length ? Qe(this.searchApi, s).catch(() => s.map(me)) : Promise.resolve([])
|
|
1394
1464
|
]);
|
|
1395
1465
|
return {
|
|
1396
1466
|
game: t,
|
|
1397
|
-
schools:
|
|
1398
|
-
teams:
|
|
1399
|
-
conferences:
|
|
1400
|
-
rankings:
|
|
1467
|
+
schools: r.items,
|
|
1468
|
+
teams: o.items,
|
|
1469
|
+
conferences: l.items,
|
|
1470
|
+
rankings: i.items,
|
|
1401
1471
|
games: h.items,
|
|
1402
|
-
coverage:
|
|
1472
|
+
coverage: d
|
|
1403
1473
|
};
|
|
1404
1474
|
}
|
|
1405
1475
|
get ctx() {
|
|
1406
1476
|
return (!this._ctx || this._ctxData !== this.data) && (this._ctx = {
|
|
1407
1477
|
teamsById: v(this.data.teams),
|
|
1408
1478
|
schoolsById: v(this.data.schools),
|
|
1409
|
-
records:
|
|
1479
|
+
records: P(this.data.games),
|
|
1410
1480
|
rankings: this.data.rankings,
|
|
1411
|
-
hrefs:
|
|
1481
|
+
hrefs: F(this),
|
|
1412
1482
|
sport: this.data.game.sport
|
|
1413
1483
|
}, this._ctxData = this.data), this._ctx;
|
|
1414
1484
|
}
|
|
1415
1485
|
renderView() {
|
|
1416
1486
|
const e = this.data.game;
|
|
1417
|
-
if (!e) return
|
|
1418
|
-
const t = this.ctx, s = v(this.data.conferences),
|
|
1419
|
-
return
|
|
1420
|
-
${B(this,
|
|
1421
|
-
${
|
|
1487
|
+
if (!e) return n`<div class="view"><p class="empty">Game not found.</p></div>`;
|
|
1488
|
+
const t = this.ctx, s = v(this.data.conferences), r = t.teamsById[e.awayTeamId] ? t.schoolsById[t.teamsById[e.awayTeamId].schoolId] : null, o = t.teamsById[e.homeTeamId] ? t.schoolsById[t.teamsById[e.homeTeamId].schoolId] : null, l = G(e), i = (c) => e.state === "final" && l !== c && l !== "tie" ? "opacity:0.45" : "", h = e.conferenceId ? s[e.conferenceId] : null, d = this.data.games.filter((c) => c.id !== e.id && c.state === "final" && c.gameType !== "scrimmage" && (c.homeTeamId === e.homeTeamId && c.awayTeamId === e.awayTeamId || c.homeTeamId === e.awayTeamId && c.awayTeamId === e.homeTeamId));
|
|
1489
|
+
return n`
|
|
1490
|
+
${B(this, n`
|
|
1491
|
+
${A(this)}
|
|
1422
1492
|
<p class="breadcrumbs">
|
|
1423
|
-
<a href=${
|
|
1424
|
-
<a href=${
|
|
1493
|
+
<a href=${g(t.hrefs.section, { sport: e.sport, view: "scores" })}>${I(e.sport)}</a> /
|
|
1494
|
+
<a href=${g(t.hrefs.section, { sport: e.sport, view: "scores" })}>Scores/Schedules</a> /
|
|
1425
1495
|
${T(t, e.awayTeamId)} at ${T(t, e.homeTeamId)}
|
|
1426
1496
|
</p>
|
|
1427
1497
|
<div class="card">
|
|
1428
1498
|
<div class="scorehead">
|
|
1429
|
-
${this.teamBlock(t, e, e.awayTeamId,
|
|
1499
|
+
${this.teamBlock(t, e, e.awayTeamId, r, !1)}
|
|
1430
1500
|
<div class="mid">
|
|
1431
1501
|
<div class="bigscore">
|
|
1432
|
-
<span style=${
|
|
1502
|
+
<span style=${i("away")}>${e.awayScore}</span>
|
|
1433
1503
|
<span class="mut" style="font-size:1.6rem">–</span>
|
|
1434
|
-
<span style=${
|
|
1504
|
+
<span style=${i("home")}>${e.homeScore}</span>
|
|
1435
1505
|
</div>
|
|
1436
|
-
<div class="status">${
|
|
1437
|
-
<div class="status">${
|
|
1438
|
-
${e.broadcast ?
|
|
1506
|
+
<div class="status">${L(e)}</div>
|
|
1507
|
+
<div class="status">${$(e.date, { weekday: "short", month: "short", day: "numeric", year: "numeric" })}${e.state === "scheduled" && e.time ? n` · ${U(e.time)}` : p} · ${e.venue || "Venue TBD"}
|
|
1508
|
+
${e.broadcast ? n` · <span class="pill class">${e.broadcast}</span>` : p}</div>
|
|
1439
1509
|
<div class="status">
|
|
1440
1510
|
<span class="pill type">${e.gameType === "conference" ? `${h?.name || "Conference"} game` : e.gameType}</span>
|
|
1441
|
-
${e.label ?
|
|
1442
|
-
${(e.tags || []).map((c) =>
|
|
1511
|
+
${e.label ? n`<span class="pill type">Bracket ${e.label}</span>` : p}
|
|
1512
|
+
${(e.tags || []).map((c) => n`<span class="pill type">${c}</span>`)}
|
|
1443
1513
|
</div>
|
|
1444
1514
|
</div>
|
|
1445
|
-
${this.teamBlock(t, e, e.homeTeamId,
|
|
1515
|
+
${this.teamBlock(t, e, e.homeTeamId, o, !0)}
|
|
1446
1516
|
</div>
|
|
1447
|
-
${this.renderLineScore(e,
|
|
1448
|
-
${
|
|
1517
|
+
${this.renderLineScore(e, r, o)}
|
|
1518
|
+
${this.renderScoringPlays(e, r, o)}
|
|
1519
|
+
${e.notes ? n`<p class="note gamenote">${e.notes}</p>` : p}
|
|
1449
1520
|
</div>
|
|
1450
|
-
${(this.data.coverage || []).length ?
|
|
1521
|
+
${(this.data.coverage || []).length ? n`
|
|
1451
1522
|
<div class="section-title">Coverage</div>
|
|
1452
1523
|
<div class="covgrid">
|
|
1453
|
-
${this.data.coverage.map((c) =>
|
|
1524
|
+
${this.data.coverage.map((c) => n`
|
|
1454
1525
|
<a class="card covcard" href=${c.uri}>
|
|
1455
|
-
${c.image ?
|
|
1526
|
+
${c.image ? n`<img class="covimg" src=${c.image} alt="" loading="lazy" />` : p}
|
|
1456
1527
|
<div class="covbody">
|
|
1457
|
-
<div class="covtitle">${c.videoDuration ?
|
|
1458
|
-
${c.description ?
|
|
1459
|
-
${c.author || c.publishedTime ?
|
|
1528
|
+
<div class="covtitle">${c.videoDuration ? n`<span class="pill live" style="animation:none">Video</span> ` : p}${c.photos ? n`<span class="pill live" style="animation:none">Photos</span> ` : p}${c.title || c.uri}</div>
|
|
1529
|
+
${c.description ? n`<p class="covdesc">${c.description}</p>` : p}
|
|
1530
|
+
${c.author || c.publishedTime ? n`
|
|
1460
1531
|
<div class="covmeta">${[c.author, c.publishedTime ? new Date(c.publishedTime).toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" }) : ""].filter(Boolean).join(" · ")}</div>
|
|
1461
1532
|
` : p}
|
|
1462
1533
|
</div>
|
|
@@ -1465,50 +1536,50 @@ class je extends $ {
|
|
|
1465
1536
|
</div>` : p}
|
|
1466
1537
|
<div class="section-title">Season context</div>
|
|
1467
1538
|
<div class="cols">
|
|
1468
|
-
${[[e.awayTeamId,
|
|
1539
|
+
${[[e.awayTeamId, r], [e.homeTeamId, o]].map(([c, m]) => this.renderContext(t, c, m))}
|
|
1469
1540
|
</div>
|
|
1470
|
-
${
|
|
1541
|
+
${d.length ? n`
|
|
1471
1542
|
<div class="section-title">Head to head this season</div>
|
|
1472
1543
|
<div class="card"><ul class="gamelist">
|
|
1473
|
-
${
|
|
1474
|
-
<span class="d">${
|
|
1544
|
+
${d.map((c) => n`<li>
|
|
1545
|
+
<span class="d">${$(c.date)}</span>${L(c)}
|
|
1475
1546
|
<span class="opp">${T(t, c.awayTeamId)} ${c.awayScore}, ${T(t, c.homeTeamId)} ${c.homeScore}</span>
|
|
1476
|
-
<a class="box" href=${
|
|
1547
|
+
<a class="box" href=${g(t.hrefs.game, { sport: e.sport, id: c.id })}>Box score →</a>
|
|
1477
1548
|
</li>`)}
|
|
1478
1549
|
</ul></div>` : p}
|
|
1479
1550
|
`)}
|
|
1480
1551
|
`;
|
|
1481
1552
|
}
|
|
1482
|
-
teamBlock(e, t, s,
|
|
1483
|
-
if (!
|
|
1484
|
-
const
|
|
1485
|
-
return
|
|
1486
|
-
<div class="teamblock ${
|
|
1487
|
-
${h ?
|
|
1553
|
+
teamBlock(e, t, s, r, o) {
|
|
1554
|
+
if (!r) return n`<div class="teamblock ${o ? "right" : ""}"><div class="tname">TBD</div></div>`;
|
|
1555
|
+
const l = e.teamsById[s], i = e.records[s], h = R(r, 58);
|
|
1556
|
+
return n`
|
|
1557
|
+
<div class="teamblock ${o ? "right" : ""}">
|
|
1558
|
+
${h ? n`<img class="crest logo" alt="" loading="lazy" src=${h} />` : n`<span class="crest" style="background:${r.colorPrimary || "#030711"};color:${_(r.colorPrimary || "#030711")}">${q(r)}</span>`}
|
|
1488
1559
|
<div>
|
|
1489
|
-
<div class="tname">${
|
|
1490
|
-
<div class="trec">${
|
|
1560
|
+
<div class="tname">${Q(e, s, t.date)}<a href=${g(e.hrefs.school, { id: r.id })}>${r.name}</a></div>
|
|
1561
|
+
<div class="trec">${r.mascot || ""} · ${k(i)}${l?.conferenceId ? n` · ${k(i, !0)} conf` : p}</div>
|
|
1491
1562
|
</div>
|
|
1492
1563
|
</div>
|
|
1493
1564
|
`;
|
|
1494
1565
|
}
|
|
1495
1566
|
renderLineScore(e, t, s) {
|
|
1496
|
-
const
|
|
1497
|
-
if (!
|
|
1498
|
-
return
|
|
1499
|
-
const
|
|
1500
|
-
const m =
|
|
1501
|
-
return m ? m[
|
|
1502
|
-
}, h = (
|
|
1567
|
+
const r = Ge(e);
|
|
1568
|
+
if (!r)
|
|
1569
|
+
return e.state === "scheduled" ? n`<p class="empty" style="text-align:center">Period scoring will appear once the game starts.</p>` : p;
|
|
1570
|
+
const o = Math.max(X(e.sport), ...r.map((d) => d.period)), l = (d) => Ue(e.sport, d), i = (d, c) => {
|
|
1571
|
+
const m = r.find((f) => f.period === c);
|
|
1572
|
+
return m ? m[d] : e.state === "final" ? 0 : "·";
|
|
1573
|
+
}, h = (d, c, m) => n`
|
|
1503
1574
|
<tr>
|
|
1504
|
-
<td class="teamcell">${
|
|
1505
|
-
${Array.from({ length:
|
|
1575
|
+
<td class="teamcell">${D(d, 20)}${d?.abbr || "TBD"}</td>
|
|
1576
|
+
${Array.from({ length: o }, (f, u) => n`<td class="num">${i(c, u + 1)}</td>`)}
|
|
1506
1577
|
<td class="num" style="font-weight:700">${m}</td>
|
|
1507
1578
|
</tr>`;
|
|
1508
|
-
return
|
|
1579
|
+
return n`
|
|
1509
1580
|
<div class="tablewrap" style="border-top:1px solid var(--hsot-gray-2)">
|
|
1510
1581
|
<table class="data" style="max-width:560px;margin:0.6rem auto 0.9rem">
|
|
1511
|
-
<thead><tr><th>Team</th>${Array.from({ length:
|
|
1582
|
+
<thead><tr><th>Team</th>${Array.from({ length: o }, (d, c) => n`<th class="num">${l(c + 1)}</th>`)}<th class="num">T</th></tr></thead>
|
|
1512
1583
|
<tbody>
|
|
1513
1584
|
${h(t, "away", e.awayScore)}
|
|
1514
1585
|
${h(s, "home", e.homeScore)}
|
|
@@ -1517,26 +1588,52 @@ class je extends $ {
|
|
|
1517
1588
|
</div>
|
|
1518
1589
|
`;
|
|
1519
1590
|
}
|
|
1591
|
+
renderScoringPlays(e, t, s) {
|
|
1592
|
+
const r = Array.isArray(e.scoringPlays) ? e.scoringPlays : [];
|
|
1593
|
+
if (!r.length) return p;
|
|
1594
|
+
const o = (l) => [l.period, l.clock].filter(Boolean).join(" ");
|
|
1595
|
+
return n`
|
|
1596
|
+
<div class="plays">
|
|
1597
|
+
<div class="plays-title">Scoring plays</div>
|
|
1598
|
+
<div class="tablewrap">
|
|
1599
|
+
<table class="data plays-table">
|
|
1600
|
+
<thead><tr>
|
|
1601
|
+
<th>When</th><th>Play</th>
|
|
1602
|
+
<th class="num">${t?.abbr || "Away"}</th><th class="num">${s?.abbr || "Home"}</th>
|
|
1603
|
+
</tr></thead>
|
|
1604
|
+
<tbody>
|
|
1605
|
+
${r.map((l) => n`<tr>
|
|
1606
|
+
<td class="when">${o(l) || "·"}</td>
|
|
1607
|
+
<td class="play">${l.description || "·"}</td>
|
|
1608
|
+
<td class="num">${l.awayScore}</td>
|
|
1609
|
+
<td class="num">${l.homeScore}</td>
|
|
1610
|
+
</tr>`)}
|
|
1611
|
+
</tbody>
|
|
1612
|
+
</table>
|
|
1613
|
+
</div>
|
|
1614
|
+
</div>
|
|
1615
|
+
`;
|
|
1616
|
+
}
|
|
1520
1617
|
renderContext(e, t, s) {
|
|
1521
1618
|
if (!s) return p;
|
|
1522
|
-
const
|
|
1523
|
-
return
|
|
1619
|
+
const r = e.records[t], o = W(this.data.games, t);
|
|
1620
|
+
return n`
|
|
1524
1621
|
<div class="card ctxcard">
|
|
1525
|
-
<div class="who">${
|
|
1622
|
+
<div class="who">${D(s)}${s.name}</div>
|
|
1526
1623
|
<div class="row">
|
|
1527
1624
|
<span>Last 5: ${K(e, t)}</span>
|
|
1528
|
-
<span>Streak: <b>${
|
|
1529
|
-
<span>PF/PA: <b>${
|
|
1530
|
-
<span>Next: ${
|
|
1531
|
-
${
|
|
1625
|
+
<span>Streak: <b>${r ? H(r.results) : "·"}</b></span>
|
|
1626
|
+
<span>PF/PA: <b>${r ? `${r.pf} / ${r.pa}` : "·"}</b></span>
|
|
1627
|
+
<span>Next: ${o ? n`${$(o.date, { month: "numeric", day: "numeric" })}
|
|
1628
|
+
${o.homeTeamId === t ? "vs" : "at"} ${N(e, o.homeTeamId === t ? o.awayTeamId : o.homeTeamId)}` : "·"}</span>
|
|
1532
1629
|
</div>
|
|
1533
1630
|
</div>
|
|
1534
1631
|
`;
|
|
1535
1632
|
}
|
|
1536
1633
|
}
|
|
1537
|
-
globalThis?.customElements && !globalThis.customElements.get("hsot-boxscore") && globalThis.customElements.define("hsot-boxscore",
|
|
1538
|
-
const
|
|
1539
|
-
class
|
|
1634
|
+
globalThis?.customElements && !globalThis.customElements.get("hsot-boxscore") && globalThis.customElements.define("hsot-boxscore", Xe);
|
|
1635
|
+
const Ze = 250, Je = 2;
|
|
1636
|
+
class et extends ae {
|
|
1540
1637
|
static properties = {
|
|
1541
1638
|
api: { type: String },
|
|
1542
1639
|
schoolHref: { type: String, attribute: "school-href" },
|
|
@@ -1547,7 +1644,7 @@ class We extends te {
|
|
|
1547
1644
|
activeIndex: { state: !0 },
|
|
1548
1645
|
searched: { state: !0 }
|
|
1549
1646
|
};
|
|
1550
|
-
static styles =
|
|
1647
|
+
static styles = y`
|
|
1551
1648
|
:host {
|
|
1552
1649
|
display: block;
|
|
1553
1650
|
position: relative;
|
|
@@ -1616,11 +1713,11 @@ class We extends te {
|
|
|
1616
1713
|
}
|
|
1617
1714
|
onInput(e) {
|
|
1618
1715
|
const t = e.target.value.trim();
|
|
1619
|
-
if (clearTimeout(this.debounceTimer), t.length <
|
|
1716
|
+
if (clearTimeout(this.debounceTimer), t.length < Je) {
|
|
1620
1717
|
this.abortController?.abort(), this.results = [], this.open = !1, this.searched = !1;
|
|
1621
1718
|
return;
|
|
1622
1719
|
}
|
|
1623
|
-
this.debounceTimer = setTimeout(() => this.search(t),
|
|
1720
|
+
this.debounceTimer = setTimeout(() => this.search(t), Ze);
|
|
1624
1721
|
}
|
|
1625
1722
|
async search(e) {
|
|
1626
1723
|
this.abortController?.abort(), this.abortController = new AbortController();
|
|
@@ -1630,8 +1727,8 @@ class We extends te {
|
|
|
1630
1727
|
});
|
|
1631
1728
|
if (!s.ok)
|
|
1632
1729
|
return;
|
|
1633
|
-
const
|
|
1634
|
-
this.results =
|
|
1730
|
+
const r = await s.json();
|
|
1731
|
+
this.results = r.items || [], this.activeIndex = -1, this.searched = !0, this.open = !0;
|
|
1635
1732
|
} catch (t) {
|
|
1636
1733
|
t.name !== "AbortError" && console.warn("school search failed", t);
|
|
1637
1734
|
}
|
|
@@ -1665,36 +1762,36 @@ class We extends te {
|
|
|
1665
1762
|
return [e.location, e.county && `${e.county} County`].filter(Boolean).join(" — ");
|
|
1666
1763
|
}
|
|
1667
1764
|
renderOption(e, t) {
|
|
1668
|
-
const s = this.where(e),
|
|
1669
|
-
|
|
1765
|
+
const s = this.where(e), r = (o) => {
|
|
1766
|
+
o.preventDefault(), this.go(e);
|
|
1670
1767
|
};
|
|
1671
|
-
return
|
|
1768
|
+
return n`
|
|
1672
1769
|
<li
|
|
1673
1770
|
id="school-option-${t}"
|
|
1674
1771
|
role="option"
|
|
1675
1772
|
aria-selected="${t === this.activeIndex ? "true" : "false"}"
|
|
1676
|
-
@pointerdown="${
|
|
1773
|
+
@pointerdown="${r}"
|
|
1677
1774
|
@mousemove="${() => {
|
|
1678
1775
|
this.activeIndex = t;
|
|
1679
1776
|
}}"
|
|
1680
1777
|
>
|
|
1681
1778
|
<span class="name">${e.name}</span>
|
|
1682
|
-
${s ?
|
|
1779
|
+
${s ? n`<span class="where">${s}</span>` : p}
|
|
1683
1780
|
</li>
|
|
1684
1781
|
`;
|
|
1685
1782
|
}
|
|
1686
1783
|
renderListbox() {
|
|
1687
|
-
const e = this.searched && !this.results.length, t =
|
|
1688
|
-
return
|
|
1784
|
+
const e = this.searched && !this.results.length, t = n`<li class="empty">No schools found</li>`;
|
|
1785
|
+
return n`
|
|
1689
1786
|
<ul id="school-search-listbox" role="listbox" aria-label="Schools">
|
|
1690
|
-
${this.results.map((s,
|
|
1787
|
+
${this.results.map((s, r) => this.renderOption(s, r))}
|
|
1691
1788
|
${e ? t : p}
|
|
1692
1789
|
</ul>
|
|
1693
1790
|
`;
|
|
1694
1791
|
}
|
|
1695
1792
|
render() {
|
|
1696
1793
|
const e = this.activeIndex >= 0 ? `school-option-${this.activeIndex}` : "";
|
|
1697
|
-
return
|
|
1794
|
+
return n`
|
|
1698
1795
|
<input
|
|
1699
1796
|
type="text"
|
|
1700
1797
|
role="combobox"
|
|
@@ -1713,23 +1810,23 @@ class We extends te {
|
|
|
1713
1810
|
`;
|
|
1714
1811
|
}
|
|
1715
1812
|
}
|
|
1716
|
-
globalThis?.customElements && !globalThis.customElements.get("hsot-school-search") && globalThis.customElements.define("hsot-school-search",
|
|
1813
|
+
globalThis?.customElements && !globalThis.customElements.get("hsot-school-search") && globalThis.customElements.define("hsot-school-search", et);
|
|
1717
1814
|
export {
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1815
|
+
O as D,
|
|
1816
|
+
Xe as H,
|
|
1817
|
+
Me as a,
|
|
1818
|
+
Oe as b,
|
|
1819
|
+
et as c,
|
|
1820
|
+
Re as d,
|
|
1821
|
+
Ne as e,
|
|
1822
|
+
P as f,
|
|
1823
|
+
ue as g,
|
|
1824
|
+
g as h,
|
|
1728
1825
|
G as i,
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1826
|
+
st as j,
|
|
1827
|
+
H as k,
|
|
1828
|
+
Ae as p,
|
|
1829
|
+
k as r,
|
|
1830
|
+
ne as s,
|
|
1831
|
+
V as t
|
|
1735
1832
|
};
|