<script type="module">
  import * as THREE from 'https://cdn.jsdelivr.net/npm/three@0.176.0/build/three.module.js';
  import { GLTFLoader } from 'https://cdn.jsdelivr.net/npm/three@0.176.0/examples/jsm/loaders/GLTFLoader.js';
  import { RGBELoader } from 'https://cdn.jsdelivr.net/npm/three@0.176.0/examples/jsm/loaders/RGBELoader.js';
  import { EffectComposer } from 'https://cdn.jsdelivr.net/npm/three@0.176.0/examples/jsm/postprocessing/EffectComposer.js';
  import { RenderPass } from 'https://cdn.jsdelivr.net/npm/three@0.176.0/examples/jsm/postprocessing/RenderPass.js';
  import { UnrealBloomPass } from 'https://cdn.jsdelivr.net/npm/three@0.176.0/examples/jsm/postprocessing/UnrealBloomPass.js';
  import { FilmPass } from 'https://cdn.jsdelivr.net/npm/three@0.176.0/examples/jsm/postprocessing/FilmPass.js';

  // ── Scene & Camera ──────────────────────────────────────────────
  const scene = new THREE.Scene();
  const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
  // Initialposition definieren
	const initialCamera = { x: 0, y: 0, z: 5 };
	camera.position.set(initialCamera.x, initialCamera.y, initialCamera.z);

  // ── Renderer ────────────────────────────────────────────────────
  const renderer = new THREE.WebGLRenderer({
    canvas: document.querySelector('#canvas_3D'),
    antialias: true,
  });
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.toneMapping = THREE.CineonToneMapping;
  renderer.toneMappingExposure = 0.85;
  renderer.outputColorSpace = THREE.SRGBColorSpace;

  // ── Post-Processing ─────────────────────────────────────────────
  const composer = new EffectComposer(renderer);
  composer.addPass(new RenderPass(scene, camera));

  const bloomPass = new UnrealBloomPass(
    new THREE.Vector2(window.innerWidth, window.innerHeight),
    0.35,   // Stärke  – anpassen nach Geschmack
    0.5,   // Radius
    0.85   // Schwellenwert (je niedriger, desto mehr leuchtet)
  );
  composer.addPass(bloomPass);

  const filmPass = new FilmPass(
    0.25,  // Grain-Stärke – anpassen nach Geschmack
    false  // Scanlines
  );
  composer.addPass(filmPass);

  // ── Resize ──────────────────────────────────────────────────────
  // Initiale Größe merken
	let canvasWidth = window.innerWidth;
	let canvasHeight = window.innerHeight;

	window.addEventListener('resize', () => {
  // Nur reagieren wenn sich die Breite ändert
  // oder die Höhe sich signifikant ändert (>100px = echtes Resize, nicht Browser-UI)
  	const widthChanged = window.innerWidth !== canvasWidth;
  	const heightChanged = Math.abs(window.innerHeight - canvasHeight) > 100;

  	if (!widthChanged && !heightChanged) return; // Browser-UI Änderung → ignorieren

  	// Neue Werte speichern
  	canvasWidth = window.innerWidth;
  	canvasHeight = window.innerHeight;

  	camera.aspect = canvasWidth / canvasHeight;
  	camera.updateProjectionMatrix();
  	renderer.setSize(canvasWidth, canvasHeight);
  	composer.setSize(canvasWidth, canvasHeight);
	});

  // ── HDRI Environment ────────────────────────────────────────────
  //Scene muss vor RGBELoader existieren
  const rgbeLoader = new RGBELoader();
  rgbeLoader.load(
    '/wp-content/uploads/2026/04/sundowner_overlook_1k.hdr',
    function (hdrTexture) {
      hdrTexture.mapping = THREE.EquirectangularReflectionMapping;
      scene.environment = hdrTexture;
    }
  );

  // ── Hintergrund ─────────────────────────────────────────────────
  const texture = new THREE.TextureLoader().load('/wp-content/uploads/2026/04/0d99a8372539a08ad0b509656ced9fb33590cbd4.png');
  scene.background = texture;

  // ── Licht ───────────────────────────────────────────────────────
  const ambientLight = new THREE.AmbientLight(0xffffff);
  const pointLight = new THREE.PointLight(0xffffff, 2);
  pointLight.position.set(-0.5, 1.5, 3);
  scene.add(ambientLight, pointLight);
	const pointLightHelper = new THREE.PointLightHelper(pointLight, 1); 
	//scene.add(pointLightHelper);
	

  // ── Modell ──────────────────────────────────────────────────────
  let model = null;
  const loader = new GLTFLoader();
  loader.load(
    '/wp-content/uploads/2026/04/LT_logo_glass.glb',
    function (gltf) {
      model = gltf.scene;
      /*
      model.traverse((child) => {
        if (child.isMesh) {
          child.material = new THREE.MeshPhysicalMaterial({
            color: 0xffffff,
            metalness: 0.1,
            roughness: 0.05,
            transmission: 0.95,
            thickness: 2.0,
            ior: 1.5,
            reflectivity: 0.9,
            transparent: true,
            envMapIntensity: 1.5,
          });
        }
      });
      */
      model.scale.set(0.1, 0.1, 0.1);
      model.position.set(-0.1, 1, 0);
      scene.add(model);
    },
    (xhr) => console.log((xhr.loaded / xhr.total * 100) + '% geladen'),
    (error) => console.error('Fehler:', error)
  );

  // ── Animate ─────────────────────────────────────────────────────



let scrollY = 0;
let targetCameraY = initialCamera.y;
let targetCameraZ = initialCamera.z;

window.addEventListener('scroll', () => {
  scrollY = document.body.getBoundingClientRect().top;
  targetCameraZ = initialCamera.z - scrollY * -0.005;
  targetCameraY = initialCamera.y + scrollY * -0.0025;
}, { passive: true });

