1diff --git a/Cargo.toml b/Cargo.toml
2index 2659c95..a679840 100644
3--- a/Cargo.toml
4+++ b/Cargo.toml
5@@ -96,9 +96,6 @@ replace = """
6 [Unreleased]: https://github.com/assert-rs/predicates-rs/compare/{{tag_name}}...HEAD"""
7 search = "<!-- next-url -->"
8
9-[dependencies.anstyle]
10-version = "1.0.0"
11-
12 [dependencies.difflib]
13 version = "0.4"
14 optional = true
15@@ -121,6 +118,9 @@ version = "1.0"
16 version = "1.0"
17 optional = true
18
19+[dependencies.termcolor]
20+version = "1.2.0"
21+
22 [dev-dependencies.predicates-tree]
23 version = "1.0"
24
25diff --git a/src/color.rs b/src/color.rs
26index f1b6a21..2b9449c 100644
27--- a/src/color.rs
28+++ b/src/color.rs
29@@ -1,17 +1,29 @@
30-#[derive(Copy, Clone, Debug, Default)]
31+use std::io::Write;
32+use termcolor::{Color, ColorSpec, WriteColor};
33+
34+#[derive(Clone, Debug, Default)]
35 pub(crate) struct Palette {
36-    description: anstyle::Style,
37-    var: anstyle::Style,
38-    expected: anstyle::Style,
39+    description: ColorSpec,
40+    var: ColorSpec,
41+    expected: ColorSpec,
42 }
43
44 impl Palette {
45     pub(crate) fn new(alternate: bool) -> Self {
46         if alternate && cfg!(feature = "color") {
47             Self {
48-                description: anstyle::AnsiColor::Blue.on_default() | anstyle::Effects::BOLD,
49-                var: anstyle::AnsiColor::Red.on_default() | anstyle::Effects::BOLD,
50-                expected: anstyle::AnsiColor::Green.on_default() | anstyle::Effects::BOLD,
51+                description: ColorSpec::new()
52+                    .set_fg(Some(Color::Blue))
53+                    .set_bold(true)
54+                    .clone(),
55+                var: ColorSpec::new()
56+                    .set_fg(Some(Color::Red))
57+                    .set_bold(true)
58+                    .clone(),
59+                expected: ColorSpec::new()
60+                    .set_fg(Some(Color::Green))
61+                    .set_bold(true)
62+                    .clone(),
63             }
64         } else {
65             Self::plain()
66@@ -26,27 +38,27 @@ impl Palette {
67         }
68     }
69
70-    pub(crate) fn description<D: std::fmt::Display>(self, display: D) -> Styled<D> {
71-        Styled::new(display, self.description)
72+    pub(crate) fn description<D: std::fmt::Display>(&self, display: D) -> Styled<D> {
73+        Styled::new(display, self.description.clone())
74     }
75
76-    pub(crate) fn var<D: std::fmt::Display>(self, display: D) -> Styled<D> {
77-        Styled::new(display, self.var)
78+    pub(crate) fn var<D: std::fmt::Display>(&self, display: D) -> Styled<D> {
79+        Styled::new(display, self.var.clone())
80     }
81
82-    pub(crate) fn expected<D: std::fmt::Display>(self, display: D) -> Styled<D> {
83-        Styled::new(display, self.expected)
84+    pub(crate) fn expected<D: std::fmt::Display>(&self, display: D) -> Styled<D> {
85+        Styled::new(display, self.expected.clone())
86     }
87 }
88
89 #[derive(Debug)]
90 pub(crate) struct Styled<D> {
91     display: D,
92-    style: anstyle::Style,
93+    style: ColorSpec,
94 }
95
96 impl<D: std::fmt::Display> Styled<D> {
97-    pub(crate) fn new(display: D, style: anstyle::Style) -> Self {
98+    pub(crate) fn new(display: D, style: ColorSpec) -> Self {
99         Self { display, style }
100     }
101 }
102@@ -55,10 +67,11 @@ impl<D: std::fmt::Display> std::fmt::Display for Styled<D> {
103     #[inline]
104     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
105         if f.alternate() {
106-            write!(f, "{}", self.style.render())?;
107-            self.display.fmt(f)?;
108-            write!(f, "{}", self.style.render_reset())?;
109-            Ok(())
110+            let mut buf = termcolor::Buffer::ansi();
111+            buf.set_color(&self.style).unwrap();
112+            write!(&mut buf, "{}", &self.display).unwrap();
113+            buf.reset().unwrap();
114+            write!(f, "{}", String::from_utf8(buf.into_inner()).unwrap())
115         } else {
116             self.display.fmt(f)
117         }
118