Maltemedia Website Setup

This commit is contained in:
2026-01-31 19:14:45 +01:00
commit 1683a91aed
12 changed files with 2536 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/target

1088
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

7
Cargo.toml Normal file
View File

@@ -0,0 +1,7 @@
[package]
name = "maltemedia_malxte_de"
version = "0.1.0"
edition = "2024"
[dependencies]
yew = { version = "0.21", features = ["csr"] }

159
dist/index.html vendored Normal file
View File

@@ -0,0 +1,159 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Maltemedia | Project Showcase</title>
<link rel="stylesheet" href="/styles-8594f1db0edea510.css" integrity="sha384-fpp8AynBq68Wjmva26y5okd7ksF/OTO41Cd3covJb8w09epjazWKm6DqqwWrRyMq"/>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet" />
<link rel="modulepreload" href="/maltemedia_malxte_de-9fece7646aa8ee92.js" crossorigin="anonymous" integrity="sha384-a4rGuVn4Pj4+QdduhJaIbTQilLQq1aI2tkCKurBFSdslxRVWo1QK0LszOH9qMJAy"><link rel="preload" href="/maltemedia_malxte_de-9fece7646aa8ee92_bg.wasm" crossorigin="anonymous" integrity="sha384-JarUa+051wjBw4Uj+yMekWly0rOICTFqjfmuJx35Q9QwK/ZA/wGHLNi5Exy0QtrN" as="fetch" type="application/wasm"></head>
<body>
<script type="module">
import init, * as bindings from '/maltemedia_malxte_de-9fece7646aa8ee92.js';
const wasm = await init({ module_or_path: '/maltemedia_malxte_de-9fece7646aa8ee92_bg.wasm' });
window.wasmBindings = bindings;
dispatchEvent(new CustomEvent("TrunkApplicationStarted", {detail: {wasm}}));
</script><script>"use strict";
(function () {
const address = '{{__TRUNK_ADDRESS__}}';
const base = '{{__TRUNK_WS_BASE__}}';
let protocol = '';
protocol =
protocol
? protocol
: window.location.protocol === 'https:'
? 'wss'
: 'ws';
const url = protocol + '://' + address + base + '.well-known/trunk/ws';
class Overlay {
constructor() {
// create an overlay
this._overlay = document.createElement("div");
const style = this._overlay.style;
style.height = "100vh";
style.width = "100vw";
style.position = "fixed";
style.top = "0";
style.left = "0";
style.backgroundColor = "rgba(222, 222, 222, 0.5)";
style.fontFamily = "sans-serif";
// not sure that's the right approach
style.zIndex = "1000000";
style.backdropFilter = "blur(1rem)";
const container = document.createElement("div");
// center it
container.style.position = "absolute";
container.style.top = "30%";
container.style.left = "15%";
container.style.maxWidth = "85%";
this._title = document.createElement("div");
this._title.innerText = "Build failure";
this._title.style.paddingBottom = "2rem";
this._title.style.fontSize = "2.5rem";
this._message = document.createElement("div");
this._message.style.whiteSpace = "pre-wrap";
const icon= document.createElement("div");
icon.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="#dc3545" viewBox="0 0 16 16"><path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/></svg>';
this._title.prepend(icon);
container.append(this._title, this._message);
this._overlay.append(container);
this._inject();
window.setInterval(() => {
this._inject();
}, 250);
}
set reason(reason) {
this._message.textContent = reason;
}
_inject() {
if (!this._overlay.isConnected) {
// prepend it
document.body?.prepend(this._overlay);
}
}
}
class Client {
constructor(url) {
this.url = url;
this.poll_interval = 5000;
this._overlay = null;
}
start() {
const ws = new WebSocket(this.url);
ws.onmessage = (ev) => {
const msg = JSON.parse(ev.data);
switch (msg.type) {
case "reload":
this.reload();
break;
case "buildFailure":
this.buildFailure(msg.data)
break;
}
};
ws.onclose = () => this.onclose();
}
onclose() {
window.setTimeout(
() => {
// when we successfully reconnect, we'll force a
// reload (since we presumably lost connection to
// trunk due to it being killed, so it will have
// rebuilt on restart)
const ws = new WebSocket(this.url);
ws.onopen = () => window.location.reload();
ws.onclose = () => this.onclose();
},
this.poll_interval);
}
reload() {
window.location.reload();
}
buildFailure({reason}) {
// also log the console
console.error("Build failed:", reason);
console.debug("Overlay", this._overlay);
if (!this._overlay) {
this._overlay = new Overlay();
}
this._overlay.reason = reason;
}
}
new Client(url).start();
})()
</script></body>
</html>

View File

