<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:media="http://search.yahoo.com/mrss/"
	
	>

<channel>
	<title>TSVELF DINGE — Sebastian Diehl</title>
	<link>https://tsvelfdinge.com</link>
	<description>TSVELF DINGE — Sebastian Diehl</description>
	<pubDate>Sat, 06 Jun 2026 18:31:36 +0000</pubDate>
	<generator>https://tsvelfdinge.com</generator>
	<language>en</language>
	
		
	<item>
		<title>001</title>
				
		<link>https://tsvelfdinge.com/001</link>

		<pubDate>Tue, 11 Jun 2024 08:37:34 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/001</guid>

		<description>Interdisziplinäre,
konzeptionelle Gestaltung, Kunst &#38;amp; Design // Siebdruckmanufaktur
TSVELF DINGE // Textildruck, Streetwear, Serigrafien – ITIDEM</description>
		
	</item>
		
		
	<item>
		<title>013</title>
				
		<link>https://tsvelfdinge.com/013</link>

		<pubDate>Tue, 30 Jul 2024 20:26:26 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/013</guid>

		<description>MANUFAKTUR


#overlay {
    position: absolute;
    z-index:100;
}




Shop für konzeptionell-grafische
T-Shirts, Streetwear, Serigrafien &#38;amp; mehr in Manufakturarbeit // Siebdruck mit umweltfreundlichen Farben // ITIDEM</description>
		
	</item>
		
		
	<item>
		<title>014</title>
				
		<link>https://tsvelfdinge.com/014-1</link>

		<pubDate>Fri, 05 Jun 2026 10:23:13 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/014-1</guid>

		<description>Individueller Textildruck

Merch, Corporate Fashion, Teamwear 

–

schon ab 10 Stück pro Motiv
Du benötigst bedruckte Textilien mit Deinem Motiv?
 
Ob für Teams, Events, Konzerte, Bands, Vereine, Abschlussklassen, Start-Ups, Messen, Künstler, Modelabel, Gastronomie, Unternehmen, usw. 

–

 via Siebdruck bringe ich Dein Motiv auf Textil.

Für ein unverbindliches Angebot nutze bitte&#38;nbsp;dieses Formular.



Alle Fragen noch offen zu Textilarten, Schnitten, Mengen, Textilfarben, Druckfarben, Deinem Motiv, Positionierungen, Druckgrößen, usw.?
Melde Dich unkompliziert und unverbindlich per Mail oder WhatsApp – ich berate Dich Schritt für Schritt bis zum Angebot.


Fair Shirt Paket


20 T-Shirts (Earth Positive, EP185) mit 1 Motiv nach Wahl, 1-farbig gedruckt, 
 zum Festpreis von 325€, all inclusive. 

Fülle weiter unten unverbindlich das Formular aus &#38;amp; ich melde mich zeitnah bei Dir.</description>
		
	</item>
		
		
	<item>
		<title>292</title>
				
		<link>https://tsvelfdinge.com/292</link>

		<pubDate>Mon, 09 Jun 2025 19:46:02 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/292</guid>

		<description>
&#60;img width="1778" height="2667" width_o="1778" height_o="2667" data-src="https://freight.cargo.site/t/original/i/80cd01520f802dcb1d971e9eeb90dd6271f24a31311d1c7af66dcaf50bd1ec72/Manufaktur_1.jpg" data-mid="234384385" border="0" data-no-zoom="true" src="https://freight.cargo.site/w/1000/i/80cd01520f802dcb1d971e9eeb90dd6271f24a31311d1c7af66dcaf50bd1ec72/Manufaktur_1.jpg" /&#62;
&#60;img width="1778" height="2667" width_o="1778" height_o="2667" data-src="https://freight.cargo.site/t/original/i/c79954c5ae37956f980f1f3e19b60318551427dde46ae5bc264e5b12848be8fa/Manufaktur_2.jpg" data-mid="234384386" border="0" data-no-zoom="true" src="https://freight.cargo.site/w/1000/i/c79954c5ae37956f980f1f3e19b60318551427dde46ae5bc264e5b12848be8fa/Manufaktur_2.jpg" /&#62;
&#60;img width="1714" height="2571" width_o="1714" height_o="2571" data-src="https://freight.cargo.site/t/original/i/b683c6ada4355e357482fa0ced2fd6f287514cb94c43b4028ae3facdac93f405/Manufaktur_5.jpg" data-mid="234384389" border="0" data-no-zoom="true" src="https://freight.cargo.site/w/1000/i/b683c6ada4355e357482fa0ced2fd6f287514cb94c43b4028ae3facdac93f405/Manufaktur_5.jpg" /&#62;
&#60;img width="1778" height="2667" width_o="1778" height_o="2667" data-src="https://freight.cargo.site/t/original/i/f6503d2c67752d533bab4f3ac3065e0812da65f21d835f58ffc9074d7e4c1374/Manufaktur_3.jpg" data-mid="234384387" border="0" data-no-zoom="true" src="https://freight.cargo.site/w/1000/i/f6503d2c67752d533bab4f3ac3065e0812da65f21d835f58ffc9074d7e4c1374/Manufaktur_3.jpg" /&#62;
&#60;img width="1335" height="2000" width_o="1335" height_o="2000" data-src="https://freight.cargo.site/t/original/i/36e8bc9254dcc17eab6ef8954e60e7f255a22f735edaf980ff060ebafd781dc0/_MG_4235.jpg" data-mid="234384400" border="0" data-no-zoom="true" src="https://freight.cargo.site/w/1000/i/36e8bc9254dcc17eab6ef8954e60e7f255a22f735edaf980ff060ebafd781dc0/_MG_4235.jpg" /&#62;
&#60;img width="1778" height="2667" width_o="1778" height_o="2667" data-src="https://freight.cargo.site/t/original/i/b0d0045420c64868572e0384ebd8f35d0355374af2de7999562e9630edfa8bd6/Manufaktur_4.jpg" data-mid="234384388" border="0" data-no-zoom="true" src="https://freight.cargo.site/w/1000/i/b0d0045420c64868572e0384ebd8f35d0355374af2de7999562e9630edfa8bd6/Manufaktur_4.jpg" /&#62;
</description>
		
	</item>
		
		
	<item>
		<title>293 copy</title>
				
		<link>https://tsvelfdinge.com/293-copy</link>

		<pubDate>Sat, 06 Jun 2026 18:31:36 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/293-copy</guid>

		<description>
	HandarbeitIm Siebdruckverfahren wird jeder Druck auf dem Handkarusell sorgfältig abgedruckt und ergibt ein hochwertiges und langlebiges Druckbild.
	Nachhaltigkeit
