\ No newline at end of file
diff --git a/layouts/partials/sidebar/left.html b/layouts/partials/sidebar/left.html
new file mode 100644
index 0000000..623a464
--- /dev/null
+++ b/layouts/partials/sidebar/left.html
@@ -0,0 +1,110 @@
+
diff --git a/layouts/partials/utils/file-path.html b/layouts/partials/utils/file-path.html
new file mode 100644
index 0000000..1794551
--- /dev/null
+++ b/layouts/partials/utils/file-path.html
@@ -0,0 +1,21 @@
+{{/* This utility is used to get the file path from absolute, relative path or URL. */}}
+
+{{- $path := .path -}}
+{{- $page := .page -}}
+
+{{- $isLocal := not (urls.Parse $path).Scheme -}}
+{{- $isPage := and (eq $page.Kind "page") (not $page.BundleType) -}}
+{{- $startsWithSlash := hasPrefix $path "/" -}}
+{{- $startsWithRelative := hasPrefix $path "../" -}}
+
+{{- if and $path $isLocal -}}
+ {{- if $startsWithSlash -}}
+ {{/* File under static directory */}}
+ {{- $path = (relURL (strings.TrimPrefix "/" $path)) -}}
+ {{- else if and $isPage (not $startsWithRelative) -}}
+ {{/* File is a sibling to the individual page file */}}
+ {{ $path = (printf "../%s" $path) }}
+ {{- end -}}
+{{- end -}}
+
+{{- return $path -}}
diff --git a/layouts/partials/utils/format-date.html b/layouts/partials/utils/format-date.html
new file mode 100644
index 0000000..94cbdc4
--- /dev/null
+++ b/layouts/partials/utils/format-date.html
@@ -0,0 +1,3 @@
+{{- with . -}}
+ {{- . | time.Format (site.Params.dateFormat | default ":date_long") -}}
+{{- end -}}
diff --git a/layouts/partials/utils/fragments.html b/layouts/partials/utils/fragments.html
new file mode 100644
index 0000000..268aeea
--- /dev/null
+++ b/layouts/partials/utils/fragments.html
@@ -0,0 +1,62 @@
+{{/* Split page raw content into fragments */}}
+{{ $page := .context }}
+{{ $type := .type | default "content" }}
+
+{{ $headingKeys := slice }}
+{{ $headingTitles := slice }}
+
+{{ range $h1 := $page.Fragments.Headings }}
+ {{ if eq $h1.Title "" }}
+ {{ $headingKeys = $headingKeys | append $h1.Title }}
+ {{ else }}
+ {{ $headingKeys = $headingKeys | append (printf "%s#%s" $h1.ID $h1.Title) }}
+ {{ end }}
+ {{ $headingTitles = $headingTitles | append (printf "# %s" $h1.Title) }}
+
+ {{ range $h2 := $h1.Headings }}
+ {{ $headingKeys = $headingKeys | append (printf "%s#%s" $h2.ID $h2.Title) }}
+ {{ $headingTitles = $headingTitles | append (printf "## %s" $h2.Title) }}
+ {{ end }}
+{{ end }}
+
+{{ $content := $page.RawContent }}
+{{ $len := len $headingKeys }}
+{{ $data := dict }}
+
+{{ if eq $type "content" }}
+ {{/* Include full content of the page */}}
+ {{ if eq $len 0 }}
+ {{ $data = $data | merge (dict "" ($page.Plain | htmlUnescape | chomp)) }}
+ {{ else }}
+ {{/* Split the raw content from bottom to top */}}
+ {{ range seq $len }}
+ {{ $i := sub $len . }}
+ {{ $headingKey := index $headingKeys $i }}
+ {{ $headingTitle := index $headingTitles $i }}
+
+ {{ if eq $i 0 }}
+ {{ $data = $data | merge (dict $headingKey ($content | $page.RenderString | plainify | htmlUnescape | chomp)) }}
+ {{ else }}
+ {{ $parts := split $content (printf "\n%s\n" $headingTitle) }}
+ {{ $lastPart := index $parts (sub (len $parts) 1) }}
+
+ {{ $data = $data | merge (dict $headingKey ($lastPart | $page.RenderString | plainify | htmlUnescape | chomp)) }}
+ {{ $content = strings.TrimSuffix $lastPart $content }}
+ {{ $content = strings.TrimSuffix (printf "\n%s\n" $headingTitle) $content }}
+ {{ end }}
+ {{ end }}
+ {{ end }}
+{{ else if (eq $type "heading" ) }}
+ {{/* Put heading keys with empty content to the data object */}}
+ {{ $data = dict "" "" }}
+ {{ range $headingKeys }}
+ {{ $data = $data | merge (dict . "") }}
+ {{ end }}
+{{ else if (eq $type "title") }}
+ {{/* Use empty data object since title is included in search-data.json */}}
+ {{ $data = $data | merge (dict "" "") }}
+{{ else if (eq $type "summary" ) }}
+ {{ $data = $data | merge (dict "" ($page.Summary | plainify | htmlUnescape | chomp)) }}
+{{ end }}
+
+{{ return $data }}
diff --git a/layouts/partials/utils/icon.html b/layouts/partials/utils/icon.html
new file mode 100644
index 0000000..85cd3cb
--- /dev/null
+++ b/layouts/partials/utils/icon.html
@@ -0,0 +1,14 @@
+{{/* Render raw svg icon from .Site.Data */}}
+{{- $icon := index site.Data.icons .name -}}
+
+{{- if not $icon -}}
+ {{ errorf "icon %q not found" .name }}
+{{- end -}}
+
+{{- $icon = $icon | safeHTML -}}
+
+{{- if .attributes -}}
+ {{- $icon = replaceRE "