@@ -0,0 +1,698 @@
function __wbg_get_imports() {
const import0 = {
__proto__: null,
__wbg___wbindgen_debug_string_0bc8482c6e3508ae: function(arg0, arg1) {
const ret = debugString(arg1);
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg___wbindgen_is_function_0095a73b8b156f76: function(arg0) {
const ret = typeof(arg0) === 'function';
return ret;
},
__wbg___wbindgen_is_undefined_9e4d92534c42d778: function(arg0) {
const ret = arg0 === undefined;
return ret;
},
__wbg___wbindgen_throw_be289d5034ed271b: function(arg0, arg1) {
throw new Error(getStringFromWasm0(arg0, arg1));
},
__wbg__wbg_cb_unref_d9b87ff7982e3b21: function(arg0) {
arg0._wbg_cb_unref();
},
__wbg_addEventListener_c917b5aafbcf493f: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
arg0.addEventListener(getStringFromWasm0(arg1, arg2), arg3, arg4);
}, arguments); },
__wbg_body_f67922363a220026: function(arg0) {
const ret = arg0.body;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_bubbles_ad88192d3c29e6f9: function(arg0) {
const ret = arg0.bubbles;
return ret;
},
__wbg_cache_key_57601dac16343711: function(arg0) {
const ret = arg0.__yew_subtree_cache_key;
return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;
},
__wbg_call_389efe28435a9388: function() { return handleError(function (arg0, arg1) {
const ret = arg0.call(arg1);
return ret;
}, arguments); },
__wbg_cancelBubble_d93ec09e9c46cd6f: function(arg0) {
const ret = arg0.cancelBubble;
return ret;
},
__wbg_childNodes_75d35de33c9f6fbb: function(arg0) {
const ret = arg0.childNodes;
return ret;
},
__wbg_cloneNode_eaf4ea08ebf633a5: function() { return handleError(function (arg0) {
const ret = arg0.cloneNode();
return ret;
}, arguments); },
__wbg_composedPath_9154ab2547c668d5: function(arg0) {
const ret = arg0.composedPath();
return ret;
},
__wbg_createElementNS_ee00621496b30ec2: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
const ret = arg0.createElementNS(arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
return ret;
}, arguments); },
__wbg_createElement_49f60fdcaae809c8: function() { return handleError(function (arg0, arg1, arg2) {
const ret = arg0.createElement(getStringFromWasm0(arg1, arg2));
return ret;
}, arguments); },
__wbg_createTask_deeb88a68fc97c9d: function() { return handleError(function (arg0, arg1) {
const ret = console.createTask(getStringFromWasm0(arg0, arg1));
return ret;
}, arguments); },
__wbg_createTextNode_55029686c9591bf3: function(arg0, arg1, arg2) {
const ret = arg0.createTextNode(getStringFromWasm0(arg1, arg2));
return ret;
},
__wbg_document_ee35a3d3ae34ef6c: function(arg0) {
const ret = arg0.document;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_error_3c7d958458bf649b: function(arg0, arg1) {
var v0 = getArrayJsValueFromWasm0(arg0, arg1).slice();
wasm.__wbindgen_free(arg0, arg1 * 4, 4);
console.error(...v0);
},
__wbg_error_7534b8e9a36f1ab4: function(arg0, arg1) {
let deferred0_0;
let deferred0_1;
try {
deferred0_0 = arg0;
deferred0_1 = arg1;
console.error(getStringFromWasm0(arg0, arg1));
} finally {
wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);
}
},
__wbg_from_bddd64e7d5ff6941: function(arg0) {
const ret = Array.from(arg0);
return ret;
},
__wbg_get_9b94d73e6221f75c: function(arg0, arg1) {
const ret = arg0[arg1 >>> 0];
return ret;
},
__wbg_host_fb29f8be35c2517d: function(arg0) {
const ret = arg0.host;
return ret;
},
__wbg_insertBefore_1468142836e61a51: function() { return handleError(function (arg0, arg1, arg2) {
const ret = arg0.insertBefore(arg1, arg2);
return ret;
}, arguments); },
__wbg_instanceof_Element_9e662f49ab6c6beb: function(arg0) {
let result;
try {
result = arg0 instanceof Element;
} catch (_) {
result = false;
}
const ret = result;
return ret;
},
__wbg_instanceof_ShadowRoot_5285adde3587c73e: function(arg0) {
let result;
try {
result = arg0 instanceof ShadowRoot;
} catch (_) {
result = false;
}
const ret = result;
return ret;
},
__wbg_instanceof_Window_ed49b2db8df90359: function(arg0) {
let result;
try {
result = arg0 instanceof Window;
} catch (_) {
result = false;
}
const ret = result;
return ret;
},
__wbg_is_f29129f676e5410c: function(arg0, arg1) {
const ret = Object.is(arg0, arg1);
return ret;
},
__wbg_lastChild_132d67597d5e4aef: function(arg0) {
const ret = arg0.lastChild;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_length_35a7bace40f36eac: function(arg0) {
const ret = arg0.length;
return ret;
},
__wbg_listener_id_ed1678830a5b97ec: function(arg0) {
const ret = arg0.__yew_listener_id;
return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;
},
__wbg_namespaceURI_86e2062c65f0f341: function(arg0, arg1) {
const ret = arg1.namespaceURI;
var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_new_361308b2356cecd0: function() {
const ret = new Object();
return ret;
},
__wbg_new_8a6f238a6ece86ea: function() {
const ret = new Error();
return ret;
},
__wbg_new_no_args_1c7c842f08d00ebb: function(arg0, arg1) {
const ret = new Function(getStringFromWasm0(arg0, arg1));
return ret;
},
__wbg_nextSibling_2e988d9bbe3e06f0: function(arg0) {
const ret = arg0.nextSibling;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_outerHTML_baa741c8917e0c70: function(arg0, arg1) {
const ret = arg1.outerHTML;
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_parentElement_75863410a8617953: function(arg0) {
const ret = arg0.parentElement;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_parentNode_d44bd5ec58601e45: function(arg0) {
const ret = arg0.parentNode;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_queueMicrotask_0aa0a927f78f5d98: function(arg0) {
const ret = arg0.queueMicrotask;
return ret;
},
__wbg_queueMicrotask_5bb536982f78a56f: function(arg0) {
queueMicrotask(arg0);
},
__wbg_removeAttribute_87259aab06d9f286: function() { return handleError(function (arg0, arg1, arg2) {
arg0.removeAttribute(getStringFromWasm0(arg1, arg2));
}, arguments); },
__wbg_removeChild_2f0b06213dbc49ca: function() { return handleError(function (arg0, arg1) {
const ret = arg0.removeChild(arg1);
return ret;
}, arguments); },
__wbg_removeEventListener_0c0902ed5009dd9f: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
arg0.removeEventListener(getStringFromWasm0(arg1, arg2), arg3, arg4 !== 0);
}, arguments); },
__wbg_resolve_002c4b7d9d8f6b64: function(arg0) {
const ret = Promise.resolve(arg0);
return ret;
},
__wbg_run_bcde7ea43ea6ed7c: function(arg0, arg1, arg2) {
try {
var state0 = {a: arg1, b: arg2};
var cb0 = () => {
const a = state0.a;
state0.a = 0;
try {
return wasm_bindgen__convert__closures_____invoke__hfa302676a84512fd(a, state0.b, );
} finally {
state0.a = a;
}
};
const ret = arg0.run(cb0);
return ret;
} finally {
state0.a = state0.b = 0;
}
},
__wbg_setAttribute_cc8e4c8a2a008508: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
arg0.setAttribute(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
}, arguments); },
__wbg_set_6cb8631f80447a67: function() { return handleError(function (arg0, arg1, arg2) {
const ret = Reflect.set(arg0, arg1, arg2);
return ret;
}, arguments); },
__wbg_set_cache_key_bb5f908a0e3ee714: function(arg0, arg1) {
arg0.__yew_subtree_cache_key = arg1 >>> 0;
},
__wbg_set_capture_d52e7a585f2933c8: function(arg0, arg1) {
arg0.capture = arg1 !== 0;
},
__wbg_set_checked_4b2468680005fbf7: function(arg0, arg1) {
arg0.checked = arg1 !== 0;
},
__wbg_set_innerHTML_edd39677e3460291: function(arg0, arg1, arg2) {
arg0.innerHTML = getStringFromWasm0(arg1, arg2);
},
__wbg_set_listener_id_3d14d37a42484593: function(arg0, arg1) {
arg0.__yew_listener_id = arg1 >>> 0;
},
__wbg_set_nodeValue_d947eb0a476b80d7: function(arg0, arg1, arg2) {
arg0.nodeValue = arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2);
},
__wbg_set_passive_f411e67e6f28687b: function(arg0, arg1) {
arg0.passive = arg1 !== 0;
},
__wbg_set_subtree_id_32b8ceff55862e29: function(arg0, arg1) {
arg0.__yew_subtree_id = arg1 >>> 0;
},
__wbg_set_value_62a965e38b22b38c: function(arg0, arg1, arg2) {
arg0.value = getStringFromWasm0(arg1, arg2);
},
__wbg_set_value_ddc3bd01a8467bf1: function(arg0, arg1, arg2) {
arg0.value = getStringFromWasm0(arg1, arg2);
},
__wbg_stack_0ed75d68575b0f3c: function(arg0, arg1) {
const ret = arg1.stack;
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_static_accessor_GLOBAL_12837167ad935116: function() {
const ret = typeof global === 'undefined' ? null : global;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f: function() {
const ret = typeof globalThis === 'undefined' ? null : globalThis;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_static_accessor_SELF_a621d3dfbb60d0ce: function() {
const ret = typeof self === 'undefined' ? null : self;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_static_accessor_WINDOW_f8727f0cf888e0bd: function() {
const ret = typeof window === 'undefined' ? null : window;
return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);
},
__wbg_subtree_id_e65dfcc52d403fd9: function(arg0) {
const ret = arg0.__yew_subtree_id;
return isLikeNone(ret) ? 0x100000001 : (ret) >>> 0;
},
__wbg_textContent_fc823fb432e90037: function(arg0, arg1) {
const ret = arg1.textContent;
var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_then_b9e7b3b5f1a9e1b5: function(arg0, arg1) {
const ret = arg0.then(arg1);
return ret;
},
__wbg_value_15684899da869c95: function(arg0, arg1) {
const ret = arg1.value;
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbg_value_e506a07878790ca0: function(arg0, arg1) {
const ret = arg1.value;
const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN;
getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);
getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);
},
__wbindgen_cast_0000000000000001: function(arg0, arg1) {
// Cast intrinsic for `Closure(Closure { dtor_idx: 101, function: Function { arguments: [Ref(NamedExternref("Event"))], shim_idx: 102, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`.
const ret = makeClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h900b4b9ea494ccf5, wasm_bindgen__convert__closures________invoke__h5816d0618d81456c);
return ret;
},
__wbindgen_cast_0000000000000002: function(arg0, arg1) {
// Cast intrinsic for `Closure(Closure { dtor_idx: 162, function: Function { arguments: [Externref], shim_idx: 163, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__hcd3dc8e25f3db697, wasm_bindgen__convert__closures_____invoke__h88fe224923f8ba2b);
return ret;
},
__wbindgen_cast_0000000000000003: function(arg0, arg1) {
// Cast intrinsic for `Ref(String) -> Externref`.
const ret = getStringFromWasm0(arg0, arg1);
return ret;
},
__wbindgen_init_externref_table: function() {
const table = wasm.__wbindgen_externrefs;
const offset = table.grow(4);
table.set(0, undefined);
table.set(offset + 0, undefined);
table.set(offset + 1, null);
table.set(offset + 2, true);
table.set(offset + 3, false);
},
};
return {
__proto__: null,
"./maltemedia_malxte_de_bg.js": import0,
};
}
function wasm_bindgen__convert__closures_____invoke__hfa302676a84512fd(arg0, arg1) {
const ret = wasm.wasm_bindgen__convert__closures_____invoke__hfa302676a84512fd(arg0, arg1);
return ret !== 0;
}
function wasm_bindgen__convert__closures________invoke__h5816d0618d81456c(arg0, arg1, arg2) {
wasm.wasm_bindgen__convert__closures________invoke__h5816d0618d81456c(arg0, arg1, arg2);
}
function wasm_bindgen__convert__closures_____invoke__h88fe224923f8ba2b(arg0, arg1, arg2) {
wasm.wasm_bindgen__convert__closures_____invoke__h88fe224923f8ba2b(arg0, arg1, arg2);
}
function addToExternrefTable0(obj) {
const idx = wasm.__externref_table_alloc();
wasm.__wbindgen_externrefs.set(idx, obj);
return idx;
}
const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined')
? { register: () => {}, unregister: () => {} }
: new FinalizationRegistry(state => state.dtor(state.a, state.b));
function debugString(val) {
// primitive types
const type = typeof val;
if (type == 'number' || type == 'boolean' || val == null) {
return `${val}`;
}
if (type == 'string') {
return `"${val}"`;
}
if (type == 'symbol') {
const description = val.description;
if (description == null) {
return 'Symbol';
} else {
return `Symbol(${description})`;
}
}
if (type == 'function') {
const name = val.name;
if (typeof name == 'string' && name.length > 0) {
return `Function(${name})`;
} else {
return 'Function';
}
}
// objects
if (Array.isArray(val)) {
const length = val.length;
let debug = '[';
if (length > 0) {
debug += debugString(val[0]);
}
for(let i = 1; i < length; i++) {
debug += ', ' + debugString(val[i]);
}
debug += ']';
return debug;
}
// Test for built-in
const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val));
let className;
if (builtInMatches && builtInMatches.length > 1) {
className = builtInMatches[1];
} else {
// Failed to match the standard '[object ClassName]'
return toString.call(val);
}
if (className == 'Object') {
// we're a user defined class or Object
// JSON.stringify avoids problems with cycles, and is generally much
// easier than looping through ownProperties of `val`.
try {
return 'Object(' + JSON.stringify(val) + ')';
} catch (_) {
return 'Object';
}
}
// errors
if (val instanceof Error) {
return `${val.name}: ${val.message}\n${val.stack}`;
}
// TODO we could test for more things here, like `Set`s and `Map`s.
return className;
}
function getArrayJsValueFromWasm0(ptr, len) {
ptr = ptr >>> 0;
const mem = getDataViewMemory0();
const result = [];
for (let i = ptr; i < ptr + 4 * len; i += 4) {
result.push(wasm.__wbindgen_externrefs.get(mem.getUint32(i, true)));
}
wasm.__externref_drop_slice(ptr, len);
return result;
}
let cachedDataViewMemory0 = null;
function getDataViewMemory0() {
if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {
cachedDataViewMemory0 = new DataView(wasm.memory.buffer);
}
return cachedDataViewMemory0;
}
function getStringFromWasm0(ptr, len) {
ptr = ptr >>> 0;
return decodeText(ptr, len);
}
let cachedUint8ArrayMemory0 = null;
function getUint8ArrayMemory0() {
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
}
return cachedUint8ArrayMemory0;
}
function handleError(f, args) {
try {
return f.apply(this, args);
} catch (e) {
const idx = addToExternrefTable0(e);
wasm.__wbindgen_exn_store(idx);
}
}
function isLikeNone(x) {
return x === undefined || x === null;
}
function makeClosure(arg0, arg1, dtor, f) {
const state = { a: arg0, b: arg1, cnt: 1, dtor };
const real = (...args) => {
// First up with a closure we increment the internal reference
// count. This ensures that the Rust closure environment won't
// be deallocated while we're invoking it.
state.cnt++;
try {
return f(state.a, state.b, ...args);
} finally {
real._wbg_cb_unref();
}
};
real._wbg_cb_unref = () => {
if (--state.cnt === 0) {
state.dtor(state.a, state.b);
state.a = 0;
CLOSURE_DTORS.unregister(state);
}
};
CLOSURE_DTORS.register(real, state, state);
return real;
}
function makeMutClosure(arg0, arg1, dtor, f) {
const state = { a: arg0, b: arg1, cnt: 1, dtor };
const real = (...args) => {
// First up with a closure we increment the internal reference
// count. This ensures that the Rust closure environment won't
// be deallocated while we're invoking it.
state.cnt++;
const a = state.a;
state.a = 0;
try {
return f(a, state.b, ...args);
} finally {
state.a = a;
real._wbg_cb_unref();
}
};
real._wbg_cb_unref = () => {
if (--state.cnt === 0) {
state.dtor(state.a, state.b);
state.a = 0;
CLOSURE_DTORS.unregister(state);
}
};
CLOSURE_DTORS.register(real, state, state);
return real;
}
function passStringToWasm0(arg, malloc, realloc) {
if (realloc === undefined) {
const buf = cachedTextEncoder.encode(arg);
const ptr = malloc(buf.length, 1) >>> 0;
getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
WASM_VECTOR_LEN = buf.length;
return ptr;
}
let len = arg.length;
let ptr = malloc(len, 1) >>> 0;
const mem = getUint8ArrayMemory0();
let offset = 0;
for (; offset < len; offset++) {
const code = arg.charCodeAt(offset);
if (code > 0x7F) break;
mem[ptr + offset] = code;
}
if (offset !== len) {
if (offset !== 0) {
arg = arg.slice(offset);
}
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
const ret = cachedTextEncoder.encodeInto(arg, view);
offset += ret.written;
ptr = realloc(ptr, len, offset, 1) >>> 0;
}
WASM_VECTOR_LEN = offset;
return ptr;
}
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
cachedTextDecoder.decode();
const MAX_SAFARI_DECODE_BYTES = 2146435072;
let numBytesDecoded = 0;
function decodeText(ptr, len) {
numBytesDecoded += len;
if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {
cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
cachedTextDecoder.decode();
numBytesDecoded = len;
}
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
}
const cachedTextEncoder = new TextEncoder();
if (!('encodeInto' in cachedTextEncoder)) {
cachedTextEncoder.encodeInto = function (arg, view) {
const buf = cachedTextEncoder.encode(arg);
view.set(buf);
return {
read: arg.length,
written: buf.length
};
};
}
let WASM_VECTOR_LEN = 0;
let wasmModule, wasm;
function __wbg_finalize_init(instance, module) {
wasm = instance.exports;
wasmModule = module;
cachedDataViewMemory0 = null;
cachedUint8ArrayMemory0 = null;
wasm.__wbindgen_start();
return wasm;
}
async function __wbg_load(module, imports) {
if (typeof Response === 'function' && module instanceof Response) {
if (typeof WebAssembly.instantiateStreaming === 'function') {
try {
return await WebAssembly.instantiateStreaming(module, imports);
} catch (e) {
const validResponse = module.ok && expectedResponseType(module.type);
if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
} else { throw e; }
}
}
const bytes = await module.arrayBuffer();
return await WebAssembly.instantiate(bytes, imports);
} else {
const instance = await WebAssembly.instantiate(module, imports);
if (instance instanceof WebAssembly.Instance) {
return { instance, module };
} else {
return instance;
}
}
function expectedResponseType(type) {
switch (type) {
case 'basic': case 'cors': case 'default': return true;
}
return false;
}
}
function initSync(module) {
if (wasm !== undefined) return wasm;
if (module !== undefined) {
if (Object.getPrototypeOf(module) === Object.prototype) {
({module} = module)
} else {
console.warn('using deprecated parameters for `initSync()`; pass a single object instead')
}
}
const imports = __wbg_get_imports();
if (!(module instanceof WebAssembly.Module)) {
module = new WebAssembly.Module(module);
}
const instance = new WebAssembly.Instance(module, imports);
return __wbg_finalize_init(instance, module);
}
async function __wbg_init(module_or_path) {
if (wasm !== undefined) return wasm;
if (module_or_path !== undefined) {
if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
({module_or_path} = module_or_path)
} else {
console.warn('using deprecated parameters for the initialization function; pass a single object instead')
}
}
if (module_or_path === undefined) {
module_or_path = new URL('maltemedia_malxte_de_bg.wasm', import.meta.url);
}
const imports = __wbg_get_imports();
if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {
module_or_path = fetch(module_or_path);
}
const { instance, module } = await __wbg_load(await module_or_path, imports);
return __wbg_finalize_init(instance, module);
}
export { initSync, __wbg_init as default };

