@lynn123411/dsh-maple-theme 0.1.0 → 0.3.0

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.
@@ -1,78 +0,0 @@
1
- /**
2
- * Maple 两套调色板的令牌表:`--dsw-*` 名字 → 浅色 / 深色各一个值。
3
- *
4
- * 值里允许出现 `var(--maple-hue-light, 35)` 这类引用:宿主把这份表写到 `body` 的
5
- * 行内样式上,色相变量写在 `<html>` 上,行内样式按继承链解析得到,所以整套色板
6
- * 仍然由一个数字转动,而令牌本身走宿主的主题通道(不是另立一份全局主题)。
7
- *
8
- * 与 Maple 原版的偏差都在 `DETAILS.md`「与 Maple 原版的偏差」里写明;
9
- * 对比度由 scripts/test-tokens.mjs 读这份表自己算。
10
- */
11
- /** 一条令牌在浅色与深色下各一个值;与宿主 `ThemeTokenOverrides` 的结构一致。 */
12
- export type ThemeTokenOverrides = Record<string, { light: string; dark: string }>;
13
-
14
- /** 本插件在主题通道里的来源名,与包名一致,便于在宿主里认出是谁改的。 */
15
- export const THEME_SOURCE = '@lynn123411/dsh-maple-theme';
16
-
17
- /**
18
- * 两套色板。浅色取 Maple 的暖白(基础色相 35°)、深色取冷灰(207°)。
19
- * 令牌名与宿主 `design-platform.css` 一致,换的是值,不是名字。
20
- */
21
- export const MAPLE_TOKENS = {
22
- '--dsw-alias-bg-base': { light: 'hsl(var(--maple-hue-light, 35) 12% 97%)', dark: 'hsl(var(--maple-hue-dark, 207) 6% 11%)' },
23
- '--dsw-alias-bg-layer-1': { light: 'hsl(var(--maple-hue-light, 35) 10% 95%)', dark: 'hsl(var(--maple-hue-dark, 207) 10% 13%)' },
24
- '--dsw-alias-bg-layer-2': { light: 'hsl(calc(var(--maple-hue-light, 35) - 18) 8% 93%)', dark: 'hsl(calc(var(--maple-hue-dark, 207) - 8) 6% 12%)' },
25
- '--dsw-alias-bg-overlay': { light: 'hsl(var(--maple-hue-light, 35) 10% 94%)', dark: 'hsl(var(--maple-hue-dark, 207) 8% 14%)' },
26
- '--dsw-alias-bg-module-platform': { light: 'hsl(var(--maple-hue-light, 35) 13.2% 90.6%)', dark: 'hsl(var(--maple-hue-dark, 207) 12% 12.4%)' },
27
- '--dsw-alias-label-primary': { light: 'hsl(var(--maple-hue-light, 35) 10% 18%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88%)' },
28
- '--dsw-alias-label-secondary': { light: 'hsl(var(--maple-hue-light, 35) 8% 35%)', dark: 'hsl(var(--maple-hue-dark, 207) 16% 72%)' },
29
- '--dsw-alias-label-tertiary': { light: 'hsl(var(--maple-hue-light, 35) 7% 42%)', dark: 'hsl(var(--maple-hue-dark, 207) 12% 58%)' },
30
- '--dsw-alias-label-caption': { light: 'hsl(var(--maple-hue-light, 35) 6% 50%)', dark: 'hsl(var(--maple-hue-dark, 207) 10% 46%)' },
31
- '--dsw-alias-label-dimmed': { light: 'hsl(var(--maple-hue-light, 35) 8% 82%)', dark: 'hsl(var(--maple-hue-dark, 207) 8% 26%)' },
32
- '--dsw-alias-label-primary-dimmed': { light: 'hsl(var(--maple-hue-light, 35) 9% 27%)', dark: 'hsl(var(--maple-hue-dark, 207) 18% 80%)' },
33
- '--dsw-alias-label-primary-bluish': { light: 'hsl(var(--maple-hue-light, 35) 26% 38%)', dark: 'hsl(var(--maple-hue-dark, 207) 26% 72%)' },
34
- '--dsw-alias-label-primary-foreground': { light: 'hsl(var(--maple-hue-light, 35) 40% 96%)', dark: 'hsl(var(--maple-hue-dark, 207) 10% 9%)' },
35
- '--dsw-alias-label-primary-inverted': { light: 'hsl(var(--maple-hue-light, 35) 40% 96%)', dark: 'hsl(var(--maple-hue-dark, 207) 10% 13%)' },
36
- '--dsw-alias-label-shimmer': { light: 'hsl(var(--maple-hue-light, 35) 10% 18% / 30%)', dark: 'hsl(0 0% 100% / 45%)' },
37
- '--dsw-alias-link': { light: 'hsl(162 76% 29%)', dark: 'hsl(178 30% 62%)' },
38
- '--dsw-alias-brand-primary': { light: 'hsl(var(--maple-hue-light, 35) 26% 38%)', dark: 'hsl(var(--maple-hue-dark, 207) 26% 72%)' },
39
- '--dsw-alias-brand-text': { light: 'hsl(var(--maple-hue-light, 35) 10% 18%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88%)' },
40
- '--dsw-alias-state-business-primary': { light: 'hsl(var(--maple-hue-light, 35) 26% 38%)', dark: 'hsl(var(--maple-hue-dark, 207) 26% 72%)' },
41
- '--dsw-alias-state-business-tertiary': { light: 'hsl(var(--maple-hue-light, 35) 40% 88%)', dark: 'hsl(var(--maple-hue-dark, 207) 18% 22%)' },
42
- '--dsw-alias-state-error-primary': { light: 'hsl(0 45% 48%)', dark: 'hsl(0 44% 68%)' },
43
- '--dsw-alias-state-warn-primary': { light: 'hsl(32 70% 37%)', dark: 'hsl(20 40% 68%)' },
44
- '--dsw-alias-state-success-primary': { light: 'hsl(95 75% 29%)', dark: 'hsl(130 32% 68%)' },
45
- '--dsw-alias-border-l1': { light: 'hsl(var(--maple-hue-light, 35) 26% 38% / 10%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88% / 7%)' },
46
- '--dsw-alias-border-l2': { light: 'hsl(var(--maple-hue-light, 35) 26% 38% / 16%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88% / 13%)' },
47
- '--dsw-alias-border-l3': { light: 'hsl(var(--maple-hue-light, 35) 26% 38% / 20%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88% / 17%)' },
48
- '--dsw-alias-border-l4': { light: 'hsl(var(--maple-hue-light, 35) 26% 38% / 26%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88% / 22%)' },
49
- '--dsw-alias-separator-primary': { light: 'hsl(var(--maple-hue-light, 35) 26% 38% / 16%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88% / 13%)' },
50
- '--dsw-alias-interactive-bg-hover': { light: 'hsl(var(--maple-hue-light, 35) 26% 38% / 7%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88% / 8%)' },
51
- '--dsw-alias-interactive-bg-active': { light: 'hsl(var(--maple-hue-light, 35) 26% 38% / 12%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88% / 14%)' },
52
- '--dsw-alias-interactive-bg-hover-solid': { light: 'hsl(var(--maple-hue-light, 35) 12% 93%)', dark: 'hsl(var(--maple-hue-dark, 207) 14% 16%)' },
53
- '--dsw-alias-button-info-fill': { light: 'hsl(162 62% 30%)', dark: 'hsl(178 34% 34%)' },
54
- '--dsw-alias-button-info-hover': { light: 'hsl(162 62% 24%)', dark: 'hsl(178 34% 42%)' },
55
- '--dsw-alias-brand-primary-new-colorprimary-new-color': { light: 'hsl(var(--maple-hue-light, 35) 30% 42%)', dark: 'hsl(var(--maple-hue-dark, 207) 30% 66%)' },
56
- '--dsw-alias-button-primary-fill': { light: 'hsl(var(--maple-hue-light, 35) 30% 42%)', dark: 'hsl(var(--maple-hue-dark, 207) 30% 66%)' },
57
- '--dsw-alias-button-primary-hover': { light: 'hsl(var(--maple-hue-light, 35) 32% 34%)', dark: 'hsl(var(--maple-hue-dark, 207) 32% 76%)' },
58
- '--dsw-alias-button-floating-fill': { light: 'hsl(var(--maple-hue-light, 35) 14% 98.5%)', dark: 'hsl(var(--maple-hue-dark, 207) 8% 15%)' },
59
- '--dsw-alias-button-floating-hover': { light: 'hsl(var(--maple-hue-light, 35) 10% 95%)', dark: 'hsl(var(--maple-hue-dark, 207) 14% 19%)' },
60
- '--dsw-alias-markdown-code-block': { light: 'hsl(var(--maple-hue-light, 35) 10% 95%)', dark: 'hsl(var(--maple-hue-dark, 207) 10% 13%)' },
61
- '--dsw-alias-markdown-code-block-banner': { light: 'hsl(var(--maple-hue-light, 35) 13.2% 90.6%)', dark: 'hsl(var(--maple-hue-dark, 207) 8% 15%)' },
62
- '--dsw-alias-markdown-inline-code': { light: 'hsl(var(--maple-hue-light, 35) 14% 94%)', dark: 'hsl(var(--maple-hue-dark, 207) 8% 15%)' },
63
- '--dsw-alias-markdown-tag': { light: 'hsl(var(--maple-hue-light, 35) 40% 88%)', dark: 'hsl(var(--maple-hue-dark, 207) 14% 20%)' },
64
- '--dsw-alias-markdown-citation': { light: 'hsl(var(--maple-hue-light, 35) 10% 94%)', dark: 'hsl(var(--maple-hue-dark, 207) 8% 14%)' },
65
- '--dsw-alias-scrollbar-bg-l1': { light: 'hsl(var(--maple-hue-light, 35) 14% 84%)', dark: 'hsl(var(--maple-hue-dark, 207) 10% 25%)' },
66
- '--dsw-alias-scrollbar-bg-l2': { light: 'hsl(var(--maple-hue-light, 35) 20% 78%)', dark: 'hsl(var(--maple-hue-dark, 207) 12% 32%)' },
67
- '--dsw-alias-scrollbar-hover-l2': { light: 'hsl(var(--maple-hue-light, 35) 18% 71%)', dark: 'hsl(var(--maple-hue-dark, 207) 10% 39%)' },
68
- '--dsw-alias-menu-icon': { light: 'hsl(var(--maple-hue-light, 35) 8% 35%)', dark: 'hsl(var(--maple-hue-dark, 207) 18% 80%)' },
69
- '--dsw-specific-sidebar-fill': { light: 'hsl(calc(var(--maple-hue-light, 35) - 18) 8% 93%)', dark: 'hsl(calc(var(--maple-hue-dark, 207) - 8) 6% 12%)' },
70
- '--dsw-specific-sidebar-nav-item-active': { light: 'hsl(var(--maple-hue-light, 35) 26% 88%)', dark: 'hsl(var(--maple-hue-dark, 207) 14% 19%)' },
71
- '--dsw-specific-sidebar-nav-item-hover': { light: 'hsl(var(--maple-hue-light, 35) 26% 38% / 8%)', dark: 'hsl(var(--maple-hue-dark, 207) 24% 88% / 8%)' },
72
- '--dsw-specific-sidebar-nav-item-active-accent': { light: 'hsl(var(--maple-hue-light, 35) 40% 84%)', dark: 'hsl(var(--maple-hue-dark, 207) 18% 24%)' },
73
- '--dsw-specific-tip': { light: 'hsl(var(--maple-hue-light, 35) 18% 90%)', dark: 'hsl(var(--maple-hue-dark, 207) 12% 18%)' },
74
- '--dsw-specific-bubble': { light: 'hsl(var(--maple-hue-light, 35) 24% 93%)', dark: 'hsl(var(--maple-hue-dark, 207) 14% 19%)' },
75
- '--dsw-specific-bubble-highlight': { light: 'hsl(var(--maple-hue-light, 35) 30% 87%)', dark: 'hsl(var(--maple-hue-dark, 207) 16% 24%)' },
76
- '--dsw-specific-input-major': { light: 'hsl(var(--maple-hue-light, 35) 14% 98.5%)', dark: 'hsl(var(--maple-hue-dark, 207) 8% 15%)' },
77
- '--dsw-specific-selector': { light: 'hsl(var(--maple-hue-light, 35) 14% 94%)', dark: 'hsl(var(--maple-hue-dark, 207) 14% 19%)' },
78
- } satisfies ThemeTokenOverrides;
package/src/index.ts DELETED
@@ -1,69 +0,0 @@
1
- import z from '@deepseek-ai/schemastery';
2
-
3
- /**
4
- * `@lynn123411/dsh-maple-theme` —— 把 Maple 的配色与聊天正文排版带进 DSH。
5
- *
6
- * 宿主半边只声明这份配置的形状:界面全部由浏览器半边画(注入样式表 + 插件页上的配置卡片),
7
- * 这里不碰任何界面,也不注册工具。配置项落进本插件那一行的 config,浏览器半边经
8
- * `ctx.configForms.get('dsh-maple-theme')` 读写同一份值。
9
- *
10
- * 每个字段都标 `volatile()`:改一个开关不该重挂整条 loader entry,浏览器半边收到通知后
11
- * 自己改 <html> 上的属性与变量,样式表不重建。
12
- */
13
- export const name = 'dsh-maple-theme';
14
-
15
- /** 只需要 settings 服务:它承载这一行的配置,也是「不自动生成设置页」那条策略的入口。 */
16
- export const inject = ['settings'];
17
-
18
- /** 标题配色的三种取材方式。 */
19
- export const HEADING_MODES = ['colorful', 'accent', 'text'] as const;
20
-
21
- /** 标题配色:六色依次换 / 全用强调色 / 全用正文色。 */
22
- export type HeadingMode = typeof HEADING_MODES[number];
23
-
24
- /** 本插件在 profile 里的 loader 行 id,同时是设置的命名空间。 */
25
- export const SETTINGS_NAMESPACE = name;
26
-
27
- /**
28
- * 配置的形状与默认值。色相取 Maple 自己的出厂值(浅色 35、深色 207)。
29
- * 行高与段落间距比 Maple 的 1.8 / 8px 松一档:对话正文的行宽比笔记窄,
30
- * 按笔记的行距排会显得稀,所以这里收紧行距、放大段距。
31
- */
32
- export const Config = z.object({
33
- /** 浅色基础色相(度):整套浅色从它推导。 */
34
- hueLight: z.number().step(1).min(0).max(360).default(35).volatile(),
35
- /** 深色基础色相(度)。 */
36
- hueDark: z.number().step(1).min(0).max(360).default(207).volatile(),
37
- /** 正文行高倍数(Maple 的出厂值是 1.8,对话正文取 1.75)。 */
38
- lineHeight: z.number().step(0.05).min(1.4).max(2).default(1.75).volatile(),
39
- /** 段落间距(px;Maple 的出厂值是 8,对话正文取 10)。 */
40
- paragraphGap: z.number().step(1).min(4).max(24).default(10).volatile(),
41
- /** 标题配色方式。 */
42
- headingColor: z.union([...HEADING_MODES]).default('colorful').volatile(),
43
- /** 悬停时在标题左侧显示 H1…H6 等级标记。 */
44
- headingIndicator: z.boolean().default(true).volatile(),
45
- /** 代码块使用 Maple 的语法配色。 */
46
- codePalette: z.boolean().default(true).volatile(),
47
- /** 外壳装饰:侧栏与标签条的圆角、输入卡填充、去掉会话头部那条分隔线。 */
48
- shellSkin: z.boolean().default(true).volatile(),
49
- });
50
-
51
- /** 宿主上下文里本插件用到的那两个成员。 */
52
- interface HostContext {
53
- fiber: unknown;
54
- settings: {
55
- /** 登记这一行在设置页上的自动生成策略;`auto: false` 表示不生成。 */
56
- configure(presentation: { auto?: boolean }, owner?: unknown): () => void;
57
- };
58
- }
59
-
60
- /**
61
- * 插件本体:声明本行的设置页策略。
62
- *
63
- * 配置界面在宿主「插件」页上(浏览器半边注册 `plugins.bundle.config`),
64
- * 所以这里要显式关掉内核按 Config schema 自动生成的设置页,否则同一批字段会出现两次。
65
- * @param ctx - 宿主插件上下文。
66
- */
67
- export function apply(ctx: HostContext): void {
68
- ctx.settings.configure({ auto: false }, ctx.fiber);
69
- }