@deernova/style 0.0.0-stage → 0.1.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.
Files changed (171) hide show
  1. package/README.md +15 -2
  2. package/bin/cli.mjs +32 -0
  3. package/package.json +18 -4
  4. package/skill/SKILL.md +36 -0
  5. package/skill/assets/design/README.md +170 -0
  6. package/skill/assets/design/components/Banner/README.md +33 -0
  7. package/skill/assets/design/components/Banner/preview.html +26 -0
  8. package/skill/assets/design/components/Button/README.md +59 -0
  9. package/skill/assets/design/components/Button/preview.html +27 -0
  10. package/skill/assets/design/components/Card/README.md +31 -0
  11. package/skill/assets/design/components/Card/preview.html +24 -0
  12. package/skill/assets/design/components/CodeBlock/README.md +34 -0
  13. package/skill/assets/design/components/CodeBlock/preview.html +16 -0
  14. package/skill/assets/design/components/Composer/README.md +42 -0
  15. package/skill/assets/design/components/Composer/preview.html +28 -0
  16. package/skill/assets/design/components/Cover/preview.html +53 -0
  17. package/skill/assets/design/components/EmptyState/README.md +28 -0
  18. package/skill/assets/design/components/EmptyState/preview.html +16 -0
  19. package/skill/assets/design/components/GlassControls/README.md +43 -0
  20. package/skill/assets/design/components/GlassControls/preview.html +40 -0
  21. package/skill/assets/design/components/ListGroup/README.md +39 -0
  22. package/skill/assets/design/components/ListGroup/preview.html +22 -0
  23. package/skill/assets/design/components/MacWindow/README.md +27 -0
  24. package/skill/assets/design/components/MacWindow/preview.html +70 -0
  25. package/skill/assets/design/components/Message/README.md +31 -0
  26. package/skill/assets/design/components/Message/preview.html +21 -0
  27. package/skill/assets/design/components/PhoneScreen/README.md +25 -0
  28. package/skill/assets/design/components/PhoneScreen/preview.html +74 -0
  29. package/skill/assets/design/components/Segmented/README.md +21 -0
  30. package/skill/assets/design/components/Segmented/preview.html +21 -0
  31. package/skill/assets/design/components/Sheet/README.md +29 -0
  32. package/skill/assets/design/components/Sheet/preview.html +31 -0
  33. package/skill/assets/design/components/Sidebar/README.md +36 -0
  34. package/skill/assets/design/components/Sidebar/preview.html +20 -0
  35. package/skill/assets/design/components/StepRow/README.md +35 -0
  36. package/skill/assets/design/components/StepRow/preview.html +17 -0
  37. package/skill/assets/design/components/Tag/README.md +36 -0
  38. package/skill/assets/design/components/Tag/preview.html +22 -0
  39. package/skill/assets/design/components/TextField/README.md +29 -0
  40. package/skill/assets/design/components/TextField/preview.html +28 -0
  41. package/skill/assets/design/components/bundle.css +189 -0
  42. package/skill/assets/design/design-system.json +25 -0
  43. package/skill/assets/design/images/Banner-dark.png +0 -0
  44. package/skill/assets/design/images/Banner-light.png +0 -0
  45. package/skill/assets/design/images/Button-dark.png +0 -0
  46. package/skill/assets/design/images/Button-light.png +0 -0
  47. package/skill/assets/design/images/Card-dark.png +0 -0
  48. package/skill/assets/design/images/Card-light.png +0 -0
  49. package/skill/assets/design/images/CodeBlock-dark.png +0 -0
  50. package/skill/assets/design/images/CodeBlock-light.png +0 -0
  51. package/skill/assets/design/images/Composer-dark.png +0 -0
  52. package/skill/assets/design/images/Composer-light.png +0 -0
  53. package/skill/assets/design/images/Cover-dark.png +0 -0
  54. package/skill/assets/design/images/Cover-light.png +0 -0
  55. package/skill/assets/design/images/EmptyState-dark.png +0 -0
  56. package/skill/assets/design/images/EmptyState-light.png +0 -0
  57. package/skill/assets/design/images/Example-iOSButtonsInPhone-dark.png +0 -0
  58. package/skill/assets/design/images/Example-iOSButtonsInPhone-light.png +0 -0
  59. package/skill/assets/design/images/GlassControls-dark.png +0 -0
  60. package/skill/assets/design/images/GlassControls-light.png +0 -0
  61. package/skill/assets/design/images/ListGroup-dark.png +0 -0
  62. package/skill/assets/design/images/ListGroup-light.png +0 -0
  63. package/skill/assets/design/images/MacWindow-dark.png +0 -0
  64. package/skill/assets/design/images/MacWindow-light.png +0 -0
  65. package/skill/assets/design/images/Message-dark.png +0 -0
  66. package/skill/assets/design/images/Message-light.png +0 -0
  67. package/skill/assets/design/images/PhoneScreen-dark.png +0 -0
  68. package/skill/assets/design/images/PhoneScreen-light.png +0 -0
  69. package/skill/assets/design/images/Segmented-dark.png +0 -0
  70. package/skill/assets/design/images/Segmented-light.png +0 -0
  71. package/skill/assets/design/images/Sheet-dark.png +0 -0
  72. package/skill/assets/design/images/Sheet-light.png +0 -0
  73. package/skill/assets/design/images/Sidebar-dark.png +0 -0
  74. package/skill/assets/design/images/Sidebar-light.png +0 -0
  75. package/skill/assets/design/images/StepRow-dark.png +0 -0
  76. package/skill/assets/design/images/StepRow-light.png +0 -0
  77. package/skill/assets/design/images/Tag-dark.png +0 -0
  78. package/skill/assets/design/images/Tag-light.png +0 -0
  79. package/skill/assets/design/images/TextField-dark.png +0 -0
  80. package/skill/assets/design/images/TextField-light.png +0 -0
  81. package/skill/assets/design/tokens.css +187 -0
  82. package/skill/assets/design/tokens.json +142 -0
  83. package/skill/manifest.json +24 -0
  84. package/skill/references/components.md +648 -0
  85. package/skill/references/foundations.md +170 -0
  86. package/skill/references/native.md +7 -0
  87. package/skill/references/review.md +13 -0
  88. package/skill/references/tokens.md +74 -0
  89. package/skill/references/web.md +11 -0
  90. package/template/app.js +7 -0
  91. package/template/index.html +1290 -0
  92. package/template/manifest.json +24 -0
  93. package/template/project/README.md +170 -0
  94. package/template/project/components/Banner/README.md +33 -0
  95. package/template/project/components/Banner/preview.html +26 -0
  96. package/template/project/components/Button/README.md +59 -0
  97. package/template/project/components/Button/preview.html +27 -0
  98. package/template/project/components/Card/README.md +31 -0
  99. package/template/project/components/Card/preview.html +24 -0
  100. package/template/project/components/CodeBlock/README.md +34 -0
  101. package/template/project/components/CodeBlock/preview.html +16 -0
  102. package/template/project/components/Composer/README.md +42 -0
  103. package/template/project/components/Composer/preview.html +28 -0
  104. package/template/project/components/Cover/preview.html +53 -0
  105. package/template/project/components/EmptyState/README.md +28 -0
  106. package/template/project/components/EmptyState/preview.html +16 -0
  107. package/template/project/components/GlassControls/README.md +43 -0
  108. package/template/project/components/GlassControls/preview.html +40 -0
  109. package/template/project/components/ListGroup/README.md +39 -0
  110. package/template/project/components/ListGroup/preview.html +22 -0
  111. package/template/project/components/MacWindow/README.md +27 -0
  112. package/template/project/components/MacWindow/preview.html +70 -0
  113. package/template/project/components/Message/README.md +31 -0
  114. package/template/project/components/Message/preview.html +21 -0
  115. package/template/project/components/PhoneScreen/README.md +25 -0
  116. package/template/project/components/PhoneScreen/preview.html +74 -0
  117. package/template/project/components/Segmented/README.md +21 -0
  118. package/template/project/components/Segmented/preview.html +21 -0
  119. package/template/project/components/Sheet/README.md +29 -0
  120. package/template/project/components/Sheet/preview.html +31 -0
  121. package/template/project/components/Sidebar/README.md +36 -0
  122. package/template/project/components/Sidebar/preview.html +20 -0
  123. package/template/project/components/StepRow/README.md +35 -0
  124. package/template/project/components/StepRow/preview.html +17 -0
  125. package/template/project/components/Tag/README.md +36 -0
  126. package/template/project/components/Tag/preview.html +22 -0
  127. package/template/project/components/TextField/README.md +29 -0
  128. package/template/project/components/TextField/preview.html +28 -0
  129. package/template/project/components/bundle.css +189 -0
  130. package/template/project/design-system.json +25 -0
  131. package/template/project/images/Banner-dark.png +0 -0
  132. package/template/project/images/Banner-light.png +0 -0
  133. package/template/project/images/Button-dark.png +0 -0
  134. package/template/project/images/Button-light.png +0 -0
  135. package/template/project/images/Card-dark.png +0 -0
  136. package/template/project/images/Card-light.png +0 -0
  137. package/template/project/images/CodeBlock-dark.png +0 -0
  138. package/template/project/images/CodeBlock-light.png +0 -0
  139. package/template/project/images/Composer-dark.png +0 -0
  140. package/template/project/images/Composer-light.png +0 -0
  141. package/template/project/images/Cover-dark.png +0 -0
  142. package/template/project/images/Cover-light.png +0 -0
  143. package/template/project/images/EmptyState-dark.png +0 -0
  144. package/template/project/images/EmptyState-light.png +0 -0
  145. package/template/project/images/Example-iOSButtonsInPhone-dark.png +0 -0
  146. package/template/project/images/Example-iOSButtonsInPhone-light.png +0 -0
  147. package/template/project/images/GlassControls-dark.png +0 -0
  148. package/template/project/images/GlassControls-light.png +0 -0
  149. package/template/project/images/ListGroup-dark.png +0 -0
  150. package/template/project/images/ListGroup-light.png +0 -0
  151. package/template/project/images/MacWindow-dark.png +0 -0
  152. package/template/project/images/MacWindow-light.png +0 -0
  153. package/template/project/images/Message-dark.png +0 -0
  154. package/template/project/images/Message-light.png +0 -0
  155. package/template/project/images/PhoneScreen-dark.png +0 -0
  156. package/template/project/images/PhoneScreen-light.png +0 -0
  157. package/template/project/images/Segmented-dark.png +0 -0
  158. package/template/project/images/Segmented-light.png +0 -0
  159. package/template/project/images/Sheet-dark.png +0 -0
  160. package/template/project/images/Sheet-light.png +0 -0
  161. package/template/project/images/Sidebar-dark.png +0 -0
  162. package/template/project/images/Sidebar-light.png +0 -0
  163. package/template/project/images/StepRow-dark.png +0 -0
  164. package/template/project/images/StepRow-light.png +0 -0
  165. package/template/project/images/Tag-dark.png +0 -0
  166. package/template/project/images/Tag-light.png +0 -0
  167. package/template/project/images/TextField-dark.png +0 -0
  168. package/template/project/images/TextField-light.png +0 -0
  169. package/template/project/tokens.css +187 -0
  170. package/template/project/tokens.json +142 -0
  171. package/template/style.css +1 -0
