@namewta/speculo 0.8.6 → 0.8.7
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/package.json +1 -1
- package/template/canonical/canonical-specdev-goal-plan.md +14 -14
- package/template/canonical/canonical-specdev-grill-with-docs.md +9 -7
- package/template/canonical/canonical-specdev-spec.md +9 -7
- package/template/canonical/canonical-specdev-tickets.md +13 -13
- package/template/canonical/canonical-specdev-wayfinder.md +7 -7
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +1 -1
- package/template/workflows/specdev/I-init-setup/config-template.json +2 -2
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +1 -1
- package/template/workflows/specdev/P-prototype/P-prototype.md +30 -26
- package/template/workflows/specdev/P-prototype/design-library/INDEX.md +43 -0
- package/template/workflows/specdev/P-prototype/design-library/color-and-theme.md +65 -0
- package/template/workflows/specdev/P-prototype/design-library/foundations.md +66 -0
- package/template/workflows/specdev/P-prototype/design-library/interaction-patterns.md +61 -0
- package/template/workflows/specdev/P-prototype/design-library/product-pattern-index.md +73 -0
- package/template/workflows/specdev/P-prototype/design-library/research-provenance.md +54 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/METHODOLOGY.md +90 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/README.md +31 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/data/extended-projects.json +241 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/data/projects.json +253 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/reference/USAGE.md +40 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/reference/design-tokens.css +145 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/report/OPEN_SOURCE_UI_RESEARCH_2026.md +519 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/PROJECT_TEMPLATE.md +29 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/README.md +9 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/claude-code-modern-clients.md +407 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/creative-ai-communication.md +574 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/data-dev-tools.md +432 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/personal-multiplatform-apps.md +185 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/research/productivity-collaboration.md +398 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/01-dense-ide.html +68 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/02-monochrome-console.html +18 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/03-soft-personal-ai.html +17 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/04-responsive-web.html +14 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/05-mobile-supervisor.html +16 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/06-cross-platform-workspace.html +17 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/07-local-first-content.html +9 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/08-media-first.html +17 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/README.md +49 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/ATTRIBUTION.md +9 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/landscape.jpg +0 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/lucide.js +20494 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/mountain.jpg +0 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/assets/workspace.jpg +0 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/index.html +70 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/package-lock.json +78 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/package.json +12 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/screenshots/index-desktop.png +0 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/scripts/gallery.js +134 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/base.css +795 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/styles/pages.css +533 -0
- package/template/workflows/specdev/P-prototype/design-library/research-snapshot/ui-gallery/tests/gallery.spec.js +56 -0
- package/template/workflows/specdev/P-prototype/design-library/responsive-and-platforms.md +53 -0
- package/template/workflows/specdev/P-prototype/design-library/style-index.md +32 -0
- package/template/workflows/specdev/P-prototype/design-package.schema.json +70 -0
- package/template/workflows/specdev/P-prototype/design-system-template.md +366 -0
- package/template/workflows/specdev/P-prototype/detect-existing-style.md +53 -0
- package/template/workflows/specdev/P-prototype/generate-design-package.md +50 -0
- package/template/workflows/specdev/P-prototype/style-selection-protocol.md +41 -0
- package/template/workflows/specdev/P-prototype/tools/materialize-prototype.mjs +126 -0
- package/template/workflows/specdev/P-prototype/tools/validate-design-package.mjs +155 -0
- package/template/workflows/specdev/README.md +11 -5
- package/template/workflows/specdev/T-triage/T-triage.md +1 -1
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +1 -1
- package/template/workflows/specdev/common/README.md +2 -2
- package/template/workflows/specdev/common/rules/artifact-contract.md +3 -1
- package/template/workflows/specdev/common/schemas/config.schema.json +4 -4
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +4 -4
- package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +1 -3
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +88 -29
- package/template/workflows/specdev/P-prototype/logic-prototype.md +0 -24
- package/template/workflows/specdev/P-prototype/prototype-record-template.md +0 -46
- package/template/workflows/specdev/P-prototype/ui-prototype.md +0 -21
- package/template/workflows/specdev/common/schemas/prototype-record.schema.json +0 -24
package/template/workflows/specdev/P-prototype/design-library/research-snapshot/data/projects.json
ADDED
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
{
|
|
2
|
+
"asOf": "2026-08-30",
|
|
3
|
+
"notes": "starsApprox is a dated, rounded snapshot; license is a research note, not legal advice",
|
|
4
|
+
"projects": [
|
|
5
|
+
{
|
|
6
|
+
"id": "supabase-studio",
|
|
7
|
+
"name": "Supabase Studio",
|
|
8
|
+
"repo": "https://github.com/supabase/supabase",
|
|
9
|
+
"category": "data-platform",
|
|
10
|
+
"starsApprox": 108600,
|
|
11
|
+
"license": "Apache-2.0",
|
|
12
|
+
"licenseClass": "open-source",
|
|
13
|
+
"frontend": ["React", "Next.js", "TanStack", "Tailwind CSS 4", "Radix", "Monaco"],
|
|
14
|
+
"layout": "product rail + module sidebar + data workspace + resizable panel",
|
|
15
|
+
"bestFor": ["design-system architecture", "data tools", "semantic themes"],
|
|
16
|
+
"detailReport": "research/data-dev-tools.md"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "grafana",
|
|
20
|
+
"name": "Grafana",
|
|
21
|
+
"repo": "https://github.com/grafana/grafana",
|
|
22
|
+
"category": "observability",
|
|
23
|
+
"starsApprox": 76500,
|
|
24
|
+
"license": "AGPL-3.0-only",
|
|
25
|
+
"licenseClass": "copyleft",
|
|
26
|
+
"frontend": ["React 19", "Emotion", "Redux", "RxJS", "Grafana UI"],
|
|
27
|
+
"layout": "top bar + dockable mega menu + dashboard canvas",
|
|
28
|
+
"bestFor": ["dashboard density", "theme contracts", "plugin UI"],
|
|
29
|
+
"detailReport": "research/data-dev-tools.md"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "metabase",
|
|
33
|
+
"name": "Metabase",
|
|
34
|
+
"repo": "https://github.com/metabase/metabase",
|
|
35
|
+
"category": "business-intelligence",
|
|
36
|
+
"starsApprox": 49000,
|
|
37
|
+
"license": "AGPL core; commercial enterprise directory",
|
|
38
|
+
"licenseClass": "mixed",
|
|
39
|
+
"frontend": ["React 18", "Mantine 8", "Redux Toolkit", "RTK Query", "CSS Modules"],
|
|
40
|
+
"layout": "app bar + collection sidebar + query and dashboard workspace",
|
|
41
|
+
"bestFor": ["accessible analytics", "theme migration", "command palette"],
|
|
42
|
+
"detailReport": "research/data-dev-tools.md"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "dbeaver",
|
|
46
|
+
"name": "DBeaver Community",
|
|
47
|
+
"repo": "https://github.com/dbeaver/dbeaver",
|
|
48
|
+
"category": "database-client",
|
|
49
|
+
"starsApprox": 51600,
|
|
50
|
+
"license": "Apache-2.0 with separately licensed bundled components",
|
|
51
|
+
"licenseClass": "mixed",
|
|
52
|
+
"frontend": ["Java", "Eclipse RCP", "SWT", "JFace", "OSGi"],
|
|
53
|
+
"layout": "object tree + tabbed editors + docked auxiliary views",
|
|
54
|
+
"bestFor": ["desktop information density", "context actions", "multi-pane workflows"],
|
|
55
|
+
"detailReport": "research/data-dev-tools.md"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "directus",
|
|
59
|
+
"name": "Directus",
|
|
60
|
+
"repo": "https://github.com/directus/directus",
|
|
61
|
+
"category": "data-cms",
|
|
62
|
+
"starsApprox": 35900,
|
|
63
|
+
"license": "MSCL-1.0-GPL",
|
|
64
|
+
"licenseClass": "source-available-restricted",
|
|
65
|
+
"frontend": ["Vue 3", "Vite", "Pinia", "Reka UI", "SCSS", "CodeMirror"],
|
|
66
|
+
"layout": "module rail + collection navigation + pluggable layouts + context sidebar",
|
|
67
|
+
"bestFor": ["schema-driven UI", "extension architecture", "multiple data views"],
|
|
68
|
+
"detailReport": "research/data-dev-tools.md"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "appsmith",
|
|
72
|
+
"name": "Appsmith",
|
|
73
|
+
"repo": "https://github.com/appsmithorg/appsmith",
|
|
74
|
+
"category": "low-code",
|
|
75
|
+
"starsApprox": 40000,
|
|
76
|
+
"license": "Apache-2.0",
|
|
77
|
+
"licenseClass": "open-source",
|
|
78
|
+
"frontend": ["React 17", "Redux Saga", "styled-components", "CodeMirror", "ECharts"],
|
|
79
|
+
"layout": "entity tree + canvas + property inspector + debugger",
|
|
80
|
+
"bestFor": ["low-code editors", "property inspectors", "debug feedback"],
|
|
81
|
+
"detailReport": "research/data-dev-tools.md"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "dbx",
|
|
85
|
+
"name": "DBX",
|
|
86
|
+
"repo": "https://github.com/t8y2/dbx",
|
|
87
|
+
"category": "database-client",
|
|
88
|
+
"starsApprox": 16300,
|
|
89
|
+
"license": "Apache-2.0",
|
|
90
|
+
"licenseClass": "open-source",
|
|
91
|
+
"frontend": ["Vue 3", "Tauri 2", "Vite 8", "Tailwind CSS 4", "Reka UI", "CodeMirror 6"],
|
|
92
|
+
"layout": "connection tree + tabs + editor/data workspace + resizable tool panels",
|
|
93
|
+
"bestFor": ["lightweight desktop apps", "database workspaces", "AI and MCP integration"],
|
|
94
|
+
"detailReport": "research/data-dev-tools.md"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "plane",
|
|
98
|
+
"name": "Plane",
|
|
99
|
+
"repo": "https://github.com/makeplane/plane",
|
|
100
|
+
"category": "project-management",
|
|
101
|
+
"starsApprox": 58500,
|
|
102
|
+
"license": "AGPL-3.0",
|
|
103
|
+
"licenseClass": "copyleft",
|
|
104
|
+
"frontend": ["React", "React Router", "Vite", "MobX", "Tailwind CSS", "Propel"],
|
|
105
|
+
"layout": "resizable project sidebar + multi-view workspace + item detail",
|
|
106
|
+
"bestFor": ["dense work management", "list board gantt views", "peek sidebars"],
|
|
107
|
+
"detailReport": "research/productivity-collaboration.md"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "appflowy",
|
|
111
|
+
"name": "AppFlowy",
|
|
112
|
+
"repo": "https://github.com/AppFlowy-IO/AppFlowy",
|
|
113
|
+
"category": "productivity",
|
|
114
|
+
"starsApprox": 76100,
|
|
115
|
+
"license": "AGPL-3.0",
|
|
116
|
+
"licenseClass": "copyleft",
|
|
117
|
+
"frontend": ["Flutter", "Dart", "BLoC", "GoRouter", "Rust core"],
|
|
118
|
+
"layout": "plugin workspace + document/database views + native responsive navigation",
|
|
119
|
+
"bestFor": ["local-first", "true cross-platform", "mobile task reflow"],
|
|
120
|
+
"detailReport": "research/productivity-collaboration.md"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "twenty",
|
|
124
|
+
"name": "Twenty",
|
|
125
|
+
"repo": "https://github.com/twentyhq/twenty",
|
|
126
|
+
"category": "crm",
|
|
127
|
+
"starsApprox": 55900,
|
|
128
|
+
"license": "AGPL with Section 7 exception; mixed subdirectories",
|
|
129
|
+
"licenseClass": "mixed",
|
|
130
|
+
"frontend": ["React 19", "Jotai", "Linaria", "Apollo GraphQL", "Nx"],
|
|
131
|
+
"layout": "table or pipeline + record side panel + mobile navigation home",
|
|
132
|
+
"bestFor": ["metadata-driven business UI", "object tables", "record panels"],
|
|
133
|
+
"detailReport": "research/productivity-collaboration.md"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": "cal",
|
|
137
|
+
"name": "Cal.com / Cal.diy",
|
|
138
|
+
"repo": "https://github.com/calcom/cal.diy",
|
|
139
|
+
"category": "scheduling",
|
|
140
|
+
"starsApprox": 48000,
|
|
141
|
+
"license": "MIT",
|
|
142
|
+
"licenseClass": "open-source",
|
|
143
|
+
"frontend": ["Next.js 16", "React 18", "Tailwind CSS 4", "tRPC", "Prisma"],
|
|
144
|
+
"layout": "admin configuration shell + separate public booking flow",
|
|
145
|
+
"bestFor": ["admin and customer UI separation", "booking forms", "brand customization"],
|
|
146
|
+
"detailReport": "research/productivity-collaboration.md"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"id": "outline",
|
|
150
|
+
"name": "Outline",
|
|
151
|
+
"repo": "https://github.com/outline/outline",
|
|
152
|
+
"category": "knowledge-base",
|
|
153
|
+
"starsApprox": 40400,
|
|
154
|
+
"license": "BSL-1.1 with competitive Document Service restriction",
|
|
155
|
+
"licenseClass": "source-available-restricted",
|
|
156
|
+
"frontend": ["React 17", "MobX", "styled-components", "ProseMirror", "Yjs", "Vite"],
|
|
157
|
+
"layout": "document tree + focused editor + contextual collaboration tools",
|
|
158
|
+
"bestFor": ["low-distraction writing", "tree navigation", "command bars"],
|
|
159
|
+
"detailReport": "research/productivity-collaboration.md"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"id": "affine",
|
|
163
|
+
"name": "AFFiNE",
|
|
164
|
+
"repo": "https://github.com/toeverything/AFFiNE",
|
|
165
|
+
"category": "documents-whiteboard",
|
|
166
|
+
"starsApprox": 72000,
|
|
167
|
+
"license": "mixed by directory: MIT, MPL-2.0 and enterprise terms",
|
|
168
|
+
"licenseClass": "mixed",
|
|
169
|
+
"frontend": ["React 19", "Vite", "Electron", "Vanilla Extract", "Jotai", "Yjs"],
|
|
170
|
+
"layout": "page and edgeless dual modes + floating or resizable sidebars",
|
|
171
|
+
"bestFor": ["local-first editing", "multi-modal documents", "responsive sidebars"],
|
|
172
|
+
"detailReport": "research/productivity-collaboration.md"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"id": "penpot",
|
|
176
|
+
"name": "Penpot",
|
|
177
|
+
"repo": "https://github.com/penpot/penpot",
|
|
178
|
+
"category": "design-tool",
|
|
179
|
+
"starsApprox": 59000,
|
|
180
|
+
"license": "MPL-2.0",
|
|
181
|
+
"licenseClass": "weak-copyleft",
|
|
182
|
+
"frontend": ["ClojureScript", "React", "SCSS", "WebAssembly"],
|
|
183
|
+
"layout": "infinite canvas + left object/assets panels + right property inspector",
|
|
184
|
+
"bestFor": ["professional canvas tools", "native design tokens", "design-to-code handoff"],
|
|
185
|
+
"detailReport": "research/creative-ai-communication.md"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"id": "excalidraw",
|
|
189
|
+
"name": "Excalidraw",
|
|
190
|
+
"repo": "https://github.com/excalidraw/excalidraw",
|
|
191
|
+
"category": "whiteboard",
|
|
192
|
+
"starsApprox": 131000,
|
|
193
|
+
"license": "MIT",
|
|
194
|
+
"licenseClass": "open-source",
|
|
195
|
+
"frontend": ["React", "TypeScript", "SCSS", "Canvas", "Jotai"],
|
|
196
|
+
"layout": "full-screen canvas + floating tool islands + contextual properties",
|
|
197
|
+
"bestFor": ["low-learning-curve canvas", "context tools", "hand-drawn visual language"],
|
|
198
|
+
"detailReport": "research/creative-ai-communication.md"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "open-webui",
|
|
202
|
+
"name": "Open WebUI",
|
|
203
|
+
"repo": "https://github.com/open-webui/open-webui",
|
|
204
|
+
"category": "ai-workbench",
|
|
205
|
+
"starsApprox": 150000,
|
|
206
|
+
"license": "custom Open WebUI license with branding restrictions",
|
|
207
|
+
"licenseClass": "source-available-restricted",
|
|
208
|
+
"frontend": ["Svelte 5", "SvelteKit", "TypeScript", "Tailwind CSS 4"],
|
|
209
|
+
"layout": "conversation sidebar + single-column chat + model tool and RAG workspaces",
|
|
210
|
+
"bestFor": ["AI conversation IA", "UI text scaling", "progressive model and tool controls"],
|
|
211
|
+
"detailReport": "research/creative-ai-communication.md"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"id": "chatwoot",
|
|
215
|
+
"name": "Chatwoot",
|
|
216
|
+
"repo": "https://github.com/chatwoot/chatwoot",
|
|
217
|
+
"category": "customer-support",
|
|
218
|
+
"starsApprox": 36000,
|
|
219
|
+
"license": "MIT community code; separately licensed enterprise directory",
|
|
220
|
+
"licenseClass": "mixed",
|
|
221
|
+
"frontend": ["Vue 3", "Vite", "Tailwind CSS 3", "Pinia", "Vuex"],
|
|
222
|
+
"layout": "navigation + queue list + conversation + customer context",
|
|
223
|
+
"bestFor": ["dense master-detail workspaces", "real-time status", "support context"],
|
|
224
|
+
"detailReport": "research/creative-ai-communication.md"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"id": "mattermost",
|
|
228
|
+
"name": "Mattermost",
|
|
229
|
+
"repo": "https://github.com/mattermost/mattermost",
|
|
230
|
+
"category": "team-communication",
|
|
231
|
+
"starsApprox": 39000,
|
|
232
|
+
"license": "mixed repository and distribution licenses",
|
|
233
|
+
"licenseClass": "mixed",
|
|
234
|
+
"frontend": ["React 18", "TypeScript", "Redux", "SCSS"],
|
|
235
|
+
"layout": "team rail + channel sidebar + message stream + resizable thread panel",
|
|
236
|
+
"bestFor": ["complex collaboration UI", "themes", "thread context"],
|
|
237
|
+
"detailReport": "research/creative-ai-communication.md"
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"id": "hoppscotch",
|
|
241
|
+
"name": "Hoppscotch",
|
|
242
|
+
"repo": "https://github.com/hoppscotch/hoppscotch",
|
|
243
|
+
"category": "api-development",
|
|
244
|
+
"starsApprox": 80000,
|
|
245
|
+
"license": "MIT",
|
|
246
|
+
"licenseClass": "open-source",
|
|
247
|
+
"frontend": ["Vue 3", "TypeScript", "Vite", "Tailwind CSS 3", "RxJS"],
|
|
248
|
+
"layout": "protocol navigation + split request and response panes + collection sidebar",
|
|
249
|
+
"bestFor": ["API workflows", "resizable panes", "protocol-specific navigation"],
|
|
250
|
+
"detailReport": "research/creative-ai-communication.md"
|
|
251
|
+
}
|
|
252
|
+
]
|
|
253
|
+
}
|
package/template/workflows/specdev/P-prototype/design-library/research-snapshot/reference/USAGE.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# 可复用 UI 基线
|
|
2
|
+
|
|
3
|
+
`design-tokens.css` 是根据本研究的跨项目共性整理出的起点,不是任何单一产品的复制品。
|
|
4
|
+
|
|
5
|
+
## 推荐层级
|
|
6
|
+
|
|
7
|
+
1. **原始尺度**:字号、间距、圆角与中性色阶。
|
|
8
|
+
2. **语义 token**:`surface`、`text`、`border`、`accent`、`danger` 等角色。
|
|
9
|
+
3. **组件 token**:按钮高度、表格行高、侧栏宽度、弹层阴影。
|
|
10
|
+
4. **业务 token**:任务状态、数据库对象类型、图表序列等领域语义。
|
|
11
|
+
|
|
12
|
+
业务代码应尽量只消费第 2-4 层,不直接写颜色值。
|
|
13
|
+
|
|
14
|
+
## 初始密度建议
|
|
15
|
+
|
|
16
|
+
| 场景 | 正文字号 | 控件高度 | 表格行高 | 常用圆角 |
|
|
17
|
+
|---|---:|---:|---:|---:|
|
|
18
|
+
| 高密度开发/数据工具 | 13-14px | 28-32px | 32-36px | 4-6px |
|
|
19
|
+
| 通用业务后台 | 14px | 32-36px | 36-40px | 6-8px |
|
|
20
|
+
| 内容与协作产品 | 14-16px | 36-40px | 40-44px | 6-8px |
|
|
21
|
+
| 触屏优先界面 | 16px | 44-48px | 44-52px | 8-12px |
|
|
22
|
+
|
|
23
|
+
不要用缩小字体单独解决信息密度。优先减少重复标签、合并工具栏、使用渐进披露,并允许用户切换密度。
|
|
24
|
+
|
|
25
|
+
## 布局基线
|
|
26
|
+
|
|
27
|
+
- 全局图标栏:48-56px。
|
|
28
|
+
- 展开侧栏:224-272px。
|
|
29
|
+
- 顶栏:44-56px。
|
|
30
|
+
- 属性检查器:288-360px,并允许拖动调整。
|
|
31
|
+
- 阅读/表单内容:通常限制在 720-960px。
|
|
32
|
+
- 数据表格、画布和仪表盘:使用可用宽度,不套普通内容最大宽度。
|
|
33
|
+
|
|
34
|
+
## 使用前必须调整
|
|
35
|
+
|
|
36
|
+
- 根据品牌对比度替换 `accent`,同时校验浅色、深色和高对比状态。
|
|
37
|
+
- 根据目标输入设备选择控件高度;桌面鼠标密度不能直接用于移动触屏。
|
|
38
|
+
- 对中英文混排测试字体回退、行高、数字等宽和长文本截断。
|
|
39
|
+
- 为所有颜色状态增加非颜色线索,例如图标、文本或形状。
|
|
40
|
+
- 用真实数据验证最长名称、空值、大数字、错误信息和权限状态。
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Cross-project baseline synthesized by this research.
|
|
3
|
+
* These are recommendations, not copied tokens from any single product.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
:root {
|
|
7
|
+
color-scheme: light;
|
|
8
|
+
|
|
9
|
+
/* Typography */
|
|
10
|
+
--font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
11
|
+
--font-mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
|
|
12
|
+
--text-11: 0.6875rem;
|
|
13
|
+
--text-12: 0.75rem;
|
|
14
|
+
--text-13: 0.8125rem;
|
|
15
|
+
--text-14: 0.875rem;
|
|
16
|
+
--text-16: 1rem;
|
|
17
|
+
--text-18: 1.125rem;
|
|
18
|
+
--text-20: 1.25rem;
|
|
19
|
+
--text-24: 1.5rem;
|
|
20
|
+
--leading-tight: 1.25;
|
|
21
|
+
--leading-ui: 1.43;
|
|
22
|
+
--leading-body: 1.6;
|
|
23
|
+
|
|
24
|
+
/* Spacing: 4px base, with 2px for optical correction */
|
|
25
|
+
--space-0-5: 0.125rem;
|
|
26
|
+
--space-1: 0.25rem;
|
|
27
|
+
--space-1-5: 0.375rem;
|
|
28
|
+
--space-2: 0.5rem;
|
|
29
|
+
--space-3: 0.75rem;
|
|
30
|
+
--space-4: 1rem;
|
|
31
|
+
--space-5: 1.25rem;
|
|
32
|
+
--space-6: 1.5rem;
|
|
33
|
+
--space-8: 2rem;
|
|
34
|
+
--space-10: 2.5rem;
|
|
35
|
+
--space-12: 3rem;
|
|
36
|
+
|
|
37
|
+
/* Stable UI geometry */
|
|
38
|
+
--control-xs: 1.5rem;
|
|
39
|
+
--control-sm: 1.75rem;
|
|
40
|
+
--control-md: 2rem;
|
|
41
|
+
--control-lg: 2.5rem;
|
|
42
|
+
--icon-sm: 0.875rem;
|
|
43
|
+
--icon-md: 1rem;
|
|
44
|
+
--icon-lg: 1.25rem;
|
|
45
|
+
--sidebar-icon-width: 3.25rem;
|
|
46
|
+
--sidebar-width: 15rem;
|
|
47
|
+
--inspector-width: 20rem;
|
|
48
|
+
--topbar-height: 3rem;
|
|
49
|
+
--content-max: 80rem;
|
|
50
|
+
|
|
51
|
+
/* Radius: quiet for work surfaces, larger only for overlays */
|
|
52
|
+
--radius-xs: 0.125rem;
|
|
53
|
+
--radius-sm: 0.25rem;
|
|
54
|
+
--radius-md: 0.375rem;
|
|
55
|
+
--radius-lg: 0.5rem;
|
|
56
|
+
--radius-xl: 0.75rem;
|
|
57
|
+
--radius-pill: 999px;
|
|
58
|
+
|
|
59
|
+
/* Neutral and semantic color roles */
|
|
60
|
+
--canvas: #f7f8fa;
|
|
61
|
+
--surface-1: #ffffff;
|
|
62
|
+
--surface-2: #f1f3f5;
|
|
63
|
+
--surface-3: #e9ecef;
|
|
64
|
+
--overlay: #ffffff;
|
|
65
|
+
--text-primary: #1f2328;
|
|
66
|
+
--text-secondary: #59636e;
|
|
67
|
+
--text-tertiary: #7d8590;
|
|
68
|
+
--text-disabled: #a7afb8;
|
|
69
|
+
--border-subtle: #e2e6ea;
|
|
70
|
+
--border-default: #cbd1d7;
|
|
71
|
+
--border-strong: #9aa3ad;
|
|
72
|
+
|
|
73
|
+
--accent: #2563eb;
|
|
74
|
+
--accent-hover: #1d4ed8;
|
|
75
|
+
--accent-subtle: #eff6ff;
|
|
76
|
+
--accent-contrast: #ffffff;
|
|
77
|
+
--success: #16803c;
|
|
78
|
+
--success-subtle: #ecfdf3;
|
|
79
|
+
--warning: #a15c00;
|
|
80
|
+
--warning-subtle: #fff8e6;
|
|
81
|
+
--danger: #c62f3d;
|
|
82
|
+
--danger-hover: #a92330;
|
|
83
|
+
--danger-subtle: #fff0f1;
|
|
84
|
+
--info: #1267a8;
|
|
85
|
+
--info-subtle: #edf7ff;
|
|
86
|
+
|
|
87
|
+
--hover: rgb(31 35 40 / 5%);
|
|
88
|
+
--selected: rgb(37 99 235 / 10%);
|
|
89
|
+
--pressed: rgb(31 35 40 / 10%);
|
|
90
|
+
--scrim: rgb(15 23 42 / 40%);
|
|
91
|
+
--focus-ring: 0 0 0 3px rgb(37 99 235 / 25%);
|
|
92
|
+
--shadow-popover: 0 8px 24px rgb(15 23 42 / 12%), 0 2px 6px rgb(15 23 42 / 8%);
|
|
93
|
+
--shadow-dialog: 0 20px 48px rgb(15 23 42 / 18%), 0 4px 12px rgb(15 23 42 / 10%);
|
|
94
|
+
|
|
95
|
+
--duration-fast: 100ms;
|
|
96
|
+
--duration-ui: 160ms;
|
|
97
|
+
--duration-panel: 220ms;
|
|
98
|
+
--ease-standard: cubic-bezier(0.2, 0, 0, 1);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
[data-theme="dark"] {
|
|
102
|
+
color-scheme: dark;
|
|
103
|
+
--canvas: #111315;
|
|
104
|
+
--surface-1: #181b1f;
|
|
105
|
+
--surface-2: #202429;
|
|
106
|
+
--surface-3: #292e34;
|
|
107
|
+
--overlay: #202429;
|
|
108
|
+
--text-primary: #f0f3f6;
|
|
109
|
+
--text-secondary: #b7c0ca;
|
|
110
|
+
--text-tertiary: #8c97a3;
|
|
111
|
+
--text-disabled: #626d78;
|
|
112
|
+
--border-subtle: #2d333b;
|
|
113
|
+
--border-default: #444c56;
|
|
114
|
+
--border-strong: #636e7b;
|
|
115
|
+
|
|
116
|
+
--accent: #6ea8fe;
|
|
117
|
+
--accent-hover: #91bdff;
|
|
118
|
+
--accent-subtle: #172a46;
|
|
119
|
+
--accent-contrast: #0f172a;
|
|
120
|
+
--success: #57c779;
|
|
121
|
+
--success-subtle: #173322;
|
|
122
|
+
--warning: #e3a438;
|
|
123
|
+
--warning-subtle: #382a13;
|
|
124
|
+
--danger: #ff7b86;
|
|
125
|
+
--danger-hover: #ff9aa3;
|
|
126
|
+
--danger-subtle: #3d1c21;
|
|
127
|
+
--info: #62b7ee;
|
|
128
|
+
--info-subtle: #152e3f;
|
|
129
|
+
|
|
130
|
+
--hover: rgb(255 255 255 / 6%);
|
|
131
|
+
--selected: rgb(110 168 254 / 14%);
|
|
132
|
+
--pressed: rgb(255 255 255 / 11%);
|
|
133
|
+
--scrim: rgb(0 0 0 / 60%);
|
|
134
|
+
--focus-ring: 0 0 0 3px rgb(110 168 254 / 30%);
|
|
135
|
+
--shadow-popover: 0 10px 30px rgb(0 0 0 / 38%), 0 2px 8px rgb(0 0 0 / 28%);
|
|
136
|
+
--shadow-dialog: 0 24px 56px rgb(0 0 0 / 48%), 0 4px 16px rgb(0 0 0 / 34%);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@media (prefers-reduced-motion: reduce) {
|
|
140
|
+
:root {
|
|
141
|
+
--duration-fast: 0ms;
|
|
142
|
+
--duration-ui: 0ms;
|
|
143
|
+
--duration-panel: 0ms;
|
|
144
|
+
}
|
|
145
|
+
}
|