diff --git a/README.md b/README.md
index a90fd1c..4023a32 100644
--- a/README.md
+++ b/README.md
@@ -171,6 +171,10 @@ Or loop:
       (hsx (li item))))))
 ```
 
+## Utils
+
+- `(clsx &rest strs)`: A utility function for constructing class strings conditionally. It removes `nil` from the string list, then joins the remaining strings with spaces.
+
 ## 📄 License
 
 MIT License
diff --git a/hsx.asd b/hsx.asd
index 10f33bb..e3fa1f0 100644
--- a/hsx.asd
+++ b/hsx.asd
@@ -1,5 +1,5 @@
 (defsystem "hsx"
-  :version "0.5.0"
+  :version "0.6.0"
   :description "Simple and powerful HTML generation library."
   :author "Akira Tempaku, Bo Yao"
   :maintainer "Akira Tempaku <paku@skyizwhite.dev>"
diff --git a/src/main.lisp b/src/main.lisp
index 80f1fab..440bf6d 100644
--- a/src/main.lisp
+++ b/src/main.lisp
@@ -2,9 +2,11 @@
   (:nicknames #:hsx/main)
   (:use #:cl
         #:hsx/element
-        #:hsx/dsl)
+        #:hsx/dsl
+        #:hsx/utils)
   (:import-from #:hsx/builtin)
   (:export #:hsx
            #:defcomp
-           #:render-to-string))
+           #:render-to-string
+           #:clsx))
 (in-package :hsx)
diff --git a/src/utils.lisp b/src/utils.lisp
index 2a1f397..94a3b25 100644
--- a/src/utils.lisp
+++ b/src/utils.lisp
@@ -5,7 +5,8 @@
                 #:make-keyword
                 #:symbolicate)
   (:export #:escape-html-attribute
-           #:escape-html-text-content))
+           #:escape-html-text-content
+           #:clsx))
 (in-package #:hsx/utils)
 
 (defparameter *text-content-escape-map*
@@ -40,3 +41,6 @@
 
 (defun escape-html-attribute (str)
   (escape-string str *attribute-escape-map*))
+
+(defun clsx (&rest strs)
+  (format nil "~{~a~^ ~}" (remove nil strs)))