@@ -0,0 +1,187 @@
1
+ /* Generated from design/tokens.json. Do not edit. */
2
+ :root {
3
+ --canvas: #f5f5f5;
4
+ --surface: #fafafa;
5
+ --surface-raised: #ffffff;
6
+ --surface-sunken: #ebebeb;
7
+ --ink: #171717;
8
+ --ink-secondary: #525252;
9
+ --ink-tertiary: #666666;
10
+ --line: #e3e3e3;
11
+ --line-control: #8a8a8a;
12
+ --accent: var(--ink);
13
+ --accent-soft: #e8e8e8;
14
+ --on-accent: #ffffff;
15
+ --focus-ring: var(--accent);
16
+ --success: #1f6b66;
17
+ --success-soft: #ddeeec;
18
+ --warning: #8a5a0b;
19
+ --warning-soft: #f5ead3;
20
+ --danger: #b0283f;
21
+ --danger-soft: #f7e1e4;
22
+ --info: #2c5f86;
23
+ --info-soft: #e1ebf3;
24
+ --fill-hover: #0000000a;
25
+ --fill-selected: #00000012;
26
+ --knob: #ffffff;
27
+ --scrim: #00000052;
28
+ --glass-fill: #ffffffa6;
29
+ --glass-stroke: #ffffffcc;
30
+ --shadow-control: 0 1px 1px rgba(0, 0, 0, 0.05);
31
+ --shadow-float: 0 1px 2px rgba(0, 0, 0, 0.05), 0 6px 20px rgba(0, 0, 0, 0.08);
32
+ --shadow-glass: 0 4px 14px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.70);
33
+ --space-1: 4px;
34
+ --space-2: 8px;
35
+ --space-3: 12px;
36
+ --space-4: 16px;
37
+ --space-5: 20px;
38
+ --space-6: 24px;
39
+ --space-8: 32px;
40
+ --space-10: 40px;
41
+ --radius-xs: 4px;
42
+ --radius-sm: 6px;
43
+ --radius-md: 8px;
44
+ --radius-lg: 12px;
45
+ --radius-xl: 24px;
46
+ --radius-full: 999px;
47
+ --stroke-hairline: 0.5px;
48
+ --stroke-control: 1px;
49
+ --stroke-focus: 2px;
50
+ --control-mac-sm: 20px;
51
+ --control-mac: 24px;
52
+ --control-mac-lg: 28px;
53
+ --row-mac: 26px;
54
+ --control-ios: 44px;
55
+ --button-ios-sm: 30px;
56
+ --button-ios: 36px;
57
+ --control-ios-lg: 46px;
58
+ --sidebar-mac: 220px;
59
+ --content-max: 680px;
60
+ --font-serif: ui-serif, "New York", "Iowan Old Style", Georgia, "PingFang SC", serif;
61
+ --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Hiragino Sans GB", system-ui, sans-serif;
62
+ --font-mono: ui-monospace, "SF Mono", Menlo, "PingFang SC", monospace;
63
+ }
64
+ @media(prefers-color-scheme:dark){:root:not([data-theme="light"]){
65
+ --canvas: #161616;
66
+ --surface: #1c1c1c;
67
+ --surface-raised: #252525;
68
+ --surface-sunken: #111111;
69
+ --ink: #ededed;
70
+ --ink-secondary: #a3a3a3;
71
+ --ink-tertiary: #8c8c8c;
72
+ --line: #2f2f2f;
73
+ --line-control: #737373;
74
+ --accent: var(--ink);
75
+ --accent-soft: #2e2e2e;
76
+ --on-accent: #161616;
77
+ --focus-ring: var(--accent);
78
+ --success: #6cc3b4;
79
+ --success-soft: #183230;
80
+ --warning: #e2b054;
81
+ --warning-soft: #3a2e17;
82
+ --danger: #f07a8a;
83
+ --danger-soft: #3d2027;
84
+ --info: #82b4dc;
85
+ --info-soft: #1d2c3a;
86
+ --fill-hover: #ffffff0f;
87
+ --fill-selected: #ffffff1a;
88
+ --knob: #ffffff;
89
+ --scrim: #00000080;
90
+ --glass-fill: #2a2a2aa6;
91
+ --glass-stroke: #ffffff24;
92
+ --shadow-control: 0 1px 1px rgba(0, 0, 0, 0.30);
93
+ --shadow-float: 0 1px 2px rgba(0, 0, 0, 0.40), 0 6px 20px rgba(0, 0, 0, 0.45);
94
+ --shadow-glass: 0 4px 14px rgba(0, 0, 0, 0.40), inset 0 1px 0 rgba(255, 255, 255, 0.10);
95
+ --space-1: 4px;
96
+ --space-2: 8px;
97
+ --space-3: 12px;
98
+ --space-4: 16px;
99
+ --space-5: 20px;
100
+ --space-6: 24px;
101
+ --space-8: 32px;
102
+ --space-10: 40px;
103
+ --radius-xs: 4px;
104
+ --radius-sm: 6px;
105
+ --radius-md: 8px;
106
+ --radius-lg: 12px;
107
+ --radius-xl: 24px;
108
+ --radius-full: 999px;
109
+ --stroke-hairline: 0.5px;
110
+ --stroke-control: 1px;
111
+ --stroke-focus: 2px;
112
+ --control-mac-sm: 20px;
113
+ --control-mac: 24px;
114
+ --control-mac-lg: 28px;
115
+ --row-mac: 26px;
116
+ --control-ios: 44px;
117
+ --button-ios-sm: 30px;
118
+ --button-ios: 36px;
119
+ --control-ios-lg: 46px;
120
+ --sidebar-mac: 220px;
121
+ --content-max: 680px;
122
+ --font-serif: ui-serif, "New York", "Iowan Old Style", Georgia, "PingFang SC", serif;
123
+ --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Hiragino Sans GB", system-ui, sans-serif;
124
+ --font-mono: ui-monospace, "SF Mono", Menlo, "PingFang SC", monospace;
125
+ }}
126
+ :root[data-theme="dark"]{
127
+ --canvas: #161616;
128
+ --surface: #1c1c1c;
129
+ --surface-raised: #252525;
130
+ --surface-sunken: #111111;
131
+ --ink: #ededed;
132
+ --ink-secondary: #a3a3a3;
133
+ --ink-tertiary: #8c8c8c;
134
+ --line: #2f2f2f;
135
+ --line-control: #737373;
136
+ --accent: var(--ink);
137
+ --accent-soft: #2e2e2e;
138
+ --on-accent: #161616;
139
+ --focus-ring: var(--accent);
140
+ --success: #6cc3b4;
141
+ --success-soft: #183230;
142
+ --warning: #e2b054;
143
+ --warning-soft: #3a2e17;
144
+ --danger: #f07a8a;
145
+ --danger-soft: #3d2027;
146
+ --info: #82b4dc;
147
+ --info-soft: #1d2c3a;
148
+ --fill-hover: #ffffff0f;
149
+ --fill-selected: #ffffff1a;
150
+ --knob: #ffffff;
151
+ --scrim: #00000080;
152
+ --glass-fill: #2a2a2aa6;
153
+ --glass-stroke: #ffffff24;
154
+ --shadow-control: 0 1px 1px rgba(0, 0, 0, 0.30);
155
+ --shadow-float: 0 1px 2px rgba(0, 0, 0, 0.40), 0 6px 20px rgba(0, 0, 0, 0.45);
156
+ --shadow-glass: 0 4px 14px rgba(0, 0, 0, 0.40), inset 0 1px 0 rgba(255, 255, 255, 0.10);
157
+ --space-1: 4px;
158
+ --space-2: 8px;
159
+ --space-3: 12px;
160
+ --space-4: 16px;
161
+ --space-5: 20px;
162
+ --space-6: 24px;
163
+ --space-8: 32px;
164
+ --space-10: 40px;
165
+ --radius-xs: 4px;
166
+ --radius-sm: 6px;
167
+ --radius-md: 8px;
168
+ --radius-lg: 12px;
169
+ --radius-xl: 24px;
170
+ --radius-full: 999px;
171
+ --stroke-hairline: 0.5px;
172
+ --stroke-control: 1px;
173
+ --stroke-focus: 2px;
174
+ --control-mac-sm: 20px;
175
+ --control-mac: 24px;
176
+ --control-mac-lg: 28px;
177
+ --row-mac: 26px;
178
+ --control-ios: 44px;
179
+ --button-ios-sm: 30px;
180
+ --button-ios: 36px;
181
+ --control-ios-lg: 46px;
182
+ --sidebar-mac: 220px;
183
+ --content-max: 680px;
184
+ --font-serif: ui-serif, "New York", "Iowan Old Style", Georgia, "PingFang SC", serif;
185
+ --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Hiragino Sans GB", system-ui, sans-serif;
186
+ --font-mono: ui-monospace, "SF Mono", Menlo, "PingFang SC", monospace;
187
+ }
@@ -0,0 +1,142 @@
1
+ {
2
+ "name": "Deernova",
3
+ "version": 2,
4
+ "color": {
5
+ "themes": [
6
+ { "id": "light", "name": "Light" },
7
+ { "id": "dark", "name": "Dark" }
8
+ ],
9
+ "tokens": [
10
+ { "name": "canvas", "value": { "light": "#f5f5f5", "dark": "#161616" }, "usage": "窗口底色、iOS 分组列表的底色。最底层的纸面。" },
11
+ { "name": "surface", "value": { "light": "#fafafa", "dark": "#1c1c1c" }, "usage": "内容区、卡片。比 canvas 略亮一层。" },
12
+ { "name": "surface-raised", "value": { "light": "#ffffff", "dark": "#252525" }, "usage": "输入框、Composer、iOS 分组列表、弹出层。最亮的纸面。" },
13
+ { "name": "surface-sunken", "value": { "light": "#ebebeb", "dark": "#111111" }, "usage": "代码块、用户消息气泡、展开的步骤详情。凹下去的纸面。" },
14
+ { "name": "ink", "value": { "light": "#171717", "dark": "#ededed" }, "usage": "正文与标题,用在四种纸面上(最低 13:1)。" },
15
+ { "name": "ink-secondary", "value": { "light": "#525252", "dark": "#a3a3a3" }, "usage": "次要文字、说明、列表的值、未选中图标,用在四种纸面上(最低 6:1)。" },
16
+ { "name": "ink-tertiary", "value": { "light": "#666666", "dark": "#8c8c8c" }, "usage": "占位符、时间戳、计数、分组标题,用在四种纸面上(最低 4.5:1)。" },
17
+ { "name": "line", "value": { "light": "#e3e3e3", "dark": "#2f2f2f" }, "usage": "分隔线、卡片描边、按钮描边。装饰性,不承载信息。" },
18
+ { "name": "line-control", "value": { "light": "#8a8a8a", "dark": "#737373" }, "usage": "输入框边框、拖拽条。在 canvas、surface、surface-raised 上不低于 3:1,让人一眼看出可输入。" },
19
+ { "name": "accent", "value": "{ink}", "usage": "强调:主按钮填充、选中指示、焦点环。就是墨色本身,浅色主题为黑、深色主题为白;强调靠明暗对比,不靠彩色。" },
20
+ { "name": "accent-soft", "value": { "light": "#e8e8e8", "dark": "#2e2e2e" }, "usage": "强调的浅底:强调标签、列表图标底、输入框聚焦光晕。上面的文字用 ink。" },
21
+ { "name": "on-accent", "value": { "light": "#ffffff", "dark": "#161616" }, "usage": "accent 填充上的文字和图标:浅色主题白字,深色主题黑字。" },
22
+ { "name": "focus-ring", "value": "{accent}", "usage": "键盘焦点环:2pt 实线,外偏移 2pt。在所有纸面上不低于 13:1。" },
23
+ { "name": "success", "value": { "light": "#1f6b66", "dark": "#6cc3b4" }, "usage": "成功、已完成、已同步。界面里只有状态色是彩色,只在表达状态时出现。作为文字用在纸面和 success-soft 上。" },
24
+ { "name": "success-soft", "value": { "light": "#ddeeec", "dark": "#183230" }, "usage": "成功状态的浅底(标签、横幅)。" },
25
+ { "name": "warning", "value": { "light": "#8a5a0b", "dark": "#e2b054" }, "usage": "需要注意但不阻断:额度将用完、网络较慢。作为文字用在纸面和 warning-soft 上。" },
26
+ { "name": "warning-soft", "value": { "light": "#f5ead3", "dark": "#3a2e17" }, "usage": "警告状态的浅底。" },
27
+ { "name": "danger", "value": { "light": "#b0283f", "dark": "#f07a8a" }, "usage": "错误、失败、删除。永远同时配图标或文字。作为文字用在纸面和 danger-soft 上。" },
28
+ { "name": "danger-soft", "value": { "light": "#f7e1e4", "dark": "#3d2027" }, "usage": "错误状态的浅底、危险按钮的底色。" },
29
+ { "name": "info", "value": { "light": "#2c5f86", "dark": "#82b4dc" }, "usage": "中性提示。作为文字用在纸面和 info-soft 上。" },
30
+ { "name": "info-soft", "value": { "light": "#e1ebf3", "dark": "#1d2c3a" }, "usage": "提示状态的浅底。" },
31
+ { "name": "fill-hover", "value": { "light": "#0000000a", "dark": "#ffffff0f" }, "usage": "悬停底色,叠在任何纸面上(列表行、文字按钮、侧边栏项)。" },
32
+ { "name": "fill-selected", "value": { "light": "#00000012", "dark": "#ffffff1a" }, "usage": "选中底色(侧边栏当前项、分段控件底槽、中性标签底)。" },
33
+ { "name": "knob", "value": { "light": "#ffffff", "dark": "#ffffff" }, "usage": "开关的圆钮,两套主题都是白色,与系统一致。" },
34
+ { "name": "scrim", "value": { "light": "#00000052", "dark": "#00000080" }, "usage": "弹窗背后压暗内容的遮罩。" },
35
+ { "name": "glass-fill", "value": { "light": "#ffffffa6", "dark": "#2a2a2aa6" }, "usage": "仅用于网页预览模拟 Liquid Glass。App 里用系统 .glassEffect(),不要用这个值自己画玻璃。" },
36
+ { "name": "glass-stroke", "value": { "light": "#ffffffcc", "dark": "#ffffff24" }, "usage": "仅用于网页预览:玻璃边缘的高光描边。" }
37
+ ]
38
+ },
39
+ "type": {
40
+ "fonts": [],
41
+ "families": {
42
+ "serif": "ui-serif, \"New York\", \"Iowan Old Style\", Georgia, \"PingFang SC\", serif",
43
+ "sans": "-apple-system, BlinkMacSystemFont, \"SF Pro Text\", \"PingFang SC\", \"Hiragino Sans GB\", system-ui, sans-serif",
44
+ "mono": "ui-monospace, \"SF Mono\", Menlo, \"PingFang SC\", monospace"
45
+ },
46
+ "groups": [
47
+ {
48
+ "name": "macOS",
49
+ "family": "sans",
50
+ "note": "Mac 正文 13pt,行高收紧到约 1.4 倍。衬线只用于标题和长文阅读,界面文字一律无衬线。",
51
+ "styles": [
52
+ { "name": "mac-display", "family": "serif", "fontSize": "22px", "lineHeight": "28px", "fontWeight": 600, "letterSpacing": "-0.01em", "sample": "还没有笔记", "usage": "空状态、引导页的大标题。每屏最多一个。SwiftUI: .system(size: 22, weight: .semibold, design: .serif)" },
53
+ { "name": "mac-title", "family": "serif", "fontSize": "17px", "lineHeight": "22px", "fontWeight": 600, "sample": "本周回顾", "usage": "文章标题、设置页标题。SwiftUI: .system(.title3, design: .serif).weight(.semibold)" },
54
+ { "name": "mac-headline", "fontSize": "13px", "lineHeight": "17px", "fontWeight": 600, "sample": "最近项目", "usage": "窗口标题、区块标题、横幅标题。SwiftUI: .headline" },
55
+ { "name": "mac-body", "fontSize": "13px", "lineHeight": "18px", "fontWeight": 400, "sample": "同步到 iCloud 后,所有设备上都能看到这条笔记。", "usage": "界面正文、按钮、列表、表单、用户消息。SwiftUI: .body" },
56
+ { "name": "mac-prose", "family": "serif", "fontSize": "14px", "lineHeight": "22px", "fontWeight": 400, "sample": "长文和 AI 的回答用衬线排,读起来更像一页纸,而不是一块界面。", "usage": "长文阅读、AI 回答。栏宽不超过 content-max。" },
57
+ { "name": "mac-callout", "fontSize": "12px", "lineHeight": "16px", "fontWeight": 400, "sample": "上次同步:今天 09:41", "usage": "表单说明、卡片摘要、次要信息。SwiftUI: .callout" },
58
+ { "name": "mac-caption", "fontSize": "11px", "lineHeight": "13px", "fontWeight": 500, "sample": "3 个文件 · 12 KB", "usage": "时间戳、计数、侧边栏分组标题、标签。SwiftUI: .caption" }
59
+ ]
60
+ },
61
+ {
62
+ "name": "iOS",
63
+ "family": "sans",
64
+ "note": "iOS 正文保持系统默认的 17pt,让动态字体正常缩放,只收紧行高和标题。",
65
+ "styles": [
66
+ { "name": "ios-large-title", "family": "serif", "fontSize": "30px", "lineHeight": "36px", "fontWeight": 600, "letterSpacing": "-0.01em", "sample": "笔记", "usage": "页面大标题。SwiftUI: .system(.largeTitle, design: .serif).weight(.semibold)" },
67
+ { "name": "ios-title", "family": "serif", "fontSize": "20px", "lineHeight": "25px", "fontWeight": 600, "sample": "本周回顾", "usage": "弹窗标题、文章标题、空状态标题。SwiftUI: .system(.title3, design: .serif)" },
68
+ { "name": "ios-headline", "fontSize": "17px", "lineHeight": "22px", "fontWeight": 600, "sample": "最近项目", "usage": "列表行标题、卡片标题、按钮。SwiftUI: .headline" },
69
+ { "name": "ios-body", "fontSize": "17px", "lineHeight": "23px", "fontWeight": 400, "sample": "同步到 iCloud 后,所有设备上都能看到这条笔记。", "usage": "界面正文、列表行。SwiftUI: .body" },
70
+ { "name": "ios-prose", "family": "serif", "fontSize": "17px", "lineHeight": "26px", "fontWeight": 400, "sample": "长文和 AI 的回答用衬线排,读起来更像一页纸。", "usage": "长文阅读、AI 回答。SwiftUI: .system(.body, design: .serif),行距 .lineSpacing(4)" },
71
+ { "name": "ios-callout", "fontSize": "15px", "lineHeight": "20px", "fontWeight": 400, "sample": "上次同步:今天 09:41", "usage": "说明文字、弹窗正文、用户消息。SwiftUI: .callout" },
72
+ { "name": "ios-footnote", "fontSize": "13px", "lineHeight": "17px", "fontWeight": 400, "sample": "关闭后,新笔记只保存在这台设备上。", "usage": "分组列表的页头页脚、卡片摘要。SwiftUI: .footnote" },
73
+ { "name": "ios-caption", "fontSize": "12px", "lineHeight": "15px", "fontWeight": 500, "sample": "3 个文件 · 12 KB", "usage": "时间戳、计数、标签。SwiftUI: .caption" }
74
+ ]
75
+ },
76
+ {
77
+ "name": "Code",
78
+ "family": "mono",
79
+ "note": "代码、命令、文件路径、数据。",
80
+ "styles": [
81
+ { "name": "code-mac", "fontSize": "12px", "lineHeight": "17px", "fontWeight": 400, "sample": "let total = items.reduce(0, +)", "usage": "Mac 上的代码块、步骤摘要。SwiftUI: .system(.callout, design: .monospaced)" },
82
+ { "name": "code-ios", "fontSize": "13px", "lineHeight": "18px", "fontWeight": 400, "sample": "let total = items.reduce(0, +)", "usage": "iOS 上的代码块。SwiftUI: .system(.footnote, design: .monospaced)" }
83
+ ]
84
+ }
85
+ ]
86
+ },
87
+ "spacing": {
88
+ "note": "4pt 网格,整体偏紧凑。组与组之间的间距至少是组内间距的 2 倍。",
89
+ "tokens": [
90
+ { "name": "space-1", "value": "4px", "usage": "图标与文字之间、卡片内标题与摘要之间。" },
91
+ { "name": "space-2", "value": "8px", "usage": "Mac 列表项内边距、横幅上下内边距、Composer 内边距。" },
92
+ { "name": "space-3", "value": "12px", "usage": "Mac 按钮左右内边距、卡片内边距、横幅左右内边距。" },
93
+ { "name": "space-4", "value": "16px", "usage": "Mac 内容区边距、对话中消息之间、iOS 页面左右边距。" },
94
+ { "name": "space-5", "value": "20px", "usage": "iOS 分组之间、Mac 区块之间。" },
95
+ { "name": "space-6", "value": "24px", "usage": "空状态内边距、大区块之间。" },
96
+ { "name": "space-8", "value": "32px", "usage": "页面级留白。" },
97
+ { "name": "space-10", "value": "40px", "usage": "引导页、首屏的大留白。" }
98
+ ]
99
+ },
100
+ "radius": {
101
+ "note": "嵌套保持同心:内圆角 = 外圆角 − 内边距。",
102
+ "tokens": [
103
+ { "name": "radius-xs", "value": "4px", "usage": "标签、复选框、分段控件里的选中块(外层 radius-sm、内边距 2)。" },
104
+ { "name": "radius-sm", "value": "6px", "usage": "Mac 按钮、输入框、侧边栏选中块、iOS 列表图标底。" },
105
+ { "name": "radius-md", "value": "8px", "usage": "Mac 卡片、横幅、代码块、弹出菜单。" },
106
+ { "name": "radius-lg", "value": "12px", "usage": "iOS 卡片、iOS 分组列表、Composer、用户消息气泡、Mac 侧边栏面板。" },
107
+ { "name": "radius-xl", "value": "24px", "usage": "iOS 底部弹窗、iOS 单行 Composer。" },
108
+ { "name": "radius-full", "value": "999px", "usage": "胶囊与圆形:玻璃按钮、iOS 主按钮、发送按钮、状态圆点。" }
109
+ ]
110
+ },
111
+ "shadow": {
112
+ "note": "卡片不加阴影。只有真正浮起来的东西才有阴影。",
113
+ "tokens": [
114
+ { "name": "shadow-control", "value": { "light": "0 1px 1px rgba(0, 0, 0, 0.05)", "dark": "0 1px 1px rgba(0, 0, 0, 0.30)" }, "usage": "次按钮、分段控件的选中块:一点点厚度。" },
115
+ { "name": "shadow-float", "value": { "light": "0 1px 2px rgba(0, 0, 0, 0.05), 0 6px 20px rgba(0, 0, 0, 0.08)", "dark": "0 1px 2px rgba(0, 0, 0, 0.40), 0 6px 20px rgba(0, 0, 0, 0.45)" }, "usage": "Composer、弹出菜单、弹窗、浮动面板。" },
116
+ { "name": "shadow-glass", "value": { "light": "0 4px 14px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.70)", "dark": "0 4px 14px rgba(0, 0, 0, 0.40), inset 0 1px 0 rgba(255, 255, 255, 0.10)" }, "usage": "仅用于网页预览模拟玻璃。App 里系统玻璃自带阴影。" }
117
+ ]
118
+ },
119
+ "stroke": {
120
+ "note": "线宽。",
121
+ "tokens": [
122
+ { "name": "stroke-hairline", "value": "0.5px", "usage": "分隔线、卡片描边:1 个物理像素。SwiftUI: 1 / displayScale。" },
123
+ { "name": "stroke-control", "value": "1px", "usage": "输入框边框。" },
124
+ { "name": "stroke-focus", "value": "2px", "usage": "焦点环。" }
125
+ ]
126
+ },
127
+ "size": {
128
+ "note": "控件高度与布局尺寸。Mac 偏紧凑,iOS 遵守 44pt 最小点击区域。",
129
+ "tokens": [
130
+ { "name": "control-mac-sm", "value": "20px", "usage": "Mac 小按钮、行内操作、分段控件。" },
131
+ { "name": "control-mac", "value": "24px", "usage": "Mac 默认按钮、输入框、图标按钮、步骤行。" },
132
+ { "name": "control-mac-lg", "value": "28px", "usage": "Mac 大按钮(引导页、空状态)。" },
133
+ { "name": "row-mac", "value": "26px", "usage": "Mac 侧边栏项、列表行。" },
134
+ { "name": "control-ios", "value": "44px", "usage": "iOS 最小可点区域(按钮看起来可以更小,点击区域仍补足到 44)、列表行、输入框、导航栏玻璃按钮。" },
135
+ { "name": "button-ios-sm", "value": "30px", "usage": "iOS 小按钮的可见高度:卡片和列表里的「获取」「关注」这类行内操作。" },
136
+ { "name": "button-ios", "value": "36px", "usage": "iOS 默认按钮的可见高度。" },
137
+ { "name": "control-ios-lg", "value": "46px", "usage": "iOS 通栏主按钮(页面底部、弹窗里的唯一主操作)。" },
138
+ { "name": "sidebar-mac", "value": "220px", "usage": "Mac 侧边栏默认宽度。" },
139
+ { "name": "content-max", "value": "680px", "usage": "长文阅读栏的最大宽度,14pt 下约每行 45 个汉字。" }
140
+ ]
141
+ }
142
+ }
@@ -0,0 +1 @@
1
+ *{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:24px}body{margin:0;background:var(--canvas);color:var(--ink);font:14px/1.65 var(--font-sans)}a{color:inherit}button,input,select{font:inherit;color:inherit}button,select{cursor:pointer}button{border:1px solid var(--line-control);background:var(--surface-raised);padding:7px 12px;border-radius:6px}a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:2px solid var(--focus-ring);outline-offset:3px}.skip{position:fixed;top:-100px;z-index:10;background:var(--surface);padding:12px}.skip:focus{top:8px}aside{width:236px;position:fixed;inset:0 auto 0 0;border-right:1px solid var(--line);background:var(--surface);padding:30px 22px;overflow:auto}.brand{text-decoration:none;font:600 32px var(--font-serif);letter-spacing:-1.6px}.brand span{display:block;font:10px var(--font-sans);letter-spacing:2px;margin-top:9px}.edition{color:var(--ink-tertiary);font-size:11px;margin:24px 0}.search{display:block;font-size:11px;color:var(--ink-secondary)}input{width:100%;min-height:34px;border:1px solid var(--line-control);background:var(--surface-raised);border-radius:6px;padding:6px 8px;margin-top:5px}nav{margin-top:24px}nav>a{display:flex;justify-content:space-between;text-decoration:none;font-size:13px;padding:7px 8px;border-radius:6px}nav a:hover,nav a.active{background:var(--fill-selected)}nav span{color:var(--ink-tertiary);font:10px var(--font-mono)}.component-nav{border-left:1px solid var(--line);margin:8px 0 12px 9px;padding-left:12px;display:grid;grid-template-columns:1fr 1fr;gap:4px}.component-nav a{text-decoration:none;font-size:10px;color:var(--ink-secondary);padding:2px 0}.aside-bottom{border-top:1px solid var(--line);margin-top:24px;padding-top:18px;font-size:12px}select{float:right;background:var(--surface);border:0}.aside-bottom p{color:var(--ink-tertiary);margin-top:24px}main{margin-left:236px;padding:0 64px;max-width:1580px}header{display:flex;justify-content:space-between;padding:24px 0;border-bottom:1px solid var(--line);font:10px var(--font-mono);letter-spacing:1px;color:var(--ink-secondary)}.hero{padding-top:64px}.eyebrow,.section-title>span{font-size:11px;letter-spacing:1.5px;color:var(--ink-secondary)}h1{font:500 clamp(38px,4.6vw,68px)/1.25 var(--font-serif);letter-spacing:-2px;margin:24px 0}h1 em{font-style:normal;color:var(--ink-tertiary)}.lede{max-width:520px;font-size:15px;line-height:1.9;color:var(--ink-secondary)}.actions{display:flex;align-items:center;gap:24px;margin:28px 0 42px}.actions a{font-size:13px;text-decoration:none}.primary{background:var(--ink);color:var(--on-accent);padding:10px 18px;border-radius:6px}.specimen{border:1px solid var(--line);border-radius:12px;overflow:hidden;background:var(--surface)}.specimen-bar{display:flex;justify-content:space-between;padding:10px 16px;border-bottom:1px solid var(--line);font:10px var(--font-mono);color:var(--ink-tertiary)}.specimen-inner{display:flex;position:relative;min-height:290px}.mini-nav{width:185px;border-right:1px solid var(--line);padding:26px 16px;font-size:11px;color:var(--ink-secondary)}.mini-nav b,.mini-nav span{display:block;margin-top:12px;padding:4px 8px}.mini-nav b{background:var(--fill-selected);border-radius:4px;color:var(--ink);font-weight:500}.paper{padding:28px 38px;flex:1;background:var(--surface-raised)}.paper small{font-size:10px;color:var(--ink-tertiary)}.paper h2{font:500 28px/1.4 var(--font-serif);margin:16px 0}.paper p{font-size:12px;color:var(--ink-secondary)}.paper-rule{height:1px;background:var(--line);margin:24px 0 12px}.status{font-size:10px;color:var(--success)}.floating{position:absolute;right:24px;bottom:24px;background:var(--glass-fill);border:1px solid var(--glass-stroke);box-shadow:var(--shadow-glass);backdrop-filter:blur(14px);border-radius:30px;padding:10px 16px}.floating span{font-size:12px;margin-left:6px}.stats{display:grid;grid-template-columns:repeat(3,1fr);padding:26px 0;border-bottom:1px solid var(--line)}.stats div+div{border-left:1px solid var(--line);padding-left:24px}.stats b{display:block;font:500 21px var(--font-serif)}.stats span{display:block;font-size:10px;color:var(--ink-tertiary);margin-top:8px}.section{padding-top:70px}.section-title{margin-bottom:32px}.section-title h2{font:500 32px/1.4 var(--font-serif);margin:12px 0}.section-title p,.muted{color:var(--ink-secondary);font-size:13px}.prose{max-width:760px;overflow-wrap:anywhere}.prose h2{font:500 24px var(--font-serif);margin-top:40px}.prose h3{margin-top:28px}.prose p,.prose li{color:var(--ink-secondary)}.prose strong{color:var(--ink);font-weight:600}pre{overflow:auto;padding:16px;background:var(--surface-sunken);border-radius:8px;max-width:100%}code{font:12px/1.7 var(--font-mono)}:not(pre)>code{background:var(--surface-sunken);padding:2px 4px;border-radius:3px}table{border-collapse:collapse;width:100%;font-size:12px;display:block;overflow:auto}td,th{padding:8px;border-bottom:1px solid var(--line);text-align:left}.token-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.token{text-align:left;display:flex;flex-direction:column;align-items:flex-start;border:1px solid var(--line);background:var(--surface);padding:14px;min-width:0}.token:hover{border-color:var(--ink-tertiary)}.swatch{height:42px;width:100%;border:1px solid var(--line);border-radius:4px;margin-bottom:12px}.token strong{font:12px var(--font-mono)}.token code{font-size:10px;margin:8px 0;overflow-wrap:anywhere;white-space:normal}.token small{color:var(--ink-secondary);font-size:11px;line-height:1.6}.type-row{border-bottom:1px solid var(--line);padding:16px 0}.type-row small{color:var(--ink-secondary)}.component{margin-bottom:28px;scroll-margin-top:24px}.component-head{display:flex;align-items:baseline;gap:12px;margin-bottom:10px}.component-head h3{font:500 17px var(--font-mono);margin:0}.component-head span{font-size:12px;color:var(--ink-secondary)}.component-head a{font-size:11px;margin-left:auto;white-space:nowrap}.preview{border:1px solid var(--line);border-radius:10px;overflow:auto;background:var(--surface)}iframe{display:block;width:100%;min-width:760px;border:0}summary{cursor:pointer;padding:12px 0;font-size:12px;color:var(--ink-secondary)}details .prose{padding:0 16px 16px;border-left:1px solid var(--line)}.install-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px}.install-grid article{min-width:0;border-top:1px solid var(--line);padding-top:10px}.install-grid p{font-size:12px;color:var(--ink-secondary)}footer{display:flex;justify-content:space-between;gap:20px;border-top:1px solid var(--line);padding:24px 0;margin-top:72px;font-size:11px;color:var(--ink-tertiary)}#toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:var(--ink);color:var(--on-accent);padding:8px 16px;border-radius:20px;opacity:0;pointer-events:none}#toast.show{opacity:1}[hidden]{display:none!important}@media(min-width:1500px){main{padding-right:100px;padding-left:100px}}@media(max-width:1000px){main{padding:0 28px}.token-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.component-head span{display:none}.mini-nav{width:130px}.paper{padding:24px}}@media(max-width:700px){aside{position:static;width:auto;padding:18px 20px}aside .edition,aside .component-nav,aside .aside-bottom p{display:none}.brand{font-size:26px}.brand span{display:inline;font-size:9px;letter-spacing:1px;margin-left:14px}nav{display:flex;flex-wrap:wrap;margin-top:12px}nav>a{font-size:11px;gap:8px}.search{margin-top:14px}.aside-bottom{margin-top:12px;padding-top:10px}main{margin:0;padding:0 20px}header{font-size:8px}.hero{padding-top:36px}h1{letter-spacing:-1px}.mini-nav{display:none}.paper{padding:24px}.floating{right:12px;bottom:18px}.stats b{font-size:16px}.stats div+div{padding-left:12px}.stats span{font-size:9px}.install-grid{grid-template-columns:1fr}.section{padding-top:48px}.section-title h2{font-size:26px}footer{flex-direction:column}.token{padding:10px}button,select,nav>a{min-height:44px}.component-nav a{min-height:24px}.component-head{flex-wrap:wrap}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{animation:none!important;transition:none!important}}@media(prefers-reduced-transparency:reduce){.floating{background:var(--surface-raised);backdrop-filter:none}}