[FEAT] Adds x-mode-only anchor styles to display images based if the theme is light or dark mode. (#3985)

Adds a feature similar to this https://github.blog/changelog/2021-11-24-specify-theme-context-for-images-in-markdown/ , by adding styles to elements which `src` or `href` attribute ends with `#light-mode-only` or `#dark-mode-only`. To improve compability, the github variants with the `gh-` prefix are also contained.

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3985
Reviewed-by: 0ko <0ko@noreply.codeberg.org>
Co-authored-by: Mai-Lapyst <mai-lapyst@noreply.codeberg.org>
Co-committed-by: Mai-Lapyst <mai-lapyst@noreply.codeberg.org>
This commit is contained in:
Mai-Lapyst 2024-06-09 10:50:53 +00:00 committed by 0ko
parent 96f661e821
commit 0a7767eaaa
12 changed files with 51 additions and 4 deletions

View file

@ -83,3 +83,12 @@
issue_id: 2 # in repo_id 1 issue_id: 2 # in repo_id 1
review_id: 20 review_id: 20
created_unix: 946684810 created_unix: 946684810
-
id: 10
type: 0
poster_id: 1
issue_id: 1 # in repo_id 1
content: "test markup light/dark-mode-only ![GitHub-Mark-Light](https://user-images.githubusercontent.com/3369400/139447912-e0f43f33-6d9f-45f8-be46-2df5bbc91289.png#gh-dark-mode-only)![GitHub-Mark-Dark](https://user-images.githubusercontent.com/3369400/139448065-39a229ba-4b06-434b-bc67-616e2ed80c8f.png#gh-light-mode-only)"
created_unix: 946684813
updated_unix: 946684813

View file

@ -10,7 +10,7 @@
priority: 0 priority: 0
is_closed: false is_closed: false
is_pull: false is_pull: false
num_comments: 2 num_comments: 3
created_unix: 946684800 created_unix: 946684800
updated_unix: 978307200 updated_unix: 978307200
is_locked: false is_locked: false

View file

@ -0,0 +1 @@
Added support for displaying images based on the users current color code by using an anchor of `#dark-mode-only` or `#light-mode-only` respectively. Also supporting the github variants (e.g. `#gh-dark-mode-only`).

View file

@ -0,0 +1,13 @@
// @ts-check
import {test, expect} from '@playwright/test';
test('Test markup with #xyz-mode-only', async ({page}) => {
const response = await page.goto('/user2/repo1/issues/1');
await expect(response?.status()).toBe(200);
await page.waitForLoadState('networkidle');
const comment = page.locator('.comment-body>.markup', {hasText: 'test markup light/dark-mode-only'});
await expect(comment).toBeVisible();
await expect(comment.locator('[src$="#gh-light-mode-only"]')).toBeVisible();
await expect(comment.locator('[src$="#gh-dark-mode-only"]')).not.toBeVisible();
});

View file

@ -39,7 +39,7 @@ func TestAPIListRepoComments(t *testing.T) {
var apiComments []*api.Comment var apiComments []*api.Comment
DecodeJSON(t, resp, &apiComments) DecodeJSON(t, resp, &apiComments)
assert.Len(t, apiComments, 2) assert.Len(t, apiComments, 3)
for _, apiComment := range apiComments { for _, apiComment := range apiComments {
c := &issues_model.Comment{ID: apiComment.ID} c := &issues_model.Comment{ID: apiComment.ID}
unittest.AssertExistsAndLoadBean(t, c, unittest.AssertExistsAndLoadBean(t, c,
@ -65,7 +65,7 @@ func TestAPIListRepoComments(t *testing.T) {
req = NewRequest(t, "GET", link.String()) req = NewRequest(t, "GET", link.String())
resp = MakeRequest(t, req, http.StatusOK) resp = MakeRequest(t, req, http.StatusOK)
DecodeJSON(t, resp, &apiComments) DecodeJSON(t, resp, &apiComments)
assert.Len(t, apiComments, 1) assert.Len(t, apiComments, 2)
assert.EqualValues(t, 3, apiComments[0].ID) assert.EqualValues(t, 3, apiComments[0].ID)
} }

View file

@ -34,6 +34,6 @@ func TestNodeinfo(t *testing.T) {
assert.Equal(t, "forgejo", nodeinfo.Software.Name) assert.Equal(t, "forgejo", nodeinfo.Software.Name)
assert.Equal(t, 29, nodeinfo.Usage.Users.Total) assert.Equal(t, 29, nodeinfo.Usage.Users.Total)
assert.Equal(t, 22, nodeinfo.Usage.LocalPosts) assert.Equal(t, 22, nodeinfo.Usage.LocalPosts)
assert.Equal(t, 3, nodeinfo.Usage.LocalComments) assert.Equal(t, 4, nodeinfo.Usage.LocalComments)
}) })
} }

View file

@ -0,0 +1,13 @@
.markup [src$="#gh-light-mode-only"],
.markup [src$="#light-mode-only"],
.markup [href$="#gh-light-mode-only"],
.markup [href$="#light-mode-only"] {
display: none;
}
.markup [src$="#gh-dark-mode-only"],
.markup [src$="#dark-mode-only"],
.markup [href$="#gh-dark-mode-only"],
.markup [href$="#dark-mode-only"] {
display: unset;
}

View file

@ -0,0 +1,6 @@
.markup [src$="#gh-dark-mode-only"],
.markup [src$="#dark-mode-only"],
.markup [href$="#gh-dark-mode-only"],
.markup [href$="#dark-mode-only"] {
display: none;
}

View file

@ -1,5 +1,7 @@
@import "../chroma/dark.css"; @import "../chroma/dark.css";
@import "../codemirror/dark.css"; @import "../codemirror/dark.css";
@import "../markup/dark.css";
:root { :root {
--steel-900: #10161d; --steel-900: #10161d;
--steel-850: #131a21; --steel-850: #131a21;

View file

@ -1,5 +1,6 @@
@import "../chroma/light.css"; @import "../chroma/light.css";
@import "../codemirror/light.css"; @import "../codemirror/light.css";
@import "../markup/light.css";
:root { :root {
--steel-900: #10161d; --steel-900: #10161d;

View file

@ -1,5 +1,6 @@
@import "../chroma/dark.css"; @import "../chroma/dark.css";
@import "../codemirror/dark.css"; @import "../codemirror/dark.css";
@import "../markup/dark.css";
:root { :root {
--is-dark-theme: true; --is-dark-theme: true;

View file

@ -1,5 +1,6 @@
@import "../chroma/light.css"; @import "../chroma/light.css";
@import "../codemirror/light.css"; @import "../codemirror/light.css";
@import "../markup/light.css";
:root { :root {
--is-dark-theme: false; --is-dark-theme: false;