branch: elpa/casual
commit 21566acc78554aaefc8ae4d7889623ebfa93dfaa
Author: Charles Choi <[email protected]>
Commit: Charles Choi <[email protected]>

    Support for Casual HTML and CSS
    
    - Added support for SGML/HTML/mHTML modes
    - Support Tree-sitter
    - Update copyright
---
 README.org                                         |   2 +-
 docs/casual.info                                   | Bin 143516 -> 148480 bytes
 docs/casual.org                                    |   7 +-
 docs/casual.texi                                   | 175 ++++++++++++++++++++-
 docs/css.org                                       |  57 +++++++
 docs/html.org                                      |  69 ++++++++
 docs/ibuffer.org                                   |   2 -
 docs/images/casual-css-screenshot.png              | Bin 0 -> 107800 bytes
 docs/images/casual-css-settings-screenshot.png     | Bin 0 -> 51284 bytes
 docs/images/casual-html-screenshot.png             | Bin 0 -> 169002 bytes
 docs/images/casual-html-settings-screenshot.png    | Bin 0 -> 159704 bytes
 docs/images/casual-html-tags-screenshot.png        | Bin 0 -> 170992 bytes
 docs/see-also.org                                  |   2 +
 lisp/Makefile                                      |  11 ++
 .../Makefile-MODULE.make => lisp/Makefile-css.make |  10 +-
 .../Makefile-html.make                             |   8 +-
 lisp/casual-css-settings.el                        |  87 ++++++++++
 .../casual-css-utils.el                            |  36 ++---
 lisp/casual-css.el                                 |  73 +++++++++
 lisp/casual-html-settings.el                       | 105 +++++++++++++
 lisp/casual-html-utils.el                          | 112 +++++++++++++
 lisp/casual-html.el                                | 111 +++++++++++++
 lisp/casual.el                                     |   8 +-
 templates/lisp/Makefile-MODULE.make                |   2 +-
 templates/lisp/casual-MODULE-settings.el           |   2 +-
 templates/lisp/casual-MODULE-utils.el              |   2 +-
 templates/lisp/casual-MODULE.el                    |   2 +-
 tests/Makefile                                     |  10 ++
 tests/casual-css-test-utils.el                     |  48 ++++++
 tests/casual-html-test-utils.el                    |  48 ++++++
 tests/test-casual-css-settings.el                  |  52 ++++++
 tests/test-casual-css-utils.el                     |  40 +++++
 tests/test-casual-css.el                           |  60 +++++++
 tests/test-casual-html-settings.el                 |  56 +++++++
 tests/test-casual-html-utils.el                    | 126 +++++++++++++++
 tests/test-casual-html.el                          |  80 ++++++++++
 36 files changed, 1360 insertions(+), 43 deletions(-)

diff --git a/README.org b/README.org
index 0a89fd947f..cd68f4de0a 100644
--- a/README.org
+++ b/README.org
@@ -39,4 +39,4 @@ Users interested in getting all current and future Casual 
interfaces for both bu
 * Acknowledgments
 A heartfelt thanks to all the contributors to 