Zum Einsatz kommen lösemittelfreie, wasserbasierte Farben, formaldehydfreie Discharge-Farben (Bleichprozess, nur für dunkle Textilien) und phthalatfreie Pastisolfarben.

	TextilienDer Fokus liegt auf hochwertigen Textilien aus 100% Naturfaser. Große Auswahl konventionell oder nachhaltig/fair produzierter &#38;amp; zertifizierter Stoffe.

	UmweltKleine und mittlere Stückzahlen &#38;amp; nur das, was wirklich gebraucht wird. Bei einfarbigen Motiven kann bereits ab 10 Exemplaren veredelt werden. Größen frei wählbar.


	Papier statt Stoff
Du brauchst bedruckte Papiertaschen, Verpackungen, Poster oder Kunstdrucke? Auch Papier kann im Siebdruckverfahren bedruckt werden.
	Aus einer HandTransferdruck bei kniffligen Druckpositionen, Druckdatenaufbereitung oder die Gestaltung von Motiven sind möglich 

–

 für hochwertige, einheitliche Ergebnisse.

</description>
		
	</item>
		
		
	<item>
		<title>294</title>
				
		<link>https://tsvelfdinge.com/294</link>

		<pubDate>Sat, 06 Jun 2026 14:40:09 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/294</guid>

		<description>


#fairshirtModal {
  font-family: "CrimsonPro", serif;
}

#fairshirtModal input,
#fairshirtModal textarea,
#fairshirtModal button,
#fairshirtModal select {
  font-family: "CrimsonPro", serif;
  font-size: 15px;
}

#fairshirtModal input[type="text"],
#fairshirtModal input[type="email"],
#fairshirtModal input[type="number"],
#fairshirtModal textarea {
  width: 100%;
  max-width: 325px;
  padding: 7px 10px;
  box-sizing: border-box;
}

#fairshirtModal input::placeholder,
#fairshirtModal textarea::placeholder {
  font-size: 15px;
  color: #888;
}

#fairshirtModal textarea {
  resize: vertical;
}

#fairshirtModal button {
  padding: 8px 14px;
  cursor: pointer;
}

#fairshirtModal input[type="checkbox"],
#fairshirtModal input[type="radio"] {
  width: auto;
  margin: 0;
  padding: 0;
}

#fairshirtModal label {
  font-family: "CrimsonPro", serif;
  display: inline;
}

#fairshirtModal .tile-group {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 10px;
}

#fairshirtModal .tile {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 4px 8px;
  border: 1px solid #ddd;
  border-radius: 4px;
  cursor: pointer;
}

#fairshirtModal small {
  display: block;
  line-height: 1.25;
}

#fairshirtModal .dynamic-label {
  font-size: 16px;
  font-weight: bold;
  line-height: 1.6;
  margin: 2px 0;
}

#fairshirtModal .fs-field {
  margin-bottom: 18px;
}

#fairshirtModal .fs-field &#62; small {
  margin-bottom: 6px;
}

#fairshirtModal h1 {
  margin-bottom: 16px;
}

#fairshirtModal .size-row {
  display: flex;
  align-items: center;
  gap: 8px;
}

#fairshirtModal .size-row label {
  width: 36px;
  font-weight: bold;
}

#fairshirtModal .size-row input[type="number"] {
  width: 70px;
  max-width: 70px;
  padding: 7px 10px;
  box-sizing: border-box;
}

#fairshirtModal .size-rows {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 8px;
}

#fairshirtModal .size-rows-line {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
}

#fs-counter {
  font-size: 15px;
  margin-top: 8px;
}

#fs-counter.over {
  color: red;
  font-weight: bold;
}

#fs-counter.exact {
  color: green;
  font-weight: bold;
}

#fairshirtModal .dropzone {
  border: 2px dashed #bbb;
  padding: 18px;
  max-width: 325px;
  cursor: pointer;
  text-align: center;
  transition: 0.2s;
}

#fairshirtModal .dropzone:hover {
  border-color: #333;
}

#fairshirtModal #fs-fileList {
  list-style: none;
  padding: 0;
  margin-top: 8px;
  font-size: 13px;
}

#fs-position-details {
  display: none;
  margin-top: 8px;
}

#fairshirtModal .success-message {
  font-size: 16px;
  line-height: 1.6;
  padding: 16px 0;
}







Fair Shirt Paket


  20 T-Shirts (Earth Positive, EP185) mit 1 Motiv nach Wahl, 1-farbig gedruckt,
 inkl. Versand – für 325 €. Stelle jetzt eine unverbindliche Anfrage.
  * Pflichtfelder





  

  
  
    Deine Kontaktdaten:
    
  

  
    
  

  
    
  

  
    
  

  
  
    *Gewünschte Textilfarbe:
    Bitte wähle aus den verfügbaren Farben auf der EP185 Produktseite.
    
  

  
  
    *Druckposition:
    
      
        
        Vorderseite
      
      
        
        Rückseite
      
    
    
      Details
      
        
      
      
        
      
    
  

  
  
    *Gewünschte Druckfarbe:
    
  

  
  
    *Größenverteilung – gesamt 20 Stück:
    Passe die Anzahl pro Größe nach Bedarf an. 
