diff --git a/assets/css/main.css b/assets/css/main.css
index 83f7903..77cf0cf 100644
--- a/assets/css/main.css
+++ b/assets/css/main.css
@@ -30,6 +30,10 @@
margin-bottom: 2rem;
}
+ .cta-gradient {
+ background: linear-gradient(calc(var(--gradient-angle) * 1deg), var(--gradient-from), var(--gradient-to));
+ }
+
.btn {
@apply inline-flex items-center justify-center px-6 py-3 font-medium transition duration-200 ease-in-out;
border-radius: 2rem;
@@ -67,4 +71,117 @@
.feature-grid {
@apply grid gap-8 md:grid-cols-2 lg:grid-cols-3;
}
+
+ /* Blog and Syntax Highlighting Styles */
+ .highlight {
+ @apply text-sm font-mono text-gray-200;
+ }
+
+ .highlight table {
+ @apply w-full border-separate border-spacing-0;
+ }
+
+ .highlight table td {
+ @apply p-0;
+ }
+
+ .highlight table td:first-child {
+ @apply pr-4 text-right select-none text-gray-500 border-r border-gray-700;
+ }
+
+ .highlight table td:last-child {
+ @apply pl-4 w-full;
+ }
+
+ .highlight .k, .highlight .kd {
+ @apply text-purple-400 font-semibold;
+ }
+
+ .highlight .nf, .highlight .nx {
+ @apply text-blue-400;
+ }
+
+ .highlight .s, .highlight .s1, .highlight .s2 {
+ @apply text-green-400;
+ }
+
+ .highlight .mi, .highlight .mf {
+ @apply text-orange-400;
+ }
+
+ .highlight .c, .highlight .c1, .highlight .cm {
+ @apply text-gray-500 italic;
+ }
+
+ .highlight .o {
+ @apply text-yellow-400;
+ }
+
+ .highlight .p {
+ @apply text-gray-400;
+ }
+
+ .prose {
+ @apply max-w-none;
+ }
+
+ .prose h1, .prose h2, .prose h3, .prose h4 {
+ @apply font-heading font-bold text-gray-900;
+ }
+
+ .prose h1 {
+ @apply text-4xl mb-8;
+ }
+
+ .prose h2 {
+ @apply text-3xl mt-12 mb-6;
+ }
+
+ .prose h3 {
+ @apply text-2xl mt-8 mb-4;
+ }
+
+ .prose p {
+ @apply text-gray-700 leading-relaxed mb-6;
+ }
+
+ .prose a {
+ @apply text-primary-600 hover:text-primary-700 no-underline;
+ }
+
+ .prose ul, .prose ol {
+ @apply my-6 ml-6;
+ }
+
+ .prose li {
+ @apply mb-2;
+ }
+
+ .prose blockquote {
+ @apply border-l-4 border-gray-200 pl-4 italic text-gray-700 my-8;
+ }
+
+ .prose img {
+ @apply rounded-lg shadow-lg my-8;
+ }
+
+ .prose code:not(pre code) {
+ @apply bg-gray-100 text-gray-900 px-1.5 py-0.5 rounded text-sm font-mono;
+ }
+
+ .table-of-contents {
+ @apply bg-gray-50 p-6 rounded-lg my-8;
+ }
+
+ .table-of-contents nav {
+ @apply space-y-2;
+ }
+
+ .table-of-contents a {
+ @apply text-gray-700 hover:text-primary-600 no-underline;
+ }
+
+ .table-of-contents ul {
+ @apply list-none ml-4 space-y-2;
+ }
}
diff --git a/layouts/_default/list.html b/layouts/_default/list.html
new file mode 100644
index 0000000..86cb090
--- /dev/null
+++ b/layouts/_default/list.html
@@ -0,0 +1,65 @@
+{{ define "main" }}
+
+
+ {{ if .IsHome }}
+
{{ .Site.Title }}
+ {{ else }}
+
{{ .Title }}
+ {{ with .Description }}
+
{{ . }}
+ {{ end }}
+ {{ end }}
+
+
+ {{ $paginator := .Paginate .Pages }}
+ {{ range $paginator.Pages }}
+ {{ partial "post-card.html" . }}
+ {{ end }}
+
+
+ {{ $paginator := .Paginate .Pages }}
+ {{ if gt $paginator.TotalPages 1 }}
+
+ {{ end }}
+
+
+{{ end }}
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
new file mode 100644
index 0000000..e845867
--- /dev/null
+++ b/layouts/_default/single.html
@@ -0,0 +1,86 @@
+{{ define "main" }}
+
+
+
+
+
+
+ {{ with .Params.categories }}
+
+ {{ end }}
+
+ {{ .Title }}
+
+ {{ partial "post-meta.html" . }}
+
+
+ {{ with .Params.featured_image }}
+
+