Binary file not shown.

BIN
dist/public/logo.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 KiB

238
dist/styles-8594f1db0edea510.css vendored Normal file
View File

@@ -0,0 +1,238 @@
:root {
--bg-color: #0f0f13;
--card-bg: rgba(255, 255, 255, 0.03);
--card-border: rgba(255, 255, 255, 0.08);
--text-primary: #e2e2e7;
--text-secondary: #a0a0b0;
--accent-color: #4a90e2;
}
body {
background-color: var(--bg-color);
color: var(--text-primary);
font-family: "Inter", sans-serif;
margin: 0;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.container {
max-width: 900px;
margin: 0 auto;
padding: 80px 24px;
animation: fadeIn 0.8s ease-out;
}
.hero {
text-align: center;
margin-bottom: 80px;
}
.hero img {
filter: drop-shadow(0 0 20px rgba(74, 144, 226, 0.2));
margin-bottom: 24px;
}
h1 {
font-size: 3.5rem;
margin: 0;
background: linear-gradient(135deg, #fff 30%, var(--accent-color) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.badge-container {
margin-top: 20px;
display: flex;
justify-content: center;
gap: 10px;
}
.badge {
background: rgba(255, 255, 255, 0.05);
padding: 6px 14px;
border-radius: 20px;
font-size: 0.8rem;
border: 1px solid var(--card-border);
color: var(--text-secondary);
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 24px;
}
.card {
background: var(--card-bg);
border: 1px solid var(--card-border);
border-radius: 20px;
padding: 30px;
transition: 0.3s;
backdrop-filter: blur(8px);
}
.card:hover {
transform: translateY(-8px);
border-color: var(--accent-color);
background: rgba(255, 255, 255, 0.05);
}
.card-icon {
font-size: 2rem;
margin-bottom: 15px;
}
.card h3 {
margin: 0 0 10px 0;
color: var(--accent-color);
}
.cta-container {
margin-top: 40px;
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
}
.gitea-button {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 16px 36px;
background: linear-gradient(135deg, var(--accent-color) 0%, #357abd 100%);
color: white;
text-decoration: none;
border-radius: 12px;
font-weight: 700;
font-size: 1.1rem;
transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.gitea-button:hover {
transform: scale(1.05);
box-shadow: 0 10px 30px rgba(74, 144, 226, 0.4);
filter: brightness(1.1);
}
.hint {
color: var(--text-secondary);
font-size: 0.85rem;
margin: 0;
opacity: 0.8;
}
/* Tech Stack Footer Area */
.footer-info {
margin-top: 100px;
padding-top: 40px;
border-top: 1px solid var(--card-border);
text-align: center;
}
.footer-info h2 {
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--text-secondary);
margin-bottom: 24px;
opacity: 0.8;
}
.tech-tags {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 12px;
}
.tech-tags span {
background: rgba(255, 255, 255, 0.03);
border: 1px solid var(--card-border);
padding: 8px 18px;
border-radius: 10px;
font-family: "JetBrains Mono", monospace;
/* Falls verfügbar, sonst sans-serif */
font-size: 0.85rem;
color: var(--text-primary);
transition: all 0.3s ease;
}
.tech-tags span:hover {
background: rgba(255, 255, 255, 0.08);
transform: translateY(-2px);
border-color: var(--text-secondary);
}
/* Spezial-Stil für dein Crate im Tech-Stack */
.tech-tags .highlight-tag {
background: rgba(123, 44, 191, 0.15);
border-color: rgba(157, 78, 221, 0.4);
color: #9d4edd;
font-weight: 600;
}
.tech-tags .highlight-tag:hover {
background: rgba(123, 44, 191, 0.25);
box-shadow: 0 0 15px rgba(157, 78, 221, 0.2);
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Badge-Hervorhebung */
.badge-special {
background-color: #7b2cbf;
/* Nostr-Violett */
color: white;
font-weight: bold;
}
/* Die neue Crate-Sektion */
.crate-feature {
background: rgba(123, 44, 191, 0.1);
border-radius: 12px;
padding: 2rem;
margin: 2rem 0;
border: 1px solid rgba(123, 44, 191, 0.3);
text-align: center;
}
.crate-feature h2 {
color: #9d4edd;
margin-top: 0;
}
.secondary-button {
display: inline-block;
margin-top: 1rem;
padding: 0.5rem 1rem;
color: #9d4edd;
border: 1px solid #9d4edd;
text-decoration: none;
border-radius: 5px;
transition: all 0.2s;
}
.secondary-button:hover {
background: #9d4edd;
color: white;
}
/* Text-Highlight im Footer */
.highlight-text {
font-weight: bold;
color: #9d4edd;
}

19
index.html Normal file
View File

@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Maltemedia | Project Showcase</title>
<link data-trunk rel="css" href="styles.css" />
<link data-trunk rel="copy-dir" href="public" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet" />
</head>
<body>
</body>
</html>

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 671 KiB

88
src/main.rs Normal file
View File

@@ -0,0 +1,88 @@
use yew::prelude::*;
#[function_component(App)]
pub fn app() -> Html {
html! {
<main class="container">
// 1. Hero Section
<section class="hero">
<img src="public/logo.png" alt="Maltemedia Logo" width="150" />
<h1>{ "Maltemedia" }</h1>
<p class="subtitle">
{ "A modern, fast, and secure application to stay updated with the latest news from different worlds." }
</p>
<div class="badge-container">
<span class="badge">{ "Made with Rust & Yew" }</span>
<span class="badge">{ "GPL v3" }</span>
<span class="badge badge-special">{ "Powered by Easy-Nostr" }</span>
</div>
<div class="cta-container">
<a href="https://gitea.malxte.de/Bytemalte/marstemedia" target="_blank" class="gitea-button">
<span class="icon">{ "💻" }</span>
{ " Download & Source Code" }
</a>
<p class="hint">{ "Find the latest releases on our Gitea instance" }</p>
</div>
</section>
// 2. Features Grid
<div class="grid">
<div class="card">
<div class="card-icon">{ "🌌" }</div>
<h3>{ "Nostr Feed" }</h3>
<p>{ "Browse decentralized posts using the Easy-Nostr engine. Fast, anonymous, and secure." }</p>
</div>
<div class="card">
<div class="card-icon">{ "🤖" }</div>
<h3>{ "AI News" }</h3>
<p>{ "Get instant tech news summaries generated by Llama 3 via Groq or OpenRouter." }</p>
</div>
<div class="card">
<div class="card-icon">{ "📻" }</div>
<h3>{ "RSS Reader" }</h3>
<p>{ "Follow your favorite news sources like NASA or Heise by adding custom RSS feeds." }</p>
</div>
<div class="card">
<div class="card-icon">{ "🔒" }</div>
<h3>{ "Private & Secure" }</h3>
<p>{ "Built with Tauri v2 for a native, high-performance experience with a minimal footprint." }</p>
</div>
</div>
// 3. Easy-Nostr Highlight Section (Informativ & Modern)
<section class="crate-feature">
<div class="crate-content">
<h2>{ "The Engine: Easy-Nostr" }</h2>
<p>
{ "To ensure a seamless decentralized experience, I developed " }
<code>{ "easy-nostr" }</code>
{ "—a high-level Rust library that simplifies identity management, social feeds, and NIP-17 encrypted messaging." }
</p>
<div class="crate-links">
<a href="https://gitea.malxte.de/Bytemalte/easy-nostr" target="_blank" class="secondary-button">
{ "Explore Crate on Gitea" }
</a>
</div>
</div>
</section>
// 4. Footer & Tech Stack
<section class="footer-info">
<h2>{ "Built with Modern Technology" }</h2>
<div class="tech-tags">
<span>{ "Tauri v2" }</span>
<span>{ "Yew (Wasm)" }</span>
<span>{ "Rust" }</span>
<span class="highlight-tag">{ "Easy-Nostr" }</span>
</div>
<p class="hint" style="margin-top: 30px;">{ "© 2026 Maltemedia • Open Source" }</p>
</section>
</main>
}
}
fn main() {
yew::Renderer::<App>::new().render();
}

238
styles.css Normal file
View File

@@ -0,0 +1,238 @@
:root {
--bg-color: #0f0f13;
--card-bg: rgba(255, 255, 255, 0.03);
--card-border: rgba(255, 255, 255, 0.08);
--text-primary: #e2e2e7;
--text-secondary: #a0a0b0;
--accent-color: #4a90e2;
}
body {
background-color: var(--bg-color);
color: var(--text-primary);
font-family: "Inter", sans-serif;
margin: 0;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
.container {
max-width: 900px;
margin: 0 auto;
padding: 80px 24px;
animation: fadeIn 0.8s ease-out;
}
.hero {
text-align: center;
margin-bottom: 80px;
}
.hero img {
filter: drop-shadow(0 0 20px rgba(74, 144, 226, 0.2));
margin-bottom: 24px;
}
h1 {
font-size: 3.5rem;
margin: 0;
background: linear-gradient(135deg, #fff 30%, var(--accent-color) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.badge-container {
margin-top: 20px;
display: flex;
justify-content: center;
gap: 10px;
}
.badge {
background: rgba(255, 255, 255, 0.05);
padding: 6px 14px;
border-radius: 20px;
font-size: 0.8rem;
border: 1px solid var(--card-border);
color: var(--text-secondary);
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 24px;
}
.card {
background: var(--card-bg);
border: 1px solid var(--card-border);
border-radius: 20px;
padding: 30px;
transition: 0.3s;
backdrop-filter: blur(8px);
}
.card:hover {
transform: translateY(-8px);
border-color: var(--accent-color);
background: rgba(255, 255, 255, 0.05);
}
.card-icon {
font-size: 2rem;
margin-bottom: 15px;
}
.card h3 {
margin: 0 0 10px 0;
color: var(--accent-color);
}
.cta-container {
margin-top: 40px;
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
}
.gitea-button {
display: inline-flex;
align-items: center;
gap: 10px;
padding: 16px 36px;
background: linear-gradient(135deg, var(--accent-color) 0%, #357abd 100%);
color: white;
text-decoration: none;
border-radius: 12px;
font-weight: 700;
font-size: 1.1rem;
transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.gitea-button:hover {
transform: scale(1.05);
box-shadow: 0 10px 30px rgba(74, 144, 226, 0.4);
filter: brightness(1.1);
}
.hint {
color: var(--text-secondary);
font-size: 0.85rem;
margin: 0;
opacity: 0.8;
}
/* Tech Stack Footer Area */
.footer-info {
margin-top: 100px;
padding-top: 40px;
border-top: 1px solid var(--card-border);
text-align: center;
}
.footer-info h2 {
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--text-secondary);
margin-bottom: 24px;
opacity: 0.8;
}
.tech-tags {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 12px;
}
.tech-tags span {
background: rgba(255, 255, 255, 0.03);
border: 1px solid var(--card-border);
padding: 8px 18px;
border-radius: 10px;
font-family: "JetBrains Mono", monospace;
/* Falls verfügbar, sonst sans-serif */
font-size: 0.85rem;
color: var(--text-primary);
transition: all 0.3s ease;
}
.tech-tags span:hover {
background: rgba(255, 255, 255, 0.08);
transform: translateY(-2px);
border-color: var(--text-secondary);
}
/* Spezial-Stil für dein Crate im Tech-Stack */
.tech-tags .highlight-tag {
background: rgba(123, 44, 191, 0.15);
border-color: rgba(157, 78, 221, 0.4);
color: #9d4edd;
font-weight: 600;
}
.tech-tags .highlight-tag:hover {
background: rgba(123, 44, 191, 0.25);
box-shadow: 0 0 15px rgba(157, 78, 221, 0.2);
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Badge-Hervorhebung */
.badge-special {
background-color: #7b2cbf;
/* Nostr-Violett */
color: white;
font-weight: bold;
}
/* Die neue Crate-Sektion */
.crate-feature {
background: rgba(123, 44, 191, 0.1);
border-radius: 12px;
padding: 2rem;
margin: 2rem 0;
border: 1px solid rgba(123, 44, 191, 0.3);
text-align: center;
}
.crate-feature h2 {
color: #9d4edd;
margin-top: 0;
}
.secondary-button {
display: inline-block;
margin-top: 1rem;
padding: 0.5rem 1rem;
color: #9d4edd;
border: 1px solid #9d4edd;
text-decoration: none;
border-radius: 5px;
transition: all 0.2s;
}
.secondary-button:hover {
background: #9d4edd;
color: white;
}
/* Text-Highlight im Footer */
.highlight-text {
font-weight: bold;
color: #9d4edd;
}