[[https://github.com/magit/transient][Transient]], [[https://magit.vc][Magit]], 
[[https://orgmode.org][Org Mode]], and 
[[https://www.gnu.org/software/emacs/][Emacs]]. This package would not be 
possible without your efforts.
 
-#+HTML: <p align='center'>© 2024-2025 Charles Y. Choi</p>
+#+HTML: <p align='center'>© 2024-2026 Charles Y. Choi</p>
diff --git a/docs/casual.info b/docs/casual.info
index 3c1c7a87a4..c3842d3f62 100644
Binary files a/docs/casual.info and b/docs/casual.info differ
diff --git a/docs/casual.org b/docs/casual.org
index adff08947f..109cc0a2e1 100644
--- a/docs/casual.org
+++ b/docs/casual.org
@@ -19,6 +19,8 @@
 
 Version: {{{version}}}
 
+#+TEXINFO: Copyright © 2024-2026 @w{Charles Y. Choi}
+
 Casual is a project to re-imagine the primary user interface for Emacs using 
keyboard-driven menus.
 
 Emacs has many commands that are easy to forget if not used frequently. Menus 
are a user interface (UI) affordance that offers discoverability and 
recognition. While menus are commonly associated with mouse-driven UI, the 
inclusion of Transient ([[info:transient]]) in Emacs core allows for building 
menus that are keyboard-driven instead. This appeals to users that prefer 
keyboard-driven workflows.
@@ -133,7 +135,6 @@ Certain menus require more installed software:
 - Casual Dired: GNU Coreutils
 - Casual Image: ImageMagick 6+
 
-
 * Install
 #+CINDEX: Install
 
@@ -147,6 +148,7 @@ Configuration of a particular Casual user interface is 
performed per mode. Go to
 - [[#calc-install][Calc]]
 - [[#calendar-install][Calendar]]
 - [[#compile-install][Compile (Grep)]]
+- [[#css-install][CSS]]
 - [[#csv-install][CSV]]
 - [[#dired-install][Dired]]
 - [[#ediff-install][Ediff]]
@@ -154,6 +156,7 @@ Configuration of a particular Casual user interface is 
performed per mode. Go to
 - [[#elisp-install][Elisp]]
 - [[#eshell-install][Eshell]]
 - [[#help-install][Help]]
+- [[#html-install][HTML]]
 - [[#ibuffer-install][IBuffer]]
 - [[#image-install][Image]]
 - [[#info-install][Info]]
@@ -261,6 +264,7 @@ The following modes are supported by Casual:
 #+INCLUDE: "./calc.org" :minlevel 2
 #+INCLUDE: "./calendar.org" :minlevel 2
 #+INCLUDE: "./compile.org" :minlevel 2
+#+INCLUDE: "./css.org" :minlevel 2
 #+INCLUDE: "./csv.org" :minlevel 2
 #+INCLUDE: "./dired.org" :minlevel 2
 #+INCLUDE: "./ediff.org" :minlevel 2
@@ -268,6 +272,7 @@ The following modes are supported by Casual:
 #+INCLUDE: "./elisp.org" :minlevel 2
 #+INCLUDE: "./eshell.org" :minlevel 2
 #+INCLUDE: "./help.org" :minlevel 2
+#+INCLUDE: "./html.org" :minlevel 2
 #+INCLUDE: "./ibuffer.org" :minlevel 2
 #+INCLUDE: "./image.org" :minlevel 2
 #+INCLUDE: "./info.org" :minlevel 2
diff --git a/docs/casual.texi b/docs/casual.texi
index 77bc3a7c0a..f22ca87d1d 100644
--- a/docs/casual.texi
+++ b/docs/casual.texi
@@ -35,6 +35,8 @@ Copyright © 2024-2025 Charles Y@. Choi
 
 Version: 2.11.2
 
+Copyright © 2024-2026 @w{Charles Y. Choi}
+
 Casual is a project to re-imagine the primary user interface for Emacs using 
keyboard-driven menus.
 
 Emacs has many commands that are easy to forget if not used frequently. Menus 
are a user interface (UI) affordance that offers discoverability and 
recognition. While menus are commonly associated with mouse-driven UI, the 
inclusion of Transient (@ref{Top,,,transient,}) in Emacs core allows for 
building menus that are keyboard-driven instead. This appeals to users that 
prefer keyboard-driven workflows.
@@ -105,6 +107,7 @@ Casual Modes
 * Calc::
 * Calendar::
 * Compile::
+* CSS::
 * CSV::
 * Dired::
 * Ediff::
@@ -112,6 +115,7 @@ Casual Modes
 * Elisp::
 * Eshell::
 * Help::
+* HTML::
 * IBuffer::
 * Image::
 * Info::
@@ -164,6 +168,11 @@ Compile
 * Compile Install::
 * Compile Usage::
 
+CSS
+
+* CSS Install::
+* CSS Usage::
+
 CSV
 
 * CSV Install::
@@ -235,6 +244,11 @@ Help
 * Help Install::
 * Help Usage::
 
+HTML
+
+* HTML Install::
+* HTML Usage::
+
 IBuffer
 
 * IBuffer Install::
@@ -452,6 +466,8 @@ Configuration of a particular Casual user interface is 
performed per mode. Go to
 @item
 @ref{Compile Install, , Compile (Grep)}
 @item
+@ref{CSS Install, , CSS}
+@item
 @ref{CSV Install, , CSV}
 @item
 @ref{Dired Install, , Dired}
@@ -466,6 +482,8 @@ Configuration of a particular Casual user interface is 
performed per mode. Go to
 @item
 @ref{Help Install, , Help}
 @item
+@ref{HTML Install, , HTML}
+@item
 @ref{IBuffer Install, , IBuffer}
 @item
 @ref{Image Install, , Image}
@@ -616,6 +634,7 @@ The following modes are supported by Casual:
 * Calc::
 * Calendar::
 * Compile::
+* CSS::
 * CSV::
 * Dired::
 * Ediff::
@@ -623,6 +642,7 @@ The following modes are supported by Casual:
 * Elisp::
 * Eshell::
 * Help::
+* HTML::
 * IBuffer::
 * Image::
 * Info::
@@ -1427,6 +1447,82 @@ If the output window is from a Grep command, 
@code{casual-compile-tmenu} will ad
 
 By enabling “@kbd{u} Use Unicode Symbols” from the Settings menu, Casual 
Compile will use Unicode symbols as appropriate in its menus.
 
+@node CSS
+@section CSS
+
+@cindex CSS
+@vindex casual-css-tmenu
+
+Casual CSS is a user interface for @code{css-mode}. 
+
+@image{images/casual-css-screenshot,,,,png}
+Casual also has support for HTML editing (@ref{HTML}).
+
+@menu
+* CSS Install::
+* CSS Usage::
+@end menu
+
+@node CSS Install
+@subsection CSS Install
+
+@cindex CSS Install
+
+In your initialization file, bind the Transient @code{casual-css-tmenu} to 
your key binding of preference.
+
+@lisp
+(keymap-set css-mode-map "M-m" #'casual-css-tmenu)
+@end lisp
+
+A different binding (@kbd{M-m}) is used as @code{casual-css-tmenu} is intended 
to work alongside with @ref{EditKit Install, , Casual EditKit}.
+
+@node CSS Usage
+@subsection CSS Usage
+
+@cindex CSS Usage
+
+@image{images/casual-css-screenshot,,,,png}
+
+
+The following sections are offered in the menu:
+
+@table @asis
+@item CSS
+CSS specific commands.
+@itemize
+@item
+“@kbd{l} Lookup Symbol” will reference the symbol's documentation from the 
Mozilla Developer Network (MDN) website.
+@item
+“@kbd{c} Cycle Color” should be selected when the point is on a color 
specification.
+@end itemize
+@item Edit
+Editing commands.
+@itemize
+@item
+“@kbd{f} Indent CSS Rule” is a call to @code{fill-paragraph} whose behavior is 
adjusted for @code{css-mode}.
+@end itemize
+@item Misc
+Miscellaneous commands.
+@itemize
+@item
+“@kbd{h} Highlight Line” toggles @code{hl-line-mode} to avoid interfering the 
display of color specifications.
+@end itemize
+@end table
+
+
+@subheading CSS Settings
+@vindex casual-css-settings-tmenu
+
+Settings menu for Casual CSS@.
+
+
+@image{images/casual-css-settings-screenshot,,,,png}
+
+
+@subheading CSS Unicode Symbol Support
+
+By enabling “@kbd{u} Use Unicode Symbols” from the Settings menu, Casual CSS 
will use Unicode symbols as appropriate in its menus.
+
 @node CSV
 @section CSV
 
@@ -2428,7 +2524,84 @@ Show the Elisp source. If the help displayed is for a 
customizable variable, the
 @subheading Help Mode Unicode Symbol Support
 
 By enabling “@kbd{u} Use Unicode Symbols” from the Settings menu, Casual Man 
will use Unicode symbols as appropriate in its menus.
-@uref{../README.org, ❮ Back to Casual}
+
+@node HTML
+@section HTML
+
+@cindex HTML
+@vindex casual-html-tmenu
+
+Casual HTML is a user interface for @code{html-mode} (@ref{HTML 
Mode,html-mode,,emacs,}). 
+
+@image{images/casual-html-screenshot,,,,png}
+Casual also has support for CSS editing (@ref{CSS}).
+
+@menu
+* HTML Install::
+* HTML Usage::
+@end menu
+
+@node HTML Install
+@subsection HTML Install
+
+@cindex HTML Install
+
+In your initialization file, bind the Transient @code{casual-html-tmenu} to 
your key binding of preference.
+
+@lisp
+(keymap-set html-mode-map "M-m" #'casual-html-tmenu)
+@end lisp
+
+A different binding (@kbd{M-m}) is used as @code{casual-html-tmenu} is 
intended to work alongside with @ref{EditKit Install, , Casual EditKit}.
+
+It is convenient to also bind @code{casual-html-tag-tmenu} as well.
+
+@lisp
+(keymap-set html-mode-map "M-m" #'casual-html-tags-tmenu)
+@end lisp
+
+If HTML Tree-sitter support is enabled, set the keymap @code{html-ts-mode-map} 
instead of @code{html-mode-map}.
+
+@node HTML Usage
+@subsection HTML Usage
+
+@cindex HTML Usage
+
+@image{images/casual-html-screenshot,,,,png}
+
+The following sections are offered in the menu:
+
+@table @asis
+@item </>
+SGML tag-related commands.
+@item HTML
+HTML tag-related commands.
+@item Misc
+Miscellaneous commands.
+@item Navigation
+Navigation commands.
+@end table
+
+Note that the item “@kbd{d} Delete” (bound to @code{sgml-delete-tag}) is not 
available when HTML Tree-sitter support is enabled.
+
+
+@subheading HTML Tags
+@vindex casual-html-tags-tmenu
+
+This menu provides support for HTML tag-related commands provided by 
@code{html-mode}.
+
+@image{images/casual-html-tags-screenshot,,,,png}
+
+@subheading HTML Settings
+@vindex casual-html-settings-tmenu
+
+SGML/HTML mode related settings can be customized here.
+
+@image{images/casual-html-settings-screenshot,,,,png}
+
+@subheading HTML Unicode Symbol Support
+
+By enabling “@kbd{u} Use Unicode Symbols” from the Settings menu, Casual html 
will use Unicode symbols as appropriate in its menus.
 
 @node IBuffer
 @section IBuffer
diff --git a/docs/css.org b/docs/css.org
new file mode 100644
index 0000000000..6de3c72ee1
--- /dev/null
+++ b/docs/css.org
@@ -0,0 +1,57 @@
+* CSS
+:PROPERTIES:
+:CUSTOM_ID: css-top
+:END:
+#+CINDEX: CSS
+#+VINDEX: casual-css-tmenu
+
+Casual CSS is a user interface for ~css-mode~. 
+
+[[file:images/casual-css-screenshot.png]]
+Casual also has support for HTML editing ([[#html-top][HTML]]).
+
+
+** CSS Install
+:PROPERTIES:
+:CUSTOM_ID: css-install
+:END:
+
+#+CINDEX: CSS Install
+
+In your initialization file, bind the Transient ~casual-css-tmenu~ to your key 
binding of preference.
+
+#+begin_src elisp :lexical no
+  (keymap-set css-mode-map "M-m" #'casual-css-tmenu)
+#+end_src
+
+A different binding ({{{kbd(M-m)}}}) is used as ~casual-css-tmenu~ is intended 
to work alongside with [[#editkit-install][Casual EditKit]].
+
+** CSS Usage
+#+CINDEX: CSS Usage
+
+[[file:images/casual-css-screenshot.png]]
+
+
+The following sections are offered in the menu:
+
+- CSS :: CSS specific commands.
+  - “{{{kbd(l)}}} Lookup Symbol” will reference the symbol's documentation 
from the Mozilla Developer Network (MDN) website.
+  - “{{{kbd(c)}}} Cycle Color” should be selected when the point is on a color 
specification.
+- Edit :: Editing commands.
+  - “{{{kbd(f)}}} Indent CSS Rule” is a call to ~fill-paragraph~ whose 
behavior is adjusted for ~css-mode~.
+- Misc :: Miscellaneous commands.
+  - “{{{kbd(h)}}} Highlight Line” toggles ~hl-line-mode~ to avoid interfering 
the display of color specifications.
+  
+
+#+TEXINFO: @subheading CSS Settings
+#+VINDEX: casual-css-settings-tmenu
+
+Settings menu for Casual CSS.
+
+
+[[file:images/casual-css-settings-screenshot.png]]
+
+
+#+TEXINFO: @subheading CSS Unicode Symbol Support
+
+By enabling “{{{kbd(u)}}} Use Unicode Symbols” from the Settings menu, Casual 
CSS will use Unicode symbols as appropriate in its menus.
diff --git a/docs/html.org b/docs/html.org
new file mode 100644
index 0000000000..12a57fc0c6
--- /dev/null
+++ b/docs/html.org
@@ -0,0 +1,69 @@
+* HTML
+:PROPERTIES:
+:CUSTOM_ID: html-top
+:END:
+
+#+CINDEX: HTML
+#+VINDEX: casual-html-tmenu
+
+Casual HTML is a user interface for ~html-mode~ ([[info:emacs#HTML 
Mode][html-mode]]). 
+
+[[file:images/casual-html-screenshot.png]]
+Casual also has support for CSS editing ([[#css-top][CSS]]).
+
+** HTML Install
+:PROPERTIES:
+:CUSTOM_ID: html-install
+:END:
+
+#+CINDEX: HTML Install
+
+In your initialization file, bind the Transient ~casual-html-tmenu~ to your 
key binding of preference.
+
+#+begin_src elisp :lexical no
+  (keymap-set html-mode-map "M-m" #'casual-html-tmenu)
+#+end_src
+
+A different binding ({{{kbd(M-m)}}}) is used as ~casual-html-tmenu~ is 
intended to work alongside with [[#editkit-install][Casual EditKit]].
+
+It is convenient to also bind ~casual-html-tag-tmenu~ as well.
+
+#+begin_src elisp :lexical no
+  (keymap-set html-mode-map "M-m" #'casual-html-tags-tmenu)
+#+end_src
+
+If HTML Tree-sitter support is enabled, set the keymap ~html-ts-mode-map~ 
instead of ~html-mode-map~.
+
+** HTML Usage
+#+CINDEX: HTML Usage
+
+[[file:images/casual-html-screenshot.png]]
+
+The following sections are offered in the menu:
+
+- </> :: SGML tag-related commands.
+- HTML :: HTML tag-related commands.
+- Misc :: Miscellaneous commands.
+- Navigation :: Navigation commands.
+
+Note that the item “{{{kbd(d)}}} Delete” (bound to ~sgml-delete-tag~) is not 
available when HTML Tree-sitter support is enabled.
+
+
+#+TEXINFO: @subheading HTML Tags
+#+VINDEX: casual-html-tags-tmenu
+
+This menu provides support for HTML tag-related commands provided by 
~html-mode~.
+
+[[file:images/casual-html-tags-screenshot.png]]
+
+#+TEXINFO: @subheading HTML Settings
+#+VINDEX: casual-html-settings-tmenu
+
+SGML/HTML mode related settings can be customized here.
+
+[[file:images/casual-html-settings-screenshot.png]]
+
+#+TEXINFO: @subheading HTML Unicode Symbol Support
+
+By enabling “{{{kbd(u)}}} Use Unicode Symbols” from the Settings menu, Casual 
html will use Unicode symbols as appropriate in its menus.
+
diff --git a/docs/ibuffer.org b/docs/ibuffer.org
index 7dfa373924..c7acf7f46f 100644
--- a/docs/ibuffer.org
+++ b/docs/ibuffer.org
@@ -1,5 +1,3 @@
-[[../README.org][❮ Back to Casual]]
-
 * IBuffer
 #+CINDEX: IBuffer
 #+VINDEX: casual-ibuffer-tmenu
diff --git a/docs/images/casual-css-screenshot.png 
b/docs/images/casual-css-screenshot.png
new file mode 100644
index 0000000000..f2b9f4886d
Binary files /dev/null and b/docs/images/casual-css-screenshot.png differ
diff --git a/docs/images/casual-css-settings-screenshot.png 
b/docs/images/casual-css-settings-screenshot.png
new file mode 100644
index 0000000000..4d0a316470
Binary files /dev/null and b/docs/images/casual-css-settings-screenshot.png 
differ
diff --git a/docs/images/casual-html-screenshot.png 
b/docs/images/casual-html-screenshot.png
new file mode 100644
index 0000000000..7d7d8c655e
Binary files /dev/null and b/docs/images/casual-html-screenshot.png differ
diff --git a/docs/images/casual-html-settings-screenshot.png 
b/docs/images/casual-html-settings-screenshot.png
new file mode 100644
index 0000000000..5c840703e4
Binary files /dev/null and b/docs/images/casual-html-settings-screenshot.png 
differ
diff --git a/docs/images/casual-html-tags-screenshot.png 
b/docs/images/casual-html-tags-screenshot.png
new file mode 100644
index 0000000000..9924c39d45
Binary files /dev/null and b/docs/images/casual-html-tags-screenshot.png differ
diff --git a/docs/see-also.org b/docs/see-also.org
new file mode 100644
index 0000000000..31648d0f9c
--- /dev/null
+++ b/docs/see-also.org
@@ -0,0 +1,2 @@
+* See Also
+[[file:agenda.org][Agenda]], [[file:bookmarks.org][Bookmarks]], 
[[file:calc.org][Calc]], [[file:calendar.org][Calendar]], 
[[file:dired.org][Dired]], [[file:editkit.org][EditKit (numerous editing 
commands)]], [[file:help.org][Help]], [[file:ibuffer.org][IBuffer]], 
[[file:image.org][Image]], [[file:info.org][Info]], 
[[file:isearch.org][I-Search]], [[file:make-mode.org][Make]], 
[[file:man.org][Man]], [[file:re-builder.org][RE-Builder]], 
[[file:timezone.org][Timezone]]
diff --git a/lisp/Makefile b/lisp/Makefile
index ab5c1fe54d..68310df6a0 100644
--- a/lisp/Makefile
+++ b/lisp/Makefile
@@ -25,6 +25,7 @@ bookmarks-tests                                       \
 calc-tests                                     \
 calendar-tests                                 \
 compile-tests                                  \
+css-tests                                      \
 csv-tests                                      \
 dired-tests                                    \
 ediff-tests                                    \
@@ -32,6 +33,7 @@ editkit-tests                                 \
 elisp-tests                                    \
 eshell-tests                                   \
 help-tests                                     \
+html-tests                                     \
 ibuffer-tests                                  \
 info-tests                                     \
 isearch-tests                                  \
@@ -68,6 +70,10 @@ calendar-tests:
 compile-tests:
        $(MAKE) -C $(SRC_DIR) -f Makefile-compile.make tests
 
+.PHONY: css-tests
+css-tests:
+       $(MAKE) -C $(SRC_DIR) -f Makefile-css.make tests
+
 .PHONY: csv-tests
 csv-tests:
        $(MAKE) -C $(SRC_DIR) -f Makefile-csv.make tests
@@ -96,6 +102,11 @@ eshell-tests:
 help-tests:
        $(MAKE) -C $(SRC_DIR) -f Makefile-help.make tests
 
+.PHONY: html-tests
+html-tests:
+       $(MAKE) -C $(SRC_DIR) -f Makefile-html.make tests
+
+
 .PHONY: image-tests
 image-tests:
        $(MAKE) -C $(SRC_DIR) -f Makefile-image.make tests
diff --git a/templates/lisp/Makefile-MODULE.make b/lisp/Makefile-css.make
similarity index 83%
copy from templates/lisp/Makefile-MODULE.make
copy to lisp/Makefile-css.make
index d9a84e30c4..f14bd6b773 100644
--- a/templates/lisp/Makefile-MODULE.make
+++ b/lisp/Makefile-css.make
@@ -1,5 +1,5 @@
 ##
-# Copyright (C) 2025 Charles Y. Choi
+# Copyright (C) 2026 Charles Y. Choi
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,11 +16,11 @@
 
 include Makefile--defines.make
 
-PACKAGE_NAME=casual-$MODULE
-ELISP_INCLUDES=casual-$MODULE-utils.el \
-casual-$MODULE-settings.el
+PACKAGE_NAME=casual-css
+ELISP_INCLUDES=casual-css-utils.el     \
+casual-css-settings.el
 ELISP_PACKAGES=
-ELISP_TEST_INCLUDES=casual-$MODULE-test-utils.el
+ELISP_TEST_INCLUDES=casual-css-test-utils.el
 PACKAGE_PATHS=                                 \
 -L $(EMACS_ELPA_DIR)/compat-current            \
 -L $(EMACS_ELPA_DIR)/seq-current               \
diff --git a/templates/lisp/Makefile-MODULE.make b/lisp/Makefile-html.make
similarity index 86%
copy from templates/lisp/Makefile-MODULE.make
copy to lisp/Makefile-html.make
index d9a84e30c4..92632be7b1 100644
--- a/templates/lisp/Makefile-MODULE.make
+++ b/lisp/Makefile-html.make
@@ -16,11 +16,11 @@
 
 include Makefile--defines.make
 
-PACKAGE_NAME=casual-$MODULE
-ELISP_INCLUDES=casual-$MODULE-utils.el \
-casual-$MODULE-settings.el
+PACKAGE_NAME=casual-html
+ELISP_INCLUDES=casual-html-utils.el    \
+casual-html-settings.el
 ELISP_PACKAGES=
-ELISP_TEST_INCLUDES=casual-$MODULE-test-utils.el
+ELISP_TEST_INCLUDES=casual-html-test-utils.el
 PACKAGE_PATHS=                                 \
 -L $(EMACS_ELPA_DIR)/compat-current            \
 -L $(EMACS_ELPA_DIR)/seq-current               \
diff --git a/lisp/casual-css-settings.el b/lisp/casual-css-settings.el
new file mode 100644
index 0000000000..0652a3282a
--- /dev/null
+++ b/lisp/casual-css-settings.el
@@ -0,0 +1,87 @@
+;;; casual-css-settings.el --- Casual CSS Settings -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+
+;;; Code:
+(require 'css-mode)
+(require 'casual-lib)
+
+(transient-define-prefix casual-css-settings-tmenu ()
+  "Casual CSS settings menu."
+  ["Casual CSS: Settings"
+   ["Customize"
+    ("o" "Indent Offset" casual-css--customize-indent-offset
+     :description (lambda () (format "Indent Offset (%d)" css-indent-offset)))]
+
+   ["Group"
+    ("G" "CSS Group" casual-css--customize-group)]]
+
+  ["General"
+   :class transient-row
+   (casual-lib-customize-unicode)
+   (casual-lib-customize-hide-navigation)]
+
+  [:class transient-row
+   (casual-lib-quit-one)
+   ("a" "About" casual-css-about :transient nil)
+   (casual-lib-quit-all)])
+
+(defun casual-css--customize-indent-offset ()
+  "Customize CSS `css-indent-offset'."
+  (interactive)
+  (customize-variable 'css-indent-offset))
+
+(defun casual-css--customize-group ()
+  "Customize CSS group."
+  (interactive)
+  (customize-group "css"))
+
+(defun casual-css-about-css ()
+  "Casual CSS is a Transient menu for CSS mode.
+
+Learn more about using Casual CSS at our discussion group on GitHub.
+Any questions or comments about it should be made there.
+URL `https://github.com/kickingvegas/casual/discussions'
+
+If you find a bug or have an enhancement request, please file an issue.
+Our best effort will be made to answer it.
+URL `https://github.com/kickingvegas/casual/issues'
+
+If you enjoy using Casual CSS, consider making a modest financial
+contribution to help support its development and maintenance.
+URL `https://www.buymeacoffee.com/kickingvegas'
+
+Casual CSS was conceived and crafted by Charles Choi in San Francisco,
+California.
+
+Thank you for using Casual CSS.
+
+Always choose love."
+  (ignore))
+
+(defun casual-css-about ()
+  "About information for Casual CSS."
+  (interactive)
+  (describe-function #'casual-css-about-css))
+
+(provide 'casual-css-settings)
+;;; casual-css-settings.el ends here
diff --git a/templates/lisp/casual-MODULE-utils.el b/lisp/casual-css-utils.el
similarity index 55%
copy from templates/lisp/casual-MODULE-utils.el
copy to lisp/casual-css-utils.el
index 5db77c1303..e9a17ce800 100644
--- a/templates/lisp/casual-MODULE-utils.el
+++ b/lisp/casual-css-utils.el
@@ -1,6 +1,6 @@
-;;; casual-$MODULE-utils.el --- Casual $MODULE Utils -*- lexical-binding: t; 
-*-
+;;; casual-css-utils.el --- Casual CSS Utils -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2025 Charles Y. Choi
+;; Copyright (C) 2026 Charles Y. Choi
 
 ;; Author: Charles Choi <[email protected]>
 ;; Keywords: tools
@@ -22,24 +22,16 @@
 ;;
 
 ;;; Code:
-(require '$MODULE)
+(require 'css-mode)
 (require 'casual-lib)
 
-(defconst casual-$MODULE-unicode-db
+(defconst casual-css-unicode-db
   '((:previous . '("↑" "Previous"))
-    (:next . '("↓" "Next"))
-    (:goto . '("→" "Goto…"))
-    (:follow . '("🔗…" "Follow…"))
-    (:beginning-of-buffer . '("⇱" "Beginning"))
-    (:end-of-buffer . '("⇲" "End"))
-    (:paragraph . '("¶" "Paragraph"))
-    (:update . '("⟳" "Update"))
-    (:kill . '("×" "Close"))
-    (:see-also . '("👀" "See Also")))
-
-  "Unicode symbol DB to use for $MODULE Transient menus.")
-
-(defun casual-$MODULE-unicode-get (key)
+    (:next . '("↓" "Next")))
+
+  "Unicode symbol DB to use for CSS Transient menus.")
+
+(defun casual-css-unicode-get (key)
   "Lookup Unicode symbol for KEY in DB.
 
 - KEY symbol used to lookup Unicode symbol in DB.
@@ -47,11 +39,7 @@
 If the value of customizable variable `casual-lib-use-unicode'
 is non-nil, then the Unicode symbol is returned, otherwise a
 plain ASCII-range string."
-  (casual-lib-unicode-db-get key casual-$MODULE-unicode-db))
-
-(defun casual-$MODULE-info ()
-  "Open Info for Emacs $Module Page."
-  (interactive) (info "(emacs) $MODULE Page"))
+  (casual-lib-unicode-db-get key casual-css-unicode-db))
 
-(provide 'casual-$MODULE-utils)
-;;; casual-$MODULE-utils.el ends here
+(provide 'casual-css-utils)
+;;; casual-css-utils.el ends here
diff --git a/lisp/casual-css.el b/lisp/casual-css.el
new file mode 100644
index 0000000000..daadbce9e6
--- /dev/null
+++ b/lisp/casual-css.el
@@ -0,0 +1,73 @@
+;;; casual-css.el --- Transient UI for CSS mode -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library provides a Transient-based user interface for `css-mode'.
+
+;; INSTALLATION
+
+;; In your initialization file, bind the Transient `casual-css-tmenu' to your
+;; key binding of preference.
+
+;; (require 'casual-css) ; optional if using autoloaded menu
+;; (keymap-set css-mode-map "M-m" #'casual-css-tmenu)
+
+;; Note that `casual-css-tmenu' is intended to work with
+;; `casual-editkit-main-tmenu' so is given a different binding.
+
+;; It is recommended that Tree-sitter support for CSS is enabled.
+
+;;; Code:
+(require 'casual-css-settings)
+(require 'casual-css-utils)
+(require 'hl-line)
+
+;;;###autoload (autoload 'casual-css-tmenu "casual-css" nil t)
+(transient-define-prefix casual-css-tmenu ()
+  "Casual menu for `css-mode'.
+
+Transient menu to commands provided by `css-mode'."
+  :refresh-suffixes t
+
+  ["Casual CSS"
+   ["CSS"
+    ("l" "Lookup Symbol" css-lookup-symbol)
+    ("c" "Cycle Color" css-cycle-color-format
+     :inapt-if (lambda () buffer-read-only)
+     :transient t)]
+
+   ["Edit"
+    ("f" "Indent CSS Rule" fill-paragraph
+     :inapt-if (lambda () buffer-read-only))]
+
+   ["Misc"
+    ("h" "Toggle Highlight-line" hl-line-mode
+     :description (lambda () (casual-lib-checkbox-label hl-line-mode 
"Highlight Line"))
+     :transient t)]]
+
+  [:class transient-row
+   (casual-lib-quit-one)
+   ("," "Settings" casual-css-settings-tmenu)
+   ("RET" "Dismiss" transient-quit-all)
+   (casual-lib-quit-all)])
+
+(provide 'casual-css)
+;;; casual-css.el ends here
diff --git a/lisp/casual-html-settings.el b/lisp/casual-html-settings.el
new file mode 100644
index 0000000000..047957b270
--- /dev/null
+++ b/lisp/casual-html-settings.el
@@ -0,0 +1,105 @@
+;;; casual-html-settings.el --- Casual HTML Settings -*- lexical-binding: t; 
-*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+
+;;; Code:
+(require 'sgml-mode)
+(require 'casual-lib)
+
+(defvar html-ts-mode-indent-offset)
+
+(transient-define-prefix casual-html-settings-tmenu ()
+  "Casual HTML settings menu."
+  ["Casual HTML: Settings"
+   ["Offsets"
+    ("b" "Basic" casual-html--customize-sgml-basic-offset
+     :description (lambda () (format "Basic (%d)" sgml-basic-offset)))
+    ("t" "Tree-sitter Basic" casual-html--customize-html-ts-mode-indent-offset
+     :if (lambda () (derived-mode-p 'html-ts-mode))
+     :description (lambda () (format "Tree-sitter Basic (%d)"
+                                html-ts-mode-indent-offset)))
+    ("A" "Attribute" casual-html--customize-sgml-attribute-offset
+     :description (lambda () (format "Attribute (%d)" sgml-attribute-offset)))]
+
+   ["Group"
+    ("G" "SGML Group" casual-html--customize-group-sgml)]]
+
+  ["General"
+   :class transient-row
+   (casual-lib-customize-unicode)
+   (casual-lib-customize-hide-navigation)]
+
+  [:class transient-row
+   (casual-lib-quit-one)
+   ("a" "About" casual-html-about :transient nil)
+   (casual-lib-quit-all)])
+
+(defun casual-html--customize-group-sgml ()
+  "Customize SGML group."
+  (interactive)
+  (customize-group "sgml"))
+
+(defun casual-html--customize-sgml-basic-offset ()
+  "Customize SGML `sgml-basic-offset'."
+  (interactive)
+  (customize-variable 'sgml-basic-offset))
+
+(defun casual-html--customize-sgml-attribute-offset ()
+  "Customize SGML `sgml-attribute-offset'."
+  (interactive)
+  (customize-variable 'sgml-attribute-offset))
+
+(defun casual-html--customize-html-ts-mode-indent-offset ()
+  "Customize SGML `html-ts-mode-indent-offset'."
+  (interactive)
+  (customize-variable 'html-ts-mode-indent-offset))
+
+(defun casual-html-about-html ()
+  "Casual HTML is a Transient menu for HTML mode.
+
+Learn more about using Casual HTML at our discussion group on GitHub.
+Any questions or comments about it should be made there.
+URL `https://github.com/kickingvegas/casual/discussions'
+
+If you find a bug or have an enhancement request, please file an issue.
+Our best effort will be made to answer it.
+URL `https://github.com/kickingvegas/casual/issues'
+
+If you enjoy using Casual HTML, consider making a modest financial
+contribution to help support its development and maintenance.
+URL `https://www.buymeacoffee.com/kickingvegas'
+
+Casual HTML was conceived and crafted by Charles Choi in San Francisco,
+California.
+
+Thank you for using Casual HTML.
+
+Always choose love."
+  (ignore))
+
+(defun casual-html-about ()
+  "About information for Casual HTML."
+  (interactive)
+  (describe-function #'casual-html-about-html))
+
+(provide 'casual-html-settings)
+;;; casual-html-settings.el ends here
diff --git a/lisp/casual-html-utils.el b/lisp/casual-html-utils.el
new file mode 100644
index 0000000000..a3671701b5
--- /dev/null
+++ b/lisp/casual-html-utils.el
@@ -0,0 +1,112 @@
+;;; casual-html-utils.el --- Casual HTML Utils -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+
+;;; Code:
+(require 'sgml-mode)
+(require 'casual-lib)
+
+(defconst casual-html-unicode-db
+  '((:previous . '("↑" "Previous"))
+    (:next . '("↓" "Next")))
+  "Unicode symbol DB to use for HTML Transient menus.")
+
+(defun casual-html-unicode-get (key)
+  "Lookup Unicode symbol for KEY in DB.
+
+- KEY symbol used to lookup Unicode symbol in DB.
+
+If the value of customizable variable `casual-lib-use-unicode'
+is non-nil, then the Unicode symbol is returned, otherwise a
+plain ASCII-range string."
+  (casual-lib-unicode-db-get key casual-html-unicode-db))
+
+(defun casual-html-info ()
+  "Open Info for Emacs HTML mode."
+  (interactive) (info "(emacs) HTML Mode"))
+
+
+;; -------------------------------------------------------------------
+;; Transients
+;; TODO: move to support autoload
+(transient-define-prefix casual-html-tags-tmenu ()
+  "Transient menu for HTML tags.
+
+This menu provides an interface to HTML-specific commands provided by
+`html-mode' and `mhtml-mode' (see Info node `(emacs) HTML Mode')."
+  :refresh-suffixes t
+  ["Casual HTML Tags"
+   :inapt-if (lambda () (if buffer-read-only t nil))
+   ["Content"
+    :pad-keys t
+    ("p" "Paragraph" html-paragraph)
+    ("i" "Image…" html-image)
+    ("b" "Line Break" html-line)
+    ("hr" "Horizontal Rule" html-horizontal-rule)
+    ("d" "div" html-div)]
+
+   ["Anchor"
+    ("aa" "Anchor…" html-href-anchor)
+    ("af" "File…" html-href-anchor-file)
+    ("ai" "ID…" html-id-anchor)
+    ("an" "Name…" html-name-anchor)]
+
+   ["Format"
+    ("fb" "Bold" facemenu-set-bold)
+    ("fi" "Italic" facemenu-set-italic)
+    ("fl" "Bold Italic" facemenu-set-bold-italic)
+    ("fu" "Underline" facemenu-set-underline)
+    ("fd" "Default" facemenu-set-default)
+    ("ff" "Face…" facemenu-set-face)]
+
+   ["List"
+    ("u" "Unordered" html-unordered-list)
+    ("o" "Ordered" html-ordered-list)
+    ("l" "List Item" html-list-item)
+    ("r" "Radio Buttons…" html-radio-buttons)
+    ("c" "Checkboxes…" html-checkboxes)]
+
+   ["Navigation"
+    ("[" "|< >" sgml-skip-tag-backward :transient t)
+    ("]" " </>|" sgml-skip-tag-forward :transient t)
+    ("C-b" "←" backward-char :transient t)
+    ("C-f" "→" forward-char :transient t)
+    ("C-p" "↑" previous-line :transient t)
+    ("C-n" "↓" next-line :transient t)]]
+
+  ["Headline"
+   :inapt-if (lambda () (if buffer-read-only t nil))
+   :class transient-row
+   ("h1" "1" html-headline-1)
+   ("h2" "2" html-headline-2)
+   ("h3" "3" html-headline-3)
+   ("h4" "4" html-headline-4)
+   ("h5" "5" html-headline-5)
+   ("h6" "6" html-headline-6)]
+
+  [:class transient-row
+   (casual-lib-quit-one)
+   ("RET" "Dismiss" transient-quit-all)
+   (casual-lib-quit-all)])
+
+(provide 'casual-html-utils)
+;;; casual-html-utils.el ends here
diff --git a/lisp/casual-html.el b/lisp/casual-html.el
new file mode 100644
index 0000000000..0e4b468875
--- /dev/null
+++ b/lisp/casual-html.el
@@ -0,0 +1,111 @@
+;;; casual-html.el --- Transient UI for HTML mode -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library provides a Transient-based user interface for `html-mode'.
+
+;; INSTALLATION
+
+;; In your initialization file, bind the Transient `casual-html-tmenu' to your
+;; key binding of preference.
+
+;; (require 'casual-html) ; optional if using autoloaded menu
+;; (keymap-set html-mode-map "M-m" #'casual-html-tmenu)
+
+;; A menu dedicated to HTML tags, `casual-html-tags-tmenu', can also be bound.
+
+;; (keymap-set html-mode-map "C-c m" #'casual-html-tags-tmenu)
+
+;; Users desiring to use Tree-sitter HTML mode should use the keymap
+;; `html-ts-mode-map' instead of `html-mode-map'.
+
+;; Note that the menu item for `sgml-delete-tag' is omitted when `html-ts-mode'
+;; is enabled.
+
+;;; Code:
+(require 'casual-html-settings)
+(require 'casual-html-utils)
+
+;;;###autoload (autoload 'casual-html-tmenu "casual-html" nil t)
+(transient-define-prefix casual-html-tmenu ()
+  "Main Transient menu for Casual HTML.
+
+This menu serves as the entry point for accessing commands provided by
+`sgml-mode' and modes which derive from it (`html-mode', `mhtml-mode',
+`html-ts-mode').
+
+This menu supports Tree-sitter for HTML. If `html-ts-mode' is enabled,
+the menu item for `smgl-delete-tag' is omitted as it does not have
+support for Tree-sitter.
+
+For more documentation, refer to the following links:
+- Info node `(casual) HTML'
+- Info node `(emacs) HTML Mode'"
+  :refresh-suffixes t
+  ["Casual HTML"
+   :description (lambda () (if (derived-mode-p 'html-ts-mode)
+                          "Casual HTML (Tree-sitter)"
+                        "Casual HTML"))
+
+   ["</>"
+    :inapt-if (lambda () (if buffer-read-only t nil))
+    ("i" "Insert…" sgml-tag)
+    ("a" "Attribute(s)…" sgml-attributes)
+    ("c" "Close" sgml-close-tag)
+    ("d" "Delete" sgml-delete-tag
+     :if-not (lambda () (derived-mode-p 'html-ts-mode)))]
+
+   ["HTML"
+    :if (lambda () (derived-mode-p 'html-mode))
+    ("h" "HTML›" casual-html-tags-tmenu)]
+
+   ["Misc"
+    :pad-keys t
+    ("b" "Browse" browse-url-of-buffer
+     :if (lambda () (derived-mode-p 'html-mode)))
+    ("v" "Validate" sgml-validate)
+    ("A" "Autoview" html-autoview-mode
+     :description (lambda () (casual-lib-checkbox-label html-autoview-mode
+                                                   "HTML Autoview"))
+     :if (lambda () (derived-mode-p 'html-mode)))
+    ("TAB" "Toggle Invisible Tags" sgml-tags-invisible
+     :description (lambda () (casual-lib-checkbox-label sgml-tags-invisible
+                                             "Invisible Tags"))
+     :transient t)]
+
+   ["Navigation"
+    ("[" "|< >" sgml-skip-tag-backward :transient t)
+    ("]" " </>|" sgml-skip-tag-forward :transient t)]
+   [""
+    ("C-b" "←" backward-char :transient t)
+    ("C-f" "→" forward-char :transient t)]
+   [""
+    ("C-p" "↑" previous-line :transient t)
+    ("C-n" "↓" next-line :transient t)]]
+
+  [:class transient-row
+   (casual-lib-quit-one)
+   ("," "Settings" casual-html-settings-tmenu)
+   ("I" "ⓘ" casual-html-info)
+   ("RET" "Dismiss" transient-quit-all)
+   (casual-lib-quit-all)])
+
+(provide 'casual-html)
+;;; casual-html.el ends here
diff --git a/lisp/casual.el b/lisp/casual.el
index b6473933dd..187a60259a 100644
--- a/lisp/casual.el
+++ b/lisp/casual.el
@@ -48,6 +48,9 @@
 ;; - Compile (Elisp library: `casual-compile.el')
 ;;   An interface for the output of the `compile' and Grep commands.
 
+;; - CSS (Elisp library: `casual-css.el')
+;;   An interface for CSS mode.
+
 ;; - CSV (Elisp library: `casual-csv.el')
 ;;   An interface for CSV mode.
 
@@ -75,6 +78,9 @@
 ;;   An interface for `help-mode', a major mode for viewing help text and
 ;;   navigating references in it.
 
+;; - HTML (Elisp library: `casual-html.el')
+;;   An interface for HTML mode.
+
 ;; - IBuffer (Elisp library: `casual-ibuffer.el')
 ;;   An interface to Emacs IBuffer, a mode designed for managing buffers.
 
@@ -111,7 +117,7 @@
 ;; For details, refer to the Info node `(casual) Install'.
 
 ;; Casual relies on the latest stable release of `transient' which may differ
-;; from the version that is preinstalled as a built-in. By b default, 
`package.el'
+;; from the version that is preinstalled as a built-in. By default, 
`package.el'
 ;; will not upgrade a built-in package. Set the customizable variable
 ;; `package-install-upgrade-built-in' to `t' to override this. For more 
details,
 ;; please refer to the "Install" section on this project's repository web page.
diff --git a/templates/lisp/Makefile-MODULE.make 
b/templates/lisp/Makefile-MODULE.make
index d9a84e30c4..1771c022f8 100644
--- a/templates/lisp/Makefile-MODULE.make
+++ b/templates/lisp/Makefile-MODULE.make
@@ -1,5 +1,5 @@
 ##
-# Copyright (C) 2025 Charles Y. Choi
+# Copyright (C) 2026 Charles Y. Choi
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/templates/lisp/casual-MODULE-settings.el 
b/templates/lisp/casual-MODULE-settings.el
index daa2b818db..e5c73021e5 100644
--- a/templates/lisp/casual-MODULE-settings.el
+++ b/templates/lisp/casual-MODULE-settings.el
@@ -1,6 +1,6 @@
 ;;; casual-$MODULE-settings.el --- Casual $MODULE Settings -*- 
lexical-binding: t; -*-
 
-;; Copyright (C) 2025 Charles Y. Choi
+;; Copyright (C) 2026 Charles Y. Choi
 
 ;; Author: Charles Choi <[email protected]>
 ;; Keywords: tools
diff --git a/templates/lisp/casual-MODULE-utils.el 
b/templates/lisp/casual-MODULE-utils.el
index 5db77c1303..cebca70e84 100644
--- a/templates/lisp/casual-MODULE-utils.el
+++ b/templates/lisp/casual-MODULE-utils.el
@@ -1,6 +1,6 @@
 ;;; casual-$MODULE-utils.el --- Casual $MODULE Utils -*- lexical-binding: t; 
-*-
 
-;; Copyright (C) 2025 Charles Y. Choi
+;; Copyright (C) 2026 Charles Y. Choi
 
 ;; Author: Charles Choi <[email protected]>
 ;; Keywords: tools
diff --git a/templates/lisp/casual-MODULE.el b/templates/lisp/casual-MODULE.el
index 0bc40c3344..25f7a56343 100644
--- a/templates/lisp/casual-MODULE.el
+++ b/templates/lisp/casual-MODULE.el
@@ -1,6 +1,6 @@
 ;;; casual-$MODULE.el --- Transient UI for $MODULE -*- lexical-binding: t; -*-
 
-;; Copyright (C) 2025  Charles Y. Choi
+;; Copyright (C) 2026 Charles Y. Choi
 
 ;; Author: Charles Choi <[email protected]>
 ;; Keywords: tools
diff --git a/tests/Makefile b/tests/Makefile
index b803100565..f6c53f514d 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -24,6 +24,7 @@ bookmarks-tests                                       \
 calc-tests                                     \
 calendar-tests                                 \
 compile-tests                                  \
+css-tests                                      \
 csv-tests                                      \
 dired-tests                                    \
 ediff-tests                                    \
@@ -31,6 +32,7 @@ editkit-tests                                 \
 elisp-tests                                    \
 eshell-tests                                   \
 help-tests                                     \
+html-tests                                     \
 ibuffer-tests                                  \
 info-tests                                     \
 isearch-tests                                  \
@@ -48,6 +50,7 @@ bookmarks-tests                                       \
 calc-tests                                     \
 calendar-tests                                 \
 compile-tests                                  \
+css-tests                                      \
 csv-tests                                      \
 dired-tests                                    \
 ediff-tests                                    \
@@ -55,6 +58,7 @@ editkit-tests                                 \
 elisp-tests                                    \
 eshell-tests                                   \
 help-tests                                     \
+html-tests                                     \
 ibuffer-tests                                  \
 info-tests                                     \
 isearch-tests                                  \
@@ -84,6 +88,9 @@ calendar-tests:
 compile-tests:
        $(MAKE) -C $(SRC_DIR) $@
 
+css-tests:
+       $(MAKE) -C $(SRC_DIR) $@
+
 csv-tests:
        $(MAKE) -C $(SRC_DIR) $@
 
@@ -105,6 +112,9 @@ eshell-tests:
 help-tests:
        $(MAKE) -C $(SRC_DIR) $@
 
+html-tests:
+       $(MAKE) -C $(SRC_DIR) $@
+
 ibuffer-tests:
        $(MAKE) -C $(SRC_DIR) $@
 
diff --git a/tests/casual-css-test-utils.el b/tests/casual-css-test-utils.el
new file mode 100644
index 0000000000..471442a6b3
--- /dev/null
+++ b/tests/casual-css-test-utils.el
@@ -0,0 +1,48 @@
+;;; casual-css-test-utils.el --- Casual Test Utils       -*- lexical-binding: 
t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'ert)
+(require 'casual-lib)
+(require 'kmacro)
+
+(defun casualt-css-setup (&optional filename)
+  "Casual CSS setup."
+  (when filename
+    (let ((temp-filename (concat "/tmp/" filename))
+          (auto-insert-mode -1))
+      (with-temp-file temp-filename
+        (goto-char (point-min)))
+      (find-file temp-filename))))
+
+(defun casualt-css-breakdown (&optional filename)
+  "Casual CSS breakdown."
+  (when filename
+    (let ((temp-filename (concat "/tmp/" filename)))
+      (switch-to-buffer filename)
+      (kill-buffer)
+      (delete-file temp-filename))))
+
+(provide 'casual-css-test-utils)
+;;; casual-css-test-utils.el ends here
diff --git a/tests/casual-html-test-utils.el b/tests/casual-html-test-utils.el
new file mode 100644
index 0000000000..b959d3e2a3
--- /dev/null
+++ b/tests/casual-html-test-utils.el
@@ -0,0 +1,48 @@
+;;; casual-html-test-utils.el --- Casual Test Utils       -*- lexical-binding: 
t; -*-
+
+;; Copyright (C) 2025  Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'ert)
+(require 'casual-lib)
+(require 'kmacro)
+
+(defun casualt-html-setup (&optional filename)
+  "Casual HTML setup."
+  (when filename
+    (let ((temp-filename (concat "/tmp/" filename))
+          (auto-insert-mode -1))
+      (with-temp-file temp-filename
+        (goto-char (point-min)))
+      (find-file temp-filename))))
+
+(defun casualt-html-breakdown (&optional filename)
+  "Casual HTML breakdown."
+  (when filename
+    (let ((temp-filename (concat "/tmp/" filename)))
+      (switch-to-buffer filename)
+      (kill-buffer)
+      (delete-file temp-filename))))
+
+(provide 'casual-html-test-utils)
+;;; casual-html-test-utils.el ends here
diff --git a/tests/test-casual-css-settings.el 
b/tests/test-casual-css-settings.el
new file mode 100644
index 0000000000..a4e82e5bde
--- /dev/null
+++ b/tests/test-casual-css-settings.el
@@ -0,0 +1,52 @@
+;;; test-casual-css-settings.el --- Casual Make Settings Tests  -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'ert)
+(require 'casual-css-test-utils)
+(require 'casual-css-settings)
+
+(ert-deftest test-casual-css-settings-tmenu ()
+  (let ()
+    (cl-letf ((casualt-mock #'casual-css--customize-indent-offset)
+              (casualt-mock #'casual-css--customize-group)
+              (casualt-mock #'casual-css-about))
+
+      (let ((test-vectors
+             '((:binding "o" :command casual-css--customize-indent-offset)
+               (:binding "G" :command casual-css--customize-group)
+               (:binding "u" :command 
casual-lib-customize-casual-lib-use-unicode)
+               (:binding "n" :command 
casual-lib-customize-casual-lib-hide-navigation)
+               (:binding "a" :command casual-css-about))))
+
+        (casualt-suffix-testcase-runner test-vectors
+                                        #'casual-css-settings-tmenu
+                                        '(lambda () (random 5000)))))))
+
+(ert-deftest test-casual-css-about ()
+  (should (stringp (casual-css-about))))
+
+(provide 'test-casual-css-settings)
+;;; test-casual-css-setttings.el ends here
diff --git a/tests/test-casual-css-utils.el b/tests/test-casual-css-utils.el
new file mode 100644
index 0000000000..6002735766
--- /dev/null
+++ b/tests/test-casual-css-utils.el
@@ -0,0 +1,40 @@
+;;; test-casual-css-utils.el --- Casual Make Utils Tests  -*- lexical-binding: 
t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'ert)
+(require 'casual-css-test-utils)
+(require 'casual-css-utils)
+
+(ert-deftest test-casual-css-unicode-get ()
+  (let ((casual-lib-use-unicode nil))
+    (should (string-equal (casual-css-unicode-get :previous) "Previous"))
+    (should (string-equal (casual-css-unicode-get :next) "Next")))
+
+  (let ((casual-lib-use-unicode t))
+    (should (string-equal (casual-css-unicode-get :previous) "↑"))
+    (should (string-equal (casual-css-unicode-get :next) "↓"))))
+
+(provide 'test-casual-css-utils)
+;;; test-casual-css-utils.el ends here
diff --git a/tests/test-casual-css.el b/tests/test-casual-css.el
new file mode 100644
index 0000000000..766428276f
--- /dev/null
+++ b/tests/test-casual-css.el
@@ -0,0 +1,60 @@
+;;; test-casual-css.el --- Casual Make Tests -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2026 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'ert)
+(require 'casual-css-test-utils)
+(require 'casual-lib-test-utils)
+(require 'casual-css)
+
+(ert-deftest test-casual-css-tmenu ()
+  (let ((temp-file-name "casual-css-test.css"))
+    (casualt-css-setup)
+
+    (cl-letf ((casualt-mock #'css-lookup-symbol)
+              (casualt-mock #'css-cycle-color-format)
+              (casualt-mock #'fill-paragraph)
+              (casualt-mock #'hl-line-mode)
+              (casualt-mock #'casual-css-settings-tmenu)
+              )
+
+
+
+      (let ((test-vectors
+             '((:binding "l" :command css-lookup-symbol)
+               (:binding "c" :command css-cycle-color-format)
+               (:binding "f" :command fill-paragraph)
+               (:binding "h" :command hl-line-mode)
+               (:binding "," :command casual-css-settings-tmenu)
+
+               )))
+
+        (casualt-suffix-testcase-runner test-vectors
+                                        #'casual-css-tmenu
+                                        '(lambda () (random 5000)))))
+    (casualt-css-breakdown)))
+
+(provide 'test-casual-css)
+;;; test-casual-css.el ends here
diff --git a/tests/test-casual-html-settings.el 
b/tests/test-casual-html-settings.el
new file mode 100644
index 0000000000..5493e9412e
--- /dev/null
+++ b/tests/test-casual-html-settings.el
@@ -0,0 +1,56 @@
+;;; test-casual-html-settings.el --- Casual Make Settings Tests  -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2025  Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'ert)
+(require 'casual-html-test-utils)
+(require 'casual-html-settings)
+
+(ert-deftest test-casual-html-settings-tmenu ()
+  (let ()
+    (cl-letf (
+              (casualt-mock #'casual-html--customize-sgml-basic-offset)
+              (casualt-mock #'casual-html--customize-sgml-attribute-offset)
+              (casualt-mock 
#'casual-html--customize-html-ts-mode-indent-offset)
+              (casualt-mock #'casual-html--customize-group-sgml)
+              (casualt-mock #'casual-html-about))
+
+      (let ((test-vectors
+             '((:binding "b" :command casual-html--customize-sgml-basic-offset)
+               (:binding "A" :command 
casual-html--customize-sgml-attribute-offset)
+               (:binding "G" :command casual-html--customize-group-sgml)
+               (:binding "u" :command 
casual-lib-customize-casual-lib-use-unicode)
+               (:binding "n" :command 
casual-lib-customize-casual-lib-hide-navigation)
+               (:binding "a" :command casual-html-about))))
+
+        (casualt-suffix-testcase-runner test-vectors
+                                        #'casual-html-settings-tmenu
+                                        '(lambda () (random 5000)))))))
+
+(ert-deftest test-casual-html-about ()
+  (should (stringp (casual-html-about))))
+
+(provide 'test-casual-html-settings)
+;;; test-casual-html-setttings.el ends here
diff --git a/tests/test-casual-html-utils.el b/tests/test-casual-html-utils.el
new file mode 100644
index 0000000000..a162791f75
--- /dev/null
+++ b/tests/test-casual-html-utils.el
@@ -0,0 +1,126 @@
+;;; test-casual-html-utils.el --- Casual Make Utils Tests  -*- 
lexical-binding: t; -*-
+
+;; Copyright (C) 2025  Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'ert)
+(require 'casual-html-test-utils)
+(require 'casual-html-utils)
+
+(ert-deftest test-casual-html-unicode-get ()
+  (let ((casual-lib-use-unicode nil))
+    (should (string-equal (casual-html-unicode-get :previous) "Previous"))
+    (should (string-equal (casual-html-unicode-get :next) "Next")))
+
+  (let ((casual-lib-use-unicode t))
+    (should (string-equal (casual-html-unicode-get :previous) "↑"))
+    (should (string-equal (casual-html-unicode-get :next) "↓"))))
+
+
+ (ert-deftest test-casual-html-tags-tmenu ()
+  (let ((auto-insert-mode -1)
+        (temp-file-name "casual-html-tags-test.html"))
+    (casualt-html-setup temp-file-name)
+
+    (cl-letf ((casualt-mock #'html-paragraph)
+              (casualt-mock #'html-image)
+              (casualt-mock #'html-line)
+              (casualt-mock #'html-horizontal-rule)
+              (casualt-mock #'html-div)
+              (casualt-mock #'html-href-anchor)
+              (casualt-mock #'html-href-anchor-file)
+              (casualt-mock #'html-id-anchor)
+              (casualt-mock #'html-name-anchor)
+              (casualt-mock #'html-ordered-list)
+              (casualt-mock #'html-unordered-list)
+              (casualt-mock #'html-list-item)
+              (casualt-mock #'html-radio-buttons)
+              (casualt-mock #'html-checkboxes)
+              (casualt-mock #'html-headline-1)
+              (casualt-mock #'html-headline-2)
+              (casualt-mock #'html-headline-3)
+              (casualt-mock #'html-headline-4)
+              (casualt-mock #'html-headline-5)
+              (casualt-mock #'html-headline-6)
+
+              (casualt-mock #'facemenu-set-bold)
+              (casualt-mock #'facemenu-set-italic)
+              (casualt-mock #'facemenu-set-underline)
+              (casualt-mock #'facemenu-set-bold-italic)
+              (casualt-mock #'facemenu-set-default)
+              (casualt-mock #'facemenu-set-face)
+
+              (casualt-mock #'sgml-skip-tag-backward)
+              (casualt-mock #'sgml-skip-tag-forward)
+              (casualt-mock #'backward-char)
+              (casualt-mock #'forward-char)
+              (casualt-mock #'next-line)
+              (casualt-mock #'previous-line)
+
+              )
+
+      (let ((test-vectors
+             '(
+               (:binding "p" :command html-paragraph)
+               (:binding "i" :command html-image)
+               (:binding "b" :command html-line)
+               (:binding "hr" :command html-horizontal-rule)
+               (:binding "d" :command html-div)
+               (:binding "aa" :command html-href-anchor)
+               (:binding "af" :command html-href-anchor-file)
+               (:binding "ai" :command html-id-anchor)
+               (:binding "an" :command html-name-anchor)
+               (:binding "o" :command html-ordered-list)
+               (:binding "u" :command html-unordered-list)
+               (:binding "l" :command html-list-item)
+               (:binding "r" :command html-radio-buttons)
+               (:binding "c" :command html-checkboxes)
+               ;; (:binding "1" :command html-headline-1)
+               ;; (:binding "2" :command html-headline-2)
+               ;; (:binding "3" :command html-headline-3)
+               ;; (:binding "4" :command html-headline-4)
+               ;; (:binding "5" :command html-headline-5)
+               ;; (:binding "6" :command html-headline-6)
+
+               (:binding "fb" :command facemenu-set-bold)
+               (:binding "fi" :command facemenu-set-italic)
+               (:binding "fu" :command facemenu-set-underline)
+               (:binding "fl" :command facemenu-set-bold-italic)
+               (:binding "fd" :command facemenu-set-default)
+               (:binding "ff" :command facemenu-set-face)
+
+               (:binding "[" :command sgml-skip-tag-backward)
+               (:binding "]" :command sgml-skip-tag-forward)
+               (:binding "C-f" :command forward-char)
+               (:binding "C-b" :command backward-char)
+               (:binding "C-n" :command next-line)
+               (:binding "C-p" :command previous-line))))
+
+        (casualt-suffix-testcase-runner test-vectors
+                                        #'casual-html-tags-tmenu
+                                        '(lambda () (random 5000)))))
+    (casualt-html-breakdown temp-file-name)))
+
+
+(provide 'test-casual-html-utils)
+;;; test-casual-html-utils.el ends here
diff --git a/tests/test-casual-html.el b/tests/test-casual-html.el
new file mode 100644
index 0000000000..65789dc839
--- /dev/null
+++ b/tests/test-casual-html.el
@@ -0,0 +1,80 @@
+;;; test-casual-html.el --- Casual HTML Tests -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2025  Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'ert)
+(require 'casual-html-test-utils)
+(require 'casual-lib-test-utils)
+(require 'casual-html)
+
+(ert-deftest test-casual-html-tmenu ()
+  (let ((auto-insert-mode -1)
+        (temp-file-name "casual-html-test.html"))
+    (casualt-html-setup temp-file-name)
+
+    (cl-letf ((casualt-mock #'sgml-tag)
+              (casualt-mock #'sgml-attributes)
+              (casualt-mock #'sgml-close-tag)
+              (casualt-mock #'sgml-delete-tag)
+              (casualt-mock #'casual-html-tags-tmenu)
+              (casualt-mock #'sgml-skip-tag-backward)
+              (casualt-mock #'sgml-skip-tag-forward)
+              (casualt-mock #'backward-char)
+              (casualt-mock #'forward-char)
+              (casualt-mock #'next-line)
+              (casualt-mock #'previous-line)
+              (casualt-mock #'browse-url-of-buffer)
+              (casualt-mock #'sgml-validate)
+              (casualt-mock #'html-autoview-mode)
+              (casualt-mock #'casual-html-settings-tmenu)
+              (casualt-mock #'casual-html-info))
+
+      (let ((test-vectors
+             '((:binding "i" :command sgml-tag)
+               (:binding "a" :command sgml-attributes)
+               (:binding "c" :command sgml-close-tag)
+               ;;(:binding "d" :command sgml-delete-tag) ; need to handle 
html-ts-mode
+               (:binding "h" :command casual-html-tags-tmenu)
+               (:binding "b" :command browse-url-of-buffer)
+               (:binding "v" :command sgml-validate)
+               (:binding "A" :command html-autoview-mode)
+               (:binding "h" :command casual-html-tags-tmenu)
+               (:binding "[" :command sgml-skip-tag-backward)
+               (:binding "]" :command sgml-skip-tag-forward)
+               (:binding "C-f" :command forward-char)
+               (:binding "C-b" :command backward-char)
+               (:binding "C-n" :command next-line)
+               (:binding "C-p" :command previous-line)
+               (:binding "I" :command casual-html-info)
+               (:binding "," :command casual-html-settings-tmenu)
+               (:binding "TAB" :command sgml-tags-invisible))))
+
+        (casualt-suffix-testcase-runner test-vectors
+                                        #'casual-html-tmenu
+                                        '(lambda () (random 5000)))))
+    (casualt-html-breakdown temp-file-name)))
+
+(provide 'test-casual-html)
+;;; test-casual-html.el ends here

Reply via email to