Skip to content

Commit 04d4b49

Browse files
committed
feat(): support theme variant
1 parent 94ef9e4 commit 04d4b49

File tree

8 files changed

+91
-1
lines changed

8 files changed

+91
-1
lines changed

etc/runtime.api.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import type { RuntimeSnippet } from '@next-core/types';
3838
import type { RuntimeStoryboard } from '@next-core/types';
3939
import type { SiteMode } from '@next-core/types';
4040
import type { SiteTheme } from '@next-core/types';
41+
import type { SiteVariant } from '@next-core/types';
4142
import type { SlotConfOfRoutes } from '@next-core/types';
4243
import type { StaticMenuConf } from '@next-core/types';
4344
import type { Storyboard } from '@next-core/types';
@@ -232,6 +233,9 @@ function getRenderId(): string | undefined;
232233
// @public (undocumented)
233234
export const getRuntime: () => Runtime;
234235

236+
// @public (undocumented)
237+
export function getThemeVariant(): SiteVariant;
238+
235239
// Warning: (ae-forgotten-export) The symbol "Kit" needs to be exported by the entry point index.d.ts
236240
//
237241
// @public (undocumented)

packages/runtime/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export {
2525
getCssPropertyValue,
2626
getCurrentTheme,
2727
getCurrentMode,
28+
getThemeVariant,
2829
batchSetAppsLocalTheme,
2930
applyTheme,
3031
} from "./themeAndMode.js";

packages/runtime/src/internal/Router.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
getLocalAppsTheme,
3131
setMode,
3232
setTheme,
33+
setThemeVariant,
3334
} from "../themeAndMode.js";
3435
import {
3536
_internalApiGetAppInBootstrapData,
@@ -404,6 +405,7 @@ export class Router {
404405
"light"
405406
);
406407
setMode("default");
408+
setThemeVariant(getRuntime().getMiscSettings().globalThemeVariant);
407409

408410
if (currentApp && !blocked) {
409411
hooks?.checkInstalledApps?.preCheckInstalledApps(

packages/runtime/src/themeAndMode.spec.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
applyMode as _applyMode,
88
getLocalAppsTheme,
99
batchSetAppsLocalTheme,
10+
setThemeVariant as _setThemeVariant,
11+
getThemeVariant as _getThemeVariant,
1012
} from "./themeAndMode.js";
1113

1214
jest.spyOn(console, "error").mockImplementation();
@@ -145,3 +147,40 @@ describe("app themes", () => {
145147
]);
146148
});
147149
});
150+
151+
describe("variant", () => {
152+
let setThemeVariant: typeof _setThemeVariant;
153+
let getThemeVariant: typeof _getThemeVariant;
154+
155+
beforeEach(() => {
156+
jest.resetModules();
157+
document.documentElement.dataset.variant = "default";
158+
// eslint-disable-next-line @typescript-eslint/no-var-requires
159+
const m = require("./themeAndMode");
160+
setThemeVariant = m.setThemeVariant;
161+
getThemeVariant = m.getThemeVariant;
162+
});
163+
164+
test("should set theme variant", () => {
165+
expect(getThemeVariant()).toEqual("default");
166+
expect(document.documentElement.dataset.variant).toBe("default");
167+
setThemeVariant("elevo");
168+
expect(getThemeVariant()).toEqual("elevo");
169+
expect(document.documentElement.dataset.variant).toBe("elevo");
170+
});
171+
172+
test("should apply the current theme variant", () => {
173+
expect(getThemeVariant()).toEqual("default");
174+
expect(document.documentElement.dataset.variant).toBe("default");
175+
setThemeVariant("elevo");
176+
expect(document.documentElement.dataset.variant).toBe("elevo");
177+
});
178+
179+
test("should apply the specified theme variant", () => {
180+
expect(getThemeVariant()).toEqual("default");
181+
expect(document.documentElement.dataset.variant).toBe("default");
182+
setThemeVariant("elevo");
183+
expect(getThemeVariant()).toEqual("elevo");
184+
expect(document.documentElement.dataset.variant).toBe("elevo");
185+
});
186+
});

packages/runtime/src/themeAndMode.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { SiteMode, SiteTheme } from "@next-core/types";
1+
import type { SiteMode, SiteTheme, SiteVariant } from "@next-core/types";
22
import { JsonStorage } from "@next-core/utils/general";
33

44
interface AppThemes {
@@ -101,3 +101,24 @@ export function getCssPropertyValue(
101101
if (!el) return "";
102102
return window.getComputedStyle(el)?.getPropertyValue(name) || "";
103103
}
104+
105+
let variant: SiteVariant = "default";
106+
107+
export function setThemeVariant(value: unknown) {
108+
if (value !== "default" && value !== "elevo") {
109+
return setThemeVariant("default");
110+
}
111+
if (variant === value) {
112+
return;
113+
}
114+
document.documentElement.dataset.variant = variant = value;
115+
window.dispatchEvent(
116+
new CustomEvent("variant.change", {
117+
detail: value,
118+
})
119+
);
120+
}
121+
122+
export function getThemeVariant(): SiteVariant {
123+
return variant;
124+
}

packages/theme/src/elevo.css

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
:root {
2+
--elevo-color-brand-rgb-channel: 37, 64, 255;
3+
--elevo-color-brand: #2540ff;
4+
--elevo-color-brand-hover: #5166ff;
5+
--elevo-color-brand-active: #1e33cc;
6+
--elevo-border-color: #ccd1de;
7+
--elevo-border-radius: 8px;
8+
--elevo-divider-color: rgba(222, 222, 223, 0.6);
9+
10+
--elevo-component-background: rgba(255, 255, 255, 0.73);
11+
--elevo-component-backdrop-filter: blur(33px);
12+
13+
--elevo-input-background: rgba(255, 255, 255, 0.8);
14+
--elevo-input-box-shadow: inset 0px -1px 3px 0px
15+
rgba(var(--elevo-color-brand-rgb-channel), 0.5);
16+
--elevo-placeholder-color: rgba(0, 10, 26, 0.26);
17+
}

packages/theme/src/index.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
@import "./business-variables.css";
66
@import "./editor-bricks-variables.css";
77
@import "./version/index.css";
8+
@import "./elevo.css";

packages/types/src/manifest.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,6 +1618,11 @@ export type SiteTheme = "light" | "dark" | "dark-v2";
16181618
*/
16191619
export type SiteMode = "default" | "dashboard";
16201620

1621+
/**
1622+
* 站点变体。
1623+
*/
1624+
export type SiteVariant = "default" | "elevo";
1625+
16211626
/**
16221627
* 国际化数据,以语言为键、文本内容为值的键值对。
16231628
*/

0 commit comments

Comments
 (0)