{items.map((item, index) => (
-
![]()
-
+
))}
diff --git a/src/pages/HerstellerPage.js b/src/pages/HerstellerPage.js
new file mode 100644
index 0000000..144a5d0
--- /dev/null
+++ b/src/pages/HerstellerPage.js
@@ -0,0 +1,168 @@
+import React, { Component } from 'react';
+import { Link } from 'react-router-dom';
+import Box from '@mui/material/Box';
+import Paper from '@mui/material/Paper';
+import LegalPage from './LegalPage.js';
+import { withI18n } from '../i18n/withTranslation.js';
+
+class HerstellerPage extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ loading: true,
+ manufacturers: [],
+ };
+ this._isMounted = false;
+ this._objectUrls = [];
+ }
+
+ componentDidMount() {
+ this._isMounted = true;
+ this.loadManufacturers();
+ }
+
+ componentWillUnmount() {
+ this._isMounted = false;
+ for (const url of this._objectUrls) {
+ URL.revokeObjectURL(url);
+ }
+ this._objectUrls = [];
+ }
+
+ loadManufacturers = () => {
+ // Check if manufacturers data is already cached from prerendering
+ if (window.herstellerImages && Array.isArray(window.herstellerImages) && window.herstellerImages.length > 0) {
+ if (!this._isMounted) return;
+
+ const manufacturers = window.herstellerImages
+ .filter(m => m.imageBuffer)
+ .map(m => {
+ const blob = new Blob([m.imageBuffer], { type: 'image/avif' });
+ const src = URL.createObjectURL(blob);
+ this._objectUrls.push(src);
+ return {
+ id: m.id,
+ name: m.name || '',
+ slug: m.slug || '',
+ src,
+ };
+ })
+ .sort((a, b) => (a.name || '').localeCompare(b.name || '', undefined, { sensitivity: 'base' }));
+
+ this.setState({
+ loading: false,
+ manufacturers,
+ });
+ return;
+ }
+
+ // Fallback: fetch from socket if no cached data
+ window.socketManager.emit('getHerstellerImages', {}, (res) => {
+ if (!this._isMounted) return;
+
+ if (!res?.success || !Array.isArray(res.manufacturers)) {
+ this.setState({ loading: false, manufacturers: [] });
+ return;
+ }
+
+ const manufacturers = res.manufacturers
+ .filter(m => m.imageBuffer)
+ .map(m => {
+ const blob = new Blob([m.imageBuffer], { type: 'image/avif' });
+ const src = URL.createObjectURL(blob);
+ this._objectUrls.push(src);
+ return {
+ id: m.id,
+ name: m.name || '',
+ slug: m.slug || '',
+ src,
+ };
+ })
+ .sort((a, b) => (a.name || '').localeCompare(b.name || '', undefined, { sensitivity: 'base' }));
+
+ this.setState({
+ loading: false,
+ manufacturers,
+ });
+ });
+ };
+
+ renderManufacturerGrid = () => {
+ const { manufacturers } = this.state;
+
+ if (!manufacturers.length) {
+ return null
+ }
+
+ return (
+