forked from lovis/socials-template
		
	Add demo and template files for sharepic layout examples
This commit is contained in:
		
							parent
							
								
									1d64be86f1
								
							
						
					
					
						commit
						2d48050378
					
				
					 4 changed files with 334 additions and 0 deletions
				
			
		
							
								
								
									
										238
									
								
								template.typ
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								template.typ
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,238 @@ | |||
| #let theme = ( | ||||
|   bg-color: rgb("#fdf6e3"), | ||||
|   fg-color: rgb("#073642"), | ||||
|   accent-color: rgb("#268bd2"), | ||||
|   border-color: rgb("#073642"), | ||||
|   heading-font: "Atkinson Hyperlegible", | ||||
|   body-font: "DejaVu Sans", | ||||
|   border-radius: 0.8cm, | ||||
|   border-stroke: 4pt, | ||||
|   title-size: 20pt, | ||||
|   label-size: 12pt, | ||||
|   body-size: 12pt, | ||||
|   info-text-size: 12pt, | ||||
| ) | ||||
| 
 | ||||
| // Default logo configuration | ||||
| #let default-logo = ( | ||||
|   path: none, | ||||
|   height: 4cm, | ||||
|   fit: "contain", | ||||
|   rotation: 0deg, | ||||
|   offset: (x: 0cm, y: 0cm), | ||||
|   pin-position: none, // "top-left", "top-center", "top-right", etc. | ||||
| ) | ||||
| 
 | ||||
| // Konfiguriert die Logos | ||||
| #let configure-logo(logo-config) = { | ||||
|   if logo-config == none { | ||||
|     return default-logo | ||||
|   } | ||||
|   if type(logo-config) == str { | ||||
|     // String = nur Pfad | ||||
|     return default-logo + (path: logo-config) | ||||
|   } | ||||
|   return default-logo + logo-config | ||||
| } | ||||
| 
 | ||||
| // Hilfsfunktion um ein einzelnes Logo zu positionieren | ||||
| #let place-logo(logo, position, dx: 0cm, dy: 0cm) = { | ||||
|   let logo = configure-logo(logo) | ||||
|   if logo.path == none { return } | ||||
| 
 | ||||
|   place(position, dx: logo.offset.x + dx, dy: logo.offset.y + dy)[ | ||||
|     #rotate(logo.rotation)[ | ||||
|       #image(logo.path, height: logo.height, fit: logo.fit) | ||||
|     ] | ||||
|   ] | ||||
| } | ||||
| 
 | ||||
| // Positioniert mehrere Logos basierend auf Layout und Anzahl | ||||
| #let position-logos(logos, layout: "horizontal") = { | ||||
|   let logos = if type(logos) == array { | ||||
|     logos.map(configure-logo) | ||||
|   } else if type(logos) == dictionary { | ||||
|     (configure-logo(logos),) | ||||
|   } else { | ||||
|     () | ||||
|   } | ||||
| 
 | ||||
