{{ $item.Title }}
{{/* Summary */}} {{ $summary := "" }} {{ $summary_raw := $item.Params.summary }} {{ if $summary_raw }} {{ $summary = strings.TrimSpace (printf "%v" $summary_raw) }} {{ end }} {{ if $summary }}{{ $summary | $page.RenderString }}
{{ else }}{{ $item.Summary | truncate 100 }}
{{ end }} {{/* Tech Stack Tags - fixed 2-line height for consistency */}} {{ $tech_stack := slice }} {{ $tech_raw := $item.Params.tech_stack }} {{ if reflect.IsSlice $tech_raw }} {{ range $tech_raw }} {{ $tech := strings.TrimSpace (printf "%v" .) }} {{ if $tech }}{{ $tech_stack = $tech_stack | append $tech }}{{ end }} {{ end }} {{ else if eq (printf "%T" $tech_raw) "string" }} {{ $tech_string := strings.TrimSpace $tech_raw }} {{ if $tech_string }} {{ if strings.Contains $tech_string "," }} {{ range (split $tech_string ",") }} {{ $tech := strings.TrimSpace . }} {{ if $tech }}{{ $tech_stack = $tech_stack | append $tech }}{{ end }} {{ end }} {{ else }} {{ $tech_stack = slice $tech_string }} {{ end }} {{ end }} {{ end }} {{ if gt (len $tech_stack) 0 }}