;;; lisp/langs/web.el --- JS / TS / HTML / CSS / React -*- lexical-binding: t -*-
;; web-mode for JSX, TSX, and HTML template files
(use-package web-mode
:mode (("\\.jsx\\'" . web-mode)
("\\.tsx\\'" . web-mode)
("\\.html?\\'" . web-mode))
:custom
(web-mode-markup-indent-offset 2)
(web-mode-css-indent-offset 2)
(web-mode-code-indent-offset 2))
;; typescript-language-server handles JS, TS, JSX, TSX
(with-eval-after-load 'eglot
(add-to-list 'eglot-server-programs
'((js-mode js-ts-mode typescript-ts-mode tsx-ts-mode web-mode)
. ("typescript-language-server" "--stdio")))
(add-to-list 'eglot-server-programs
'((html-mode mhtml-mode)
. ("vscode-html-language-server" "--stdio")))
(add-to-list 'eglot-server-programs
'((css-mode css-ts-mode)
. ("vscode-css-language-server" "--stdio"))))
(dolist (hook '(js-mode-hook js-ts-mode-hook
typescript-ts-mode-hook tsx-ts-mode-hook
web-mode-hook
html-mode-hook mhtml-mode-hook
css-mode-hook css-ts-mode-hook))
(add-hook hook #'eglot-ensure))
;; Async formatting via Prettier (apheleia runs formatters without blocking)
(use-package apheleia
:hook ((js-mode . apheleia-mode)
(js-ts-mode . apheleia-mode)
(typescript-ts-mode . apheleia-mode)
(tsx-ts-mode . apheleia-mode)
(css-mode . apheleia-mode)
(css-ts-mode . apheleia-mode)
(web-mode . apheleia-mode))
:config
(setf (alist-get 'web-mode apheleia-mode-alist) '(prettier)))