<?xml version='1.0'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
	<title><![CDATA[Catatan Harian: All site blogs: November 2025}]]></title>
	<link>https://sharka.site/3blog/blog/all/1761926400/1764518400</link>
	<atom:link href="https://sharka.site/3blog/blog/all/1761926400/1764518400" rel="self" type="application/rss+xml" />
	<description><![CDATA[}]]></description>
		<item>
	<guid isPermaLink="true">https://sharka.site/3blog/blog/view/101/membangun-jembatan-dengan-cost-dan-bahan-yang-digunakan</guid>
	<pubDate>Thu, 13 Nov 2025 17:44:38 +0800</pubDate>
	<link>https://sharka.site/3blog/blog/view/101/membangun-jembatan-dengan-cost-dan-bahan-yang-digunakan</link>
	<title><![CDATA[Membangun jembatan dengan cost dan bahan yang digunakan]]></title>
	<description><![CDATA[<p>&lt;!doctype html&gt;<br />&lt;html lang="id" class="h-full"&gt;<br />&lt;head&gt;<br />&nbsp;&lt;meta charset="UTF-8"&gt;<br />&nbsp;&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;<br />&nbsp;&lt;title&gt;Simulasi Membangun Jembatan&lt;/title&gt;<br />&nbsp;&lt;script src="/_sdk/element_sdk.js"&gt;&lt;/script&gt;<br />&nbsp;&lt;script src="https://cdn.tailwindcss.com"&gt;&lt;/script&gt;<br />&nbsp;&lt;style&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;body {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;box-sizing: border-box;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.bridge-canvas {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;background: linear-gradient(to bottom, #87CEEB 0%, #87CEEB 60%, #8FBC8F 60%, #228B22 100%);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: relative;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;overflow: hidden;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.water {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: absolute;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bottom: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;left: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;right: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;height: 40%;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;background: linear-gradient(to bottom, #4682B4, #1E90FF);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: wave 3s ease-in-out infinite;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes wave {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0%, 100% { transform: translateY(0px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;50% { transform: translateY(-5px); }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.bridge-part {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: absolute;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cursor: pointer;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transition: all 0.3s ease;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.bridge-part:hover {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transform: scale(1.05);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;filter: brightness(1.1);<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.material-card {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transition: all 0.3s ease;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cursor: pointer;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.material-card:hover {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transform: translateY(-2px);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;box-shadow: 0 8px 25px rgba(0,0,0,0.15);<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.material-card.selected {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;border: 3px solid #3B82F6;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;background: #EBF8FF;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.test-animation {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: testBridge 2s ease-in-out;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes testBridge {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0% { transform: translateY(0); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;25% { transform: translateY(-10px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;50% { transform: translateY(5px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;75% { transform: translateY(-5px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;100% { transform: translateY(0); }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.success-glow {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: successGlow 1s ease-in-out;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes successGlow {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0%, 100% { box-shadow: 0 0 0 rgba(34, 197, 94, 0.4); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;50% { box-shadow: 0 0 30px rgba(34, 197, 94, 0.8); }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.failure-shake {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: failureShake 0.5s ease-in-out;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes failureShake {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0%, 100% { transform: translateX(0); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;25% { transform: translateX(-10px); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;75% { transform: translateX(10px); }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.collapse-animation {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: bridgeCollapse 2s ease-in forwards;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes bridgeCollapse {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0% { transform: translateY(0) rotate(0deg); opacity: 1; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;30% { transform: translateY(10px) rotate(-2deg); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;60% { transform: translateY(30px) rotate(5deg); }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;100% { transform: translateY(100px) rotate(-10deg); opacity: 0.3; }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.crack-effect {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: relative;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;.crack-effect::after {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;content: '';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position: absolute;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;top: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;left: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;right: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bottom: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;background: linear-gradient(45deg, transparent 40%, #ff0000 50%, transparent 60%);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;opacity: 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;animation: crackAppear 1s ease-in-out forwards;<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp;@keyframes crackAppear {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0% { opacity: 0; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;100% { opacity: 0.8; }<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp;&lt;/style&gt;<br />&nbsp;&lt;style&gt;@view-transition { navigation: auto; }&lt;/style&gt;<br />&nbsp;&lt;script src="/_sdk/data_sdk.js" type="text/javascript"&gt;&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body class="h-full bg-gradient-to-br from-blue-50 to-green-50 font-sans"&gt;<br />&nbsp;&lt;div class="h-full flex flex-col"&gt;&lt;!-- Header --&gt;<br />&nbsp; &lt;header class="bg-white shadow-lg p-4"&gt;<br />&nbsp; &nbsp;&lt;div class="max-w-6xl mx-auto flex justify-between items-center"&gt;<br />&nbsp; &nbsp; &lt;h1 id="gameTitle" class="text-3xl font-bold text-blue-800"&gt;🌉 Simulasi Membangun Jembatan&lt;/h1&gt;<br />&nbsp; &nbsp; &lt;div class="flex items-center space-x-6"&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="text-right"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;p id="budgetLabel" class="text-sm text-gray-600"&gt;Anggaran Tersedia&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;p id="budget" class="text-2xl font-bold text-green-600"&gt;Rp 500.000&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="text-right"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;p class="text-sm text-gray-600"&gt;Biaya Terpakai&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;p id="usedBudget" class="text-2xl font-bold text-red-600"&gt;Rp 0&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &lt;/header&gt;<br />&nbsp; &lt;main class="flex-1 flex"&gt;&lt;!-- Material Selection Panel --&gt;<br />&nbsp; &nbsp;&lt;aside class="w-80 bg-white shadow-lg p-6 overflow-y-auto"&gt;<br />&nbsp; &nbsp; &lt;h2 id="materialsHeader" class="text-xl font-bold text-gray-800 mb-4"&gt;🔧 Pilih Material&lt;/h2&gt;<br />&nbsp; &nbsp; &lt;div class="space-y-4"&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="material-card bg-yellow-50 border-2 border-yellow-200 rounded-lg p-4" data-material="kayu"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center justify-between mb-2"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-yellow-800"&gt;🪵 Kayu&lt;/h3&gt;&lt;span class="text-yellow-700 font-bold"&gt;Rp 50.000&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-sm text-yellow-700"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Kekuatan: ⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Fleksibilitas: ⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Tahan Air: ⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="material-card bg-gray-50 border-2 border-gray-200 rounded-lg p-4" data-material="beton"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center justify-between mb-2"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-gray-800"&gt;🧱 Beton&lt;/h3&gt;&lt;span class="text-gray-700 font-bold"&gt;Rp 100.000&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-sm text-gray-700"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Kekuatan: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Fleksibilitas: ⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Tahan Air: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="material-card bg-blue-50 border-2 border-blue-200 rounded-lg p-4" data-material="baja"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center justify-between mb-2"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-blue-800"&gt;🔩 Baja&lt;/h3&gt;&lt;span class="text-blue-700 font-bold"&gt;Rp 150.000&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-sm text-blue-700"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Kekuatan: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Fleksibilitas: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Tahan Air: ⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="material-card bg-green-50 border-2 border-green-200 rounded-lg p-4" data-material="bambu"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center justify-between mb-2"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-green-800"&gt;🎋 Bambu&lt;/h3&gt;&lt;span class="text-green-700 font-bold"&gt;Rp 30.000&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-sm text-green-700"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Kekuatan: ⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Fleksibilitas: ⭐⭐⭐⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;&lt;p&gt;Tahan Air: ⭐⭐&lt;/p&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &lt;div class="mt-6 space-y-3"&gt;&lt;button id="buildButton" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-bold py-3 px-4 rounded-lg transition-colors"&gt; 🔨 Bangun Jembatan &lt;/button&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="bg-orange-50 border border-orange-200 rounded-lg p-4 mb-3"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;h3 class="font-bold text-orange-800 mb-2"&gt;⚖️ Beban Uji&lt;/h3&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="flex items-center space-x-2 mb-2"&gt;&lt;label class="text-sm text-orange-700 font-medium"&gt;Berat:&lt;/label&gt; &lt;input type="range" id="loadSlider" min="1" max="10" value="3" class="flex-1"&gt; &lt;span id="loadValue" class="text-orange-800 font-bold min-w-[60px]"&gt;3 ton&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-orange-600"&gt;&lt;span id="loadDescription"&gt;Beban Ringan - Mobil kecil&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;button id="testButton" class="w-full bg-green-600 hover:bg-green-700 text-white font-bold py-3 px-4 rounded-lg transition-colors" disabled&gt; 🚛 Uji Jembatan &lt;/button&gt; &lt;button id="resetButton" class="w-full bg-gray-600 hover:bg-gray-700 text-white font-bold py-3 px-4 rounded-lg transition-colors"&gt; 🔄 Reset &lt;/button&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &lt;div id="infoPanel" class="mt-6 p-4 bg-blue-50 border border-blue-200 rounded-lg"&gt;<br />&nbsp; &nbsp; &nbsp;&lt;h3 class="font-bold text-blue-800 mb-2"&gt;💡 Tips:&lt;/h3&gt;<br />&nbsp; &nbsp; &nbsp;&lt;p class="text-sm text-blue-700"&gt;Pilih material untuk setiap bagian jembatan. Pertimbangkan kekuatan, biaya, dan kondisi lingkungan!&lt;/p&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp;&lt;/aside&gt;&lt;!-- Bridge Building Area --&gt;<br />&nbsp; &nbsp;&lt;section class="flex-1 p-6"&gt;<br />&nbsp; &nbsp; &lt;div class="bridge-canvas h-full rounded-lg relative border-4 border-blue-300"&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div class="water"&gt;&lt;/div&gt;&lt;!-- Bridge Foundation Left --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="foundation-left" class="bridge-part w-16 h-32 bg-gray-400 border-2 border-gray-600 rounded-t-lg" style="bottom: 40%; left: 10%; cursor: pointer;" data-part="foundation-left"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-center mt-1 font-bold"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;Pondasi Kiri<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Bridge Foundation Right --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="foundation-right" class="bridge-part w-16 h-32 bg-gray-400 border-2 border-gray-600 rounded-t-lg" style="bottom: 40%; right: 10%; cursor: pointer;" data-part="foundation-right"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-center mt-1 font-bold"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;Pondasi Kanan<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Bridge Deck --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="deck" class="bridge-part h-8 bg-gray-400 border-2 border-gray-600 rounded" style="bottom: 45%; left: 18%; right: 18%; cursor: pointer;" data-part="deck"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-center mt-1 font-bold"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;Lantai Jembatan<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Bridge Support Cables --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="cables" class="bridge-part" style="bottom: 53%; left: 35%; right: 35%; height: 30px; cursor: pointer;" data-part="cables"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;svg width="100%" height="100%" class="absolute"&gt;&lt;line x1="0%" y1="100%" x2="50%" y2="0%" stroke="#666" stroke-width="3" /&gt; &lt;line x1="100%" y1="100%" x2="50%" y2="0%" stroke="#666" stroke-width="3" /&gt; &lt;line x1="25%" y1="75%" x2="75%" y2="75%" stroke="#666" stroke-width="2" /&gt;<br />&nbsp; &nbsp; &nbsp; &lt;/svg&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-xs text-center font-bold" style="margin-top: 25px;"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;Kabel Penyangga<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Test Truck --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="testTruck" class="absolute hidden" style="bottom: 53%; left: -100px; transition: left 3s ease-in-out;"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div class="text-4xl"&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;🚛<br />&nbsp; &nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;&lt;!-- Results Display --&gt;<br />&nbsp; &nbsp; &nbsp;&lt;div id="resultDisplay" class="absolute top-4 left-4 right-4 text-center hidden"&gt;<br />&nbsp; &nbsp; &nbsp; &lt;div id="resultMessage" class="inline-block px-6 py-3 rounded-lg font-bold text-lg"&gt;&lt;/div&gt;<br />&nbsp; &nbsp; &nbsp;&lt;/div&gt;<br />&nbsp; &nbsp; &lt;/div&gt;<br />&nbsp; &nbsp;&lt;/section&gt;<br />&nbsp; &lt;/main&gt;<br />&nbsp;&lt;/div&gt;<br />&nbsp;&lt;script&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp;// Configuration object for editable features<br />&nbsp; &nbsp; &nbsp; &nbsp;const defaultConfig = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;game_title: "🌉 Simulasi Membangun Jembatan",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;budget_label: "Anggaran Tersedia",&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;materials_header: "🔧 Pilih Material",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;build_button: "🔨 Bangun Jembatan",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;test_button: "🚛 Uji Jembatan"<br />&nbsp; &nbsp; &nbsp; &nbsp;};</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Game state<br />&nbsp; &nbsp; &nbsp; &nbsp;let gameState = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;budget: 500000,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;usedBudget: 0,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;selectedMaterial: null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bridgeParts: {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-left': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-right': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'deck': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'cables': null<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;},<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isBuilt: false,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;testLoad: 3,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isCollapsed: false<br />&nbsp; &nbsp; &nbsp; &nbsp;};</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Material properties<br />&nbsp; &nbsp; &nbsp; &nbsp;const materials = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;kayu: { name: 'Kayu', cost: 50000, strength: 3, flexibility: 4, waterResistance: 2, color: '#D2691E', emoji: '🪵' },<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;beton: { name: 'Beton', cost: 100000, strength: 5, flexibility: 2, waterResistance: 5, color: '#696969', emoji: '🧱' },<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;baja: { name: 'Baja', cost: 150000, strength: 5, flexibility: 5, waterResistance: 3, color: '#708090', emoji: '🔩' },<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bambu: { name: 'Bambu', cost: 30000, strength: 2, flexibility: 5, waterResistance: 2, color: '#228B22', emoji: '🎋' }<br />&nbsp; &nbsp; &nbsp; &nbsp;};</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Initialize the game<br />&nbsp; &nbsp; &nbsp; &nbsp;function initGame() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateDisplay();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setupEventListeners();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateLoadValue(); // Initialize load slider display<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function updateDisplay() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('budget').textContent = `Rp ${gameState.budget.toLocaleString('id-ID')}`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('usedBudget').textContent = `Rp ${gameState.usedBudget.toLocaleString('id-ID')}`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update test button state<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const testButton = document.getElementById('testButton');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const allPartsBuilt = Object.values(gameState.bridgeParts).every(part =&gt; part !== null);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;testButton.disabled = !allPartsBuilt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;testButton.classList.toggle('opacity-50', !allPartsBuilt);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function setupEventListeners() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Material selection<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.material-card').forEach(card =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;card.addEventListener('click', () =&gt; selectMaterial(card.dataset.material));<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Bridge part selection<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.addEventListener('click', () =&gt; buildPart(part.dataset.part));<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Load slider<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('loadSlider').addEventListener('input', updateLoadValue);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Control buttons<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('buildButton').addEventListener('click', buildBridge);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('testButton').addEventListener('click', testBridge);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('resetButton').addEventListener('click', resetGame);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function updateLoadValue() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const slider = document.getElementById('loadSlider');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const loadValue = document.getElementById('loadValue');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const loadDescription = document.getElementById('loadDescription');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.testLoad = parseInt(slider.value);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loadValue.textContent = `${gameState.testLoad} ton`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const descriptions = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1: "Beban Sangat Ringan - Sepeda motor",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2: "Beban Ringan - Mobil kecil",&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3: "Beban Sedang - Mobil sedan",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;4: "Beban Menengah - SUV",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5: "Beban Berat - Truk kecil",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6: "Beban Sangat Berat - Truk sedang",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;7: "Beban Ekstrem - Truk besar",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;8: "Beban Berbahaya - Truk trailer",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;9: "Beban Kritis - Truk kontainer",<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;10: "Beban Maksimal - Truk gandeng"<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loadDescription.textContent = descriptions[gameState.testLoad];<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function selectMaterial(materialType) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.selectedMaterial = materialType;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update UI<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.material-card').forEach(card =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;card.classList.remove('selected');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelector(`[data-material="${materialType}"]`).classList.add('selected');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel(`Material ${materials[materialType].name} dipilih! Klik bagian jembatan untuk membangunnya.`);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function buildPart(partName) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!gameState.selectedMaterial) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Pilih material terlebih dahulu!', 'warning');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const material = materials[gameState.selectedMaterial];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const cost = material.cost;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (gameState.usedBudget + cost &gt; gameState.budget) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Anggaran tidak cukup! Pilih material yang lebih murah.', 'error');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update game state<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.bridgeParts[partName] = gameState.selectedMaterial;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.usedBudget += cost;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update visual<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const partElement = document.getElementById(partName);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;partElement.style.backgroundColor = material.color;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;partElement.style.borderColor = material.color;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Add material emoji<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const existingEmoji = partElement.querySelector('.material-emoji');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (existingEmoji) existingEmoji.remove();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const emojiSpan = document.createElement('span');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;emojiSpan.className = 'material-emoji absolute top-0 right-0 text-lg';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;emojiSpan.textContent = material.emoji;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;partElement.appendChild(emojiSpan);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateDisplay();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel(`${material.name} dipasang pada ${getPartDisplayName(partName)}! Biaya: Rp ${cost.toLocaleString('id-ID')}`);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function buildBridge() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const allPartsBuilt = Object.values(gameState.bridgeParts).every(part =&gt; part !== null);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!allPartsBuilt) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Lengkapi semua bagian jembatan terlebih dahulu!', 'warning');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.isBuilt = true;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Jembatan selesai dibangun! Sekarang Anda bisa mengujinya.', 'success');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Enable test button<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('testButton').disabled = false;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('testButton').classList.remove('opacity-50');<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function testBridge() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!gameState.isBuilt || gameState.isCollapsed) return;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Calculate bridge strength<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let totalStrength = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let totalFlexibility = 0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let totalWaterResistance = 0;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Object.values(gameState.bridgeParts).forEach(materialType =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const material = materials[materialType];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;totalStrength += material.strength;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;totalFlexibility += material.flexibility;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;totalWaterResistance += material.waterResistance;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const averageStrength = totalStrength / 4;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const averageFlexibility = totalFlexibility / 4;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const averageWaterResistance = totalWaterResistance / 4;</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Calculate load capacity vs test load<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const bridgeCapacity = averageStrength * 2; // Each strength point = 2 ton capacity<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const loadStress = gameState.testLoad / bridgeCapacity;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Animate truck crossing<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const truck = document.getElementById('testTruck');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truck.classList.remove('hidden');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truck.style.left = '-100px';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Update truck size based on load<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const truckEmoji = truck.querySelector('div');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (gameState.testLoad &lt;= 3) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truckEmoji.textContent = '🚗';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else if (gameState.testLoad &lt;= 6) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truckEmoji.textContent = '🚛';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truckEmoji.textContent = '🚚';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(() =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truck.style.left = 'calc(100% + 50px)';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}, 100);</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Add bridge animation based on load stress<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (loadStress &gt; 1.2) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Overloaded - show cracks first<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('crack-effect');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('test-animation');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Determine test result<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(() =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const success = loadStress &lt;= 1.0;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const catastrophicFailure = loadStress &gt; 1.5;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (catastrophicFailure) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Bridge collapses<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState.isCollapsed = true;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.remove('test-animation', 'crack-effect');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('collapse-animation');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;showTestResult(false, averageStrength, averageFlexibility, averageWaterResistance, true, loadStress);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;showTestResult(success, averageStrength, averageFlexibility, averageWaterResistance, false, loadStress);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Reset animations<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.remove('test-animation', 'crack-effect');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (success) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('success-glow');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.add('failure-shake');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(() =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;truck.classList.add('hidden');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!gameState.isCollapsed) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.remove('success-glow', 'failure-shake');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}, 2000);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}, 3000);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function showTestResult(success, strength, flexibility, waterResistance, collapsed, loadStress) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const resultDisplay = document.getElementById('resultDisplay');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const resultMessage = document.getElementById('resultMessage');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const capacity = strength * 2;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (collapsed) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.className = 'inline-block px-6 py-3 rounded-lg font-bold text-lg bg-red-100 text-red-800 border border-red-300';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.innerHTML = `<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;💥 JEMBATAN RUNTUH! 💥&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;span class="text-sm"&gt;Beban ${gameState.testLoad} ton terlalu berat untuk kapasitas ${capacity.toFixed(1)} ton!&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Stress: ${(loadStress * 100).toFixed(0)}% | Kekuatan: ${strength.toFixed(1)} | Fleksibilitas: ${flexibility.toFixed(1)}&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else if (success) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.className = 'inline-block px-6 py-3 rounded-lg font-bold text-lg bg-green-100 text-green-800 border border-green-300';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.innerHTML = `<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;🎉 JEMBATAN AMAN! 🎉&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;span class="text-sm"&gt;Beban ${gameState.testLoad} ton berhasil dilalui!&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Kapasitas: ${capacity.toFixed(1)} ton | Stress: ${(loadStress * 100).toFixed(0)}% | Kekuatan: ${strength.toFixed(1)}&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.className = 'inline-block px-6 py-3 rounded-lg font-bold text-lg bg-yellow-100 text-yellow-800 border border-yellow-300';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultMessage.innerHTML = `<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;⚠️ JEMBATAN RETAK! ⚠️&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;span class="text-sm"&gt;Beban ${gameState.testLoad} ton menyebabkan kerusakan!&lt;br&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Kapasitas: ${capacity.toFixed(1)} ton | Stress: ${(loadStress * 100).toFixed(0)}% | Berbahaya!&lt;/span&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultDisplay.classList.remove('hidden');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(() =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resultDisplay.classList.add('hidden');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}, 5000);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function resetGame() {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;gameState = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;budget: 500000,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;usedBudget: 0,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;selectedMaterial: null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bridgeParts: {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-left': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-right': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'deck': null,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'cables': null<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;},<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isBuilt: false,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;testLoad: 3,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;isCollapsed: false<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Reset visual elements<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.bridge-part').forEach(part =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.style.backgroundColor = '#9CA3AF';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.style.borderColor = '#6B7280';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.style.transform = '';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.style.opacity = '';<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;part.classList.remove('collapse-animation', 'crack-effect', 'success-glow', 'failure-shake', 'test-animation');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const emoji = part.querySelector('.material-emoji');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (emoji) emoji.remove();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.querySelectorAll('.material-card').forEach(card =&gt; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;card.classList.remove('selected');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Reset load slider<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('loadSlider').value = 3;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateLoadValue();</p><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateDisplay();<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateInfoPanel('Game direset! Mulai membangun jembatan baru.');<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function updateInfoPanel(message, type = 'info') {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const infoPanel = document.getElementById('infoPanel');<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const colors = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;info: 'bg-blue-50 border-blue-200 text-blue-700',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success: 'bg-green-50 border-green-200 text-green-700',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;warning: 'bg-yellow-50 border-yellow-200 text-yellow-700',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;error: 'bg-red-50 border-red-200 text-red-700'<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;infoPanel.className = `mt-6 p-4 border rounded-lg ${colors[type]}`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;infoPanel.innerHTML = `&lt;h3 class="font-bold mb-2"&gt;💡 Info:&lt;/h3&gt;&lt;p class="text-sm"&gt;${message}&lt;/p&gt;`;<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function getPartDisplayName(partName) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const names = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-left': 'Pondasi Kiri',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'foundation-right': 'Pondasi Kanan',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'deck': 'Lantai Jembatan',<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'cables': 'Kabel Penyangga'<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return names[partName] || partName;<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Element SDK implementation<br />&nbsp; &nbsp; &nbsp; &nbsp;async function onConfigChange(config) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('gameTitle').textContent = config.game_title || defaultConfig.game_title;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('budgetLabel').textContent = config.budget_label || defaultConfig.budget_label;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('materialsHeader').textContent = config.materials_header || defaultConfig.materials_header;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('buildButton').innerHTML = `${config.build_button || defaultConfig.build_button}`;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;document.getElementById('testButton').innerHTML = `${config.test_button || defaultConfig.test_button}`;<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function mapToCapabilities(config) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;recolorables: [],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;borderables: [],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fontEditable: undefined,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fontSizeable: undefined<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;function mapToEditPanelValues(config) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return new Map([<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["game_title", config.game_title || defaultConfig.game_title],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["budget_label", config.budget_label || defaultConfig.budget_label],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["materials_header", config.materials_header || defaultConfig.materials_header],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["build_button", config.build_button || defaultConfig.build_button],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;["test_button", config.test_button || defaultConfig.test_button]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;]);<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Initialize Element SDK<br />&nbsp; &nbsp; &nbsp; &nbsp;if (window.elementSdk) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;window.elementSdk.init({<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;defaultConfig,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;onConfigChange,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mapToCapabilities,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mapToEditPanelValues<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;});<br />&nbsp; &nbsp; &nbsp; &nbsp;}</p><p>&nbsp; &nbsp; &nbsp; &nbsp;// Start the game<br />&nbsp; &nbsp; &nbsp; &nbsp;initGame();<br />&nbsp; &nbsp;&lt;/script&gt;<br />&lt;script&gt;(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'99dd500fa600229b',t:'MTc2MzAyNjg4MC4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;<br />&lt;/html&gt;</p>]]></description>
	<dc:creator>Muh.Taqiuddin.S</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://sharka.site/3blog/blog/view/100/kasus-menumbuhkan-keberanian-bertanya</guid>
	<pubDate>Thu, 13 Nov 2025 10:40:36 +0800</pubDate>
	<link>https://sharka.site/3blog/blog/view/100/kasus-menumbuhkan-keberanian-bertanya</link>
	<title><![CDATA[Kasus : Menumbuhkan keberanian bertanya]]></title>
	<description><![CDATA[<div style="background-color:#e6faff;border-radius:10px;box-shadow:0 0 5px rgba(0,0,0,0.2);font-family:Arial, sans-serif;padding:20px;"><h2 style="color:#006666;text-align:center;">📘 Lembar Analisis Kasus Pembelajaran</h2><h3 style="color:#004d4d;">Petunjuk Umum:</h3><ol style="line-height:1.6;"><li><p style="margin-left:20px;">Bacalah setiap kasus dengan cermat.</p></li><li><p style="margin-left:20px;">Analisis situasi yang terjadi, kemudian tuliskan:</p><ol style="list-style-type:lower-latin;" type="a"><li><p style="margin-left:20px;">Identifikasi masalah pembelajaran.</p></li><li><p style="margin-left:20px;">Solusi atau langkah-langkah yang dapat diterapkan guru.</p></li><li><p style="margin-left:20px;">Strategi pembelajaran aktif dan penguatan berpikir kritis yang relevan.</p></li><li><p style="margin-left:20px;">Nilai karakter yang dapat dikembangkan.</p></li></ol></li><li><p style="margin-left:20px;">Gunakan pengalaman Anda di sekolah untuk mendukung jawaban.</p></li></ol><hr><figure class="table" style="width:100%;"><table style="border-collapse:collapse;border-spacing:0px;font-size:14px;" border="1" cellpadding="10"><thead style="background-color:#ccf2f2;"><tr><th style="text-align:center;width:5%;">No</th><th style="text-align:center;width:30%;">Komponen Analisis</th><th style="text-align:center;">Uraian Jawaban</th></tr></thead><tbody><tr><td style="text-align:center;">1</td><td><strong>Identifikasi Masalah Pembelajaran</strong></td><td>Siswa kurang aktif dalam berdiskusi dan cenderung pasif karena metode pembelajaran yang digunakan guru masih bersifat ceramah satu arah. Siswa kesulitan untuk menyusun kalimat untuk bertanya. Siswa tidak memahami materi sehingga tidak ada yang mau ditanyakan.</td></tr><tr><td style="text-align:center;">2</td><td><strong>Solusi / Langkah yang Dapat Diterapkan Guru</strong></td><td><p>Guru dapat membuat ice breaking diawal pembelajaran, berupa guru meletakkan 3 lokasi jawaban pertanyaan (Benar, Salah, Ragu - Ragu) lalu guru memberikan pertanyaan dan mengarahkan siswa untuk berkelompok ke lokasi benar, ragu - ragu dan salah, dan Guru dapat melakukan improvisasi dengan berpura - pura menjawab salah soal dan menyampaikan ke murid bahwa itu adalah jawaban yang benar.&nbsp;</p><p>Menerapkan pembelajaran berbasis masalah (PBL), membagi siswa ke dalam kelompok kecil, dan memberikan tugas kolaboratif yang menuntut partisipasi setiap anggota.</p></td></tr><tr><td style="text-align:center;">3</td><td><strong>Strategi Pembelajaran Aktif dan Penguatan Berpikir Kritis</strong></td><td>Strategi yang digunakan adalah <strong>Problem Based Learning (PBL)</strong> di mana siswa menganalisis masalah nyata, mendiskusikan solusi, dan mempresentasikan hasilnya. Kegiatan ini menumbuhkan kemampuan berpikir kritis melalui analisis, evaluasi, dan argumentasi logis.</td></tr><tr><td style="text-align:center;">4</td><td><strong>Nilai Karakter yang Dapat Dikembangkan</strong></td><td>Kerja sama, tanggung jawab, rasa ingin tahu, dan percaya diri.</td></tr><tr><td style="text-align:center;">5</td><td><strong>Pengalaman di Sekolah (Refleksi Pribadi)</strong></td><td>Saat saya menerapkan ice breaking diatas serta model PBL pada materi “Operasi Bilangan Bulat”, siswa menjadi lebih aktif bertanya dan saling membantu dalam memahami konsep. Hasilnya, keterlibatan dan hasil belajar meningkat signifikan.</td></tr></tbody></table></figure><p style="color:#004d4d;margin-top:20px;"><i>💡 <strong>Catatan:</strong> Isilah bagian jawaban berdasarkan kasus nyata atau pengalaman Anda sendiri di sekolah.</i></p></div>]]></description>
	<dc:creator>Muh.Taqiuddin.S</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://sharka.site/3blog/blog/view/99/tutorial-menggunakan-sketchup</guid>
	<pubDate>Wed, 12 Nov 2025 07:48:54 +0800</pubDate>
	<link>https://sharka.site/3blog/blog/view/99/tutorial-menggunakan-sketchup</link>
	<title><![CDATA[Tutorial menggunakan sketchUp]]></title>
	<description><![CDATA[<h3 style="color:#2e7d32;">🧱 Tutorial Membuat Kolam 4 x 6 Meter dengan SketchUp</h3><p><strong>Tujuan:</strong> Peserta didik mampu membuat desain kolam penampungan air ukuran <i>4 meter x 6 meter</i> menggunakan SketchUp secara mandiri.</p><h4><strong>Langkah-langkah:</strong></h4><ol><li><p><strong>Buka SketchUp</strong> dan pilih satuan dalam <i>meter</i>.</p><figure class="image image_resized" style="width:537px;"><img style="aspect-ratio:616/415;" src="https://sharka.site/3blog/serve-file/e0/l1763045804/di/c0/3COtQn5hoirO4qX_woyDSXNgywFSkiBsZ5gZNsAT8UA/editor_images/1/46/6915f1acd299d.jpg" width="616" height="415" alt=""></figure></li><li><p>Pilih <strong>Tools Rectangle</strong> di toolbar.</p><figure class="image"><img style="aspect-ratio:674/496;" src="https://sharka.site/3blog/serve-file/e0/l1763046082/di/c0/R3zPOuxqGP4LEg1glV4xjupmqiSfVIGene4eM7ylfiY/editor_images/1/46/6915f2c2260e9.jpg" width="674" height="496" alt=""></figure></li><li>Klik di area kerja, lalu ketik <code>6,4</code> pada keyboard dan tekan <strong>Enter</strong> untuk membuat dasar kolam berukuran 6 m x 4 m.</li><li>Pilih <strong>Push/Pull Tool</strong> (ikon balok naik-turun), arahkan ke bidang persegi panjang tadi, lalu tarik ke atas untuk membuat ketinggian kolam (misalnya 2 meter).</li><li>Setelah dinding kolam terbentuk, pilih <strong>Offset Tool</strong>, klik sisi atas kolam, lalu geser ke arah luar sejauh <code>0.5</code> meter untuk membentuk ketebalan dinding kolam.</li><li>Gunakan kembali <strong>Push/Pull Tool</strong> pada bidang tengah (bagian dalam) dan dorong ke bawah hingga mencapai dasar kolam, sehingga ruang kolam menjadi tampak kosong di dalam.</li><li>Hapus permukaan bagian atas kolam (cover) agar bagian dalam kolam terlihat jelas.</li><li>Pilih <strong>Paint Bucket Tool</strong> untuk memberikan pewarnaan. Gunakan warna biru muda atau tekstur air pada bagian dalam kolam yang akan dilapisi terpal.</li></ol><p><strong>Catatan:</strong> Pastikan tampilan orbit digunakan (tekan tombol tengah mouse dan geser) agar dapat melihat seluruh sisi kolam secara tiga dimensi.</p><p><strong>Hasil Akhir:</strong> Model 3D kolam ukuran 4 x 6 meter dengan dinding setebal 0,5 meter dan warna bagian dalam menyerupai kolam berlapis terpal.</p>]]></description>
	<dc:creator>Muh.Taqiuddin.S</dc:creator>		</item>
<item>
	<guid isPermaLink="true">https://sharka.site/3blog/blog/view/94/ai</guid>
	<pubDate>Sun, 02 Nov 2025 06:27:35 +0800</pubDate>
	<link>https://sharka.site/3blog/blog/view/94/ai</link>
	<title><![CDATA[AI]]></title>
	<description><![CDATA[<p>Video : <a href="https://aistudio.google.com">https://aistudio.google.com</a></p><p>workflow video : <a href="https://wan.video">https://wan.video</a></p><p>phet simulation</p><p>Polypad untuk bermain math</p><p><a href="https://www.ginifab.com/feeds/angle_measurement/">https://www.ginifab.com/feeds/angle_measurement/</a> (busur online)</p><p>https://sketchfab.com/ . Untuk IPa</p><p>Text : gemini</p><p>&nbsp;</p>]]></description>
	<dc:creator>Muh.Taqiuddin.S</dc:creator>		</item>
</channel>
</rss>