|   if layout == "horizontal" { | ||||
|     // Logos nebeneinander oben | ||||
|     if logos.len() == 1 { | ||||
|       place-logo(logos.first(), top + center) | ||||
|     } else if logos.len() == 2 { | ||||
|       place-logo(logos.at(0), top + left, dx: 1.5cm, dy: 0.7cm) | ||||
|       place-logo(logos.at(1), top + right, dx: -1.5cm, dy: 0.7cm) | ||||
|     } else if logos.len() == 3 { | ||||
|       place-logo(logos.at(0), top + left, dx: 1.5cm, dy: 0.7cm) | ||||
|       place-logo(logos.at(1), top + center, dy: 0.7cm) | ||||
|       place-logo(logos.at(2), top + right, dx: -1.5cm, dy: 0.7cm) | ||||
|     } else { | ||||
|       // 4+ logos - anordnen in Gitter | ||||
|       let cols = calc.min(2, logos.len()) | ||||
|       let rows = calc.ceil(logos.len() / cols) | ||||
|       for (i, logo) in logos.enumerate() { | ||||
|         let row = calc.floor(i / cols) | ||||
|         let col = calc.rem(i, cols) | ||||
|         let x = -2.5cm + col * 5cm | ||||
|         let y = 0.5cm + row * 2.2cm | ||||
|         place-logo(logo, top + left, dx: x, dy: y) | ||||
|       } | ||||
|     } | ||||
|   } else if layout == "vertical" { | ||||
|     // Logos auf der rechten Seite positioniert, vertikal gestapelt | ||||
|     if logos.len() == 1 { | ||||
|       place-logo(logos.first(), top + right, dx: -1cm, dy: 0.7cm) | ||||
|     } else if logos.len() == 2 { | ||||
|       place-logo(logos.at(0), top + right, dx: -1cm, dy: 0.7cm) | ||||
|       place-logo(logos.at(1), top + right, dx: -1cm, dy: 4.2cm) | ||||
|     } else { | ||||
|       // 3+ logos: vertikal auf der rechten Seite mit leichtem Offset gestapelt | ||||
|       for (i, logo) in logos.enumerate() { | ||||
|         let dy = 0.7cm + i * 3.5cm | ||||
|         place-logo(logo, top + right, dx: -1cm, dy: dy) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // Hilfsfunktion um den Inhalt zu arrangieren | ||||
| #let arrange-content(title: [], when: [], where: [], about: [], layout: "horizontal", current-theme: theme) = { | ||||
|   let left-padding = if layout == "vertical" { 1.5cm } else { 1.5cm } | ||||
|   let right-padding = if layout == "vertical" { 5cm } else { 1.5cm } | ||||
|   let top-padding = if layout == "vertical" { 0.8cm } else { 5.5cm } | ||||
|    | ||||
|   pad(top: top-padding, bottom: 1.5cm, left: left-padding, right: right-padding)[ | ||||
|     #stack( | ||||
|       dir: ttb, | ||||
|       spacing: 1em, | ||||
|       // Title | ||||
|       if title != [] { | ||||
|         text(size: current-theme.title-size, weight: "bold", font: current-theme.heading-font, title) | ||||
|       }, | ||||
| 
 | ||||
|       // Info-Block für wann/wo | ||||
|       if when != [] or where != [] { | ||||
|         block( | ||||
|           inset: 0.8em, | ||||
|           radius: 0.4em, | ||||
|           width: 100%, | ||||
|           fill: current-theme.bg-color.mix(current-theme.accent-color).darken(10%), | ||||
|           stack( | ||||
|             dir: ttb, | ||||
|             spacing: 0.4em, | ||||
|             if when != [] { | ||||
|               align(center + horizon, stack( | ||||
|                 dir: ltr, | ||||
|                 spacing: 0.5em, | ||||
|                 align(center + horizon, emoji.calendar), | ||||
|                 text(size: current-theme.info-text-size, when), | ||||
|               )) | ||||
|             }, | ||||
|             if where != [] { | ||||
|               align(center + horizon, stack( | ||||
|                 dir: ltr, | ||||
|                 spacing: 0.5em, | ||||
|                 align(center + horizon, emoji.pin), | ||||
|                 text(size: current-theme.info-text-size, where), | ||||
|               )) | ||||
|             }, | ||||
|           ), | ||||
|         ) | ||||
|       }, | ||||
| 
 | ||||
|       // Beschreibungstext | ||||
|       if about != [] { | ||||
|         let about-align = if layout == "vertical" { left } else { center } | ||||
|         block( | ||||
|           spacing: 0.1em, | ||||
|           align(about-align, text(size: current-theme.body-size, about)) | ||||
|         ) | ||||
|       } | ||||
|     ) | ||||
|   ] | ||||
| } | ||||
| 
 | ||||
| // Haupt-Vorlage-Funktion | ||||
| #let sharepic( | ||||
|   logos: (), | ||||
|   layout: "horizontal", | ||||
|   title: [], | ||||
|   when: [], | ||||
|   where: [], | ||||
|   about: [], | ||||
|   theme-override: (:) | ||||
| ) = { | ||||
|   // Überschreiben der Theme | ||||
|   let current-theme = theme + theme-override | ||||
| 
 | ||||
|   set page( | ||||
|     width: 15cm, | ||||
|     height: 15cm, | ||||
|     fill: current-theme.bg-color, | ||||
|     margin: 0cm, | ||||
|   ) | ||||
|   set text( | ||||
|     font: current-theme.body-font, | ||||
|     size: 15pt, | ||||
|     fill: current-theme.fg-color, | ||||
|   ) | ||||
| 
 | ||||
|   align(center + horizon)[ | ||||
|     #rect( | ||||
|       width: 14cm, | ||||
|       height: 14cm, | ||||
|       radius: current-theme.border-radius, | ||||
|       stroke: current-theme.border-stroke + current-theme.border-color, | ||||
|     )[ | ||||
|       // Positioniert Logos basierend auf Layout | ||||
|       #{position-logos(logos, layout: layout)} | ||||
| 
 | ||||
|       // Inhaltsbereich | ||||
|       #{arrange-content( | ||||
|         title: title, | ||||
|         when: when, | ||||
|         where: where, | ||||
|         about: about, | ||||
|         layout: layout, | ||||
|         current-theme: current-theme | ||||
|       )} | ||||
|     ] | ||||
|   ] | ||||
| } | ||||
| 
 | ||||
| // Verwendungsbeispiele und Dokumentation | ||||
| /* | ||||
| #sharepic( | ||||
|   logos: ( | ||||
|     (path: "logo1.png", height: 4cm), | ||||
|     (path: "connection.png", height: 4cm, rotation: -8deg), | ||||
|     (path: "kew.jpg", height: 4cm, rotation: 8deg) | ||||
|   ), | ||||
|   layout: "horizontal", | ||||
|   title: [Beispiel-Event], | ||||
|   when: [22.10.2025, 17:00 Uhr], | ||||
|   where: [Ort Hier], | ||||
|   about: [Beschreibung des Events...] | ||||
| ) | ||||
| 
 | ||||
| #sharepic( | ||||
|   logos: ( | ||||
|     (path: "logo1.png", height: 3cm), | ||||
|     (path: "logo2.png", height: 3cm), | ||||
|     (path: "logo3.png", height: 3cm), | ||||
|     (path: "logo4.png", height: 3cm) | ||||
|   ), | ||||
|   layout: "vertical", | ||||
|   title: [Beispiel-Event], | ||||
|   about: [Beschreibung des Events...] | ||||
| ) | ||||
| 
 | ||||
| // Einfache Verwendung mit String-Logos | ||||
| #sharepic( | ||||
|   logos: ("connection.png", "kew.jpg"), | ||||
|   layout: "horizontal", | ||||
|   title: [Beispiel-Event] | ||||
| ) | ||||
| */ | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 AljGe
						AljGe