@veltra/styles 1.6.6 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/_mixins.scss +1 -7
- package/dist/theme/component-css-vars.d.ts +24 -0
- package/dist/theme/component-css-vars.js +74 -14
- package/dist/theme/component-css-vars.js.map +1 -1
- package/dist/theme/index.d.ts +11 -7
- package/dist/theme/index.js +10 -6
- package/dist/theme/load-theme.d.ts +3 -4
- package/dist/theme/load-theme.js +15 -22
- package/dist/theme/load-theme.js.map +1 -1
- package/dist/theme/presets/ancient.d.ts +3 -2
- package/dist/theme/presets/ancient.js +6 -3
- package/dist/theme/presets/ancient.js.map +1 -1
- package/dist/theme/presets/dark.js +1 -1
- package/dist/theme/presets/dark.js.map +1 -1
- package/dist/theme/presets/glass.d.ts +7 -3
- package/dist/theme/presets/glass.js +18 -47
- package/dist/theme/presets/glass.js.map +1 -1
- package/dist/theme/presets/hero.d.ts +3 -3
- package/dist/theme/presets/hero.js +5 -41
- package/dist/theme/presets/hero.js.map +1 -1
- package/dist/theme/presets/midnight.d.ts +8 -0
- package/dist/theme/presets/midnight.js +55 -0
- package/dist/theme/presets/midnight.js.map +1 -0
- package/dist/theme/presets/neon.d.ts +8 -0
- package/dist/theme/presets/neon.js +55 -0
- package/dist/theme/presets/neon.js.map +1 -0
- package/dist/theme/presets/ocean.d.ts +8 -0
- package/dist/theme/presets/ocean.js +57 -0
- package/dist/theme/presets/ocean.js.map +1 -0
- package/dist/theme/presets/sakura.d.ts +8 -0
- package/dist/theme/presets/sakura.js +59 -0
- package/dist/theme/presets/sakura.js.map +1 -0
- package/dist/theme/type.d.ts +10 -0
- package/dist/theme/ui-theme.d.ts +21 -8
- package/dist/theme/ui-theme.js +30 -27
- package/dist/theme/ui-theme.js.map +1 -1
- package/package.json +3 -3
- package/src/_mixins.scss +1 -7
- package/src/theme/__test__/ui-theme.test.ts +84 -9
- package/src/theme/component-css-vars.ts +90 -13
- package/src/theme/index.ts +2 -0
- package/src/theme/load-theme.ts +12 -27
- package/src/theme/presets/ancient.ts +9 -2
- package/src/theme/presets/dark.ts +43 -40
- package/src/theme/presets/glass.ts +56 -67
- package/src/theme/presets/hero.ts +5 -36
- package/src/theme/presets/index.ts +7 -4
- package/src/theme/presets/midnight.ts +45 -0
- package/src/theme/presets/neon.ts +45 -0
- package/src/theme/presets/ocean.ts +40 -0
- package/src/theme/presets/sakura.ts +42 -0
- package/src/theme/type.ts +10 -0
- package/src/theme/ui-theme.ts +54 -43
- package/dist/theme/presets/shadcn.d.ts +0 -8
- package/dist/theme/presets/shadcn.js +0 -100
- package/dist/theme/presets/shadcn.js.map +0 -1
- package/src/theme/presets/shadcn.ts +0 -84
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glass.js","names":[],"sources":["../../../src/theme/presets/glass.ts"],"sourcesContent":["import { lightTheme } from './light'\n\nexport const
|
|
1
|
+
{"version":3,"file":"glass.js","names":[],"sources":["../../../src/theme/presets/glass.ts"],"sourcesContent":["import { lightTheme } from './light'\n\n/**\n * 玻璃拟态,天生适合深色(半透明背景 + 背景模糊在深色下层次最好)。\n * 背景为 rgba() 时派生 token(kbd / batch-edit 混合色)无法自动推导,\n * 需通过组件级扩展键显式声明。\n */\nexport const glassTheme = lightTheme.new(\n {\n color: {\n primary: '#3B82F6',\n success: '#10B981',\n warning: '#F59E0B',\n danger: '#EF4444',\n info: '#06B6D4',\n disabled: '#374151',\n default: '#1E293B'\n },\n bg: {\n color: {\n bottom: 'rgba(15, 23, 42, 0.6)',\n middle: 'rgba(15, 23, 42, 0.7)',\n top: 'rgba(15, 23, 42, 0.75)',\n hover: 'rgba(30, 41, 59, 0.85)',\n black: '#000000'\n },\n filter: { blur: 'blur(20px)', saturate: 'saturate(200%)' }\n },\n border: {\n color: 'rgba(255, 255, 255, 0.18)',\n mutedColor: 'rgba(255, 255, 255, 0.1)',\n width: 1,\n style: 'solid'\n },\n 'text-color': {\n title: '#F8FAFC',\n main: '#F1F5F9',\n second: '#94A3B8',\n placeholder: '#64748B',\n assist: '#64748B',\n disabled: '#475569',\n white: '#ffffff'\n },\n shadow: {\n color: '#00000059',\n x: 0,\n y: 4,\n blur: 32,\n spread: 0,\n emboss: 'none',\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.4)',\n lg: '0 8px 24px 0 rgba(0, 0, 0, 0.55), 0 2px 6px 0 rgba(0, 0, 0, 0.35)'\n },\n kbd: {\n 'inset-shadow': 'rgba(0, 0, 0, 0.5)',\n 'border-shadow': 'rgba(255, 255, 255, 0.09)',\n 'drop-shadow': 'rgba(0, 0, 0, 0.6)'\n },\n 'batch-edit': { 'form-header-bg': 'rgba(15, 23, 42, 0.8)' }\n },\n { series: 'dark' }\n)\n"],"mappings":";;;;;;;AAOA,MAAa,aAAa,WAAW,IACnC;CACE,OAAO;EACL,SAAS;EACT,SAAS;EACT,SAAS;EACT,QAAQ;EACR,MAAM;EACN,UAAU;EACV,SAAS;CACX;CACA,IAAI;EACF,OAAO;GACL,QAAQ;GACR,QAAQ;GACR,KAAK;GACL,OAAO;GACP,OAAO;EACT;EACA,QAAQ;GAAE,MAAM;GAAc,UAAU;EAAiB;CAC3D;CACA,QAAQ;EACN,OAAO;EACP,YAAY;EACZ,OAAO;EACP,OAAO;CACT;CACA,cAAc;EACZ,OAAO;EACP,MAAM;EACN,QAAQ;EACR,aAAa;EACb,QAAQ;EACR,UAAU;EACV,OAAO;CACT;CACA,QAAQ;EACN,OAAO;EACP,GAAG;EACH,GAAG;EACH,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,IAAI;EACJ,IAAI;CACN;CACA,KAAK;EACH,gBAAgB;EAChB,iBAAiB;EACjB,eAAe;CACjB;CACA,cAAc,EAAE,kBAAkB,wBAAwB;AAC5D,GACA,EAAE,QAAQ,OAAO,CACnB"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { UITheme } from "../ui-theme.js";
|
|
2
2
|
import "../index.js";
|
|
3
3
|
//#region src/theme/presets/hero.d.ts
|
|
4
|
-
|
|
5
|
-
declare const
|
|
4
|
+
/** HeroUI 风格,天生适合浅色 */
|
|
5
|
+
declare const heroTheme: UITheme;
|
|
6
6
|
//#endregion
|
|
7
|
-
export {
|
|
7
|
+
export { heroTheme };
|
|
8
8
|
//# sourceMappingURL=hero.d.ts.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { lightTheme } from "./light.js";
|
|
2
2
|
//#region src/theme/presets/hero.ts
|
|
3
|
-
|
|
3
|
+
/** HeroUI 风格,天生适合浅色 */
|
|
4
|
+
const heroTheme = lightTheme.new({
|
|
4
5
|
color: {
|
|
5
6
|
primary: "#7828c8",
|
|
6
7
|
success: "#17c964",
|
|
@@ -37,47 +38,10 @@ const heroLightTheme = lightTheme.new({
|
|
|
37
38
|
spread: 0,
|
|
38
39
|
emboss: "0 2px 4px 0 #0000000a,0 1px 2px 0 #0000000f,0 0 3px 0px #0000000f"
|
|
39
40
|
},
|
|
40
|
-
button: { "default-bg": "#ebebec" }
|
|
41
|
-
}
|
|
42
|
-
const heroDarkTheme = heroLightTheme.new({
|
|
43
|
-
color: {
|
|
44
|
-
primary: "#9353d3",
|
|
45
|
-
disabled: "#27272a",
|
|
46
|
-
default: "#27272a"
|
|
47
|
-
},
|
|
48
|
-
bg: { color: {
|
|
49
|
-
bottom: "#000000",
|
|
50
|
-
middle: "#18181b",
|
|
51
|
-
top: "#27272a",
|
|
52
|
-
hover: "#3f3f46",
|
|
53
|
-
black: "#000000"
|
|
54
|
-
} },
|
|
55
|
-
border: {
|
|
56
|
-
color: "#3f3f46",
|
|
57
|
-
mutedColor: "#3f3f46"
|
|
58
|
-
},
|
|
59
|
-
"text-color": {
|
|
60
|
-
title: "#ECEDEE",
|
|
61
|
-
main: "#ECEDEE",
|
|
62
|
-
second: "#A1A1AA",
|
|
63
|
-
placeholder: "#71717A",
|
|
64
|
-
assist: "#71717A",
|
|
65
|
-
disabled: "#71717A",
|
|
66
|
-
white: "#FFFFFF"
|
|
67
|
-
},
|
|
68
|
-
shadow: {
|
|
69
|
-
color: "#00000033",
|
|
70
|
-
x: 0,
|
|
71
|
-
y: 4,
|
|
72
|
-
blur: 14,
|
|
73
|
-
spread: 0,
|
|
74
|
-
emboss: "0 2px 4px 0 #0000000a,0 1px 2px 0 #0000000f,0 0 1px 0 #0000000f",
|
|
75
|
-
sm: "0 1px 2px 0 rgba(0, 0, 0, 0.4)",
|
|
76
|
-
lg: "0 8px 24px 0 rgba(0, 0, 0, 0.5), 0 2px 6px 0 rgba(0, 0, 0, 0.35)"
|
|
77
|
-
},
|
|
78
|
-
button: { "default-bg": "var(--u-bg-color-top)" }
|
|
41
|
+
button: { "default-bg": "#ebebec" },
|
|
42
|
+
nav: { variant: "light" }
|
|
79
43
|
});
|
|
80
44
|
//#endregion
|
|
81
|
-
export {
|
|
45
|
+
export { heroTheme };
|
|
82
46
|
|
|
83
47
|
//# sourceMappingURL=hero.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hero.js","names":[],"sources":["../../../src/theme/presets/hero.ts"],"sourcesContent":["import { lightTheme } from './light'\n\nexport const
|
|
1
|
+
{"version":3,"file":"hero.js","names":[],"sources":["../../../src/theme/presets/hero.ts"],"sourcesContent":["import { lightTheme } from './light'\n\n/** HeroUI 风格,天生适合浅色 */\nexport const heroTheme = lightTheme.new({\n color: {\n primary: '#7828c8', // purple\n success: '#17c964',\n warning: '#f5a524',\n danger: '#f31260',\n info: '#006fee',\n disabled: '#f4f4f5',\n default: '#f4f4f5'\n },\n border: { width: 2, color: '#dcdfe6', mutedColor: '#e4e4e7' },\n 'text-color': {\n title: '#11181C',\n main: '#11181C',\n second: '#71717A',\n placeholder: '#A1A1AA',\n assist: '#A1A1AA',\n disabled: '#A1A1AA',\n white: '#FFFFFF'\n },\n radius: { small: 8, default: 12, large: 14 },\n shadow: {\n color: '#00000014',\n x: 0,\n y: 4,\n blur: 14,\n spread: 0,\n emboss: '0 2px 4px 0 #0000000a,0 1px 2px 0 #0000000f,0 0 3px 0px #0000000f'\n },\n button: { 'default-bg': '#ebebec' },\n // HeroUI 风浅灰侧栏(演示浅色变体)\n nav: { variant: 'light' }\n})\n"],"mappings":";;;AAGA,MAAa,YAAY,WAAW,IAAI;CACtC,OAAO;EACL,SAAS;EACT,SAAS;EACT,SAAS;EACT,QAAQ;EACR,MAAM;EACN,UAAU;EACV,SAAS;CACX;CACA,QAAQ;EAAE,OAAO;EAAG,OAAO;EAAW,YAAY;CAAU;CAC5D,cAAc;EACZ,OAAO;EACP,MAAM;EACN,QAAQ;EACR,aAAa;EACb,QAAQ;EACR,UAAU;EACV,OAAO;CACT;CACA,QAAQ;EAAE,OAAO;EAAG,SAAS;EAAI,OAAO;CAAG;CAC3C,QAAQ;EACN,OAAO;EACP,GAAG;EACH,GAAG;EACH,MAAM;EACN,QAAQ;EACR,QAAQ;CACV;CACA,QAAQ,EAAE,cAAc,UAAU;CAElC,KAAK,EAAE,SAAS,QAAQ;AAC1B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { UITheme } from "../ui-theme.js";
|
|
2
|
+
import "../index.js";
|
|
3
|
+
//#region src/theme/presets/midnight.d.ts
|
|
4
|
+
/** 午夜(靛蓝 + 深空底,宽松间距、舒缓缓动),天生适合深色 */
|
|
5
|
+
declare const midnightTheme: UITheme;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { midnightTheme };
|
|
8
|
+
//# sourceMappingURL=midnight.d.ts.map
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { darkTheme } from "./dark.js";
|
|
2
|
+
//#region src/theme/presets/midnight.ts
|
|
3
|
+
/** 午夜(靛蓝 + 深空底,宽松间距、舒缓缓动),天生适合深色 */
|
|
4
|
+
const midnightTheme = darkTheme.new({
|
|
5
|
+
color: {
|
|
6
|
+
primary: "#6f78ee",
|
|
7
|
+
success: "#34d399",
|
|
8
|
+
warning: "#fbbf24",
|
|
9
|
+
danger: "#f87171",
|
|
10
|
+
info: "#38bdf8",
|
|
11
|
+
disabled: "#232d4a",
|
|
12
|
+
default: "#232d4a"
|
|
13
|
+
},
|
|
14
|
+
bg: { color: {
|
|
15
|
+
bottom: "#0a0f1e",
|
|
16
|
+
middle: "#101731",
|
|
17
|
+
top: "#182242",
|
|
18
|
+
hover: "#212d54"
|
|
19
|
+
} },
|
|
20
|
+
"text-color": {
|
|
21
|
+
title: "#e8ecff",
|
|
22
|
+
main: "#c3cbf0",
|
|
23
|
+
second: "#8d97c6",
|
|
24
|
+
placeholder: "#7d8ab8",
|
|
25
|
+
assist: "#5b6895",
|
|
26
|
+
disabled: "#576493"
|
|
27
|
+
},
|
|
28
|
+
border: {
|
|
29
|
+
color: "#36457a",
|
|
30
|
+
mutedColor: "#52619a"
|
|
31
|
+
},
|
|
32
|
+
gap: {
|
|
33
|
+
small: 8,
|
|
34
|
+
default: 10,
|
|
35
|
+
large: 14
|
|
36
|
+
},
|
|
37
|
+
shadow: {
|
|
38
|
+
color: "#00000080",
|
|
39
|
+
x: 0,
|
|
40
|
+
y: 2,
|
|
41
|
+
blur: 8,
|
|
42
|
+
spread: 0,
|
|
43
|
+
emboss: "none",
|
|
44
|
+
sm: "0 1px 2px 0 rgba(0, 0, 0, 0.5)",
|
|
45
|
+
lg: "0 8px 24px 0 rgba(0, 0, 0, 0.6), 0 2px 6px 0 rgba(0, 0, 0, 0.4)"
|
|
46
|
+
},
|
|
47
|
+
transition: {
|
|
48
|
+
slow: "0.4s",
|
|
49
|
+
ease: "cubic-bezier(0.33, 1, 0.68, 1)"
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
//#endregion
|
|
53
|
+
export { midnightTheme };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=midnight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midnight.js","names":[],"sources":["../../../src/theme/presets/midnight.ts"],"sourcesContent":["import { darkTheme } from './dark'\n\n/** 午夜(靛蓝 + 深空底,宽松间距、舒缓缓动),天生适合深色 */\nexport const midnightTheme = darkTheme.new({\n color: {\n primary: '#6f78ee', // 星靛(白字对比 3.75:1)\n success: '#34d399',\n warning: '#fbbf24',\n danger: '#f87171',\n info: '#38bdf8',\n disabled: '#232d4a',\n default: '#232d4a'\n },\n bg: {\n color: {\n bottom: '#0a0f1e', // 深空\n middle: '#101731',\n top: '#182242',\n hover: '#212d54'\n }\n },\n 'text-color': {\n title: '#e8ecff', // 月光\n main: '#c3cbf0',\n second: '#8d97c6',\n placeholder: '#7d8ab8',\n assist: '#5b6895',\n disabled: '#576493'\n },\n // mutedColor 与卡片底对比 2.6:1,保证输入控件清晰可见\n border: { color: '#36457a', mutedColor: '#52619a' },\n // 更宽松的间距,配合深空的呼吸感\n gap: { small: 8, default: 10, large: 14 },\n shadow: {\n color: '#00000080',\n x: 0,\n y: 2,\n blur: 8,\n spread: 0,\n emboss: 'none',\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.5)',\n lg: '0 8px 24px 0 rgba(0, 0, 0, 0.6), 0 2px 6px 0 rgba(0, 0, 0, 0.4)'\n },\n transition: { slow: '0.4s', ease: 'cubic-bezier(0.33, 1, 0.68, 1)' }\n})\n"],"mappings":";;;AAGA,MAAa,gBAAgB,UAAU,IAAI;CACzC,OAAO;EACL,SAAS;EACT,SAAS;EACT,SAAS;EACT,QAAQ;EACR,MAAM;EACN,UAAU;EACV,SAAS;CACX;CACA,IAAI,EACF,OAAO;EACL,QAAQ;EACR,QAAQ;EACR,KAAK;EACL,OAAO;CACT,EACF;CACA,cAAc;EACZ,OAAO;EACP,MAAM;EACN,QAAQ;EACR,aAAa;EACb,QAAQ;EACR,UAAU;CACZ;CAEA,QAAQ;EAAE,OAAO;EAAW,YAAY;CAAU;CAElD,KAAK;EAAE,OAAO;EAAG,SAAS;EAAI,OAAO;CAAG;CACxC,QAAQ;EACN,OAAO;EACP,GAAG;EACH,GAAG;EACH,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,IAAI;EACJ,IAAI;CACN;CACA,YAAY;EAAE,MAAM;EAAQ,MAAM;CAAiC;AACrE,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { darkTheme } from "./dark.js";
|
|
2
|
+
//#region src/theme/presets/neon.ts
|
|
3
|
+
/** 霓虹(品红 + 夜紫底 + 辉光阴影,小圆角、急速缓动),天生适合深色 */
|
|
4
|
+
const neonTheme = darkTheme.new({
|
|
5
|
+
color: {
|
|
6
|
+
primary: "#c026d3",
|
|
7
|
+
success: "#4ade80",
|
|
8
|
+
warning: "#facc15",
|
|
9
|
+
danger: "#fb7185",
|
|
10
|
+
info: "#22d3ee",
|
|
11
|
+
disabled: "#241532",
|
|
12
|
+
default: "#241532"
|
|
13
|
+
},
|
|
14
|
+
bg: { color: {
|
|
15
|
+
bottom: "#0c0612",
|
|
16
|
+
middle: "#130a1d",
|
|
17
|
+
top: "#1c102a",
|
|
18
|
+
hover: "#28163d"
|
|
19
|
+
} },
|
|
20
|
+
"text-color": {
|
|
21
|
+
title: "#f6efff",
|
|
22
|
+
main: "#d9cdee",
|
|
23
|
+
second: "#a08bc4",
|
|
24
|
+
placeholder: "#8f74b8",
|
|
25
|
+
assist: "#6b4f94",
|
|
26
|
+
disabled: "#63498a"
|
|
27
|
+
},
|
|
28
|
+
border: {
|
|
29
|
+
color: "#503480",
|
|
30
|
+
mutedColor: "#684a9e"
|
|
31
|
+
},
|
|
32
|
+
radius: {
|
|
33
|
+
small: 2,
|
|
34
|
+
default: 4,
|
|
35
|
+
large: 8
|
|
36
|
+
},
|
|
37
|
+
shadow: {
|
|
38
|
+
color: "rgba(192, 38, 211, 0.3)",
|
|
39
|
+
x: 0,
|
|
40
|
+
y: 0,
|
|
41
|
+
blur: 12,
|
|
42
|
+
spread: 0,
|
|
43
|
+
emboss: "none",
|
|
44
|
+
sm: "0 1px 2px 0 rgba(0, 0, 0, 0.5)",
|
|
45
|
+
lg: "0 0 24px 0 rgba(192, 38, 211, 0.25), 0 8px 24px 0 rgba(0, 0, 0, 0.5)"
|
|
46
|
+
},
|
|
47
|
+
transition: {
|
|
48
|
+
fast: "0.1s",
|
|
49
|
+
ease: "cubic-bezier(0.85, 0, 0.15, 1)"
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
//#endregion
|
|
53
|
+
export { neonTheme };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=neon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neon.js","names":[],"sources":["../../../src/theme/presets/neon.ts"],"sourcesContent":["import { darkTheme } from './dark'\n\n/** 霓虹(品红 + 夜紫底 + 辉光阴影,小圆角、急速缓动),天生适合深色 */\nexport const neonTheme = darkTheme.new({\n color: {\n primary: '#c026d3', // 霓红\n success: '#4ade80',\n warning: '#facc15',\n danger: '#fb7185',\n info: '#22d3ee',\n disabled: '#241532',\n default: '#241532'\n },\n bg: {\n color: {\n bottom: '#0c0612', // 夜紫\n middle: '#130a1d',\n top: '#1c102a',\n hover: '#28163d'\n }\n },\n 'text-color': {\n title: '#f6efff',\n main: '#d9cdee',\n second: '#a08bc4',\n placeholder: '#8f74b8',\n assist: '#6b4f94',\n disabled: '#63498a'\n },\n // mutedColor 与卡片底对比 2.65:1,输入控件带清晰的紫色描边\n border: { color: '#503480', mutedColor: '#684a9e' },\n // 赛博感:小圆角 + 品红辉光\n radius: { small: 2, default: 4, large: 8 },\n shadow: {\n color: 'rgba(192, 38, 211, 0.3)',\n x: 0,\n y: 0,\n blur: 12,\n spread: 0,\n emboss: 'none',\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.5)',\n lg: '0 0 24px 0 rgba(192, 38, 211, 0.25), 0 8px 24px 0 rgba(0, 0, 0, 0.5)'\n },\n transition: { fast: '0.1s', ease: 'cubic-bezier(0.85, 0, 0.15, 1)' }\n})\n"],"mappings":";;;AAGA,MAAa,YAAY,UAAU,IAAI;CACrC,OAAO;EACL,SAAS;EACT,SAAS;EACT,SAAS;EACT,QAAQ;EACR,MAAM;EACN,UAAU;EACV,SAAS;CACX;CACA,IAAI,EACF,OAAO;EACL,QAAQ;EACR,QAAQ;EACR,KAAK;EACL,OAAO;CACT,EACF;CACA,cAAc;EACZ,OAAO;EACP,MAAM;EACN,QAAQ;EACR,aAAa;EACb,QAAQ;EACR,UAAU;CACZ;CAEA,QAAQ;EAAE,OAAO;EAAW,YAAY;CAAU;CAElD,QAAQ;EAAE,OAAO;EAAG,SAAS;EAAG,OAAO;CAAE;CACzC,QAAQ;EACN,OAAO;EACP,GAAG;EACH,GAAG;EACH,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,IAAI;EACJ,IAAI;CACN;CACA,YAAY;EAAE,MAAM;EAAQ,MAAM;CAAiC;AACrE,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { mixColor } from "../helper.js";
|
|
2
|
+
import { lightTheme } from "./light.js";
|
|
3
|
+
//#region src/theme/presets/ocean.ts
|
|
4
|
+
/** 海盐(松石青 + 冷白底,利落的快缓动),天生适合浅色 */
|
|
5
|
+
const oceanTheme = lightTheme.new({
|
|
6
|
+
color: {
|
|
7
|
+
primary: "#0d9488",
|
|
8
|
+
success: "#16a34a",
|
|
9
|
+
warning: "#d97706",
|
|
10
|
+
danger: "#dc2626",
|
|
11
|
+
info: "#0284c7",
|
|
12
|
+
disabled: "#eff6f5",
|
|
13
|
+
default: "#eff6f5"
|
|
14
|
+
},
|
|
15
|
+
bg: { color: {
|
|
16
|
+
bottom: "#eef6f5",
|
|
17
|
+
middle: "#f5fafa",
|
|
18
|
+
top: "#ffffff",
|
|
19
|
+
hover: "#e0efee"
|
|
20
|
+
} },
|
|
21
|
+
"text-color": {
|
|
22
|
+
title: "#16302e",
|
|
23
|
+
main: "#2f4a48",
|
|
24
|
+
second: "#5b7875",
|
|
25
|
+
assist: "#c3d6d4",
|
|
26
|
+
placeholder: "#7fa19e",
|
|
27
|
+
disabled: "#a3bab7"
|
|
28
|
+
},
|
|
29
|
+
border: {
|
|
30
|
+
width: 1,
|
|
31
|
+
color: "#c2dedb",
|
|
32
|
+
mutedColor: "#8fbcb7"
|
|
33
|
+
},
|
|
34
|
+
radius: {
|
|
35
|
+
small: 6,
|
|
36
|
+
default: 10,
|
|
37
|
+
large: 14
|
|
38
|
+
},
|
|
39
|
+
shadow: {
|
|
40
|
+
color: "rgba(21, 94, 89, 0.12)",
|
|
41
|
+
x: 0,
|
|
42
|
+
y: 2,
|
|
43
|
+
blur: 10,
|
|
44
|
+
spread: -1,
|
|
45
|
+
sm: "0 1px 2px 0 rgba(21, 94, 89, 0.08)",
|
|
46
|
+
lg: "0 8px 24px 0 rgba(21, 94, 89, 0.12), 0 2px 6px 0 rgba(21, 94, 89, 0.06)"
|
|
47
|
+
},
|
|
48
|
+
transition: {
|
|
49
|
+
fast: "0.12s",
|
|
50
|
+
ease: "cubic-bezier(0.22, 1, 0.36, 1)"
|
|
51
|
+
},
|
|
52
|
+
nav: { "bg-color": mixColor("#16302e", "#0d9488", .25) }
|
|
53
|
+
});
|
|
54
|
+
//#endregion
|
|
55
|
+
export { oceanTheme };
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=ocean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocean.js","names":[],"sources":["../../../src/theme/presets/ocean.ts"],"sourcesContent":["import { mixColor } from '../helper'\nimport { lightTheme } from './light'\n\n/** 海盐(松石青 + 冷白底,利落的快缓动),天生适合浅色 */\nexport const oceanTheme = lightTheme.new({\n color: {\n primary: '#0d9488', // 松石青\n success: '#16a34a',\n warning: '#d97706',\n danger: '#dc2626',\n info: '#0284c7',\n disabled: '#eff6f5',\n default: '#eff6f5'\n },\n bg: { color: { bottom: '#eef6f5', middle: '#f5fafa', top: '#ffffff', hover: '#e0efee' } },\n 'text-color': {\n title: '#16302e', // 深礁\n main: '#2f4a48',\n second: '#5b7875',\n assist: '#c3d6d4',\n placeholder: '#7fa19e',\n disabled: '#a3bab7'\n },\n border: { width: 1, color: '#c2dedb', mutedColor: '#8fbcb7' },\n radius: { small: 6, default: 10, large: 14 },\n shadow: {\n color: 'rgba(21, 94, 89, 0.12)',\n x: 0,\n y: 2,\n blur: 10,\n spread: -1,\n sm: '0 1px 2px 0 rgba(21, 94, 89, 0.08)',\n lg: '0 8px 24px 0 rgba(21, 94, 89, 0.12), 0 2px 6px 0 rgba(21, 94, 89, 0.06)'\n },\n transition: { fast: '0.12s', ease: 'cubic-bezier(0.22, 1, 0.36, 1)' },\n nav: {\n // 深海礁侧栏:深礁 + 松石青调和\n 'bg-color': mixColor('#16302e', '#0d9488', 0.25)\n }\n})\n"],"mappings":";;;;AAIA,MAAa,aAAa,WAAW,IAAI;CACvC,OAAO;EACL,SAAS;EACT,SAAS;EACT,SAAS;EACT,QAAQ;EACR,MAAM;EACN,UAAU;EACV,SAAS;CACX;CACA,IAAI,EAAE,OAAO;EAAE,QAAQ;EAAW,QAAQ;EAAW,KAAK;EAAW,OAAO;CAAU,EAAE;CACxF,cAAc;EACZ,OAAO;EACP,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,aAAa;EACb,UAAU;CACZ;CACA,QAAQ;EAAE,OAAO;EAAG,OAAO;EAAW,YAAY;CAAU;CAC5D,QAAQ;EAAE,OAAO;EAAG,SAAS;EAAI,OAAO;CAAG;CAC3C,QAAQ;EACN,OAAO;EACP,GAAG;EACH,GAAG;EACH,MAAM;EACN,QAAQ;EACR,IAAI;EACJ,IAAI;CACN;CACA,YAAY;EAAE,MAAM;EAAS,MAAM;CAAiC;CACpE,KAAK,EAEH,YAAY,SAAS,WAAW,WAAW,GAAI,EACjD;AACF,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { mixColor } from "../helper.js";
|
|
2
|
+
import { lightTheme } from "./light.js";
|
|
3
|
+
//#region src/theme/presets/sakura.ts
|
|
4
|
+
/** 樱花(柔粉 + 花瓣底,大圆角、弹性缓动),天生适合浅色 */
|
|
5
|
+
const sakuraTheme = lightTheme.new({
|
|
6
|
+
color: {
|
|
7
|
+
primary: "#e64980",
|
|
8
|
+
success: "#2f9e6e",
|
|
9
|
+
warning: "#e8890c",
|
|
10
|
+
danger: "#e03131",
|
|
11
|
+
info: "#7c6cf0",
|
|
12
|
+
disabled: "#faf0f3",
|
|
13
|
+
default: "#faf0f3"
|
|
14
|
+
},
|
|
15
|
+
bg: { color: {
|
|
16
|
+
bottom: "#fdf1f5",
|
|
17
|
+
middle: "#fef6f9",
|
|
18
|
+
top: "#ffffff",
|
|
19
|
+
hover: "#fbe4ec"
|
|
20
|
+
} },
|
|
21
|
+
"text-color": {
|
|
22
|
+
title: "#43272f",
|
|
23
|
+
main: "#5f3d46",
|
|
24
|
+
second: "#92616d",
|
|
25
|
+
assist: "#dcc0c7",
|
|
26
|
+
placeholder: "#b58694",
|
|
27
|
+
disabled: "#c4a0aa"
|
|
28
|
+
},
|
|
29
|
+
border: {
|
|
30
|
+
width: 1,
|
|
31
|
+
color: "#f0c3d4",
|
|
32
|
+
mutedColor: "#e09db6"
|
|
33
|
+
},
|
|
34
|
+
radius: {
|
|
35
|
+
small: 8,
|
|
36
|
+
default: 12,
|
|
37
|
+
large: 16
|
|
38
|
+
},
|
|
39
|
+
"form-component-height": {
|
|
40
|
+
small: 26,
|
|
41
|
+
default: 34,
|
|
42
|
+
large: 42
|
|
43
|
+
},
|
|
44
|
+
shadow: {
|
|
45
|
+
color: "rgba(173, 58, 105, 0.12)",
|
|
46
|
+
x: 0,
|
|
47
|
+
y: 4,
|
|
48
|
+
blur: 14,
|
|
49
|
+
spread: -2,
|
|
50
|
+
sm: "0 1px 2px 0 rgba(173, 58, 105, 0.08)",
|
|
51
|
+
lg: "0 8px 24px 0 rgba(173, 58, 105, 0.14), 0 2px 6px 0 rgba(173, 58, 105, 0.08)"
|
|
52
|
+
},
|
|
53
|
+
transition: { easeOut: "cubic-bezier(0.34, 1.56, 0.64, 1)" },
|
|
54
|
+
nav: { "bg-color": mixColor("#43272f", "#e64980", .22) }
|
|
55
|
+
});
|
|
56
|
+
//#endregion
|
|
57
|
+
export { sakuraTheme };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=sakura.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sakura.js","names":[],"sources":["../../../src/theme/presets/sakura.ts"],"sourcesContent":["import { mixColor } from '../helper'\nimport { lightTheme } from './light'\n\n/** 樱花(柔粉 + 花瓣底,大圆角、弹性缓动),天生适合浅色 */\nexport const sakuraTheme = lightTheme.new({\n color: {\n primary: '#e64980', // 樱粉\n success: '#2f9e6e',\n warning: '#e8890c',\n danger: '#e03131',\n info: '#7c6cf0',\n disabled: '#faf0f3',\n default: '#faf0f3'\n },\n bg: { color: { bottom: '#fdf1f5', middle: '#fef6f9', top: '#ffffff', hover: '#fbe4ec' } },\n 'text-color': {\n title: '#43272f', // 樱墨\n main: '#5f3d46',\n second: '#92616d',\n assist: '#dcc0c7',\n placeholder: '#b58694',\n disabled: '#c4a0aa'\n },\n border: { width: 1, color: '#f0c3d4', mutedColor: '#e09db6' },\n radius: { small: 8, default: 12, large: 16 },\n // 更宽松的表单控件,配合大圆角的柔和感\n 'form-component-height': { small: 26, default: 34, large: 42 },\n shadow: {\n color: 'rgba(173, 58, 105, 0.12)',\n x: 0,\n y: 4,\n blur: 14,\n spread: -2,\n sm: '0 1px 2px 0 rgba(173, 58, 105, 0.08)',\n lg: '0 8px 24px 0 rgba(173, 58, 105, 0.14), 0 2px 6px 0 rgba(173, 58, 105, 0.08)'\n },\n transition: { easeOut: 'cubic-bezier(0.34, 1.56, 0.64, 1)' },\n nav: {\n // 深酒红侧栏:樱墨 + 樱粉调和\n 'bg-color': mixColor('#43272f', '#e64980', 0.22)\n }\n})\n"],"mappings":";;;;AAIA,MAAa,cAAc,WAAW,IAAI;CACxC,OAAO;EACL,SAAS;EACT,SAAS;EACT,SAAS;EACT,QAAQ;EACR,MAAM;EACN,UAAU;EACV,SAAS;CACX;CACA,IAAI,EAAE,OAAO;EAAE,QAAQ;EAAW,QAAQ;EAAW,KAAK;EAAW,OAAO;CAAU,EAAE;CACxF,cAAc;EACZ,OAAO;EACP,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,aAAa;EACb,UAAU;CACZ;CACA,QAAQ;EAAE,OAAO;EAAG,OAAO;EAAW,YAAY;CAAU;CAC5D,QAAQ;EAAE,OAAO;EAAG,SAAS;EAAI,OAAO;CAAG;CAE3C,yBAAyB;EAAE,OAAO;EAAI,SAAS;EAAI,OAAO;CAAG;CAC7D,QAAQ;EACN,OAAO;EACP,GAAG;EACH,GAAG;EACH,MAAM;EACN,QAAQ;EACR,IAAI;EACJ,IAAI;CACN;CACA,YAAY,EAAE,SAAS,oCAAoC;CAC3D,KAAK,EAEH,YAAY,SAAS,WAAW,WAAW,GAAI,EACjD;AACF,CAAC"}
|
package/dist/theme/type.d.ts
CHANGED
|
@@ -176,6 +176,16 @@ type Theme = {
|
|
|
176
176
|
'default-bg'?: string;
|
|
177
177
|
[key: string]: any;
|
|
178
178
|
};
|
|
179
|
+
/**
|
|
180
|
+
* 侧栏导航(nav / dual-nav / group-nav)组件级变量。
|
|
181
|
+
* variant 选择深/浅侧栏外观,其余键覆盖同名 `--u-nav-*` token
|
|
182
|
+
* (如 `'bg-color'` → `--u-nav-bg-color`),覆盖优先级高于 variant 内置值。
|
|
183
|
+
*/
|
|
184
|
+
nav?: {
|
|
185
|
+
/** 侧栏外观:dark 深底浅字 / light 浅底深字,默认 dark */
|
|
186
|
+
variant?: 'dark' | 'light';
|
|
187
|
+
[key: string]: any;
|
|
188
|
+
};
|
|
179
189
|
/** 折叠面板组件级变量 */
|
|
180
190
|
collapse?: {
|
|
181
191
|
/** 折叠项标题文字颜色 */
|
package/dist/theme/ui-theme.d.ts
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import { Theme } from "./type.js";
|
|
2
2
|
//#region src/theme/ui-theme.d.ts
|
|
3
3
|
type RecursivePartial<T> = { [P in keyof T]?: T[P] extends object ? RecursivePartial<T[P]> : T[P]; };
|
|
4
|
+
/** 主题系列:浅色或深色。决定组件级 token 与 html[data-theme] */
|
|
5
|
+
type ThemeSeries = 'light' | 'dark';
|
|
6
|
+
interface UIThemeOptions {
|
|
7
|
+
/** 主题变更时是否自动重渲染,默认 true */
|
|
8
|
+
reactive?: boolean;
|
|
9
|
+
/** 主题所属系列,默认 'light' */
|
|
10
|
+
series?: ThemeSeries;
|
|
11
|
+
}
|
|
4
12
|
declare class UITheme {
|
|
5
13
|
static themeID: string;
|
|
6
14
|
private static adoptedSheet;
|
|
7
15
|
readonly theme: Theme;
|
|
16
|
+
/** 主题所属系列:浅色 / 深色 */
|
|
17
|
+
series: ThemeSeries;
|
|
8
18
|
private readonly reactiveEnabled;
|
|
9
|
-
constructor(theme: Theme, options?:
|
|
10
|
-
reactive?: boolean;
|
|
11
|
-
});
|
|
12
|
-
static setTheme(mode: 'light' | 'dark' | 'auto'): void;
|
|
19
|
+
constructor(theme: Theme, options?: UIThemeOptions);
|
|
13
20
|
private renderBase;
|
|
14
21
|
private renderBorder;
|
|
15
22
|
private renderTypeColor;
|
|
@@ -23,13 +30,19 @@ declare class UITheme {
|
|
|
23
30
|
/** 主题变量声明列表,均为 `--u-` 前缀的 CSS 自定义属性 */
|
|
24
31
|
themeToDeclarationList(theme: Theme): string[];
|
|
25
32
|
private static declarationBlock;
|
|
33
|
+
/**
|
|
34
|
+
* nav 侧栏外观声明:按主题 `nav.variant`(默认 dark)取内置深/浅侧栏 token,
|
|
35
|
+
* 主题 `nav` 的其余键作为 `--u-nav-*` 覆盖追加在最后(同规则后者生效)。
|
|
36
|
+
*/
|
|
37
|
+
navSidebarDecls(theme: Theme): string[];
|
|
26
38
|
private static removeExistingStyleTag;
|
|
27
39
|
private static applyGlobalCSS;
|
|
28
|
-
/**
|
|
29
|
-
static injectBuiltInThemes(light: UITheme, dark: UITheme): void;
|
|
40
|
+
/** 注入主题:全局 token + 与主题系列匹配的组件级 token + nav 侧栏外观,并写入 html[data-theme] */
|
|
30
41
|
render(): void;
|
|
31
|
-
new(customTheme?: RecursivePartial<Theme
|
|
42
|
+
new(customTheme?: RecursivePartial<Theme>, options?: {
|
|
43
|
+
series?: ThemeSeries;
|
|
44
|
+
}): UITheme;
|
|
32
45
|
}
|
|
33
46
|
//#endregion
|
|
34
|
-
export { UITheme };
|
|
47
|
+
export { ThemeSeries, UITheme, UIThemeOptions };
|
|
35
48
|
//# sourceMappingURL=ui-theme.d.ts.map
|
package/dist/theme/ui-theme.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { componentCssVarsDarkDecls, componentCssVarsLightDecls } from "./component-css-vars.js";
|
|
1
|
+
import { componentCssVarsDarkDecls, componentCssVarsLightDecls, resolveNavSidebarDecls } from "./component-css-vars.js";
|
|
2
2
|
import { hexRgbOnly, hexWithAlpha, isHexColor, mixColor } from "./helper.js";
|
|
3
3
|
import { isObj, str } from "@cat-kit/core";
|
|
4
4
|
import { withUnit } from "@veltra/utils";
|
|
@@ -8,20 +8,18 @@ var UITheme = class UITheme {
|
|
|
8
8
|
static themeID = "ultra-ui-theme";
|
|
9
9
|
static adoptedSheet = null;
|
|
10
10
|
theme;
|
|
11
|
+
/** 主题所属系列:浅色 / 深色 */
|
|
12
|
+
series;
|
|
11
13
|
reactiveEnabled;
|
|
12
14
|
constructor(theme, options) {
|
|
13
15
|
this.reactiveEnabled = options?.reactive !== false;
|
|
16
|
+
this.series = options?.series ?? "light";
|
|
14
17
|
this.theme = reactive(theme);
|
|
15
18
|
if (this.reactiveEnabled) watch(this.theme, () => this.render(), { deep: true });
|
|
16
19
|
}
|
|
17
|
-
static setTheme(mode) {
|
|
18
|
-
if (typeof document === "undefined") return;
|
|
19
|
-
const el = document.documentElement;
|
|
20
|
-
if (mode === "auto") delete el.dataset.theme;
|
|
21
|
-
else el.dataset.theme = mode;
|
|
22
|
-
}
|
|
23
20
|
renderBase(theme, themeRules = [], parentKey = "--u") {
|
|
24
21
|
Object.keys(theme).forEach((key) => {
|
|
22
|
+
if (parentKey === "--u" && key === "nav") return;
|
|
25
23
|
const value = theme[key];
|
|
26
24
|
const varKey = `${parentKey.startsWith("-") ? parentKey : str(parentKey).kebabCase()}-${str(key).kebabCase()}`;
|
|
27
25
|
if (typeof value === "object" && value !== null && !Array.isArray(value)) this.renderBase(value, themeRules, varKey);
|
|
@@ -160,6 +158,17 @@ var UITheme = class UITheme {
|
|
|
160
158
|
static declarationBlock(decls) {
|
|
161
159
|
return decls.join(";");
|
|
162
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* nav 侧栏外观声明:按主题 `nav.variant`(默认 dark)取内置深/浅侧栏 token,
|
|
163
|
+
* 主题 `nav` 的其余键作为 `--u-nav-*` 覆盖追加在最后(同规则后者生效)。
|
|
164
|
+
*/
|
|
165
|
+
navSidebarDecls(theme) {
|
|
166
|
+
const nav = theme.nav ?? {};
|
|
167
|
+
const variant = nav.variant === "light" ? "light" : "dark";
|
|
168
|
+
const decls = resolveNavSidebarDecls(this.series, variant);
|
|
169
|
+
const overrides = Object.keys(nav).filter((key) => key !== "variant" && typeof nav[key] === "string" && nav[key]).map((key) => `--u-nav-${str(key).kebabCase()}: ${nav[key]}`);
|
|
170
|
+
return [...decls, ...overrides];
|
|
171
|
+
}
|
|
163
172
|
static removeExistingStyleTag(doc) {
|
|
164
173
|
const el = doc.getElementById(UITheme.themeID);
|
|
165
174
|
if (el?.parentNode) el.parentNode.removeChild(el);
|
|
@@ -185,29 +194,20 @@ var UITheme = class UITheme {
|
|
|
185
194
|
style.textContent = css;
|
|
186
195
|
}
|
|
187
196
|
}
|
|
188
|
-
/**
|
|
189
|
-
static injectBuiltInThemes(light, dark) {
|
|
190
|
-
const lightDecls = [...light.themeToDeclarationList(toRaw(light.theme)), ...componentCssVarsLightDecls];
|
|
191
|
-
const darkDecls = [...dark.themeToDeclarationList(toRaw(dark.theme)), ...componentCssVarsDarkDecls];
|
|
192
|
-
const lightBlock = UITheme.declarationBlock(lightDecls);
|
|
193
|
-
const darkBlock = UITheme.declarationBlock(darkDecls);
|
|
194
|
-
const css = [
|
|
195
|
-
`html { ${lightBlock} }`,
|
|
196
|
-
`@media (prefers-color-scheme: dark) {`,
|
|
197
|
-
` html:not([data-theme="light"]) { ${darkBlock} }`,
|
|
198
|
-
`}`,
|
|
199
|
-
`html[data-theme="light"] { ${lightBlock} }`,
|
|
200
|
-
`html[data-theme="dark"] { ${darkBlock} }`
|
|
201
|
-
].join("\n");
|
|
202
|
-
UITheme.applyGlobalCSS(css);
|
|
203
|
-
}
|
|
197
|
+
/** 注入主题:全局 token + 与主题系列匹配的组件级 token + nav 侧栏外观,并写入 html[data-theme] */
|
|
204
198
|
render() {
|
|
205
|
-
const componentDecls =
|
|
206
|
-
const
|
|
199
|
+
const componentDecls = this.series === "dark" ? componentCssVarsDarkDecls : componentCssVarsLightDecls;
|
|
200
|
+
const raw = toRaw(this.theme);
|
|
201
|
+
const decls = [
|
|
202
|
+
...this.themeToDeclarationList(raw),
|
|
203
|
+
...componentDecls,
|
|
204
|
+
...this.navSidebarDecls(raw)
|
|
205
|
+
];
|
|
207
206
|
const css = `html { ${UITheme.declarationBlock(decls)} }`;
|
|
208
207
|
UITheme.applyGlobalCSS(css);
|
|
208
|
+
if (typeof document !== "undefined") document.documentElement.dataset.theme = this.series;
|
|
209
209
|
}
|
|
210
|
-
new(customTheme = {}) {
|
|
210
|
+
new(customTheme = {}, options) {
|
|
211
211
|
function delEmpty(obj) {
|
|
212
212
|
Object.keys(obj).forEach((key) => {
|
|
213
213
|
const value = obj[key];
|
|
@@ -228,7 +228,10 @@ var UITheme = class UITheme {
|
|
|
228
228
|
});
|
|
229
229
|
}
|
|
230
230
|
deepMerge(base, customTheme);
|
|
231
|
-
return new UITheme(base, {
|
|
231
|
+
return new UITheme(base, {
|
|
232
|
+
reactive: this.reactiveEnabled,
|
|
233
|
+
series: options?.series ?? this.series
|
|
234
|
+
});
|
|
232
235
|
}
|
|
233
236
|
};
|
|
234
237
|
//#endregion
|