/************************************
timeline
************************************//* The actual timeline (the vertical ruler) */.timeline{position:relative;margin:0auto;}/* The actual timeline (the vertical ruler) */.timeline::after{content:"";position:absolute;width:6px;background-color:#444;top:0;bottom:0;left:10%;margin-left:-3px;}/* Container around content */.timeline.container{padding:10px10px10px40px;margin-top:10px;position:relative;/* background-color: gray; */width:90%;left:10%;}/* The circles on the timeline */.timeline.container::after{content:"";position:absolute;width:25px;height:25px;left:-12px;background-color:rgb(106,215,229);border:4pxsolid#444;top:0px;border-radius:50%;z-index:1;}/* date display */.timeline.container.date{position:absolute;top:22px;z-index:1;left:-10%;font-size:large;}/* Add arrows to the right container (pointing left) */.timeline.container::before{content:" ";height:0;position:absolute;top:30px;width:0;z-index:1;left:26px;border:mediumsolid#6ad7e5;border-width:13px13px13px0px;border-color:#6ad7e5#6ad7e5transparenttransparent;}/* The actual content */.timeline.content{box-shadow:003px3px#6ad7e5;background-color:white;position:relative;border-radius:6px;transition:box-shadow0.3s;}/* small shadow change on hover*/.timeline.content:hover{box-shadow:003px4px#6ad7e5;}/* card title format */.timeline.content.title{padding:5px30px;font-weight:bold;display:inline-block;}/* time moment format*/.timeline.content.moment{color:#16c4a4;text-align:right;position:absolute;top:0;right:0;padding:5px;}/* body size */.timeline.content.body{padding:5px30px;}/* responsive for small devices*/@mediascreenand(max-width:600px){.timeline.container{padding:10px10px0px40px;left:5%;width:95%;}.timeline.container.date{font-size:small;transform:rotate(-90deg);left:-5%;top:30px;}.timeline.container::after{left:3px;}.timeline.content.body{padding:5px5px;}.timeline.content.moment{position:relative;}}
{{$duration := ""}}
{{$to := now }}
{{ if ne (.Get "to") ""}}
{{$to = time (.Get "to") }}
{{end}}
{{$enabledTime := ne (.Get "from") ""}}
{{if $enabledTime }}
{{$from := time (.Get "from") }}
{{$tmonths:=mul ($to.Sub $from).Hours 0.00136986301 }}
{{$months := mod $tmonths 12 }}
{{$years := math.Floor (div $tmonths 12)}}
{{$yearStr := "years"}}
{{if lt $years 2 }}{{$yearStr = "year"}}{{end}}
{{$monthStr := "months"}}
{{if lt $months 2 }}{{$monthStr = "month"}}{{end}}
{{$duration = ""}}
{{if gt $years 0 }}{{$duration = printf "%s %.0f %s" $duration $years $yearStr}}{{end}}
{{if gt $months 0 }}{{$duration = printf "%s %d %s" $duration $months $monthStr}}{{end}}
{{end}}
<divclass="container"><divclass="content"><divclass="title">{{.Get "title"}}</div> {{if $enabledTime }}
<divclass="moment"{{ifeq.Ordinal0}}id="moment"{{end}}> {{ if ne .Ordinal 0 }} {{$duration}} {{ end }}
</div> {{ end }}
<divclass="body">{{.Inner}}</div></div><divclass="date">{{$to.Year}}</div></div>{{ if and (eq (.Ordinal) 0) $enabledTime }}
<script>functionnon0plural(number,name){if(number==0){return""}if(number>1){returnnumber+" "+name+"s"}returnnumber+" "+name}el=document.querySelector("#moment");functionrefresh(){start=dayjs({{.Get"from"}})now=dayjs()total_months=now.diff(start,"M",true)months=total_months%12years=Math.floor((total_months)/12)el.innerHTML=non0plural(years,"year")+" "+non0plural(months.toFixed(8),"month")}window.setInterval(refresh,100);</script>{{ end }}
Step 3. Add timeline.html under layouts/shortcodes
1
<divclass="timeline">{{ .Inner }}</div>
Step 4. Add the time line content in your md file
1
2
3
4
5
6
7
8
9
10
{{<timeline>}}
{{<eventtitle="XXX Inc."from="2022-10-01">}}
Current position
{{</event>}}
<br> {{<eventtitle="YYY Inc."from="2020-07-01"to="2021-04-01">}}
Past position
{{</event>}}
{{</timeline>}}