/*
document.body.onscroll = moveCamera;
moveCamera();
*/
	
	
  const clock = new THREE.Clock(); 

	function animate() {
  	requestAnimationFrame(animate);
    camera.position.z += (targetCameraZ - camera.position.z) * 0.15;
  	camera.position.y += (targetCameraY - camera.position.y) * 0.15;
 
  
  if (model) {
    const t = clock.getElapsedTime(); 
    
      
    model.rotation.y = Math.sin(t * 0.5) * 0.15; // ±0.15 rad (~8°)
    model.rotation.x = Math.sin(t * 0.3) * 0.08; // ±0.08 rad (~4°)

    
  }

  composer.render();
}
animate();
</script>

Gute Unternehmen
verdienen gute
Geschichten.

LiberFam

Unsere eigene begann in einem Kinderzimmer. Mit einem zu langsamen PC und der Frage: „Wie macht man eigentlich eine Webseite?"
Das war vor über zehn Jahren. Heute sitzen wir in einem Büro mit über 200 Quadratmetern statt im Kinderzimmer, die Rechner sind schneller – und die Geschichten, die wir erzählen, sind größer geworden. Geblieben ist das, was uns damals angetrieben hat:
Echte Neugier, Perfektionismus bis zur Schmerzgrenze und die Überzeugung, dass gute Arbeit nur entsteht, wenn man sie mit Herz macht. Genau das bringen wir heute in jedes Unternehmen ein, das uns seine Geschichte anvertraut.

Wir sind LiberTec.
Wir bauen keine Websiten,
Wir schneiden keine Videos,
Wir machen kein Marketing,
Wir erzählen Geschichten.
Ihre Geschichte.

Unsere Philosophie

LiberDNA

    ZufriedenheitsgarantieSie werden Keine unzufriedenen Kunden finden.

    In unserer gesamten Firmengeschichte gab es keinen einzigen. Das ist kein Zufall, sondern Prinzip: Wir arbeiten so lange an einem Projekt, bis es wirklich passt – ohne Zusatzkosten, ohne Diskussion. Dafür wurden wir 2024 mit dem Oberlausitzer Unternehmerpreis ausgezeichnet.

    QualitätGut ist nicht gut genug.

    Wir sind Perfektionisten. Lieber drehen wir eine Runde mehr, prüfen zweimal, feilen ein drittes Mal.
    Nicht, weil wir müssen – sondern weil wir nicht anders können.

    IndividualitätKeine Vorlagen. Keine Copy-Paste-Projekte.

    Jedes Unternehmen ist einzigartig. Wir hören zu, tauchen ein, lernen kennen – und entwickeln Lösungen, die zu Ihnen passen.
    Statt Vorlagen mit KI-Texten zu füllen.

    KommunikationKlartext statt Floskeln.

    Ehrlich, direkt, offen. Intern wie extern. Auch wenn es mal unbequem wird – nur so entsteht Vertrauen. Und nur so wachsen beide Seiten.

    EinfachheitZurücklehnen statt To-do-Liste.

    Wir wissen, wie voll Ihr Kopf schon ist. Darum nehmen wir Arbeit ab, statt welche draufzupacken.
    Sie konzentrieren sich auf Ihr Geschäft. Um den Rest kümmern wir uns.

    ZuverlässigkeitEin Wort ist ein Versprechen.

    Deadlines sind keine Richtwerte. Absprachen sind bindend. Auf uns ist Verlass – immer.

    ErgebnisorientierungErgebnisse statt Ausreden.

    Am Ende zählt nicht, warum etwas nicht ging. Sondern, was funktioniert.
    Wir liefern Lösungen, die wirken – und gehen dafür die Extrameile.

    GeschwindigkeitSchnell. Ohne Abstriche.

    Ihre Zeit ist wertvoll. Darum arbeiten wir zügig. Aber nie auf Kosten der Qualität.

    ErreichbarkeitImmer nah, immer da.

    Mail, Telefon, WhatsApp – wir passen uns an Ihre Kommunikation an. Auch nach Feierabend. Auch am Wochenende, wenn es brennt.

    LeidenschaftEmotionen ohne Ausnahme.

    Webseiten, Videos, Social Media – was heute unser Beruf ist, war damals unser Hobby.
    Die Begeisterung von damals haben wir uns bewahrt.

    VerantwortungWir geben weiter, was wir haben.

    Sponsorings, ehrenamtliche Projekte, Praktika für junge Menschen – wir glauben, dass sich Glück verdoppelt, wenn man es teilt.

    Mehr als ein JobWir lieben, was wir tun.

    Wir nehmen unsere Arbeit ernst, aber uns selbst nicht. Die meisten von uns kennen sich seit über zehn Jahren.
    Gute Arbeit entsteht nur dort, wo echte Verbindungen sind – und davon haben wir jede Menge.

Die LiberFam

Team

Olgierd Linke

Paskal Müncheberg

Hannes Exner

Johannes Eichler

Anya Babiienko

Szymon Staśkiewicz

Moritz Weiss

Franz Burkhardt

Davin Falk

Filip Parkitny

Jakob Kollenda

Julian Mauermann

Anna Gemeinhardt

Mehr geben,
als man nimmt.

Seit unserer Gründung unterstützen wir Vereine und Initiativen aus der Region – mit dem, was wir am besten können. Webseiten, Videos, Kampagnen, Sichtbarkeit. Nicht als PR-Instrument, sondern als Überzeugung. Weil wir wissen, wo wir herkommen.
zu unseren Sponsorings

Sponsoring

Anfragen
kostenlos und unverbindlich

Projektanfrage

Erzählen Sie uns von Ihrem Projekt.