summaryrefslogtreecommitdiffhomepage
path: root/packages/app
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-09 08:25:34 -0500
committerAdam <[email protected]>2026-03-09 08:25:41 -0500
commit6388cbaf9261a71ec8e5e90d09ccb01450201dff (patch)
tree6a1a39c3270d92151fff12ccb268a566eafa4594 /packages/app
parent5cc61e1b536c047a9ff2b348d99711807c6c270f (diff)
downloadopencode-6388cbaf9261a71ec8e5e90d09ccb01450201dff.tar.gz
opencode-6388cbaf9261a71ec8e5e90d09ccb01450201dff.zip
fix(app): remove oc-1 theme
Diffstat (limited to 'packages/app')
-rw-r--r--packages/app/e2e/settings/settings.spec.ts36
-rw-r--r--packages/app/public/oc-theme-preload.js10
-rw-r--r--packages/app/src/theme-preload.test.ts46
3 files changed, 91 insertions, 1 deletions
diff --git a/packages/app/e2e/settings/settings.spec.ts b/packages/app/e2e/settings/settings.spec.ts
index 42fe0b06c..f25e91a31 100644
--- a/packages/app/e2e/settings/settings.spec.ts
+++ b/packages/app/e2e/settings/settings.spec.ts
@@ -116,6 +116,42 @@ test("changing theme persists in localStorage", async ({ page, gotoSession }) =>
expect(dataTheme).toBe(storedThemeId)
})
+test("legacy oc-1 theme migrates to oc-2", async ({ page, gotoSession }) => {
+ await page.addInitScript(() => {
+ localStorage.setItem("opencode-theme-id", "oc-1")
+ localStorage.setItem("opencode-theme-css-light", "--background-base:#fff;")
+ localStorage.setItem("opencode-theme-css-dark", "--background-base:#000;")
+ })
+
+ await gotoSession()
+
+ await expect(page.locator("html")).toHaveAttribute("data-theme", "oc-2")
+
+ await expect
+ .poll(async () => {
+ return await page.evaluate(() => {
+ return localStorage.getItem("opencode-theme-id")
+ })
+ })
+ .toBe("oc-2")
+
+ await expect
+ .poll(async () => {
+ return await page.evaluate(() => {
+ return localStorage.getItem("opencode-theme-css-light")
+ })
+ })
+ .toBeNull()
+
+ await expect
+ .poll(async () => {
+ return await page.evaluate(() => {
+ return localStorage.getItem("opencode-theme-css-dark")
+ })
+ })
+ .toBeNull()
+})
+
test("changing font persists in localStorage and updates CSS variable", async ({ page, gotoSession }) => {
await gotoSession()
diff --git a/packages/app/public/oc-theme-preload.js b/packages/app/public/oc-theme-preload.js
index 5851f756e..36fa5d726 100644
--- a/packages/app/public/oc-theme-preload.js
+++ b/packages/app/public/oc-theme-preload.js
@@ -1,5 +1,13 @@
;(function () {
- var themeId = localStorage.getItem("opencode-theme-id") || "oc-2"
+ var key = "opencode-theme-id"
+ var themeId = localStorage.getItem(key) || "oc-2"
+
+ if (themeId === "oc-1") {
+ themeId = "oc-2"
+ localStorage.setItem(key, themeId)
+ localStorage.removeItem("opencode-theme-css-light")
+ localStorage.removeItem("opencode-theme-css-dark")
+ }
var scheme = localStorage.getItem("opencode-color-scheme") || "system"
var isDark = scheme === "dark" || (scheme === "system" && matchMedia("(prefers-color-scheme: dark)").matches)
diff --git a/packages/app/src/theme-preload.test.ts b/packages/app/src/theme-preload.test.ts
new file mode 100644
index 000000000..00d7da239
--- /dev/null
+++ b/packages/app/src/theme-preload.test.ts
@@ -0,0 +1,46 @@
+import { beforeEach, describe, expect, test } from "bun:test"
+
+const src = await Bun.file(new URL("../public/oc-theme-preload.js", import.meta.url)).text()
+
+const run = () => Function(src)()
+
+beforeEach(() => {
+ document.head.innerHTML = ""
+ document.documentElement.removeAttribute("data-theme")
+ document.documentElement.removeAttribute("data-color-scheme")
+ localStorage.clear()
+ Object.defineProperty(window, "matchMedia", {
+ value: () =>
+ ({
+ matches: false,
+ }) as MediaQueryList,
+ configurable: true,
+ })
+})
+
+describe("theme preload", () => {
+ test("migrates legacy oc-1 to oc-2 before mount", () => {
+ localStorage.setItem("opencode-theme-id", "oc-1")
+ localStorage.setItem("opencode-theme-css-light", "--background-base:#fff;")
+ localStorage.setItem("opencode-theme-css-dark", "--background-base:#000;")
+
+ run()
+
+ expect(document.documentElement.dataset.theme).toBe("oc-2")
+ expect(document.documentElement.dataset.colorScheme).toBe("light")
+ expect(localStorage.getItem("opencode-theme-id")).toBe("oc-2")
+ expect(localStorage.getItem("opencode-theme-css-light")).toBeNull()
+ expect(localStorage.getItem("opencode-theme-css-dark")).toBeNull()
+ expect(document.getElementById("oc-theme-preload")).toBeNull()
+ })
+
+ test("keeps cached css for non-default themes", () => {
+ localStorage.setItem("opencode-theme-id", "nightowl")
+ localStorage.setItem("opencode-theme-css-light", "--background-base:#fff;")
+
+ run()
+
+ expect(document.documentElement.dataset.theme).toBe("nightowl")
+ expect(document.getElementById("oc-theme-preload")?.textContent).toContain("--background-base:#fff;")
+ })
+})