Die Größentabelle findest Du auf der EP185 Produktseite.

    
      
        
          
          XS
        
        
          
          S
        
        
          
          M
        
        
          
          L
        
      
      
        
          
          XL
        
        
          
          XXL
        
        
          
          3XL
        
      
    
    20 / 20 gewählt
  

  
  
    *Lade hier Dein Motiv hoch:
    nur PNG, JPEG, PDF und SVG

    

    
      Datei hier ablegen oder klicken
      max. 1 Datei / max. 10 MB
      
    
  

  
  
    Hast Du weitere Fragen, Wünsche oder Anmerkungen?
    
  

  
  
    
      
        
        Ich habe die Datenschutzerklärung gelesen und stimme der Verarbeitung meiner Angaben zur Bearbeitung meiner Anfrage zu.*
      
    
  

  Anfrage absenden










document.addEventListener("DOMContentLoaded", function () {

  const form = document.getElementById("fairshirtForm");
  const dropzone = document.getElementById("fs-dropzone");
  const fileInput = document.getElementById("fs-fileInput");
  const fileList = document.getElementById("fs-fileList");
  const counter = document.getElementById("fs-counter");
  const formWrapper = document.getElementById("fs-formWrapper");
  const positionDetails = document.getElementById("fs-position-details");
  const sizes = ["xs","s","m","l","xl","xxl","3xl"];
  let fsFiles = [];

  // Druckposition Details ein-/ausblenden
  document.querySelectorAll('input[name="position"]').forEach(function(radio) {
    radio.addEventListener("change", function() {
      positionDetails.style.display = "block";
    });
  });

  // Größen-Zähler
  function updateCounter() {
    const total = sizes.reduce(function(sum, size) {
      return sum + (parseInt(document.getElementById("fs-" + size).value) &#124;&#124; 0);
    }, 0);
    counter.textContent = total + " / 20 gewählt";
    counter.className = total &#62; 20 ? "over" : total === 20 ? "exact" : "";
  }

  sizes.forEach(function(size) {
    document.getElementById("fs-" + size).addEventListener("input", updateCounter);
  });

  updateCounter();

  // Dropzone
  dropzone.addEventListener("click", function(e) {
    if (e.target.classList.contains("remove-file")) return;
    fileInput.click();
  });

  dropzone.addEventListener("dragover", function(e) {
    e.preventDefault();
    dropzone.style.borderColor = "#000";
  });

  dropzone.addEventListener("dragleave", function() {
    dropzone.style.borderColor = "#bbb";
  });

  dropzone.addEventListener("drop", function(e) {
    e.preventDefault();
    e.stopPropagation();
    dropzone.style.borderColor = "#bbb";
    const dropped = [...e.dataTransfer.files];
    fsFiles = [
      ...fsFiles,
      ...dropped.filter(function(nf) {
        return !fsFiles.some(function(ef) { return ef.name === nf.name &#38;&#38; ef.size === nf.size; });
      })
    ];
    if (fsFiles.length &#62; 1) {
      alert("Maximal 1 Datei erlaubt");
      fsFiles = fsFiles.slice(0, 1);
    }
    renderFileList();
  });

  fileInput.addEventListener("change", function() {
    const newFiles = [...fileInput.files];
    fsFiles = [
      ...fsFiles,
      ...newFiles.filter(function(nf) {
        return !fsFiles.some(function(ef) { return ef.name === nf.name &#38;&#38; ef.size === nf.size; });
      })
    ];
    if (fsFiles.length &#62; 1) {
      alert("Maximal 1 Datei erlaubt");
      fsFiles = fsFiles.slice(0, 1);
    }
    renderFileList();
  });

  function renderFileList() {
    fileList.innerHTML = "";
    fsFiles.forEach(function(file, index) {
      const li = document.createElement("li");
      li.innerHTML = file.name + ' ✕';
      fileList.appendChild(li);
    });
  }

  fileList.addEventListener("click", function(e) {
    if (!e.target.classList.contains("remove-file")) return;
    e.stopPropagation();
    fsFiles.splice(Number(e.target.dataset.index), 1);
    renderFileList();
  });

  // Submit
  form.addEventListener("submit", async function(e) {
    e.preventDefault();

    if (this.website.value !== "") return;

    const name = form.querySelector('[name="name"]').value.trim();
    const address = form.querySelector('[name="address"]').value.trim();
    const email = form.querySelector('[name="email"]').value.trim();
    const textileColor = form.querySelector('[name="textile_color"]').value.trim();
    const printColor = form.querySelector('[name="print_color"]').value.trim();
    const position = form.querySelector('input[name="position"]:checked');
    const privacy = form.querySelector('[name="privacy"]').checked;

    if (!name) { alert("Bitte gib deinen Namen an."); return; }
    if (!address) { alert("Bitte gib deine Adresse an."); return; }
    if (!email) { alert("Bitte gib deine E-Mail-Adresse an."); return; }
    if (!textileColor) { alert("Bitte gib eine Textilfarbe an."); return; }
    if (!position) { alert("Bitte wähle eine Druckposition."); return; }

    const printSize = form.querySelector('[name="print_size"]').value.trim();
    const printLocation = form.querySelector('[name="print_location"]').value.trim();
    if (!printSize) { alert("Bitte gib die gewünschte Druckgröße an."); return; }
    if (!printLocation) { alert("Bitte gib an, wo genau gedruckt werden soll."); return; }

    if (!printColor) { alert("Bitte gib eine Druckfarbe an."); return; }

    const total = sizes.reduce(function(sum, size) {
      return sum + (parseInt(document.getElementById("fs-" + size).value) &#124;&#124; 0);
    }, 0);

    if (total !== 20) {
      alert("Die Größenverteilung muss genau 20 Stück ergeben. Aktuell: " + total);
      return;
    }

    if (fsFiles.length === 0) {
      alert("Bitte lade Dein Motiv hoch.");
      return;
    }

    const allowedTypes = ["image/png","image/jpeg","application/pdf","image/svg+xml"];
    const file = fsFiles[0];

    if (file.size &#62; 10 * 1024 * 1024) {
      alert("Die Datei ist zu groß (max. 10 MB).");
      return;
    }

    if (!allowedTypes.includes(file.type)) {
      alert("Nicht erlaubtes Dateiformat. Nur PDF, PNG, JPG und SVG sind erlaubt.");
      return;
    }

    if (!privacy) { alert("Bitte stimme der Datenschutzerklärung zu."); return; }

    const submitBtn = form.querySelector('button[type="submit"]');
    submitBtn.disabled = true;
    submitBtn.textContent = "Wird gesendet…";

    // Summary
    const NL = String.fromCharCode(13, 10);
    let summary = "";

    summary += "FAIR SHIRT PAKET – ANFRAGE" + NL;
    summary += "====================" + NL + NL;

    summary += "KONTAKTDATEN" + NL;
    summary += "====================" + NL;
    summary += "Name: " + name + NL;
    if (form.company.value.trim()) summary += "Firma/Verein: " + form.company.value.trim() + NL;
    summary += "Adresse: " + address + NL;
    summary += "E-Mail: " + email + NL + NL;

    summary += "PAKET" + NL;
    summary += "====================" + NL;
    summary += "Modell: EP185 von Earth Positive" + NL;
    summary += "Textilfarbe: " + textileColor + NL;
    summary += "Druckposition: " + position.value + NL;
    if (printSize) summary += "Druckgröße: " + printSize + NL;
    if (printLocation) summary += "Position genau: " + printLocation + NL;
    summary += "Druckfarbe: " + printColor + NL + NL;

    summary += "GRÖSSEN" + NL;
    summary += "====================" + NL;
    sizes.forEach(function(size) {
      const val = parseInt(document.getElementById("fs-" + size).value) &#124;&#124; 0;
      if (val &#62; 0) summary += size.toUpperCase() + ": " + val + " Stück" + NL;
    });
    summary += "Gesamt: 20 Stück" + NL + NL;

    summary += "DATEI" + NL;
    summary += "====================" + NL;
    summary += "• " + file.name + NL + NL;

    if (form.notes.value.trim()) {
      summary += "ANMERKUNGEN" + NL;
      summary += "====================" + NL;
      summary += form.notes.value.trim() + NL + NL;
    }

    summary += "DATENSCHUTZ &#38; ZEITSTEMPEL" + NL;
    summary += "====================" + NL;
    summary += "Datenschutz zugestimmt: ja" + NL;
    summary += "Abgesendet am: " + new Date().toLocaleString("de-DE") + NL;

    const formData = new FormData(form);
    fsFiles.forEach(function(f) { formData.append("files", f); });
    formData.append("summary", summary);
    formData.append("submitted_at", new Date().toISOString());

    try {
      await fetch("https://hook.eu1.make.com/da6s3yq4fhiu12p3cpqwrhpwmnjy6vvk", {
        method: "POST",
        body: formData
      });

      formWrapper.innerHTML = 'Danke, Deine Anfrage ist eingegangen. Ich melde mich zeitnah bei Dir.';

    } catch (err) {
      alert("Beim Senden ist ein Fehler aufgetreten. Bitte versuche es erneut oder kontaktiere mich direkt.");
      console.error(err);
      submitBtn.disabled = false;
      submitBtn.textContent = "Anfrage absenden";
    }

  });

});
</description>
		
	</item>
		
		
	<item>
		<title>016</title>
				
		<link>https://tsvelfdinge.com/016</link>

		<pubDate>Wed, 14 May 2025 11:57:12 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/016</guid>

		<description>

&#60;img width="300" height="285" width_o="300" height_o="285" data-src="https://freight.cargo.site/t/original/i/9f4f1d8d855c3d741d004c8af579774b33416d1545f3c04078d9e668a9cbd154/12D_300px.png" data-mid="233185160" border="0" data-scale="6" data-no-zoom data-icon-mode src="https://freight.cargo.site/w/300/i/9f4f1d8d855c3d741d004c8af579774b33416d1545f3c04078d9e668a9cbd154/12D_300px.png" /&#62;
︎Instagram&#38;nbsp; &#38;nbsp; 

︎TikTok&#38;nbsp; &#38;nbsp; ︎WhatsAppAlle Beträge steuerbefreit gemäß § 19 UStG






Copyright ©&#38;nbsp;, Sebastian Diehl



AGB &#38;amp; Widerrufsbelehrung



 


 Datenschutzerklärung &#38;amp; Cookie-Richtlinie





Impressum

</description>
		
	</item>
		
		
	<item>
		<title>295</title>
				
		<link>https://tsvelfdinge.com/295</link>

		<pubDate>Thu, 04 Jun 2026 19:59:53 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/295</guid>

		<description>MANUFAKTUR


#overlay {
    position: absolute;
    z-index:100;
}




Shop für konzeptionell-grafische
T-Shirts, Streetwear, Serigrafien &#38;amp; mehr in Manufakturarbeit // Siebdruck mit umweltfreundlichen Farben // ITIDEM</description>
		
	</item>
		
		
	<item>
		<title>296</title>
				
		<link>https://tsvelfdinge.com/296</link>

		<pubDate>Wed, 03 Jun 2026 21:24:28 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/296</guid>

		<description>


#texprintModal {
  font-family: "CrimsonPro", serif;
}

#texprintModal input,
#texprintModal textarea,
#texprintModal button,
#texprintModal select {
  font-family: "CrimsonPro", serif;
  font-size: 15px;
}

#texprintModal input[type="text"],
#texprintModal input[type="email"],
#texprintModal input[type="tel"],
#texprintModal input[type="number"],
#texprintModal input[type="date"],
#texprintModal textarea,
#texprintModal select {
  width: 100%;
  max-width: 325px;
  padding: 7px 10px;
  box-sizing: border-box;
}

#texprintModal input::placeholder,
#texprintModal textarea::placeholder {
  font-size: 15px;
  color: #888;
}

#texprintModal textarea {
  resize: vertical;
}

#texprintModal button {
  padding: 8px 14px;
  cursor: pointer;
}

