From c90c89a74fc22a037a9d5d36da09665d4d6c9bfe Mon Sep 17 00:00:00 2001
From: Akira Tempaku <paku@skyizwhite.dev>
Date: Sun, 18 May 2025 18:27:58 +0900
Subject: [PATCH] Add ~article component

---
 src/components/article.lisp | 21 +++++++++++++++++++++
 src/routes/about.lisp       | 24 ++++++++----------------
 src/routes/works.lisp       | 22 +++++++---------------
 3 files changed, 36 insertions(+), 31 deletions(-)
 create mode 100644 src/components/article.lisp

diff --git a/src/components/article.lisp b/src/components/article.lisp
new file mode 100644
index 0000000..5177c7d
--- /dev/null
+++ b/src/components/article.lisp
@@ -0,0 +1,21 @@
+(defpackage #:website/components/article
+  (:use #:cl
+        #:hsx)
+  (:import-from #:website/lib/time
+                #:datetime
+                #:jp-datetime)
+  (:export #:~article))
+(in-package #:website/components/article)
+
+(defcomp ~article (&key title content revised-at draft-p)
+  (hsx
+   (<>
+     (and draft-p (hsx (p :class "text-lg text-pink-500" "下書きモード")))
+     (article :class "prose max-w-none"
+       (h1 title)
+       (raw! content)
+       (p :class "text-right"
+         "(最終更新:"
+         (|time| :datetime (datetime revised-at)
+                 (jp-datetime revised-at))
+         ")")))))
diff --git a/src/routes/about.lisp b/src/routes/about.lisp
index a642363..c1b0796 100644
--- a/src/routes/about.lisp
+++ b/src/routes/about.lisp
@@ -1,13 +1,11 @@
 (defpackage #:website/routes/about
   (:use #:cl
         #:hsx
-        #:jingle
-        #:access)
+        #:jingle)
   (:import-from #:website/lib/cms
                 #:get-about)
-  (:import-from #:website/lib/time
-                #:datetime
-                #:jp-datetime)
+  (:import-from #:website/components/article
+                #:~article)
   (:export #:handle-get))
 (in-package #:website/routes/about)
 
@@ -19,14 +17,8 @@
   (with-request-params ((draft-key "draft-key" nil)) params
     (setf (context :no-cache) draft-key)
     (let ((about (get-about :query (list :draft-key draft-key))))
-      (hsx
-       (<>
-         (and draft-key (hsx (p :class "text-lg text-pink-500" "下書きモード")))
-         (article :class "prose max-w-none"
-           (h1 "About")
-           (raw! (getf about :content))
-           (p :class "text-right"
-             "(最終更新:"
-             (|time| :datetime (datetime (getf about :revised-at))
-                     (jp-datetime (getf about :revised-at)))
-             ")")))))))
+      (~article
+        :title "About"
+        :content (getf about :content)
+        :revised-at (getf about :revised-at)
+        :draft-p draft-key))))
diff --git a/src/routes/works.lisp b/src/routes/works.lisp
index 9110875..1e6e9b4 100644
--- a/src/routes/works.lisp
+++ b/src/routes/works.lisp
@@ -4,10 +4,8 @@
         #:jingle)
   (:import-from #:website/lib/cms
                 #:get-works)
-  (:import-from #:website/lib/time
-                #:datetime
-                #:jp-datetime)
-  (:export #:handle-get))
+  (:import-from #:website/components/article
+                #:~article))
 (in-package #:website/routes/works)
 
 (defparameter *metadata*
@@ -18,14 +16,8 @@
   (with-request-params ((draft-key "draft-key" nil)) params
     (setf (context :no-cache) draft-key)
     (let ((works (get-works :query (list :draft-key draft-key))))
-      (hsx
-       (<>
-         (and draft-key (hsx (p :class "text-lg text-pink-500" "下書きモード")))
-         (article :class "prose max-w-none"
-           (h1 "Works")
-           (raw! (getf works :content))
-           (p :class "text-right"
-             "(最終更新:"
-             (|time| :datetime (datetime (getf works :revised-at))
-                     (jp-datetime (getf works :revised-at)))
-             ")")))))))
+      (~article
+        :title "Works"
+        :content (getf works :content)
+        :revised-at (getf works :revised-at)
+        :draft-p draft-key))))