diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,29 +1,22 @@
-# Changelog
-
-All notable changes to this project will be documented in this file.
+## [0.2.0] - 2022-10-28
 
-The format is based on [Keep a Changelog](http://keepachangelog.com/)
-and this project adheres to the [Haskell Package Versioning Policy](https://pvp.haskell.org/).
+- Drop the `Data` prefix from `Data.Text.ANSI` and `Data.Text.Builder.ANSI` modules
+- Rename `Text.Builder.ANSI` to `Text.Lazy.Builder.ANSI`
+- Add `Text.Builder.ANSI` back, but based on `text-builder`'s builder instead of `text`'s builder.
 
 ## [0.1.1] - 2021-01-07
 
-## Added
 - Add `Data.Text.Builder.ANSI` module
 
 ## [0.1.0.2] - 2020-12-26
 
-### Changed
 - Fix bug in `italic`
 
 ## [0.1.0.1] - 2020-06-14
 
-### Changed
 - Relax `base` bounds
-
-### Removed
 - Drop `text-builder` dependency
 
 ## [0.1.0] - 2018-11-14
 
-### Added
 - Initial release
diff --git a/Data/Text/ANSI.hs b/Data/Text/ANSI.hs
deleted file mode 100644
--- a/Data/Text/ANSI.hs
+++ /dev/null
@@ -1,346 +0,0 @@
-module Data.Text.ANSI
-  ( -- $intro
-
-    -- * Foreground color
-    black,
-    red,
-    green,
-    yellow,
-    blue,
-    magenta,
-    cyan,
-    white,
-    brightBlack,
-    brightRed,
-    brightGreen,
-    brightYellow,
-    brightBlue,
-    brightMagenta,
-    brightCyan,
-    brightWhite,
-    rgb,
-
-    -- * Background color
-    blackBg,
-    redBg,
-    greenBg,
-    yellowBg,
-    blueBg,
-    magentaBg,
-    cyanBg,
-    whiteBg,
-    brightBlackBg,
-    brightRedBg,
-    brightGreenBg,
-    brightYellowBg,
-    brightBlueBg,
-    brightMagentaBg,
-    brightCyanBg,
-    brightWhiteBg,
-    rgbBg,
-
-    -- * Style
-    bold,
-    faint,
-    italic,
-    underline,
-    doubleUnderline,
-    strikethrough,
-    frame,
-    encircle,
-    overline,
-  )
-where
-
-import Data.Text (Text)
-import qualified Data.Text.Builder.ANSI as Builder.ANSI
-import qualified Data.Text.Lazy as Text.Lazy
-import Data.Text.Lazy.Builder (Builder)
-import qualified Data.Text.Lazy.Builder as Builder
-import Data.Word (Word8)
-
--- $intro
---
--- Text styling for ANSI terminals using SGR codes, as defined by the
--- <https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf ECMA-48>
--- standard.
---
--- Supports foreground\/background color, bold\/faint intensity, italic,
--- single\/double underline, strikethrough, frame, encircle, and overline escape
--- sequences. Some styles may not work on your terminal.
---
--- Also features terminal detection, so redirecting styled output to a file will
--- automatically strip the ANSI escape sequences.
-
--- | Black foreground.
-black :: Text -> Text
-black =
-  lift Builder.ANSI.black
-{-# INLINE black #-}
-
--- | Red foreground.
-red :: Text -> Text
-red =
-  lift Builder.ANSI.red
-{-# INLINE red #-}
-
--- | Green foreground.
-green :: Text -> Text
-green =
-  lift Builder.ANSI.green
-{-# INLINE green #-}
-
--- | Yellow foreground.
-yellow :: Text -> Text
-yellow =
-  lift Builder.ANSI.yellow
-{-# INLINE yellow #-}
-
--- | Blue foreground.
-blue :: Text -> Text
-blue =
-  lift Builder.ANSI.blue
-{-# INLINE blue #-}
-
--- | Magenta foreground.
-magenta :: Text -> Text
-magenta =
-  lift Builder.ANSI.magenta
-{-# INLINE magenta #-}
-
--- | Cyan foreground.
-cyan :: Text -> Text
-cyan =
-  lift Builder.ANSI.cyan
-{-# INLINE cyan #-}
-
--- | White foreground.
-white :: Text -> Text
-white =
-  lift Builder.ANSI.white
-{-# INLINE white #-}
-
--- | Bright black foreground.
-brightBlack :: Text -> Text
-brightBlack =
-  lift Builder.ANSI.brightBlack
-{-# INLINE brightBlack #-}
-
--- | Bright red foreground.
-brightRed :: Text -> Text
-brightRed =
-  lift Builder.ANSI.brightRed
-{-# INLINE brightRed #-}
-
--- | Bright green foreground.
-brightGreen :: Text -> Text
-brightGreen =
-  lift Builder.ANSI.brightGreen
-{-# INLINE brightGreen #-}
-
--- | Bright yellow foreground.
-brightYellow :: Text -> Text
-brightYellow =
-  lift Builder.ANSI.brightYellow
-{-# INLINE brightYellow #-}
-
--- | Bright blue foreground.
-brightBlue :: Text -> Text
-brightBlue =
-  lift Builder.ANSI.brightBlue
-{-# INLINE brightBlue #-}
-
--- | Bright magenta foreground.
-brightMagenta :: Text -> Text
-brightMagenta =
-  lift Builder.ANSI.brightMagenta
-{-# INLINE brightMagenta #-}
-
--- | Bright cyan foreground.
-brightCyan :: Text -> Text
-brightCyan =
-  lift Builder.ANSI.brightCyan
-{-# INLINE brightCyan #-}
-
--- | Bright white foreground.
-brightWhite :: Text -> Text
-brightWhite =
-  lift Builder.ANSI.brightWhite
-{-# INLINE brightWhite #-}
-
--- | RGB foreground.
-rgb :: Word8 -> Word8 -> Word8 -> Text -> Text
-rgb r g b =
-  lift (Builder.ANSI.rgb r g b)
-{-# INLINE rgb #-}
-
--- | Black background.
-blackBg :: Text -> Text
-blackBg =
-  lift Builder.ANSI.blackBg
-{-# INLINE blackBg #-}
-
--- | Red background.
-redBg :: Text -> Text
-redBg =
-  lift Builder.ANSI.redBg
-{-# INLINE redBg #-}
-
--- | Green background.
-greenBg :: Text -> Text
-greenBg =
-  lift Builder.ANSI.greenBg
-{-# INLINE greenBg #-}
-
--- | Yellow background.
-yellowBg :: Text -> Text
-yellowBg =
-  lift Builder.ANSI.yellowBg
-{-# INLINE yellowBg #-}
-
--- | Blue background.
-blueBg :: Text -> Text
-blueBg =
-  lift Builder.ANSI.blueBg
-{-# INLINE blueBg #-}
-
--- | Magenta background.
-magentaBg :: Text -> Text
-magentaBg =
-  lift Builder.ANSI.magentaBg
-{-# INLINE magentaBg #-}
-
--- | Cyan background.
-cyanBg :: Text -> Text
-cyanBg =
-  lift Builder.ANSI.cyanBg
-{-# INLINE cyanBg #-}
-
--- | White background.
-whiteBg :: Text -> Text
-whiteBg =
-  lift Builder.ANSI.whiteBg
-{-# INLINE whiteBg #-}
-
--- | Bright black background.
-brightBlackBg :: Text -> Text
-brightBlackBg =
-  lift Builder.ANSI.brightBlackBg
-{-# INLINE brightBlackBg #-}
-
--- | Bright red background.
-brightRedBg :: Text -> Text
-brightRedBg =
-  lift Builder.ANSI.brightRedBg
-{-# INLINE brightRedBg #-}
-
--- | Bright green background.
-brightGreenBg :: Text -> Text
-brightGreenBg =
-  lift Builder.ANSI.brightGreenBg
-{-# INLINE brightGreenBg #-}
-
--- | Bright yellow background.
-brightYellowBg :: Text -> Text
-brightYellowBg =
-  lift Builder.ANSI.brightYellowBg
-{-# INLINE brightYellowBg #-}
-
--- | Bright blue background.
-brightBlueBg :: Text -> Text
-brightBlueBg =
-  lift Builder.ANSI.brightBlueBg
-{-# INLINE brightBlueBg #-}
-
--- | Bright magenta background.
-brightMagentaBg :: Text -> Text
-brightMagentaBg =
-  lift Builder.ANSI.brightMagentaBg
-{-# INLINE brightMagentaBg #-}
-
--- | Bright cyan background.
-brightCyanBg :: Text -> Text
-brightCyanBg =
-  lift Builder.ANSI.brightCyanBg
-{-# INLINE brightCyanBg #-}
-
--- | Bright white background.
-brightWhiteBg :: Text -> Text
-brightWhiteBg =
-  lift Builder.ANSI.brightWhiteBg
-{-# INLINE brightWhiteBg #-}
-
--- | RGB background.
-rgbBg :: Word8 -> Word8 -> Word8 -> Text -> Text
-rgbBg r g b =
-  lift (Builder.ANSI.rgbBg r g b)
-{-# INLINE rgbBg #-}
-
--- | __Bold__ style (high intensity).
-bold :: Text -> Text
-bold =
-  lift Builder.ANSI.bold
-{-# INLINE bold #-}
-
--- | Faint style (low intensity).
-faint :: Text -> Text
-faint =
-  lift Builder.ANSI.faint
-{-# INLINE faint #-}
-
--- | /Italic/ style.
-italic :: Text -> Text
-italic =
-  lift Builder.ANSI.italic
-{-# INLINE italic #-}
-
--- | U̲n̲d̲e̲r̲l̲i̲n̲e̲ style.
-underline :: Text -> Text
-underline =
-  lift Builder.ANSI.underline
-{-# INLINE underline #-}
-
--- | D̳o̳u̳b̳l̳e̳ ̳u̳n̳d̳e̳r̳l̳i̳n̳e̳ style.
-doubleUnderline :: Text -> Text
-doubleUnderline =
-  lift Builder.ANSI.doubleUnderline
-{-# INLINE doubleUnderline #-}
-
--- | S̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h̶ style.
-strikethrough :: Text -> Text
-strikethrough =
-  lift Builder.ANSI.strikethrough
-{-# INLINE strikethrough #-}
-
--- | Frame style.
-frame :: Text -> Text
-frame =
-  lift Builder.ANSI.frame
-{-# INLINE frame #-}
-
--- | Encircle style.
-encircle :: Text -> Text
-encircle =
-  lift Builder.ANSI.encircle
-{-# INLINE encircle #-}
-
--- | O̅v̅e̅r̅l̅i̅n̅e̅ style.
-overline :: Text -> Text
-overline =
-  lift Builder.ANSI.overline
-{-# INLINE overline #-}
-
---
-
-lift :: (Builder -> Builder) -> Text -> Text
-lift f =
-  Text.Lazy.toStrict . Builder.toLazyText . f . Builder.fromText
--- Don't inline before phase 2
-{-# NOINLINE [2] lift #-}
-
--- Collapse lift/lift to a single lift before phase 2
-{-# RULES
-"lift/lift" [~2] forall f g s.
-  lift f (lift g s) =
-    lift (f . g) s
-  #-}
diff --git a/Data/Text/Builder/ANSI.hs b/Data/Text/Builder/ANSI.hs
deleted file mode 100644
--- a/Data/Text/Builder/ANSI.hs
+++ /dev/null
@@ -1,383 +0,0 @@
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE OverloadedStrings #-}
-
-module Data.Text.Builder.ANSI
-  ( -- $intro
-
-    -- * Foreground color
-    black,
-    red,
-    green,
-    yellow,
-    blue,
-    magenta,
-    cyan,
-    white,
-    brightBlack,
-    brightRed,
-    brightGreen,
-    brightYellow,
-    brightBlue,
-    brightMagenta,
-    brightCyan,
-    brightWhite,
-    rgb,
-
-    -- * Background color
-    blackBg,
-    redBg,
-    greenBg,
-    yellowBg,
-    blueBg,
-    magentaBg,
-    cyanBg,
-    whiteBg,
-    brightBlackBg,
-    brightRedBg,
-    brightGreenBg,
-    brightYellowBg,
-    brightBlueBg,
-    brightMagentaBg,
-    brightCyanBg,
-    brightWhiteBg,
-    rgbBg,
-
-    -- * Style
-    bold,
-    faint,
-    italic,
-    underline,
-    doubleUnderline,
-    strikethrough,
-    frame,
-    encircle,
-    overline,
-  )
-where
-
-#if !MIN_VERSION_base(4,13,0)
-import Data.Semigroup ((<>))
-#endif
-import Data.Text.Lazy.Builder (Builder)
-import qualified Data.Text.Lazy.Builder as Builder
-import qualified Data.Text.Lazy.Builder.Int as Builder
-import Data.Word (Word8)
-import Foreign.C (CInt (CInt))
-import System.IO.Unsafe (unsafePerformIO)
-
--- $intro
---
--- Text styling for ANSI terminals using SGR codes, as defined by the
--- <https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf ECMA-48>
--- standard.
---
--- Supports foreground\/background color, bold\/faint intensity, italic,
--- single\/double underline, strikethrough, frame, encircle, and overline escape
--- sequences. Some styles may not work on your terminal.
---
--- Also features terminal detection, so redirecting styled output to a file will
--- automatically strip the ANSI escape sequences.
-
--- | Black foreground.
-black :: Builder -> Builder
-black =
-  foreground "30"
-{-# INLINE black #-}
-
--- | Red foreground.
-red :: Builder -> Builder
-red =
-  foreground "31"
-{-# INLINE red #-}
-
--- | Green foreground.
-green :: Builder -> Builder
-green =
-  foreground "32"
-{-# INLINE green #-}
-
--- | Yellow foreground.
-yellow :: Builder -> Builder
-yellow =
-  foreground "33"
-{-# INLINE yellow #-}
-
--- | Blue foreground.
-blue :: Builder -> Builder
-blue =
-  foreground "34"
-{-# INLINE blue #-}
-
--- | Magenta foreground.
-magenta :: Builder -> Builder
-magenta =
-  foreground "35"
-{-# INLINE magenta #-}
-
--- | Cyan foreground.
-cyan :: Builder -> Builder
-cyan =
-  foreground "36"
-{-# INLINE cyan #-}
-
--- | White foreground.
-white :: Builder -> Builder
-white =
-  foreground "37"
-{-# INLINE white #-}
-
--- | Bright black foreground.
-brightBlack :: Builder -> Builder
-brightBlack =
-  foreground "90"
-{-# INLINE brightBlack #-}
-
--- | Bright red foreground.
-brightRed :: Builder -> Builder
-brightRed =
-  foreground "91"
-{-# INLINE brightRed #-}
-
--- | Bright green foreground.
-brightGreen :: Builder -> Builder
-brightGreen =
-  foreground "92"
-{-# INLINE brightGreen #-}
-
--- | Bright yellow foreground.
-brightYellow :: Builder -> Builder
-brightYellow =
-  foreground "93"
-{-# INLINE brightYellow #-}
-
--- | Bright blue foreground.
-brightBlue :: Builder -> Builder
-brightBlue =
-  foreground "94"
-{-# INLINE brightBlue #-}
-
--- | Bright magenta foreground.
-brightMagenta :: Builder -> Builder
-brightMagenta =
-  foreground "95"
-{-# INLINE brightMagenta #-}
-
--- | Bright cyan foreground.
-brightCyan :: Builder -> Builder
-brightCyan =
-  foreground "96"
-{-# INLINE brightCyan #-}
-
--- | Bright white foreground.
-brightWhite :: Builder -> Builder
-brightWhite =
-  foreground "97"
-{-# INLINE brightWhite #-}
-
--- | RGB foreground.
-rgb :: Word8 -> Word8 -> Word8 -> Builder -> Builder
-rgb r g b =
-  foreground ("38;2;" <> Builder.decimal r <> semi <> Builder.decimal g <> semi <> Builder.decimal b)
-{-# INLINE rgb #-}
-
-foreground :: Builder -> Builder -> Builder
-foreground s =
-  surround s "39"
-{-# INLINE foreground #-}
-
--- | Black background.
-blackBg :: Builder -> Builder
-blackBg =
-  background "40"
-{-# INLINE blackBg #-}
-
--- | Red background.
-redBg :: Builder -> Builder
-redBg =
-  background "41"
-{-# INLINE redBg #-}
-
--- | Green background.
-greenBg :: Builder -> Builder
-greenBg =
-  background "42"
-{-# INLINE greenBg #-}
-
--- | Yellow background.
-yellowBg :: Builder -> Builder
-yellowBg =
-  background "43"
-{-# INLINE yellowBg #-}
-
--- | Blue background.
-blueBg :: Builder -> Builder
-blueBg =
-  background "44"
-{-# INLINE blueBg #-}
-
--- | Magenta background.
-magentaBg :: Builder -> Builder
-magentaBg =
-  background "45"
-{-# INLINE magentaBg #-}
-
--- | Cyan background.
-cyanBg :: Builder -> Builder
-cyanBg =
-  background "46"
-{-# INLINE cyanBg #-}
-
--- | White background.
-whiteBg :: Builder -> Builder
-whiteBg =
-  background "47"
-{-# INLINE whiteBg #-}
-
--- | Bright black background.
-brightBlackBg :: Builder -> Builder
-brightBlackBg =
-  background "100"
-{-# INLINE brightBlackBg #-}
-
--- | Bright red background.
-brightRedBg :: Builder -> Builder
-brightRedBg =
-  background "101"
-{-# INLINE brightRedBg #-}
-
--- | Bright green background.
-brightGreenBg :: Builder -> Builder
-brightGreenBg =
-  background "102"
-{-# INLINE brightGreenBg #-}
-
--- | Bright yellow background.
-brightYellowBg :: Builder -> Builder
-brightYellowBg =
-  background "103"
-{-# INLINE brightYellowBg #-}
-
--- | Bright blue background.
-brightBlueBg :: Builder -> Builder
-brightBlueBg =
-  background "104"
-{-# INLINE brightBlueBg #-}
-
--- | Bright magenta background.
-brightMagentaBg :: Builder -> Builder
-brightMagentaBg =
-  background "105"
-{-# INLINE brightMagentaBg #-}
-
--- | Bright cyan background.
-brightCyanBg :: Builder -> Builder
-brightCyanBg =
-  background "106"
-{-# INLINE brightCyanBg #-}
-
--- | Bright white background.
-brightWhiteBg :: Builder -> Builder
-brightWhiteBg =
-  background "107"
-{-# INLINE brightWhiteBg #-}
-
-background :: Builder -> Builder -> Builder
-background s =
-  surround s "49"
-{-# INLINE background #-}
-
--- | RGB background.
-rgbBg :: Word8 -> Word8 -> Word8 -> Builder -> Builder
-rgbBg r g b =
-  background ("48;2;" <> Builder.decimal r <> semi <> Builder.decimal g <> semi <> Builder.decimal b)
-{-# INLINE rgbBg #-}
-
--- | __Bold__ style (high intensity).
-bold :: Builder -> Builder
-bold =
-  surround "1" "22"
-{-# INLINE bold #-}
-
--- | Faint style (low intensity).
-faint :: Builder -> Builder
-faint =
-  surround "2" "22"
-{-# INLINE faint #-}
-
--- | /Italic/ style.
-italic :: Builder -> Builder
-italic =
-  surround "3" "23"
-{-# INLINE italic #-}
-
--- | U̲n̲d̲e̲r̲l̲i̲n̲e̲ style.
-underline :: Builder -> Builder
-underline =
-  surround "4" "24"
-{-# INLINE underline #-}
-
--- | D̳o̳u̳b̳l̳e̳ ̳u̳n̳d̳e̳r̳l̳i̳n̳e̳ style.
-doubleUnderline :: Builder -> Builder
-doubleUnderline =
-  surround "21" "24"
-{-# INLINE doubleUnderline #-}
-
--- | S̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h̶ style.
-strikethrough :: Builder -> Builder
-strikethrough =
-  surround "9" "29"
-{-# INLINE strikethrough #-}
-
--- | Frame style.
-frame :: Builder -> Builder
-frame =
-  surround "51" "54"
-{-# INLINE frame #-}
-
--- | Encircle style.
-encircle :: Builder -> Builder
-encircle =
-  surround "52" "54"
-{-# INLINE encircle #-}
-
--- | O̅v̅e̅r̅l̅i̅n̅e̅ style.
-overline :: Builder -> Builder
-overline =
-  surround "53" "55"
-{-# INLINE overline #-}
-
---------------------------------------------------------------------------------
-
-surround :: Builder -> Builder -> Builder -> Builder
-surround open close text
-  | isatty = esc <> open <> m <> text <> esc <> close <> m
-  | otherwise = text
--- Don't inline before phase 1
-{-# NOINLINE [1] surround #-}
-
-esc :: Builder
-esc =
-  "\ESC["
-
-m :: Builder
-m =
-  Builder.singleton 'm'
-
-semi :: Builder
-semi =
-  Builder.singleton ';'
-
-isatty :: Bool
-isatty =
-  unsafePerformIO (c_isatty 1) == 1
-{-# NOINLINE isatty #-}
-
-foreign import ccall unsafe "isatty"
-  c_isatty :: CInt -> IO CInt
-
--- Collapse surround/surround to a single surround before phase 1
-{-# RULES
-"surround/surround" [~1] forall a b c d s.
-  surround a b (surround c d s) =
-    surround (a <> semi <> c) (b <> semi <> d) s
-  #-}
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2018 Mitchell Rosen
+Copyright 2018-2022 Mitchell Rosen
 
 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 
diff --git a/src/Text/ANSI.hs b/src/Text/ANSI.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/ANSI.hs
@@ -0,0 +1,345 @@
+module Text.ANSI
+  ( -- $intro
+
+    -- * Foreground color
+    black,
+    red,
+    green,
+    yellow,
+    blue,
+    magenta,
+    cyan,
+    white,
+    brightBlack,
+    brightRed,
+    brightGreen,
+    brightYellow,
+    brightBlue,
+    brightMagenta,
+    brightCyan,
+    brightWhite,
+    rgb,
+
+    -- * Background color
+    blackBg,
+    redBg,
+    greenBg,
+    yellowBg,
+    blueBg,
+    magentaBg,
+    cyanBg,
+    whiteBg,
+    brightBlackBg,
+    brightRedBg,
+    brightGreenBg,
+    brightYellowBg,
+    brightBlueBg,
+    brightMagentaBg,
+    brightCyanBg,
+    brightWhiteBg,
+    rgbBg,
+
+    -- * Style
+    bold,
+    faint,
+    italic,
+    underline,
+    doubleUnderline,
+    strikethrough,
+    frame,
+    encircle,
+    overline,
+  )
+where
+
+import Data.Text (Text)
+import Data.Word (Word8)
+import Text.Builder (Builder)
+import qualified Text.Builder as Builder
+import qualified Text.Builder.ANSI as Builder.ANSI
+
+-- $intro
+--
+-- Text styling for ANSI terminals using SGR codes, as defined by the
+-- <https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf ECMA-48>
+-- standard.
+--
+-- Supports foreground\/background color, bold\/faint intensity, italic,
+-- single\/double underline, strikethrough, frame, encircle, and overline escape
+-- sequences. Some styles may not work on your terminal.
+--
+-- Also features terminal detection, so redirecting styled output to a file will
+-- automatically strip the ANSI escape sequences.
+
+-- | Black foreground.
+black :: Text -> Text
+black =
+  lift Builder.ANSI.black
+{-# INLINE black #-}
+
+-- | Red foreground.
+red :: Text -> Text
+red =
+  lift Builder.ANSI.red
+{-# INLINE red #-}
+
+-- | Green foreground.
+green :: Text -> Text
+green =
+  lift Builder.ANSI.green
+{-# INLINE green #-}
+
+-- | Yellow foreground.
+yellow :: Text -> Text
+yellow =
+  lift Builder.ANSI.yellow
+{-# INLINE yellow #-}
+
+-- | Blue foreground.
+blue :: Text -> Text
+blue =
+  lift Builder.ANSI.blue
+{-# INLINE blue #-}
+
+-- | Magenta foreground.
+magenta :: Text -> Text
+magenta =
+  lift Builder.ANSI.magenta
+{-# INLINE magenta #-}
+
+-- | Cyan foreground.
+cyan :: Text -> Text
+cyan =
+  lift Builder.ANSI.cyan
+{-# INLINE cyan #-}
+
+-- | White foreground.
+white :: Text -> Text
+white =
+  lift Builder.ANSI.white
+{-# INLINE white #-}
+
+-- | Bright black foreground.
+brightBlack :: Text -> Text
+brightBlack =
+  lift Builder.ANSI.brightBlack
+{-# INLINE brightBlack #-}
+
+-- | Bright red foreground.
+brightRed :: Text -> Text
+brightRed =
+  lift Builder.ANSI.brightRed
+{-# INLINE brightRed #-}
+
+-- | Bright green foreground.
+brightGreen :: Text -> Text
+brightGreen =
+  lift Builder.ANSI.brightGreen
+{-# INLINE brightGreen #-}
+
+-- | Bright yellow foreground.
+brightYellow :: Text -> Text
+brightYellow =
+  lift Builder.ANSI.brightYellow
+{-# INLINE brightYellow #-}
+
+-- | Bright blue foreground.
+brightBlue :: Text -> Text
+brightBlue =
+  lift Builder.ANSI.brightBlue
+{-# INLINE brightBlue #-}
+
+-- | Bright magenta foreground.
+brightMagenta :: Text -> Text
+brightMagenta =
+  lift Builder.ANSI.brightMagenta
+{-# INLINE brightMagenta #-}
+
+-- | Bright cyan foreground.
+brightCyan :: Text -> Text
+brightCyan =
+  lift Builder.ANSI.brightCyan
+{-# INLINE brightCyan #-}
+
+-- | Bright white foreground.
+brightWhite :: Text -> Text
+brightWhite =
+  lift Builder.ANSI.brightWhite
+{-# INLINE brightWhite #-}
+
+-- | RGB foreground.
+rgb :: Word8 -> Word8 -> Word8 -> Text -> Text
+rgb r g b =
+  lift (Builder.ANSI.rgb r g b)
+{-# INLINE rgb #-}
+
+-- | Black background.
+blackBg :: Text -> Text
+blackBg =
+  lift Builder.ANSI.blackBg
+{-# INLINE blackBg #-}
+
+-- | Red background.
+redBg :: Text -> Text
+redBg =
+  lift Builder.ANSI.redBg
+{-# INLINE redBg #-}
+
+-- | Green background.
+greenBg :: Text -> Text
+greenBg =
+  lift Builder.ANSI.greenBg
+{-# INLINE greenBg #-}
+
+-- | Yellow background.
+yellowBg :: Text -> Text
+yellowBg =
+  lift Builder.ANSI.yellowBg
+{-# INLINE yellowBg #-}
+
+-- | Blue background.
+blueBg :: Text -> Text
+blueBg =
+  lift Builder.ANSI.blueBg
+{-# INLINE blueBg #-}
+
+-- | Magenta background.
+magentaBg :: Text -> Text
+magentaBg =
+  lift Builder.ANSI.magentaBg
+{-# INLINE magentaBg #-}
+
+-- | Cyan background.
+cyanBg :: Text -> Text
+cyanBg =
+  lift Builder.ANSI.cyanBg
+{-# INLINE cyanBg #-}
+
+-- | White background.
+whiteBg :: Text -> Text
+whiteBg =
+  lift Builder.ANSI.whiteBg
+{-# INLINE whiteBg #-}
+
+-- | Bright black background.
+brightBlackBg :: Text -> Text
+brightBlackBg =
+  lift Builder.ANSI.brightBlackBg
+{-# INLINE brightBlackBg #-}
+
+-- | Bright red background.
+brightRedBg :: Text -> Text
+brightRedBg =
+  lift Builder.ANSI.brightRedBg
+{-# INLINE brightRedBg #-}
+
+-- | Bright green background.
+brightGreenBg :: Text -> Text
+brightGreenBg =
+  lift Builder.ANSI.brightGreenBg
+{-# INLINE brightGreenBg #-}
+
+-- | Bright yellow background.
+brightYellowBg :: Text -> Text
+brightYellowBg =
+  lift Builder.ANSI.brightYellowBg
+{-# INLINE brightYellowBg #-}
+
+-- | Bright blue background.
+brightBlueBg :: Text -> Text
+brightBlueBg =
+  lift Builder.ANSI.brightBlueBg
+{-# INLINE brightBlueBg #-}
+
+-- | Bright magenta background.
+brightMagentaBg :: Text -> Text
+brightMagentaBg =
+  lift Builder.ANSI.brightMagentaBg
+{-# INLINE brightMagentaBg #-}
+
+-- | Bright cyan background.
+brightCyanBg :: Text -> Text
+brightCyanBg =
+  lift Builder.ANSI.brightCyanBg
+{-# INLINE brightCyanBg #-}
+
+-- | Bright white background.
+brightWhiteBg :: Text -> Text
+brightWhiteBg =
+  lift Builder.ANSI.brightWhiteBg
+{-# INLINE brightWhiteBg #-}
+
+-- | RGB background.
+rgbBg :: Word8 -> Word8 -> Word8 -> Text -> Text
+rgbBg r g b =
+  lift (Builder.ANSI.rgbBg r g b)
+{-# INLINE rgbBg #-}
+
+-- | __Bold__ style (high intensity).
+bold :: Text -> Text
+bold =
+  lift Builder.ANSI.bold
+{-# INLINE bold #-}
+
+-- | Faint style (low intensity).
+faint :: Text -> Text
+faint =
+  lift Builder.ANSI.faint
+{-# INLINE faint #-}
+
+-- | /Italic/ style.
+italic :: Text -> Text
+italic =
+  lift Builder.ANSI.italic
+{-# INLINE italic #-}
+
+-- | U̲n̲d̲e̲r̲l̲i̲n̲e̲ style.
+underline :: Text -> Text
+underline =
+  lift Builder.ANSI.underline
+{-# INLINE underline #-}
+
+-- | D̳o̳u̳b̳l̳e̳ ̳u̳n̳d̳e̳r̳l̳i̳n̳e̳ style.
+doubleUnderline :: Text -> Text
+doubleUnderline =
+  lift Builder.ANSI.doubleUnderline
+{-# INLINE doubleUnderline #-}
+
+-- | S̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h̶ style.
+strikethrough :: Text -> Text
+strikethrough =
+  lift Builder.ANSI.strikethrough
+{-# INLINE strikethrough #-}
+
+-- | Frame style.
+frame :: Text -> Text
+frame =
+  lift Builder.ANSI.frame
+{-# INLINE frame #-}
+
+-- | Encircle style.
+encircle :: Text -> Text
+encircle =
+  lift Builder.ANSI.encircle
+{-# INLINE encircle #-}
+
+-- | O̅v̅e̅r̅l̅i̅n̅e̅ style.
+overline :: Text -> Text
+overline =
+  lift Builder.ANSI.overline
+{-# INLINE overline #-}
+
+--
+
+lift :: (Builder -> Builder) -> Text -> Text
+lift f =
+  Builder.run . f . Builder.text
+-- Don't inline before phase 2
+{-# NOINLINE [2] lift #-}
+
+-- Collapse lift/lift to a single lift before phase 2
+{-# RULES
+"lift/lift" [~2] forall f g s.
+  lift f (lift g s) =
+    lift (f . g) s
+  #-}
diff --git a/src/Text/Builder/ANSI.hs b/src/Text/Builder/ANSI.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Builder/ANSI.hs
@@ -0,0 +1,381 @@
+{-# LANGUAGE CPP #-}
+
+module Text.Builder.ANSI
+  ( -- $intro
+
+    -- * Foreground color
+    black,
+    red,
+    green,
+    yellow,
+    blue,
+    magenta,
+    cyan,
+    white,
+    brightBlack,
+    brightRed,
+    brightGreen,
+    brightYellow,
+    brightBlue,
+    brightMagenta,
+    brightCyan,
+    brightWhite,
+    rgb,
+
+    -- * Background color
+    blackBg,
+    redBg,
+    greenBg,
+    yellowBg,
+    blueBg,
+    magentaBg,
+    cyanBg,
+    whiteBg,
+    brightBlackBg,
+    brightRedBg,
+    brightGreenBg,
+    brightYellowBg,
+    brightBlueBg,
+    brightMagentaBg,
+    brightCyanBg,
+    brightWhiteBg,
+    rgbBg,
+
+    -- * Style
+    bold,
+    faint,
+    italic,
+    underline,
+    doubleUnderline,
+    strikethrough,
+    frame,
+    encircle,
+    overline,
+  )
+where
+
+#if !MIN_VERSION_base(4,13,0)
+import Data.Semigroup ((<>))
+#endif
+import Text.Builder (Builder)
+import qualified Text.Builder as Builder
+import Data.Word (Word8)
+import Foreign.C (CInt (CInt))
+import System.IO.Unsafe (unsafePerformIO)
+
+-- $intro
+--
+-- Text styling for ANSI terminals using SGR codes, as defined by the
+-- <https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf ECMA-48>
+-- standard.
+--
+-- Supports foreground\/background color, bold\/faint intensity, italic,
+-- single\/double underline, strikethrough, frame, encircle, and overline escape
+-- sequences. Some styles may not work on your terminal.
+--
+-- Also features terminal detection, so redirecting styled output to a file will
+-- automatically strip the ANSI escape sequences.
+
+-- | Black foreground.
+black :: Builder -> Builder
+black =
+  foreground (Builder.string "30")
+{-# INLINE black #-}
+
+-- | Red foreground.
+red :: Builder -> Builder
+red =
+  foreground (Builder.string "31")
+{-# INLINE red #-}
+
+-- | Green foreground.
+green :: Builder -> Builder
+green =
+  foreground (Builder.string "32")
+{-# INLINE green #-}
+
+-- | Yellow foreground.
+yellow :: Builder -> Builder
+yellow =
+  foreground (Builder.string "33")
+{-# INLINE yellow #-}
+
+-- | Blue foreground.
+blue :: Builder -> Builder
+blue =
+  foreground (Builder.string "34")
+{-# INLINE blue #-}
+
+-- | Magenta foreground.
+magenta :: Builder -> Builder
+magenta =
+  foreground (Builder.string "35")
+{-# INLINE magenta #-}
+
+-- | Cyan foreground.
+cyan :: Builder -> Builder
+cyan =
+  foreground (Builder.string "36")
+{-# INLINE cyan #-}
+
+-- | White foreground.
+white :: Builder -> Builder
+white =
+  foreground (Builder.string "37")
+{-# INLINE white #-}
+
+-- | Bright black foreground.
+brightBlack :: Builder -> Builder
+brightBlack =
+  foreground (Builder.string "90")
+{-# INLINE brightBlack #-}
+
+-- | Bright red foreground.
+brightRed :: Builder -> Builder
+brightRed =
+  foreground (Builder.string "91")
+{-# INLINE brightRed #-}
+
+-- | Bright green foreground.
+brightGreen :: Builder -> Builder
+brightGreen =
+  foreground (Builder.string "92")
+{-# INLINE brightGreen #-}
+
+-- | Bright yellow foreground.
+brightYellow :: Builder -> Builder
+brightYellow =
+  foreground (Builder.string "93")
+{-# INLINE brightYellow #-}
+
+-- | Bright blue foreground.
+brightBlue :: Builder -> Builder
+brightBlue =
+  foreground (Builder.string "94")
+{-# INLINE brightBlue #-}
+
+-- | Bright magenta foreground.
+brightMagenta :: Builder -> Builder
+brightMagenta =
+  foreground (Builder.string "95")
+{-# INLINE brightMagenta #-}
+
+-- | Bright cyan foreground.
+brightCyan :: Builder -> Builder
+brightCyan =
+  foreground (Builder.string "96")
+{-# INLINE brightCyan #-}
+
+-- | Bright white foreground.
+brightWhite :: Builder -> Builder
+brightWhite =
+  foreground (Builder.string "97")
+{-# INLINE brightWhite #-}
+
+-- | RGB foreground.
+rgb :: Word8 -> Word8 -> Word8 -> Builder -> Builder
+rgb r g b =
+  foreground (Builder.string "38;2;" <> Builder.decimal r <> semi <> Builder.decimal g <> semi <> Builder.decimal b)
+{-# INLINE rgb #-}
+
+foreground :: Builder -> Builder -> Builder
+foreground s =
+  surround s (Builder.string "39")
+{-# INLINE foreground #-}
+
+-- | Black background.
+blackBg :: Builder -> Builder
+blackBg =
+  background (Builder.string "40")
+{-# INLINE blackBg #-}
+
+-- | Red background.
+redBg :: Builder -> Builder
+redBg =
+  background (Builder.string "41")
+{-# INLINE redBg #-}
+
+-- | Green background.
+greenBg :: Builder -> Builder
+greenBg =
+  background (Builder.string "42")
+{-# INLINE greenBg #-}
+
+-- | Yellow background.
+yellowBg :: Builder -> Builder
+yellowBg =
+  background (Builder.string "43")
+{-# INLINE yellowBg #-}
+
+-- | Blue background.
+blueBg :: Builder -> Builder
+blueBg =
+  background (Builder.string "44")
+{-# INLINE blueBg #-}
+
+-- | Magenta background.
+magentaBg :: Builder -> Builder
+magentaBg =
+  background (Builder.string "45")
+{-# INLINE magentaBg #-}
+
+-- | Cyan background.
+cyanBg :: Builder -> Builder
+cyanBg =
+  background (Builder.string "46")
+{-# INLINE cyanBg #-}
+
+-- | White background.
+whiteBg :: Builder -> Builder
+whiteBg =
+  background (Builder.string "47")
+{-# INLINE whiteBg #-}
+
+-- | Bright black background.
+brightBlackBg :: Builder -> Builder
+brightBlackBg =
+  background (Builder.string "100")
+{-# INLINE brightBlackBg #-}
+
+-- | Bright red background.
+brightRedBg :: Builder -> Builder
+brightRedBg =
+  background (Builder.string "101")
+{-# INLINE brightRedBg #-}
+
+-- | Bright green background.
+brightGreenBg :: Builder -> Builder
+brightGreenBg =
+  background (Builder.string "102")
+{-# INLINE brightGreenBg #-}
+
+-- | Bright yellow background.
+brightYellowBg :: Builder -> Builder
+brightYellowBg =
+  background (Builder.string "103")
+{-# INLINE brightYellowBg #-}
+
+-- | Bright blue background.
+brightBlueBg :: Builder -> Builder
+brightBlueBg =
+  background (Builder.string "104")
+{-# INLINE brightBlueBg #-}
+
+-- | Bright magenta background.
+brightMagentaBg :: Builder -> Builder
+brightMagentaBg =
+  background (Builder.string "105")
+{-# INLINE brightMagentaBg #-}
+
+-- | Bright cyan background.
+brightCyanBg :: Builder -> Builder
+brightCyanBg =
+  background (Builder.string "106")
+{-# INLINE brightCyanBg #-}
+
+-- | Bright white background.
+brightWhiteBg :: Builder -> Builder
+brightWhiteBg =
+  background (Builder.string "107")
+{-# INLINE brightWhiteBg #-}
+
+background :: Builder -> Builder -> Builder
+background s =
+  surround s (Builder.string "49")
+{-# INLINE background #-}
+
+-- | RGB background.
+rgbBg :: Word8 -> Word8 -> Word8 -> Builder -> Builder
+rgbBg r g b =
+  background (Builder.string "48;2;" <> Builder.decimal r <> semi <> Builder.decimal g <> semi <> Builder.decimal b)
+{-# INLINE rgbBg #-}
+
+-- | __Bold__ style (high intensity).
+bold :: Builder -> Builder
+bold =
+  surround (Builder.string "1") (Builder.string "22")
+{-# INLINE bold #-}
+
+-- | Faint style (low intensity).
+faint :: Builder -> Builder
+faint =
+  surround (Builder.string "2") (Builder.string "22")
+{-# INLINE faint #-}
+
+-- | /Italic/ style.
+italic :: Builder -> Builder
+italic =
+  surround (Builder.string "3") (Builder.string "23")
+{-# INLINE italic #-}
+
+-- | U̲n̲d̲e̲r̲l̲i̲n̲e̲ style.
+underline :: Builder -> Builder
+underline =
+  surround (Builder.string "4") (Builder.string "24")
+{-# INLINE underline #-}
+
+-- | D̳o̳u̳b̳l̳e̳ ̳u̳n̳d̳e̳r̳l̳i̳n̳e̳ style.
+doubleUnderline :: Builder -> Builder
+doubleUnderline =
+  surround (Builder.string "21") (Builder.string "24")
+{-# INLINE doubleUnderline #-}
+
+-- | S̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h̶ style.
+strikethrough :: Builder -> Builder
+strikethrough =
+  surround (Builder.string "9") (Builder.string "29")
+{-# INLINE strikethrough #-}
+
+-- | Frame style.
+frame :: Builder -> Builder
+frame =
+  surround (Builder.string "51") (Builder.string "54")
+{-# INLINE frame #-}
+
+-- | Encircle style.
+encircle :: Builder -> Builder
+encircle =
+  surround (Builder.string "52") (Builder.string "54")
+{-# INLINE encircle #-}
+
+-- | O̅v̅e̅r̅l̅i̅n̅e̅ style.
+overline :: Builder -> Builder
+overline =
+  surround (Builder.string "53") (Builder.string "55")
+{-# INLINE overline #-}
+
+--------------------------------------------------------------------------------
+
+surround :: Builder -> Builder -> Builder -> Builder
+surround open close text
+  | isatty = esc <> open <> m <> text <> esc <> close <> m
+  | otherwise = text
+-- Don't inline before phase 1
+{-# NOINLINE [1] surround #-}
+
+esc :: Builder
+esc =
+  Builder.string "\ESC["
+
+m :: Builder
+m =
+  Builder.char 'm'
+
+semi :: Builder
+semi =
+  Builder.char ';'
+
+isatty :: Bool
+isatty =
+  unsafePerformIO (c_isatty 1) == 1
+{-# NOINLINE isatty #-}
+
+foreign import ccall unsafe "isatty"
+  c_isatty :: CInt -> IO CInt
+
+-- Collapse surround/surround to a single surround before phase 1
+{-# RULES
+"surround/surround" [~1] forall a b c d s.
+  surround a b (surround c d s) =
+    surround (a <> semi <> c) (b <> semi <> d) s
+  #-}
diff --git a/src/Text/Lazy/Builder/ANSI.hs b/src/Text/Lazy/Builder/ANSI.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Lazy/Builder/ANSI.hs
@@ -0,0 +1,382 @@
+{-# LANGUAGE CPP #-}
+
+module Text.Lazy.Builder.ANSI
+  ( -- $intro
+
+    -- * Foreground color
+    black,
+    red,
+    green,
+    yellow,
+    blue,
+    magenta,
+    cyan,
+    white,
+    brightBlack,
+    brightRed,
+    brightGreen,
+    brightYellow,
+    brightBlue,
+    brightMagenta,
+    brightCyan,
+    brightWhite,
+    rgb,
+
+    -- * Background color
+    blackBg,
+    redBg,
+    greenBg,
+    yellowBg,
+    blueBg,
+    magentaBg,
+    cyanBg,
+    whiteBg,
+    brightBlackBg,
+    brightRedBg,
+    brightGreenBg,
+    brightYellowBg,
+    brightBlueBg,
+    brightMagentaBg,
+    brightCyanBg,
+    brightWhiteBg,
+    rgbBg,
+
+    -- * Style
+    bold,
+    faint,
+    italic,
+    underline,
+    doubleUnderline,
+    strikethrough,
+    frame,
+    encircle,
+    overline,
+  )
+where
+
+#if !MIN_VERSION_base(4,13,0)
+import Data.Semigroup ((<>))
+#endif
+import Data.Text.Lazy.Builder (Builder)
+import qualified Data.Text.Lazy.Builder as Builder
+import qualified Data.Text.Lazy.Builder.Int as Builder
+import Data.Word (Word8)
+import Foreign.C (CInt (CInt))
+import System.IO.Unsafe (unsafePerformIO)
+
+-- $intro
+--
+-- Text styling for ANSI terminals using SGR codes, as defined by the
+-- <https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf ECMA-48>
+-- standard.
+--
+-- Supports foreground\/background color, bold\/faint intensity, italic,
+-- single\/double underline, strikethrough, frame, encircle, and overline escape
+-- sequences. Some styles may not work on your terminal.
+--
+-- Also features terminal detection, so redirecting styled output to a file will
+-- automatically strip the ANSI escape sequences.
+
+-- | Black foreground.
+black :: Builder -> Builder
+black =
+  foreground (Builder.fromString "30")
+{-# INLINE black #-}
+
+-- | Red foreground.
+red :: Builder -> Builder
+red =
+  foreground (Builder.fromString "31")
+{-# INLINE red #-}
+
+-- | Green foreground.
+green :: Builder -> Builder
+green =
+  foreground (Builder.fromString "32")
+{-# INLINE green #-}
+
+-- | Yellow foreground.
+yellow :: Builder -> Builder
+yellow =
+  foreground (Builder.fromString "33")
+{-# INLINE yellow #-}
+
+-- | Blue foreground.
+blue :: Builder -> Builder
+blue =
+  foreground (Builder.fromString "34")
+{-# INLINE blue #-}
+
+-- | Magenta foreground.
+magenta :: Builder -> Builder
+magenta =
+  foreground (Builder.fromString "35")
+{-# INLINE magenta #-}
+
+-- | Cyan foreground.
+cyan :: Builder -> Builder
+cyan =
+  foreground (Builder.fromString "36")
+{-# INLINE cyan #-}
+
+-- | White foreground.
+white :: Builder -> Builder
+white =
+  foreground (Builder.fromString "37")
+{-# INLINE white #-}
+
+-- | Bright black foreground.
+brightBlack :: Builder -> Builder
+brightBlack =
+  foreground (Builder.fromString "90")
+{-# INLINE brightBlack #-}
+
+-- | Bright red foreground.
+brightRed :: Builder -> Builder
+brightRed =
+  foreground (Builder.fromString "91")
+{-# INLINE brightRed #-}
+
+-- | Bright green foreground.
+brightGreen :: Builder -> Builder
+brightGreen =
+  foreground (Builder.fromString "92")
+{-# INLINE brightGreen #-}
+
+-- | Bright yellow foreground.
+brightYellow :: Builder -> Builder
+brightYellow =
+  foreground (Builder.fromString "93")
+{-# INLINE brightYellow #-}
+
+-- | Bright blue foreground.
+brightBlue :: Builder -> Builder
+brightBlue =
+  foreground (Builder.fromString "94")
+{-# INLINE brightBlue #-}
+
+-- | Bright magenta foreground.
+brightMagenta :: Builder -> Builder
+brightMagenta =
+  foreground (Builder.fromString "95")
+{-# INLINE brightMagenta #-}
+
+-- | Bright cyan foreground.
+brightCyan :: Builder -> Builder
+brightCyan =
+  foreground (Builder.fromString "96")
+{-# INLINE brightCyan #-}
+
+-- | Bright white foreground.
+brightWhite :: Builder -> Builder
+brightWhite =
+  foreground (Builder.fromString "97")
+{-# INLINE brightWhite #-}
+
+-- | RGB foreground.
+rgb :: Word8 -> Word8 -> Word8 -> Builder -> Builder
+rgb r g b =
+  foreground (Builder.fromString "38;2;" <> Builder.decimal r <> semi <> Builder.decimal g <> semi <> Builder.decimal b)
+{-# INLINE rgb #-}
+
+foreground :: Builder -> Builder -> Builder
+foreground s =
+  surround s (Builder.fromString "39")
+{-# INLINE foreground #-}
+
+-- | Black background.
+blackBg :: Builder -> Builder
+blackBg =
+  background (Builder.fromString "40")
+{-# INLINE blackBg #-}
+
+-- | Red background.
+redBg :: Builder -> Builder
+redBg =
+  background (Builder.fromString "41")
+{-# INLINE redBg #-}
+
+-- | Green background.
+greenBg :: Builder -> Builder
+greenBg =
+  background (Builder.fromString "42")
+{-# INLINE greenBg #-}
+
+-- | Yellow background.
+yellowBg :: Builder -> Builder
+yellowBg =
+  background (Builder.fromString "43")
+{-# INLINE yellowBg #-}
+
+-- | Blue background.
+blueBg :: Builder -> Builder
+blueBg =
+  background (Builder.fromString "44")
+{-# INLINE blueBg #-}
+
+-- | Magenta background.
+magentaBg :: Builder -> Builder
+magentaBg =
+  background (Builder.fromString "45")
+{-# INLINE magentaBg #-}
+
+-- | Cyan background.
+cyanBg :: Builder -> Builder
+cyanBg =
+  background (Builder.fromString "46")
+{-# INLINE cyanBg #-}
+
+-- | White background.
+whiteBg :: Builder -> Builder
+whiteBg =
+  background (Builder.fromString "47")
+{-# INLINE whiteBg #-}
+
+-- | Bright black background.
+brightBlackBg :: Builder -> Builder
+brightBlackBg =
+  background (Builder.fromString "100")
+{-# INLINE brightBlackBg #-}
+
+-- | Bright red background.
+brightRedBg :: Builder -> Builder
+brightRedBg =
+  background (Builder.fromString "101")
+{-# INLINE brightRedBg #-}
+
+-- | Bright green background.
+brightGreenBg :: Builder -> Builder
+brightGreenBg =
+  background (Builder.fromString "102")
+{-# INLINE brightGreenBg #-}
+
+-- | Bright yellow background.
+brightYellowBg :: Builder -> Builder
+brightYellowBg =
+  background (Builder.fromString "103")
+{-# INLINE brightYellowBg #-}
+
+-- | Bright blue background.
+brightBlueBg :: Builder -> Builder
+brightBlueBg =
+  background (Builder.fromString "104")
+{-# INLINE brightBlueBg #-}
+
+-- | Bright magenta background.
+brightMagentaBg :: Builder -> Builder
+brightMagentaBg =
+  background (Builder.fromString "105")
+{-# INLINE brightMagentaBg #-}
+
+-- | Bright cyan background.
+brightCyanBg :: Builder -> Builder
+brightCyanBg =
+  background (Builder.fromString "106")
+{-# INLINE brightCyanBg #-}
+
+-- | Bright white background.
+brightWhiteBg :: Builder -> Builder
+brightWhiteBg =
+  background (Builder.fromString "107")
+{-# INLINE brightWhiteBg #-}
+
+background :: Builder -> Builder -> Builder
+background s =
+  surround s (Builder.fromString "49")
+{-# INLINE background #-}
+
+-- | RGB background.
+rgbBg :: Word8 -> Word8 -> Word8 -> Builder -> Builder
+rgbBg r g b =
+  background (Builder.fromString "48;2;" <> Builder.decimal r <> semi <> Builder.decimal g <> semi <> Builder.decimal b)
+{-# INLINE rgbBg #-}
+
+-- | __Bold__ style (high intensity).
+bold :: Builder -> Builder
+bold =
+  surround (Builder.fromString "1") (Builder.fromString "22")
+{-# INLINE bold #-}
+
+-- | Faint style (low intensity).
+faint :: Builder -> Builder
+faint =
+  surround (Builder.fromString "2") (Builder.fromString "22")
+{-# INLINE faint #-}
+
+-- | /Italic/ style.
+italic :: Builder -> Builder
+italic =
+  surround (Builder.fromString "3") (Builder.fromString "23")
+{-# INLINE italic #-}
+
+-- | U̲n̲d̲e̲r̲l̲i̲n̲e̲ style.
+underline :: Builder -> Builder
+underline =
+  surround (Builder.fromString "4") (Builder.fromString "24")
+{-# INLINE underline #-}
+
+-- | D̳o̳u̳b̳l̳e̳ ̳u̳n̳d̳e̳r̳l̳i̳n̳e̳ style.
+doubleUnderline :: Builder -> Builder
+doubleUnderline =
+  surround (Builder.fromString "21") (Builder.fromString "24")
+{-# INLINE doubleUnderline #-}
+
+-- | S̶t̶r̶i̶k̶e̶t̶h̶r̶o̶u̶g̶h̶ style.
+strikethrough :: Builder -> Builder
+strikethrough =
+  surround (Builder.fromString "9") (Builder.fromString "29")
+{-# INLINE strikethrough #-}
+
+-- | Frame style.
+frame :: Builder -> Builder
+frame =
+  surround (Builder.fromString "51") (Builder.fromString "54")
+{-# INLINE frame #-}
+
+-- | Encircle style.
+encircle :: Builder -> Builder
+encircle =
+  surround (Builder.fromString "52") (Builder.fromString "54")
+{-# INLINE encircle #-}
+
+-- | O̅v̅e̅r̅l̅i̅n̅e̅ style.
+overline :: Builder -> Builder
+overline =
+  surround (Builder.fromString "53") (Builder.fromString "55")
+{-# INLINE overline #-}
+
+--------------------------------------------------------------------------------
+
+surround :: Builder -> Builder -> Builder -> Builder
+surround open close text
+  | isatty = esc <> open <> m <> text <> esc <> close <> m
+  | otherwise = text
+-- Don't inline before phase 1
+{-# NOINLINE [1] surround #-}
+
+esc :: Builder
+esc =
+  Builder.fromString "\ESC["
+
+m :: Builder
+m =
+  Builder.singleton 'm'
+
+semi :: Builder
+semi =
+  Builder.singleton ';'
+
+isatty :: Bool
+isatty =
+  unsafePerformIO (c_isatty 1) == 1
+{-# NOINLINE isatty #-}
+
+foreign import ccall unsafe "isatty"
+  c_isatty :: CInt -> IO CInt
+
+-- Collapse surround/surround to a single surround before phase 1
+{-# RULES
+"surround/surround" [~1] forall a b c d s.
+  surround a b (surround c d s) =
+    surround (a <> semi <> c) (b <> semi <> d) s
+  #-}
diff --git a/text-ansi.cabal b/text-ansi.cabal
--- a/text-ansi.cabal
+++ b/text-ansi.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name: text-ansi
-version: 0.1.1
+version: 0.2.0
 category: Data
 synopsis: Text styling for ANSI terminals.
 description:
@@ -19,7 +19,7 @@
 maintainer: Mitchell Rosen <mitchellwrosen@gmail.com>
 homepage: https://github.com/mitchellwrosen/text-ansi
 bug-reports: https://github.com/mitchellwrosen/text-ansi/issues
-copyright: (c) 2018-2020, Mitchell Rosen
+copyright: (c) 2018-2022, Mitchell Rosen
 license: BSD-3-Clause
 license-file: LICENSE
 build-type: Simple
@@ -35,13 +35,15 @@
 
 library
   build-depends:
-    base >= 4.9 && < 4.15,
-    text >= 1.0 && < 1.3,
+    base >= 4.9 && < 4.18,
+    text >= 1.0 && < 2.1,
+    text-builder ^>= 0.6.7,
   default-language:
     Haskell2010
   exposed-modules:
-    Data.Text.ANSI
-    Data.Text.Builder.ANSI
+    Text.ANSI
+    Text.Builder.ANSI
+    Text.Lazy.Builder.ANSI
   ghc-options:
     -Weverything
     -Wno-implicit-prelude
@@ -52,3 +54,5 @@
     ghc-options:
       -Wno-missing-safe-haskell-mode
       -Wno-prepositive-qualified-module
+  hs-source-dirs:
+    src