#texprintModal input[type="checkbox"] {
  width: auto;
  margin: 0;
  padding: 0;
}

#texprintModal label {
  font-family: "CrimsonPro", serif;
  display: inline;
}

#texprintModal .tile-group {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 10px;
}

#texprintModal .tile {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 4px 8px;
  border: 1px solid #ddd;
  border-radius: 4px;
}

#texprintModal small {
  display: block;
  line-height: 1.25;
}

#texprintModal .dropzone {
  border: 2px dashed #bbb;
  padding: 18px;
  max-width: 325px;
  cursor: pointer;
  text-align: center;
  transition: 0.2s;
}

#texprintModal .dropzone:hover {
  border-color: #333;
}

#texprintModal #fileList {
  list-style: none;
  padding: 0;
  margin-top: 8px;
  font-size: 13px;
}

#texprintModal .dynamic-label {
  font-size: 16px;
  font-weight: bold;
  line-height: 1.6;
  margin: 2px 0;
}

/* Abstände zwischen Formularblöcken */
#texprintModal .tp-field {
  margin-bottom: 18px;
}

#texprintModal .tp-field &#62; small {
  margin-bottom: 6px;
}

#texprintModal h1 {
  margin-bottom: 12px;
}

#texprintModal h2 {
  margin-bottom: 18px;
}

