8000 ENH Add themes for HTML display. Add dark theme (#26862) · REDVM/scikit-learn@154d4c3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 154d4c3

Browse files
9Y5REDVM
authored andcommitted
ENH Add themes for HTML display. Add dark theme (scikit-learn#26862)
1 parent 73f52db commit 154d4c3

File tree

3 files changed

+53
-22
lines changed

3 files changed

+53
-22
lines changed

doc/whats_new/v1.4.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,12 @@ Changelog
206206
:mod:`sklearn.utils`
207207
....................
208208

209+
- |Enhancement| :func:`sklearn.utils.estimator_html_repr` dynamically adapts
210+
diagram colors based on the browser's `prefers-color-scheme`, providing
211+
improved adaptability to dark mode environments.
212+
:pr:`26862` by :user:`Andrew Goh Yisheng <9y5>`, `Thomas Fan`_, `Adrin
213+
Jalali`_.
214+
209215
- |Enhancement| :class:`~utils.metadata_routing.MetadataRequest` and
210216
:class:`~utils.metadata_routing.MetadataRouter` now have a ``consumes`` method
211217
which can be used to check whether a given set of parameters would be consumed.

sklearn/utils/_estimator_html_repr.py

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,35 @@ def _write_estimator_html(
190190

191191
_STYLE = """
192192
#$id {
193-
color: black;
193+
--sklearn-color-text: black;
194+
--sklearn-color-line: gray;
195+
--sklearn-color-background: white;
196+
--sklearn-color-background-box: #f0f8ff;
197+
--sklearn-color-border-box: black;
198+
--sklearn-color-icon: #696969;
199+
--sklearn-color-active: #d4ebff;
200+
--sklearn-color-highlight: #d4ebff;
201+
202+
@media (prefers-color-scheme: dark) {
203+
--sklearn-color-text: white;
204+
--sklearn-color-line: gray;
205+
--sklearn-color-background: #111;
206+
--sklearn-color-background-box: #424242;
207+
--sklearn-color-border-box: white;
208+
--sklearn-color-icon: #878787;
209+
--sklearn-color-active: #616161;
210+
--sklearn-color-highlight: #616161;
211+
}
212+
}
213+
214+
#$id {
215+
color: var(--sklearn-color-text);
194216
}
195217
#$id pre{
196218
padding: 0;
197219
}
198220
#$id div.sk-toggleable {
199-
background-color: white;
221+
background-color: var(--sklearn-color-background);
200222
}
201223
#$id label.sk-toggleable__label {
202224
cursor: pointer;
@@ -211,26 +233,26 @@ def _write_estimator_html(
211233
content: "▸";
212234
float: left;
213235
margin-right: 0.25em;
214-
color: #696969;
236+
color: var(--sklearn-color-icon);
215237
}
216238
#$id label.sk-toggleable__label-arrow:hover:before {
217-
color: black;
239+
color: var(--sklearn-color-text);
218240
}
219241
#$id div.sk-estimator:hover label.sk-toggleable__label-arrow:before {
220-
color: black;
242+
color: var(--sklearn-color-text);
221243
}
222244
#$id div.sk-toggleable__content {
223245
max-height: 0;
224246
max-width: 0;
225247
overflow: hidden;
226248
text-align: left;
227-
background-color: #f0f8ff;
249+
background-color: var(--sklearn-color-background-box);
228250
}
229251
#$id div.sk-toggleable__content pre {
230252
margin: 0.2em;
231-
color: black;
253+
color: var(--sklearn-color-text);
232254
border-radius: 0.25em;
233-
background-color: #f0f8ff;
255+
background-color: var(--sklearn-color-background-box);
234256
}
235257
#$id input.sk-toggleable__control:checked~div.sk-toggleable__content {
236258
max-height: 200px;
@@ -241,10 +263,10 @@ def _write_estimator_html(
241263
content: "▾";
242264
}
243265
#$id div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {
244-
background-color: #d4ebff;
266+
background-color: var(--sklearn-color-active);
245267
}
246268
#$id div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {
247-
background-color: #d4ebff;
269+
background-color: var(--sklearn-color-active);
248270
}
249271
#$id input.sk-hidden--visually {
250272
border: 0;
@@ -259,28 +281,28 @@ def _write_estimator_html(
259281
}
260282
#$id div.sk-estimator {
261283
font-family: monospace;
262-
background-color: #f0f8ff;
263-
border: 1px dotted black;
284+
background-color: var(--sklearn-color-background-box);
285+
border: 1px dotted var(--sklearn-color-border-box);
264286
border-radius: 0.25em;
265287
box-sizing: border-box;
266288
margin-bottom: 0.5em;
267289
}
268290
#$id div.sk-estimator:hover {
269-
background-color: #d4ebff;
291+
background-color: var(--sklearn-color-highlight);
270292
}
271293
#$id div.sk-parallel-item::after {
272294
content: "";
273295
width: 100%;
274-
border-bottom: 1px solid gray;
296+
border-bottom: 1px solid var(--sklearn-color-line);
275297
flex-grow: 1;
276298
}
277299
#$id div.sk-label:hover label.sk-toggleable__label {
278-
background-color: #d4ebff;
300+
background-color: var(--sklearn-color-highlight);
279301
}
280302
#$id div.sk-serial::before {
281303
content: "";
282304
position: absolute;
283-
border-left: 1px solid gray;
305+
border-left: 1px solid var(--sklearn-color-line);
284306
box-sizing: border-box;
285307
top: 0;
286308
bottom: 0;
@@ -291,7 +313,7 @@ def _write_estimator_html(
291313
display: flex;
292314
flex-direction: column;
293315
align-items: center;
294-
background-color: white;
316+
background-color: var(--sklearn-color-background);
295317
padding-right: 0.2em;
296318
padding-left: 0.2em;
297319
position: relative;
@@ -304,13 +326,13 @@ def _write_estimator_html(
304326
display: flex;
305327
align-items: stretch;
306328
justify-content: center;
307-
background-color: white;
329+
background-color: var(--sklearn-color-background);
308330
position: relative;
309331
}
310332
#$id div.sk-item::before, #$id div.sk-parallel-item::before {
311333
content: "";
312334
position: absolute;
313-
border-left: 1px solid gray;
335+
border-left: 1px solid var(--sklearn-color-line);
314336
box-sizing: border-box;
315337
top: 0;
316338
bottom: 0;
@@ -322,7 +344,7 @@ def _write_estimator_html(
322344
flex-direction: column;
323345
z-index: 1;
324346
position: relative;
325-
background-color: white;
347+
background-color: var(--sklearn-color-background);
326348
}
327349
#$id div.sk-parallel-item:first-child::after {
328350
align-self: flex-end;
@@ -336,11 +358,11 @@ def _write_estimator_html(
336358
width: 0;
337359
}
338360
#$id div.sk-dashed-wrapped {
339-
border: 1px dashed gray;
361+
border: 1px dashed var(--sklearn-color-line);
340362
margin: 0 0.4em 0.5em 0.4em;
341363
box-sizing: border-box;
342364
padding-bottom: 0.4em;
343-
background-color: white;
365+
background-color: var(--sklearn-color-background);
344366
}
345367
#$id div.sk-label label {
346368
font-family: monospace;

sklearn/utils/tests/test_estimator_html_repr.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ def test_estimator_html_repr_pipeline():
197197
assert f"<label>{html.escape(name)}</label>" in html_output
198198
assert f"<pre>{html.escape(str(est))}</pre>" in html_output
199199

200+
# verify that prefers-color-scheme is implemented
201+
assert "prefers-color-scheme" in html_output
202+
200203

201204
@pytest.mark.parametrize("final_estimator", [None, LinearSVC()])
202205
def test_stacking_classifier(final_estimator):

0 commit comments

Comments
 (0)
0