diff --git a/pages/src/assets/ts/index.ts b/pages/src/assets/ts/index.ts
index 161668b..d251d22 100644
--- a/pages/src/assets/ts/index.ts
+++ b/pages/src/assets/ts/index.ts
@@ -4,6 +4,7 @@ import { renderLaunchers } from './renderers/launchers.js';
import { renderOverview } from './renderers/overview.js';
import { renderPatches } from './renderers/patches.js';
import { renderResources } from './renderers/resources.js';
+import { renderWeb } from './renderers/web.js';
import type { MirrorFileEntry } from './types.js';
import { BASE_URL } from './utils/constants.js';
@@ -32,6 +33,7 @@ async function main() {
@@ -39,6 +41,7 @@ async function main() {
+
`;
contentDiv.innerHTML = tabsHtml;
@@ -49,5 +52,6 @@ async function main() {
renderPatches(document.getElementById('tab-patch')!, mirrorFileDb),
renderResources(document.getElementById('tab-resources')!),
renderLaunchers(document.getElementById('tab-launcher')!, mirrorFileDb),
+ renderWeb(document.getElementById('tab-web')!),
]);
}
diff --git a/pages/src/assets/ts/renderers/web.ts b/pages/src/assets/ts/renderers/web.ts
new file mode 100644
index 0000000..8919f92
--- /dev/null
+++ b/pages/src/assets/ts/renderers/web.ts
@@ -0,0 +1,157 @@
+import { DateTime } from 'luxon';
+import { fetchJson } from '../api.js';
+import type { StoredData } from '../types.js';
+import { BASE_URL, gameTargets, launcherWebApiLang } from '../utils/constants.js';
+
+const apiTypes = ['announcement', 'banner', 'main_bg_image', 'sidebar', 'single_ent'];
+
+export async function renderWeb(container: HTMLElement) {
+ for (const target of gameTargets) {
+ const section = document.createElement('div');
+ section.className = 'mb-5';
+ section.innerHTML = `Loading...
';
+
+ const results = await Promise.all(
+ apiTypes.map(async (apiType) => {
+ const url = `${BASE_URL}/akEndfield/launcher/web/${target.dirName}/${apiType}/${lang}/all.json`;
+ try {
+ const data = await fetchJson