#quantityBox div,
#colorBox div,
#positionSizeBox div {
  margin-bottom: 10px;
}

#quantityBox input,
#colorBox input,
#positionSizeBox input {
  margin-top: 4px;
}







Individueller Textildruck
Für ein unverbindliches Angebot, fülle einfach das Formular aus.
  Solltest Du Dir unsicher sein – kein Problem – schreib mir einfach bei WhatsApp, per Mail oder nutze das Feld am Ende des Formulars für Fragen.
  * Pflichtfelder




  

  
  
    Deine Kontaktdaten:
    
  

  
    
  

  
    
  

  
    
  

  
  
    *Welche Textilarten sollen bedruckt werden?
Wähle anschließend die Textilfarbe/n und die jeweilige Mengenverteilung pro Farbe. 
Beachte: Nicht weniger als 10 Exemplare pro Textilfarbe und Textilart.
    
      T-Shirts
      Longsleeves
      Hoodies/Kapuzenpullover
      Sweatshirts/Pullover
      Poloshirts
      Stoffbeutel
      Sonstige
    
    
  

  
  
    Sind bestimmte Textilhersteller und ggf. spezifische Modelle gewünscht?
    Falls bekannt, bitte Hersteller oder Modelle angeben.
    
  

  
  
    Was ist bei den Textilien besonders wichtig?
    
      100% Baumwolle/Naturfaser
      wenn möglich bio/fair
      dicker Stoff
      dünner Stoff
      Passform/Schnitt/Style
      günstiger Preis
    
  

  
  
    Lade hier Dein/e bereits vorhandenen Motiv/e hoch.
    Bitte lege Deine Motive in den gewünschten Druckfarben an.
    
    
      Dateien hier ablegen oder klicken
      nur PNG, JPEG, PDF und SVG / max. 5 Dateien / je 10MB
      
    
  

  
  
    An welchen Positionen sollen die Textilien bedruckt werden?
    Bitte jeweils Dateiname &#38;amp; Druckgröße angeben (z.B. Logo.png&#38;nbsp;

–&#38;nbsp;4x7cm, Brusthöhe links).
    
      Vorderseite
      Rückseite
      Ärmel
      Nackeninnendruck
    
    
  

  
  
    Was sind die Anforderungen an den Druck?
    Bitte wähle nur die wichtigsten Punkte – nicht alles kann berücksichtigt werden.
    
      hohe Umweltfreundlichkeit
      hohe Deckkraft/Brillianz
      hohe Elastizität
      hoher Reibungswiderstand
      hohe Waschbelastung
      hohe Farbgenauigkeit/Farbstabilität
      bestmögliche Atmungsaktivität
    
  

  
  
    Bis wann benötigst Du die Textilien spätestens?
    
  

  
  
    *Wie möchtest Du die fertigen Textilien erhalten?
    
      bitte wählen
      Versand
      Abholung
    
  

  
  
    Hast Du weitere Fragen, Wünsche oder Anmerkungen?
    
  

  
  
    
      Ich habe die Datenschutzerklärung gelesen und stimme der Verarbeitung meiner Angaben zur Bearbeitung meiner Anfrage zu.*
    
  

  Anfrage absenden