+
+ {{ end }}
+
+
+ {{ .Content }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ if and .Site.Params.blog.cta.enable .Site.Params.cta.enable }}
+
+ {{ partial "components/cta.html" . }}
+
+ {{ end }}
+
+{{ end }}
diff --git a/layouts/index.html b/layouts/index.html
index 89327cd..9983b08 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -1,6 +1,3 @@
{{ define "main" }}
-
-{{ if .Content }}
- {{ .Content }}
-{{ end }}
+{{ .Content }}
{{ end }}
diff --git a/layouts/partials/components/cta.html b/layouts/partials/components/cta.html
new file mode 100644
index 0000000..b62bc4e
--- /dev/null
+++ b/layouts/partials/components/cta.html
@@ -0,0 +1,28 @@
+{{ if .Site.Params.cta.enable }}
+
+
+ {{ $angle := .Site.Params.cta.gradient_angle | default 45 }}
+ {{ $from := .Site.Params.cta.gradient_from }}
+ {{ $to := .Site.Params.cta.gradient_to }}
+
+
+
{{ .Site.Params.cta.title }}
+
{{ .Site.Params.cta.description }}
+
+ {{ with .Site.Params.cta.primary_button }}
+
+ {{ .text }}
+
+ {{ end }}
+ {{ with .Site.Params.cta.secondary_button }}
+
+ {{ .text }}
+
+ {{ end }}
+
+
+
+
+
+{{ end }}
diff --git a/layouts/partials/components/subscribe-form.html b/layouts/partials/components/subscribe-form.html
new file mode 100644
index 0000000..65bd176
--- /dev/null
+++ b/layouts/partials/components/subscribe-form.html
@@ -0,0 +1,33 @@
+
+
{{ .title | default "Subscribe to Newsletter" }}
+
{{ .description | default "Get the latest posts delivered right to your inbox." }}
+
+
+
diff --git a/layouts/partials/post-card.html b/layouts/partials/post-card.html
new file mode 100644
index 0000000..defd8e3
--- /dev/null
+++ b/layouts/partials/post-card.html
@@ -0,0 +1,80 @@
+
+ {{ with .Params.featured_image }}
+
+
+
+ {{ end }}
+
+
+
+ {{ with .Params.categories }}
+
+ {{ end }}
+
+
+
+
+
+
+ {{ with .Description }}
+ {{ . }}
+ {{ else }}
+ {{ .Summary | truncate 160 }}
+ {{ end }}
+
+
+
+
+ {{ with .Params.author }}
+
+ {{ end }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/layouts/partials/post-meta.html b/layouts/partials/post-meta.html
new file mode 100644
index 0000000..30c9175
--- /dev/null
+++ b/layouts/partials/post-meta.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+ {{ with .Params.author }}
+
+ {{ end }}
+
+
+
+
+
{{ .ReadingTime }} min read
+
+
+
+
+
+
+
+
+
+
+ {{ with .Params.tags }}
+
+ {{ end }}
+
diff --git a/layouts/partials/sidebar.html b/layouts/partials/sidebar.html
new file mode 100644
index 0000000..f2a360d
--- /dev/null
+++ b/layouts/partials/sidebar.html
@@ -0,0 +1,86 @@
+
+
+ {{ if .Site.Params.blog.sidebar.subscribe.enable }}
+ {{ $params := dict
+ "title" .Site.Params.blog.sidebar.subscribe.title
+ "description" .Site.Params.blog.sidebar.subscribe.description
+ "action" .Site.Params.blog.sidebar.subscribe.action
+ "emailName" .Site.Params.blog.sidebar.subscribe.emailName
+ "buttonText" .Site.Params.blog.sidebar.subscribe.buttonText
+ "placeholder" .Site.Params.blog.sidebar.subscribe.placeholder
+ "disclaimer" .Site.Params.blog.sidebar.subscribe.disclaimer
+ "hidden" .Site.Params.blog.sidebar.subscribe.hidden
+ }}
+ {{ partial "components/subscribe-form" $params }}
+ {{ end }}
+
+
+ {{ if .Site.Params.blog.sidebar.recent.enable }}
+
+
{{ .Site.Params.blog.sidebar.recent.title | default "Recent Articles" }}
+
+ {{ $recentCount := .Site.Params.blog.sidebar.recent.count | default 5 }}
+ {{ range first $recentCount (where .Site.RegularPages "Type" "blog") }}
+
+ {{ end }}
+
+
+ {{ end }}
+
+
+ {{ if .Site.Params.blog.sidebar.categories.enable }}
+
+
{{ .Site.Params.blog.sidebar.categories.title | default "Categories" }}
+
+
+ {{ end }}
+
+
+ {{ if .Site.Params.blog.sidebar.tags.enable }}
+
+
{{ .Site.Params.blog.sidebar.tags.title | default "Popular Tags" }}
+
+ {{ $tagCount := .Site.Params.blog.sidebar.tags.count | default 20 }}
+ {{ range first $tagCount .Site.Taxonomies.tags.ByCount }}
+
+ #{{ .Name }}
+ ({{ .Count }})
+
+ {{ end }}
+
+
+ {{ end }}
+
diff --git a/layouts/shortcodes/code.html b/layouts/shortcodes/code.html
new file mode 100644
index 0000000..bdada01
--- /dev/null
+++ b/layouts/shortcodes/code.html
@@ -0,0 +1,19 @@
+{{ $lang := .Get 0 }}
+{{ $code := .Inner }}
+{{ $filename := .Get 1 }}
+
+
+ {{ with $filename }}
+
+ {{ end }}
+
+ {{ highlight $code $lang "linenos=table,linenostart=1,hl_lines=,lineanchors=line" }}
+
+
diff --git a/layouts/shortcodes/cta.html b/layouts/shortcodes/cta.html
index 0fd5ebf..9238bc9 100644
--- a/layouts/shortcodes/cta.html
+++ b/layouts/shortcodes/cta.html
@@ -1,22 +1,17 @@
-{{/* CTA Shortcode */}}
-
-
-
- {{ with .Get "background-image" }}
-
- {{ end }}
-
-
{{ .Get "title" | default "Ready to Transform Your User Experience?" }}
-
{{ .Get "description" | default "Join thousands of companies already using our platform to drive growth." }}
-
-
-
-
-
+{{ $params := dict
+ "title" (.Get "title")
+ "description" (.Get "description")
+ "primary_button" (dict
+ "text" (.Get "primary_button_text")
+ "url" (.Get "primary_button_url")
+ )
+ "secondary_button" (dict
+ "text" (.Get "secondary_button_text")
+ "url" (.Get "secondary_button_url")
+ )
+ "gradient_from" (.Get "gradient-from")
+ "gradient_to" (.Get "gradient-to")
+ "gradient_angle" (.Get "gradient-angle")
+}}
+
+{{ partial "components/cta" (dict "Site" .Site "Params" (dict "cta" $params "enable" true)) }}
diff --git a/layouts/shortcodes/figure.html b/layouts/shortcodes/figure.html
new file mode 100644
index 0000000..d782dd9
--- /dev/null
+++ b/layouts/shortcodes/figure.html
@@ -0,0 +1,18 @@
+{{ $src := .Get "src" }}
+{{ $alt := .Get "alt" }}
+{{ $caption := .Get "caption" }}
+{{ $class := .Get "class" | default "w-full" }}
+
+
+
+ {{ with $caption }}
+
+ {{ . | markdownify }}
+
+ {{ end }}
+
diff --git a/layouts/shortcodes/toc.html b/layouts/shortcodes/toc.html
new file mode 100644
index 0000000..1b94a2b
--- /dev/null
+++ b/layouts/shortcodes/toc.html
@@ -0,0 +1,4 @@
+
+
Table of Contents
+ {{ .Page.TableOfContents }}
+
diff --git a/layouts/taxonomy/list.html b/layouts/taxonomy/list.html
new file mode 100644
index 0000000..e81533f
--- /dev/null
+++ b/layouts/taxonomy/list.html
@@ -0,0 +1,70 @@
+{{ define "main" }}
+
+
+
+
+
+ {{ $paginator := .Paginate .Pages }}
+ {{ range $paginator.Pages }}
+ {{ partial "post-card.html" . }}
+ {{ end }}
+
+
+ {{ $paginator := .Paginate .Pages }}
+ {{ if gt $paginator.TotalPages 1 }}
+
+ {{ end }}
+
+
+{{ end }}
diff --git a/layouts/taxonomy/terms.html b/layouts/taxonomy/terms.html
new file mode 100644
index 0000000..5fe1654
--- /dev/null
+++ b/layouts/taxonomy/terms.html
@@ -0,0 +1,39 @@
+{{ define "main" }}
+
+
+
+
+
+
+ {{ if not .Data.Terms }}
+
+ No {{ .Data.Plural }} found
+
+ {{ end }}
+
+
+{{ end }}
diff --git a/static/images/blog/blog-1.jpg b/static/images/blog/blog-1.jpg
new file mode 100644
index 0000000..8776392
Binary files /dev/null and b/static/images/blog/blog-1.jpg differ
diff --git a/static/images/blog/blog-2.webp b/static/images/blog/blog-2.webp
new file mode 100644
index 0000000..18d5bee
Binary files /dev/null and b/static/images/blog/blog-2.webp differ
diff --git a/static/images/blog/blog-3.webp b/static/images/blog/blog-3.webp
new file mode 100644
index 0000000..af244a5
Binary files /dev/null and b/static/images/blog/blog-3.webp differ
diff --git a/static/images/blog/blog-4.jpg b/static/images/blog/blog-4.jpg
new file mode 100644
index 0000000..326f9c5
Binary files /dev/null and b/static/images/blog/blog-4.jpg differ
diff --git a/static/images/blog/blog-5.jpg b/static/images/blog/blog-5.jpg
new file mode 100644
index 0000000..6081974
Binary files /dev/null and b/static/images/blog/blog-5.jpg differ