diff --git a/pages/src/assets/ts/index.ts b/pages/src/assets/ts/index.ts
index d251d22..d37f100 100644
--- a/pages/src/assets/ts/index.ts
+++ b/pages/src/assets/ts/index.ts
@@ -4,7 +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 { renderWebPretty } from './renderers/webPretty.js';
import type { MirrorFileEntry } from './types.js';
import { BASE_URL } from './utils/constants.js';
@@ -33,7 +33,7 @@ async function main() {
@@ -41,7 +41,7 @@ async function main() {
-
+
`;
contentDiv.innerHTML = tabsHtml;
@@ -52,6 +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')!),
+ renderWebPretty(document.getElementById('tab-web-pretty')!),
]);
}
diff --git a/pages/src/assets/ts/renderers/webPretty.ts b/pages/src/assets/ts/renderers/webPretty.ts
new file mode 100644
index 0000000..b74c18b
--- /dev/null
+++ b/pages/src/assets/ts/renderers/webPretty.ts
@@ -0,0 +1,14 @@
+import { renderAnnouncement } from './webPretty/announcement.js';
+import { renderBanner } from './webPretty/banner.js';
+import { renderMainBgImage } from './webPretty/mainBgImage.js';
+import { renderSidebar } from './webPretty/sidebar.js';
+import { renderSingleEnt } from './webPretty/singleEnt.js';
+
+export async function renderWebPretty(container: HTMLElement) {
+ container.innerHTML = '';
+ await renderAnnouncement(container);
+ await renderBanner(container);
+ await renderMainBgImage(container);
+ await renderSingleEnt(container);
+ await renderSidebar(container);
+}
diff --git a/pages/src/assets/ts/renderers/webPretty/announcement.ts b/pages/src/assets/ts/renderers/webPretty/announcement.ts
new file mode 100644
index 0000000..9e1d3d1
--- /dev/null
+++ b/pages/src/assets/ts/renderers/webPretty/announcement.ts
@@ -0,0 +1,179 @@
+import { DateTime } from 'luxon';
+import { fetchJson } from '../../api.js';
+import type { LauncherWebAnnouncement, StoredData } from '../../types.js';
+import { BASE_URL, gameTargets, launcherWebApiLang } from '../../utils/constants.js';
+
+export async function renderAnnouncement(container: HTMLElement) {
+ const outerCard = document.createElement('div');
+ outerCard.className = 'card mb-3';
+
+ const header = document.createElement('div');
+ header.className = 'card-header d-flex justify-content-between align-items-center';
+ header.style.cursor = 'pointer';
+ header.setAttribute('data-bs-toggle', 'collapse');
+ header.setAttribute('data-bs-target', '#collapseAnnouncement');
+ header.setAttribute('role', 'button');
+ header.innerHTML = 'No language selected.
';
+ return;
+ }
+
+ contentDiv.innerHTML = 'Loading announcements...
';
+
+ const url = `${BASE_URL}/akEndfield/launcher/web/${target.dirName}/announcement/${lang}/all.json`;
+ try {
+ const data = await fetchJson