function initTexprintForm() {
  if (!document.getElementById("texprintForm")) return;

  const form = document.getElementById("texprintForm");
  const dropzone = document.getElementById("dropzone");
  const fileInput = document.getElementById("fileInput");
  const fileList = document.getElementById("fileList");
  const colorBox = document.getElementById("colorBox");
  const positionSizeBox = document.getElementById("positionSizeBox");

  const state = {
    textiles: {},
    colors: {},
    positions: {},
    positionData: {},
    selectedTextiles: [],
    selectedTraits: [],
    selectedPositions: [],
    selectedPrintTraits: [],
    files: [],
    otherTextile: ""
  };

  function getTextileLabel(textile) {
    if (textile === "Sonstige" &#38;&#38; state.otherTextile &#38;&#38; state.otherTextile.trim() !== "") {
      return state.otherTextile.trim();
    }
    return textile;
  }

  function updateSelections() {
    state.selectedTextiles = [...document.querySelectorAll('input[name="textiles[]"]:checked')].map(cb =&#62; cb.value);
    state.selectedTraits = [...document.querySelectorAll('input[name="traits[]"]:checked')].map(cb =&#62; cb.value);
    state.selectedPositions = [...document.querySelectorAll('input[name="positions[]"]:checked')].map(cb =&#62; cb.value);
    state.selectedPrintTraits = [...document.querySelectorAll('input[name="printtraits[]"]:checked')].map(cb =&#62; cb.value);
  }

  function showToast(msg) {
    const t = document.createElement("div");
    t.textContent = msg;
    t.style.position = "fixed";
    t.style.bottom = "20px";
    t.style.left = "50%";
    t.style.transform = "translateX(-50%)";
    t.style.background = "#111";
    t.style.color = "#fff";
    t.style.padding = "10px 14px";
    t.style.fontSize = "13px";
    t.style.zIndex = "9999";
    t.style.borderRadius = "6px";
    document.body.appendChild(t);
    setTimeout(() =&#62; t.remove(), 2500);
  }

  dropzone.addEventListener("click", (e) =&#62; {
    if (e.target.classList.contains("remove-file")) return;
    fileInput.click();
  });

  dropzone.addEventListener("dragover", (e) =&#62; {
    e.preventDefault();
    dropzone.style.borderColor = "#000";
  });

  dropzone.addEventListener("dragleave", () =&#62; {
    dropzone.style.borderColor = "#bbb";
  });

  dropzone.addEventListener("drop", (e) =&#62; {
    e.preventDefault();
    e.stopPropagation();
    dropzone.style.borderColor = "#bbb";
    const droppedFiles = [...e.dataTransfer.files];
    state.files = [...state.files, ...droppedFiles.filter(nf =&#62; !state.files.some(ef =&#62; ef.name === nf.name &#38;&#38; ef.size === nf.size))];
    if (state.files.length &#62; 5) { alert("Maximal 5 Dateien erlaubt"); state.files = state.files.slice(0, 5); }
    renderFileList();
  });

  fileInput.addEventListener("change", handleFiles);

  function handleFiles() {
    const newFiles = [...fileInput.files];
    state.files = [...state.files, ...newFiles.filter(nf =&#62; !state.files.some(ef =&#62; ef.name === nf.name &#38;&#38; ef.size === nf.size))];
    if (state.files.length &#62; 5) { alert("Maximal 5 Dateien erlaubt"); state.files = state.files.slice(0, 5); }
    renderFileList();
  }

  function renderFileList() {
    fileList.innerHTML = "";
    state.files.forEach((file, index) =&#62; {
      const li = document.createElement("li");
      li.innerHTML = `${file.name} ✕`;
      fileList.appendChild(li);
    });
  }

  fileList.addEventListener("click", function(e) {
    if (!e.target.classList.contains("remove-file")) return;
    e.stopPropagation();
    state.files.splice(Number(e.target.dataset.index), 1);
    renderFileList();
  });

  function handleOtherTextile() {
    const selected = [...document.querySelectorAll('input[name="textiles[]"]:checked')].map(e =&#62; e.value);
    const hasOther = selected.includes("Sonstige");
    let existing = document.getElementById("otherTextileField");

    if (hasOther &#38;&#38; !existing) {
      const wrapper = document.createElement("div");
      wrapper.id = "otherTextileField";
      wrapper.innerHTML = `
        Bitte Textilart spezifizieren
        
      `;
      const otherInput = wrapper.querySelector('input[name="textiles_other"]');
      otherInput.addEventListener("input", e =&#62; {
        state.otherTextile = e.target.value;
        document.querySelectorAll('[data-textile="Sonstige"] .dynamic-label').forEach(label =&#62; {
          label.textContent = getTextileLabel("Sonstige") + " Farben + Menge";
        });
        updatePositions();
      });
      colorBox.before(wrapper);
    }

    if (!hasOther &#38;&#38; existing) {
      state.otherTextile = "";
      existing.remove();
    }
  }

  document.querySelectorAll('input[name="textiles[]"]').forEach(cb =&#62; {
    cb.addEventListener("change", () =&#62; { handleTextiles(); handleOtherTextile(); });
  });

  function handleTextiles() {
    const selected = [...document.querySelectorAll('input[name="textiles[]"]:checked')].map(e =&#62; e.value);
    Object.keys(state.textiles).forEach(t =&#62; {
      if (!selected.includes(t)) {
        delete state.textiles[t];
        delete state.colors[t];
        document.querySelector(`[data-textile="${t}"]`)?.remove();
        showToast(`${t} entfernt`);
      }
    });
    selected.forEach(t =&#62; {
      if (!state.textiles[t]) { state.textiles[t] = true; createColorBlock(t); }
    });
    updatePositions();
  }

  function createColorBlock(textile) {
    const wrapper = document.createElement("div");
    wrapper.dataset.textile = textile;
    wrapper.innerHTML = `
      ${getTextileLabel(textile)} Farben + Menge
      
      + Farbe
    `;
    const group = wrapper.querySelector(".color-group");
    const btn = wrapper.querySelector("button");
    state.colors[textile] = state.colors[textile] &#124;&#124; [];
    btn.addEventListener("click", () =&#62; addColor(textile, group));
    colorBox.appendChild(wrapper);
  }

  function addColor(textile, group) {
    if (!state.colors[textile]) state.colors[textile] = [];
    if (state.colors[textile].length &#62;= 5) { alert("Maximal 5 Farben pro Textilart"); return; }
    state.colors[textile].push({ color: "", qty: "" });
    renderColorGroup(textile, group);
    updatePositions();
  }

  function renderColorGroup(textile, group) {
    group.innerHTML = "";
    state.colors[textile].forEach((entry, index) =&#62; {
      const row = document.createElement("div");
      row.className = "color-entry";
      row.innerHTML = `
        
        
        ✕
      `;
      const inputs = row.querySelectorAll("input");
      inputs[0].addEventListener("input", e =&#62; { state.colors[textile][index].color = e.target.value; updatePositions(); });
      inputs[1].addEventListener("input", e =&#62; { state.colors[textile][index].qty = e.target.value; updatePositions(); });
      row.querySelector(".remove").addEventListener("click", () =&#62; {
        state.colors[textile].splice(index, 1);
        renderColorGroup(textile, group);
        showToast("Farbe entfernt");
        updatePositions();
      });
      group.appendChild(row);
    });
  }

  document.querySelectorAll('input[name="positions[]"]').forEach(cb =&#62; {
    cb.addEventListener("change", handlePositions);
  });

  function handlePositions() {
    const selected = [...document.querySelectorAll('input[name="positions[]"]:checked')].map(e =&#62; e.value);
    Object.keys(state.positions).forEach(p =&#62; { if (!selected.includes(p)) delete state.positions[p]; });
    selected.forEach(p =&#62; { state.positions[p] = true; });
    updatePositions();
  }

  function updatePositions() {
    positionSizeBox.innerHTML = "";
    Object.keys(state.positions).forEach(pos =&#62; { createPositionBlock(pos); });
  }

  function createPositionBlock(position) {
    const wrapper = document.createElement("div");
    wrapper.innerHTML = `${position}`;
    const group = wrapper.querySelector(".position-group");
    positionSizeBox.appendChild(wrapper);
    renderPositionInputs(position, group);
  }

  function renderPositionInputs(position, group) {
    group.innerHTML = "";
    Object.keys(state.colors).forEach(textile =&#62; {
      state.colors[textile].forEach((c, i) =&#62; {
        if (!c?.color &#124;&#124; !c?.qty) return;
        const key = `${position}_${textile}_${i}`;
        if (!state.positionData[key]) state.positionData[key] = { motif: "", size: "" };

        const btn = document.createElement("button");
        btn.type = "button";
        btn.textContent = `${getTextileLabel(textile)} · ${c.color} (${c.qty})`;
        btn.style.marginBottom = "4px";
        btn.style.display = "block";

        const detail = document.createElement("div");
        detail.style.display = "none";
        detail.style.marginBottom = "10px";
        detail.innerHTML = `
          
          
        `;

        btn.addEventListener("click", () =&#62; {
          const isOpen = detail.style.display === "block";
          detail.style.display = isOpen ? "none" : "block";
          btn.style.fontWeight = isOpen ? "normal" : "bold";
        });

        const inputs = detail.querySelectorAll("input");
        inputs[0].addEventListener("input", e =&#62; { state.positionData[key].motif = e.target.value; });
        inputs[1].addEventListener("input", e =&#62; { state.positionData[key].size = e.target.value; });
        inputs[0].value = state.positionData[key].motif &#124;&#124; "";
        inputs[1].value = state.positionData[key].size &#124;&#124; "";

        group.appendChild(btn);
        group.appendChild(detail);
      });
    });
  }

  form.addEventListener("submit", async function(e) {
    e.preventDefault();
    if (this.website.value !== "") return;

    const name = form.querySelector('[name="name"]').value.trim();
    const address = form.querySelector('[name="address"]').value.trim();
    const email = form.querySelector('[name="email"]').value.trim();
    const delivery = form.querySelector('[name="delivery"]').value;
    const privacy = form.querySelector('[name="privacy"]').checked;

    if (!name) { alert("Bitte gib deinen Namen an."); return; }
    if (!address) { alert("Bitte gib deine Adresse an."); return; }
    if (!email) { alert("Bitte gib deine E-Mail-Adresse an."); return; }

    const selectedTextiles = Object.keys(state.textiles);
    if (selectedTextiles.length === 0) { alert("Bitte wähle mindestens eine Textilart aus."); return; }

    for (const textile of selectedTextiles) {
      const entries = state.colors[textile] &#124;&#124; [];
      const valid = entries.filter(e =&#62; e.color &#38;&#38; e.color.trim() !== "" &#38;&#38; e.qty &#38;&#38; Number(e.qty) &#62;= 10);
      if (valid.length === 0) {
        alert(`Bitte füge bei "${getTextileLabel(textile)}" mindestens eine Farbe mit einer Menge von mindestens 10 Stück hinzu.`);
        return;
      }
    }

    if (!delivery) { alert("Bitte wähle Versand oder Abholung."); return; }
    if (!privacy) { alert("Bitte stimme der Datenschutzerklärung zu."); return; }

    const allowedTypes = ["image/png", "image/jpeg", "application/pdf", "image/svg+xml"];
    for (const file of state.files) {
      if (file.size &#62; 10 * 1024 * 1024) { alert(`Die Datei "${file.name}" ist zu groß (max. 10 MB).`); return; }
      if (!allowedTypes.includes(file.type)) { alert(`Die Datei "${file.name}" hat ein nicht erlaubtes Format.`); return; }
    }

    const submitBtn = form.querySelector('button[type="submit"]');
    submitBtn.disabled = true;
    submitBtn.textContent = "Wird gesendet…";

    updateSelections();
    const formData = new FormData(form);
    state.files.forEach(file =&#62; { formData.append("files", file); });

    const cleanState = {
      ...state,
      files: state.files.map(f =&#62; ({ name: f.name, size: f.size, type: f.type }))
    };

    const NL = String.fromCharCode(13, 10);
    let summary = "";

    summary += "KONTAKTDATEN" + NL;
    summary += "====================" + NL;
    summary += "Name: " + name + NL;
    if (form.company.value.trim()) summary += "Firma/Verein: " + form.company.value.trim() + NL;
    summary += "Adresse: " + address + NL;
    summary += "E-Mail: " + email + NL + NL;

    summary += "TEXTILIEN" + NL;
    summary += "====================" + NL + NL;
    Object.keys(state.colors).forEach(textile =&#62; {
      const textileName = textile === "Sonstige" ? (state.otherTextile &#124;&#124; "Sonstige") : textile;
      summary += textileName + NL;
      state.colors[textile].forEach(entry =&#62; {
        if (!entry.color &#124;&#124; !entry.qty) return;
        summary += "• " + entry.color + ": " + entry.qty + " Stück" + NL;
      });
      summary += NL;
    });

    if (state.selectedTraits?.length) {
      summary += "TEXTILEIGENSCHAFTEN" + NL;
      summary += "====================" + NL;
      state.selectedTraits.forEach(trait =&#62; { summary += "• " + trait + NL; });
      summary += NL;
    }

    summary += "DRUCKPOSITIONEN UND MOTIVE" + NL;
    summary += "====================" + NL + NL;
    const groupedPositions = {};
    Object.keys(state.positionData).forEach(key =&#62; {
      const data = state.positionData[key];
      if (!data.motif &#38;&#38; !data.size) return;
      const parts = key.split("_");
      const position = parts[0];
      const textile = parts[1];
      const colorIndex = parts[2];
      const textileName = textile === "Sonstige" ? (state.otherTextile &#124;&#124; "Sonstige") : textile;
      const colorData = state.colors[textile]?.[Number(colorIndex)];
      if (!colorData) return;
      if (!groupedPositions[position]) groupedPositions[position] = [];
      groupedPositions[position].push({ textile: textileName, color: colorData.color, qty: colorData.qty, motif: data.motif, size: data.size });
    });
    Object.keys(groupedPositions).forEach(position =&#62; {
      summary += position.toUpperCase() + NL;
      summary += "--------------------" + NL;
      groupedPositions[position].forEach(item =&#62; {
        summary += "• " + item.textile + " - " + item.color + " (" + item.qty + " Stück)" + NL;
        if (item.motif) summary += "  Motiv: " + item.motif + NL;
        if (item.size) summary += "  Größe/Position: " + item.size + NL;
        summary += NL;
      });
    });

    if (state.selectedPrintTraits?.length) {
      summary += "DRUCKANFORDERUNGEN" + NL;
      summary += "====================" + NL;
      state.selectedPrintTraits.forEach(trait =&#62; { summary += "• " + trait + NL; });
      summary += NL;
    }

    if (form.preferred_textile.value.trim()) {
      summary += "BEVORZUGTES TEXTIL" + NL;
      summary += "====================" + NL;
      summary += form.preferred_textile.value.trim() + NL + NL;
    }

    if (form.finishing_date.value) {
      summary += "FERTIGSTELLUNG" + NL;
      summary += "====================" + NL;
      summary += form.finishing_date.value + NL + NL;
    }

    summary += "LIEFERUNG" + NL;
    summary += "====================" + NL;
    summary += delivery + NL + NL;

    summary += "DATENSCHUTZ &#38; ZEITSTEMPEL" + NL;
    summary += "====================" + NL;
    summary += "Datenschutz zugestimmt: ja" + NL;
    summary += "Abgesendet am: " + new Date().toLocaleString("de-DE") + NL + NL;

    if (form.notes.value.trim()) {
      summary += "ANMERKUNGEN" + NL;
      summary += "====================" + NL;
      summary += form.notes.value.trim() + NL + NL;
    }

    if (state.files.length) {
      summary += "DATEIEN" + NL;
      summary += "====================" + NL;
      state.files.forEach(file =&#62; { summary += "• " + file.name + NL; });
      summary += NL;
    }

    formData.append("state_json", JSON.stringify(cleanState));
    formData.append("summary", summary);
    formData.append("submitted_at", new Date().toISOString());

    try {
      await fetch("https://hook.eu1.make.com/da6s3yq4fhiu12p3cpqwrhpwmnjy6vvk", {
        method: "POST",
        body: formData
      });
      window.location.href = "https://tsvelfdinge.com/success";
    } catch (err) {
      alert("Beim Senden ist ein Fehler aufgetreten. Bitte versuche es erneut oder kontaktiere mich direkt.");
      console.error(err);
      submitBtn.disabled = false;
      submitBtn.textContent = "Anfrage absenden";
    }
  });
}

document.addEventListener("DOMContentLoaded", initTexprintForm);
</description>
		
	</item>
		
		
	<item>
		<title>297</title>
				
		<link>https://tsvelfdinge.com/297</link>

		<pubDate>Fri, 05 Jun 2026 12:42:12 +0000</pubDate>

		<dc:creator>TSVELF DINGE — Sebastian Diehl</dc:creator>

		<guid isPermaLink="true">https://tsvelfdinge.com/297</guid>

		<description>

&#60;img width="300" height="285" width_o="300" height_o="285" data-src="https://freight.cargo.site/t/original/i/9f4f1d8d855c3d741d004c8af579774b33416d1545f3c04078d9e668a9cbd154/12D_300px.png" data-mid="249152340" border="0" data-scale="6" data-no-zoom data-icon-mode src="https://freight.cargo.site/w/300/i/9f4f1d8d855c3d741d004c8af579774b33416d1545f3c04078d9e668a9cbd154/12D_300px.png" /&#62;
︎Instagram&#38;nbsp; &#38;nbsp; 

︎TikTok&#38;nbsp; &#38;nbsp; ︎WhatsAppAlle Beträge steuerbefreit gemäß § 19 UStG






Copyright ©&#38;nbsp;, Sebastian Diehl



AGB &#38;amp; Widerrufsbelehrung



 


 Datenschutzerklärung &#38;amp; Cookie-Richtlinie





Impressum

</description>
		
	</item>
		
	</channel>
</rss>