standby-design-mcp 0.1.3 → 0.1.5
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/LICENSE +21 -21
- package/dist/http.js +37 -25
- package/dist/index.js +37 -25
- package/package.json +53 -53
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Karsten Kreh
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Karsten Kreh
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/http.js
CHANGED
|
@@ -2091,6 +2091,7 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2091
2091
|
...brandContrastWarnLight,
|
|
2092
2092
|
["primary-subtle", "brand", 100],
|
|
2093
2093
|
["primary-subtle-foreground", "brand", 950],
|
|
2094
|
+
["primary-emphasis", "brand", 700],
|
|
2094
2095
|
[null, null, "Secondary \u2014 softened brand"],
|
|
2095
2096
|
["secondary", "brand", 200],
|
|
2096
2097
|
["secondary-foreground", "brand", fgStep(brandMap[200]?.hex, brandMap, 100, 900, fgMode)],
|
|
@@ -2105,6 +2106,7 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2105
2106
|
destFgLight,
|
|
2106
2107
|
["destructive-subtle", "error", 100],
|
|
2107
2108
|
["destructive-subtle-foreground", "error", 950],
|
|
2109
|
+
["destructive-emphasis", "error", 700],
|
|
2108
2110
|
["destructive-border", "error-surface", 300],
|
|
2109
2111
|
[null, null, "Border / Input / Ring"],
|
|
2110
2112
|
["border", "surface", 300],
|
|
@@ -2137,6 +2139,7 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2137
2139
|
...brandContrastWarnDark,
|
|
2138
2140
|
["primary-subtle", "brand", 850],
|
|
2139
2141
|
["primary-subtle-foreground", "brand", 50],
|
|
2142
|
+
["primary-emphasis", "brand", 300],
|
|
2140
2143
|
[null, null, "Secondary \u2014 softened brand"],
|
|
2141
2144
|
["secondary", "brand", 800],
|
|
2142
2145
|
["secondary-foreground", "brand", fgStep(brandMap[800]?.hex, brandMap, 100, 900, fgMode)],
|
|
@@ -2144,26 +2147,27 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2144
2147
|
["muted", "surface", 850],
|
|
2145
2148
|
["muted-foreground", "surface", 300],
|
|
2146
2149
|
[null, null, "Accent"],
|
|
2147
|
-
["accent", "brand",
|
|
2148
|
-
["accent-foreground", "brand", fgStep(brandMap[
|
|
2150
|
+
["accent", "brand", 850],
|
|
2151
|
+
["accent-foreground", "brand", fgStep(brandMap[850]?.hex, brandMap, 50, 950, fgMode)],
|
|
2149
2152
|
[null, null, "Destructive"],
|
|
2150
2153
|
destDark,
|
|
2151
2154
|
destFgDark,
|
|
2152
2155
|
["destructive-subtle", "error", 850],
|
|
2153
2156
|
["destructive-subtle-foreground", "error", 50],
|
|
2157
|
+
["destructive-emphasis", "error", 300],
|
|
2154
2158
|
["destructive-border", "error-surface", 700],
|
|
2155
2159
|
[null, null, "Border / Input / Ring"],
|
|
2156
2160
|
["border", "surface", 600],
|
|
2157
2161
|
["border-muted", "surface", 700],
|
|
2158
|
-
["input", "surface",
|
|
2162
|
+
["input", "surface", 600],
|
|
2159
2163
|
["ring", "surface", 500],
|
|
2160
2164
|
[null, null, "Sidebar"],
|
|
2161
|
-
["sidebar", "surface",
|
|
2165
|
+
["sidebar", "surface", 825],
|
|
2162
2166
|
["sidebar-foreground", "surface", 25],
|
|
2163
2167
|
sbPrimDark,
|
|
2164
2168
|
sbPrimFgDark,
|
|
2165
|
-
["sidebar-accent", "brand",
|
|
2166
|
-
["sidebar-accent-foreground", "brand", fgStep(brandMap[
|
|
2169
|
+
["sidebar-accent", "brand", 850],
|
|
2170
|
+
["sidebar-accent-foreground", "brand", fgStep(brandMap[850]?.hex, brandMap, 50, 950, fgMode)],
|
|
2167
2171
|
["sidebar-border", "surface", 600],
|
|
2168
2172
|
["sidebar-ring", "surface", 500]
|
|
2169
2173
|
]);
|
|
@@ -2196,14 +2200,15 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2196
2200
|
[`${n}-popover-foreground`, `${n}-surface`, 975],
|
|
2197
2201
|
[null, null, "Secondary"],
|
|
2198
2202
|
[`${n}-secondary`, n, 200],
|
|
2199
|
-
[`${n}-secondary-foreground`, n, 900],
|
|
2203
|
+
[`${n}-secondary-foreground`, n, fgStep(aMap[200]?.hex, aMap, 100, 900, fgMode)],
|
|
2200
2204
|
[null, null, "Muted / Subtle / Accent"],
|
|
2201
2205
|
[`${n}-muted`, `${n}-surface`, 75],
|
|
2202
2206
|
[`${n}-muted-foreground`, `${n}-surface`, 700],
|
|
2203
2207
|
[`${n}-accent`, n, 100],
|
|
2204
|
-
[`${n}-accent-foreground`, n, 950],
|
|
2208
|
+
[`${n}-accent-foreground`, n, fgStep(aMap[100]?.hex, aMap, 50, 950, fgMode)],
|
|
2205
2209
|
[`${n}-subtle`, n, 100],
|
|
2206
2210
|
[`${n}-subtle-foreground`, n, 950],
|
|
2211
|
+
[`${n}-emphasis`, n, 700],
|
|
2207
2212
|
[null, null, "Border / Input / Ring"],
|
|
2208
2213
|
[`${n}-border`, `${n}-surface`, 300],
|
|
2209
2214
|
[`${n}-border-muted`, `${n}-surface`, 200],
|
|
@@ -2223,18 +2228,19 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2223
2228
|
[`${n}-popover-foreground`, `${n}-surface`, 25],
|
|
2224
2229
|
[null, null, "Secondary"],
|
|
2225
2230
|
[`${n}-secondary`, n, 800],
|
|
2226
|
-
[`${n}-secondary-foreground`, n, 100],
|
|
2231
|
+
[`${n}-secondary-foreground`, n, fgStep(aMap[800]?.hex, aMap, 100, 900, fgMode)],
|
|
2227
2232
|
[null, null, "Muted / Subtle / Accent"],
|
|
2228
2233
|
[`${n}-muted`, `${n}-surface`, 850],
|
|
2229
2234
|
[`${n}-muted-foreground`, `${n}-surface`, 300],
|
|
2230
|
-
[`${n}-accent`, n,
|
|
2231
|
-
[`${n}-accent-foreground`, n, 50],
|
|
2235
|
+
[`${n}-accent`, n, 850],
|
|
2236
|
+
[`${n}-accent-foreground`, n, fgStep(aMap[850]?.hex, aMap, 50, 950, fgMode)],
|
|
2232
2237
|
[`${n}-subtle`, n, 850],
|
|
2233
2238
|
[`${n}-subtle-foreground`, n, 50],
|
|
2239
|
+
[`${n}-emphasis`, n, 300],
|
|
2234
2240
|
[null, null, "Border / Input / Ring"],
|
|
2235
|
-
[`${n}-border`, `${n}-surface`,
|
|
2241
|
+
[`${n}-border`, `${n}-surface`, 600],
|
|
2236
2242
|
[`${n}-border-muted`, `${n}-surface`, 700],
|
|
2237
|
-
[`${n}-input`, `${n}-surface`,
|
|
2243
|
+
[`${n}-input`, `${n}-surface`, 600],
|
|
2238
2244
|
[`${n}-ring`, `${n}-surface`, 500]
|
|
2239
2245
|
]);
|
|
2240
2246
|
accentBlocks += `
|
|
@@ -2260,7 +2266,7 @@ function generateLlmBriefing(brandHex, effectiveBgHex, effectiveErrorHex, accent
|
|
|
2260
2266
|
)
|
|
2261
2267
|
].join("\n");
|
|
2262
2268
|
const pinnedNote = brandPin || errorPin || accentPalettes.some((a) => a.pin) ? `
|
|
2263
|
-
> **Pinned** means the exact input hex is used
|
|
2269
|
+
> **Pinned** means the exact input hex is used instead of the generated palette step \u2014 for the primary (\`brand-600/400\`), destructive (\`error-600/400\`), or accent (\`{accent}-600/400\`) role of that color.
|
|
2264
2270
|
` : "";
|
|
2265
2271
|
let pinnedContrastWarning = "";
|
|
2266
2272
|
if (brandPin) {
|
|
@@ -2288,41 +2294,44 @@ ${pinnedNote}${pinnedContrastWarning}
|
|
|
2288
2294
|
| \`--popover\` | surface-25 | surface-800 | Popover/dropdown |
|
|
2289
2295
|
| \`--primary\` | brand-600 | brand-400 | Primary buttons, links |
|
|
2290
2296
|
| \`--primary-subtle\` | brand-100 | brand-850 | Tinted brand fills: callouts, selected items |
|
|
2297
|
+
| \`--primary-emphasis\` | brand-700 | brand-300 | Brand-colored text, links, icons on background |
|
|
2291
2298
|
| \`--secondary\` | brand-200 | brand-800 | Secondary buttons |
|
|
2292
2299
|
| \`--muted\` | surface-75 | surface-850 | Muted backgrounds |
|
|
2293
|
-
| \`--accent\` | brand-100 | brand-
|
|
2300
|
+
| \`--accent\` | brand-100 | brand-850 | Interaction highlights (hover, selected) |
|
|
2294
2301
|
| \`--destructive\` | error-600 | error-400 | Error/delete actions |
|
|
2295
2302
|
| \`--destructive-subtle\` | error-100 | error-850 | Inline errors, alert backgrounds |
|
|
2303
|
+
| \`--destructive-emphasis\` | error-700 | error-300 | Error text and icons on background |
|
|
2296
2304
|
| \`--destructive-border\` | error-surface-300 | error-surface-700 | Error borders |
|
|
2297
2305
|
| \`--border\` | surface-300 | surface-600 | Default borders |
|
|
2298
2306
|
| \`--border-muted\` | surface-200 | surface-700 | Subtle separators |
|
|
2299
|
-
| \`--input\` | surface-300 | surface-
|
|
2307
|
+
| \`--input\` | surface-300 | surface-600 | Form-control borders (input, select, textarea) |
|
|
2300
2308
|
| \`--ring\` | surface-400 | surface-500 | Focus rings |
|
|
2301
2309
|
|
|
2302
2310
|
### Sidebar
|
|
2303
2311
|
|
|
2304
2312
|
| Token | Light | Dark |
|
|
2305
2313
|
|-------|-------|------|
|
|
2306
|
-
| \`--sidebar\` | surface-25 | surface-
|
|
2314
|
+
| \`--sidebar\` | surface-25 | surface-825 |
|
|
2307
2315
|
| \`--sidebar-primary\` | brand-600 | brand-400 |
|
|
2308
|
-
| \`--sidebar-accent\` | brand-100 | brand-
|
|
2316
|
+
| \`--sidebar-accent\` | brand-100 | brand-850 |
|
|
2309
2317
|
| \`--sidebar-border\` | surface-300 | surface-600 |
|
|
2318
|
+
| \`--sidebar-ring\` | surface-400 | surface-500 |
|
|
2310
2319
|
|
|
2311
2320
|
Every background token has a matching \`*-foreground\` counterpart. Always pair them.
|
|
2312
2321
|
${accentPalettes.length > 0 ? `
|
|
2313
2322
|
### Accent Scopes
|
|
2314
2323
|
|
|
2315
2324
|
Each accent color provides a full semantic scope:
|
|
2316
|
-
${accentPalettes.map((a) => `- **${a.name}** (\`--${a.cssName}\`): \`-foreground\`, \`-background\`, \`-card\`, \`-popover\`, \`-secondary\`, \`-muted\`, \`-accent\`, \`-subtle\`, \`-border\`, \`-border-muted\`, \`-input\`, \`-ring\` \u2014 each with light/dark variants.`).join("\n")}
|
|
2325
|
+
${accentPalettes.map((a) => `- **${a.name}** (\`--${a.cssName}\`): \`-foreground\`, \`-background\`, \`-card\`, \`-popover\`, \`-secondary\`, \`-muted\`, \`-accent\`, \`-subtle\`, \`-emphasis\`, \`-border\`, \`-border-muted\`, \`-input\`, \`-ring\` \u2014 each with light/dark variants.`).join("\n")}
|
|
2317
2326
|
` : ""}
|
|
2318
2327
|
## How to Use
|
|
2319
2328
|
|
|
2320
2329
|
1. **Use semantic tokens** (\`--primary\`, \`--background\`, etc.) in component code \u2014 never reference primitive step numbers directly.
|
|
2321
|
-
2. **Tailwind**:
|
|
2330
|
+
2. **Tailwind v4**: The export ships plain CSS custom properties. To get utilities like \`bg-primary\` or \`text-foreground\`, map the variables once via \`@theme inline { --color-primary: var(--primary); \u2026 }\` \u2014 see tailwindcss.com/docs/theme.
|
|
2322
2331
|
3. **Dark mode**: Add \`.dark\` to \`<html>\` or a container. All semantic tokens remap automatically.
|
|
2323
2332
|
4. **Borders**: Default to \`--border-muted\` for subtle separation (dividers, table rows). Use \`--border\` for visible borders (cards, panels). Form controls (\`input\`, \`select\`, \`textarea\`) always use \`--input\` \u2014 never \`--border\`.
|
|
2324
|
-
5. **
|
|
2325
|
-
6. **
|
|
2333
|
+
5. **Colored text**: For links, icons, and indicators placed directly on \`--background\` or \`--card\`, use \`--primary-emphasis\` / \`--destructive-emphasis\` / \`--{name}-emphasis\` \u2014 never the button colors (\`--primary\`, 600/400 steps), which may lack text contrast there.
|
|
2334
|
+
6. **Shadows and radii**: see standby.design/shape for hue-matched shadow tokens and border-radius scales.
|
|
2326
2335
|
|
|
2327
2336
|
## Primitive Scale Reference
|
|
2328
2337
|
|
|
@@ -2332,10 +2341,13 @@ Each color uses an 18-step scale: **25, 50, 75, 100, 200\u2013800, 825, 850, 875
|
|
|
2332
2341
|
- **200\u2013800** \u2014 core palette (buttons, text, accents)
|
|
2333
2342
|
- **825\u2013875** \u2014 dark-mode surfaces
|
|
2334
2343
|
- **900\u2013975** \u2014 high-contrast surfaces
|
|
2344
|
+
- **0 / 1000** \u2014 neutral only: pure white and pure black endpoints (\`--color-neutral-0\`, \`--color-neutral-1000\`)
|
|
2335
2345
|
|
|
2336
|
-
|
|
2346
|
+
Chroma variants:
|
|
2337
2347
|
- \`--color-{name}-{step}\` \u2014 full chroma (interactive elements)
|
|
2338
|
-
- \`--color-
|
|
2348
|
+
- \`--color-surface-{step}\` \u2014 the brand's ${pct}%-chroma counterpart (backgrounds, containers)
|
|
2349
|
+
- \`--color-error-surface-{step}\` and \`--color-{accent}-surface-{step}\` \u2014 reduced-chroma twins for error and extra accents
|
|
2350
|
+
- \`--color-neutral-{step}\` \u2014 0% chroma, no surface twin
|
|
2339
2351
|
|
|
2340
2352
|
## Settings
|
|
2341
2353
|
|
|
@@ -3454,7 +3466,7 @@ ${output}`);
|
|
|
3454
3466
|
}
|
|
3455
3467
|
|
|
3456
3468
|
// src/server.ts
|
|
3457
|
-
var SERVER_VERSION = "0.1.
|
|
3469
|
+
var SERVER_VERSION = "0.1.5";
|
|
3458
3470
|
function createServer() {
|
|
3459
3471
|
const server = new McpServer(
|
|
3460
3472
|
{ name: "standby-design", version: SERVER_VERSION },
|
package/dist/index.js
CHANGED
|
@@ -2090,6 +2090,7 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2090
2090
|
...brandContrastWarnLight,
|
|
2091
2091
|
["primary-subtle", "brand", 100],
|
|
2092
2092
|
["primary-subtle-foreground", "brand", 950],
|
|
2093
|
+
["primary-emphasis", "brand", 700],
|
|
2093
2094
|
[null, null, "Secondary \u2014 softened brand"],
|
|
2094
2095
|
["secondary", "brand", 200],
|
|
2095
2096
|
["secondary-foreground", "brand", fgStep(brandMap[200]?.hex, brandMap, 100, 900, fgMode)],
|
|
@@ -2104,6 +2105,7 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2104
2105
|
destFgLight,
|
|
2105
2106
|
["destructive-subtle", "error", 100],
|
|
2106
2107
|
["destructive-subtle-foreground", "error", 950],
|
|
2108
|
+
["destructive-emphasis", "error", 700],
|
|
2107
2109
|
["destructive-border", "error-surface", 300],
|
|
2108
2110
|
[null, null, "Border / Input / Ring"],
|
|
2109
2111
|
["border", "surface", 300],
|
|
@@ -2136,6 +2138,7 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2136
2138
|
...brandContrastWarnDark,
|
|
2137
2139
|
["primary-subtle", "brand", 850],
|
|
2138
2140
|
["primary-subtle-foreground", "brand", 50],
|
|
2141
|
+
["primary-emphasis", "brand", 300],
|
|
2139
2142
|
[null, null, "Secondary \u2014 softened brand"],
|
|
2140
2143
|
["secondary", "brand", 800],
|
|
2141
2144
|
["secondary-foreground", "brand", fgStep(brandMap[800]?.hex, brandMap, 100, 900, fgMode)],
|
|
@@ -2143,26 +2146,27 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2143
2146
|
["muted", "surface", 850],
|
|
2144
2147
|
["muted-foreground", "surface", 300],
|
|
2145
2148
|
[null, null, "Accent"],
|
|
2146
|
-
["accent", "brand",
|
|
2147
|
-
["accent-foreground", "brand", fgStep(brandMap[
|
|
2149
|
+
["accent", "brand", 850],
|
|
2150
|
+
["accent-foreground", "brand", fgStep(brandMap[850]?.hex, brandMap, 50, 950, fgMode)],
|
|
2148
2151
|
[null, null, "Destructive"],
|
|
2149
2152
|
destDark,
|
|
2150
2153
|
destFgDark,
|
|
2151
2154
|
["destructive-subtle", "error", 850],
|
|
2152
2155
|
["destructive-subtle-foreground", "error", 50],
|
|
2156
|
+
["destructive-emphasis", "error", 300],
|
|
2153
2157
|
["destructive-border", "error-surface", 700],
|
|
2154
2158
|
[null, null, "Border / Input / Ring"],
|
|
2155
2159
|
["border", "surface", 600],
|
|
2156
2160
|
["border-muted", "surface", 700],
|
|
2157
|
-
["input", "surface",
|
|
2161
|
+
["input", "surface", 600],
|
|
2158
2162
|
["ring", "surface", 500],
|
|
2159
2163
|
[null, null, "Sidebar"],
|
|
2160
|
-
["sidebar", "surface",
|
|
2164
|
+
["sidebar", "surface", 825],
|
|
2161
2165
|
["sidebar-foreground", "surface", 25],
|
|
2162
2166
|
sbPrimDark,
|
|
2163
2167
|
sbPrimFgDark,
|
|
2164
|
-
["sidebar-accent", "brand",
|
|
2165
|
-
["sidebar-accent-foreground", "brand", fgStep(brandMap[
|
|
2168
|
+
["sidebar-accent", "brand", 850],
|
|
2169
|
+
["sidebar-accent-foreground", "brand", fgStep(brandMap[850]?.hex, brandMap, 50, 950, fgMode)],
|
|
2166
2170
|
["sidebar-border", "surface", 600],
|
|
2167
2171
|
["sidebar-ring", "surface", 500]
|
|
2168
2172
|
]);
|
|
@@ -2195,14 +2199,15 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2195
2199
|
[`${n}-popover-foreground`, `${n}-surface`, 975],
|
|
2196
2200
|
[null, null, "Secondary"],
|
|
2197
2201
|
[`${n}-secondary`, n, 200],
|
|
2198
|
-
[`${n}-secondary-foreground`, n, 900],
|
|
2202
|
+
[`${n}-secondary-foreground`, n, fgStep(aMap[200]?.hex, aMap, 100, 900, fgMode)],
|
|
2199
2203
|
[null, null, "Muted / Subtle / Accent"],
|
|
2200
2204
|
[`${n}-muted`, `${n}-surface`, 75],
|
|
2201
2205
|
[`${n}-muted-foreground`, `${n}-surface`, 700],
|
|
2202
2206
|
[`${n}-accent`, n, 100],
|
|
2203
|
-
[`${n}-accent-foreground`, n, 950],
|
|
2207
|
+
[`${n}-accent-foreground`, n, fgStep(aMap[100]?.hex, aMap, 50, 950, fgMode)],
|
|
2204
2208
|
[`${n}-subtle`, n, 100],
|
|
2205
2209
|
[`${n}-subtle-foreground`, n, 950],
|
|
2210
|
+
[`${n}-emphasis`, n, 700],
|
|
2206
2211
|
[null, null, "Border / Input / Ring"],
|
|
2207
2212
|
[`${n}-border`, `${n}-surface`, 300],
|
|
2208
2213
|
[`${n}-border-muted`, `${n}-surface`, 200],
|
|
@@ -2222,18 +2227,19 @@ function generateSemantic(accentPalettes, brandPal, errPal, errSurfPal, surfaceP
|
|
|
2222
2227
|
[`${n}-popover-foreground`, `${n}-surface`, 25],
|
|
2223
2228
|
[null, null, "Secondary"],
|
|
2224
2229
|
[`${n}-secondary`, n, 800],
|
|
2225
|
-
[`${n}-secondary-foreground`, n, 100],
|
|
2230
|
+
[`${n}-secondary-foreground`, n, fgStep(aMap[800]?.hex, aMap, 100, 900, fgMode)],
|
|
2226
2231
|
[null, null, "Muted / Subtle / Accent"],
|
|
2227
2232
|
[`${n}-muted`, `${n}-surface`, 850],
|
|
2228
2233
|
[`${n}-muted-foreground`, `${n}-surface`, 300],
|
|
2229
|
-
[`${n}-accent`, n,
|
|
2230
|
-
[`${n}-accent-foreground`, n, 50],
|
|
2234
|
+
[`${n}-accent`, n, 850],
|
|
2235
|
+
[`${n}-accent-foreground`, n, fgStep(aMap[850]?.hex, aMap, 50, 950, fgMode)],
|
|
2231
2236
|
[`${n}-subtle`, n, 850],
|
|
2232
2237
|
[`${n}-subtle-foreground`, n, 50],
|
|
2238
|
+
[`${n}-emphasis`, n, 300],
|
|
2233
2239
|
[null, null, "Border / Input / Ring"],
|
|
2234
|
-
[`${n}-border`, `${n}-surface`,
|
|
2240
|
+
[`${n}-border`, `${n}-surface`, 600],
|
|
2235
2241
|
[`${n}-border-muted`, `${n}-surface`, 700],
|
|
2236
|
-
[`${n}-input`, `${n}-surface`,
|
|
2242
|
+
[`${n}-input`, `${n}-surface`, 600],
|
|
2237
2243
|
[`${n}-ring`, `${n}-surface`, 500]
|
|
2238
2244
|
]);
|
|
2239
2245
|
accentBlocks += `
|
|
@@ -2259,7 +2265,7 @@ function generateLlmBriefing(brandHex, effectiveBgHex, effectiveErrorHex, accent
|
|
|
2259
2265
|
)
|
|
2260
2266
|
].join("\n");
|
|
2261
2267
|
const pinnedNote = brandPin || errorPin || accentPalettes.some((a) => a.pin) ? `
|
|
2262
|
-
> **Pinned** means the exact input hex is used
|
|
2268
|
+
> **Pinned** means the exact input hex is used instead of the generated palette step \u2014 for the primary (\`brand-600/400\`), destructive (\`error-600/400\`), or accent (\`{accent}-600/400\`) role of that color.
|
|
2263
2269
|
` : "";
|
|
2264
2270
|
let pinnedContrastWarning = "";
|
|
2265
2271
|
if (brandPin) {
|
|
@@ -2287,41 +2293,44 @@ ${pinnedNote}${pinnedContrastWarning}
|
|
|
2287
2293
|
| \`--popover\` | surface-25 | surface-800 | Popover/dropdown |
|
|
2288
2294
|
| \`--primary\` | brand-600 | brand-400 | Primary buttons, links |
|
|
2289
2295
|
| \`--primary-subtle\` | brand-100 | brand-850 | Tinted brand fills: callouts, selected items |
|
|
2296
|
+
| \`--primary-emphasis\` | brand-700 | brand-300 | Brand-colored text, links, icons on background |
|
|
2290
2297
|
| \`--secondary\` | brand-200 | brand-800 | Secondary buttons |
|
|
2291
2298
|
| \`--muted\` | surface-75 | surface-850 | Muted backgrounds |
|
|
2292
|
-
| \`--accent\` | brand-100 | brand-
|
|
2299
|
+
| \`--accent\` | brand-100 | brand-850 | Interaction highlights (hover, selected) |
|
|
2293
2300
|
| \`--destructive\` | error-600 | error-400 | Error/delete actions |
|
|
2294
2301
|
| \`--destructive-subtle\` | error-100 | error-850 | Inline errors, alert backgrounds |
|
|
2302
|
+
| \`--destructive-emphasis\` | error-700 | error-300 | Error text and icons on background |
|
|
2295
2303
|
| \`--destructive-border\` | error-surface-300 | error-surface-700 | Error borders |
|
|
2296
2304
|
| \`--border\` | surface-300 | surface-600 | Default borders |
|
|
2297
2305
|
| \`--border-muted\` | surface-200 | surface-700 | Subtle separators |
|
|
2298
|
-
| \`--input\` | surface-300 | surface-
|
|
2306
|
+
| \`--input\` | surface-300 | surface-600 | Form-control borders (input, select, textarea) |
|
|
2299
2307
|
| \`--ring\` | surface-400 | surface-500 | Focus rings |
|
|
2300
2308
|
|
|
2301
2309
|
### Sidebar
|
|
2302
2310
|
|
|
2303
2311
|
| Token | Light | Dark |
|
|
2304
2312
|
|-------|-------|------|
|
|
2305
|
-
| \`--sidebar\` | surface-25 | surface-
|
|
2313
|
+
| \`--sidebar\` | surface-25 | surface-825 |
|
|
2306
2314
|
| \`--sidebar-primary\` | brand-600 | brand-400 |
|
|
2307
|
-
| \`--sidebar-accent\` | brand-100 | brand-
|
|
2315
|
+
| \`--sidebar-accent\` | brand-100 | brand-850 |
|
|
2308
2316
|
| \`--sidebar-border\` | surface-300 | surface-600 |
|
|
2317
|
+
| \`--sidebar-ring\` | surface-400 | surface-500 |
|
|
2309
2318
|
|
|
2310
2319
|
Every background token has a matching \`*-foreground\` counterpart. Always pair them.
|
|
2311
2320
|
${accentPalettes.length > 0 ? `
|
|
2312
2321
|
### Accent Scopes
|
|
2313
2322
|
|
|
2314
2323
|
Each accent color provides a full semantic scope:
|
|
2315
|
-
${accentPalettes.map((a) => `- **${a.name}** (\`--${a.cssName}\`): \`-foreground\`, \`-background\`, \`-card\`, \`-popover\`, \`-secondary\`, \`-muted\`, \`-accent\`, \`-subtle\`, \`-border\`, \`-border-muted\`, \`-input\`, \`-ring\` \u2014 each with light/dark variants.`).join("\n")}
|
|
2324
|
+
${accentPalettes.map((a) => `- **${a.name}** (\`--${a.cssName}\`): \`-foreground\`, \`-background\`, \`-card\`, \`-popover\`, \`-secondary\`, \`-muted\`, \`-accent\`, \`-subtle\`, \`-emphasis\`, \`-border\`, \`-border-muted\`, \`-input\`, \`-ring\` \u2014 each with light/dark variants.`).join("\n")}
|
|
2316
2325
|
` : ""}
|
|
2317
2326
|
## How to Use
|
|
2318
2327
|
|
|
2319
2328
|
1. **Use semantic tokens** (\`--primary\`, \`--background\`, etc.) in component code \u2014 never reference primitive step numbers directly.
|
|
2320
|
-
2. **Tailwind**:
|
|
2329
|
+
2. **Tailwind v4**: The export ships plain CSS custom properties. To get utilities like \`bg-primary\` or \`text-foreground\`, map the variables once via \`@theme inline { --color-primary: var(--primary); \u2026 }\` \u2014 see tailwindcss.com/docs/theme.
|
|
2321
2330
|
3. **Dark mode**: Add \`.dark\` to \`<html>\` or a container. All semantic tokens remap automatically.
|
|
2322
2331
|
4. **Borders**: Default to \`--border-muted\` for subtle separation (dividers, table rows). Use \`--border\` for visible borders (cards, panels). Form controls (\`input\`, \`select\`, \`textarea\`) always use \`--input\` \u2014 never \`--border\`.
|
|
2323
|
-
5. **
|
|
2324
|
-
6. **
|
|
2332
|
+
5. **Colored text**: For links, icons, and indicators placed directly on \`--background\` or \`--card\`, use \`--primary-emphasis\` / \`--destructive-emphasis\` / \`--{name}-emphasis\` \u2014 never the button colors (\`--primary\`, 600/400 steps), which may lack text contrast there.
|
|
2333
|
+
6. **Shadows and radii**: see standby.design/shape for hue-matched shadow tokens and border-radius scales.
|
|
2325
2334
|
|
|
2326
2335
|
## Primitive Scale Reference
|
|
2327
2336
|
|
|
@@ -2331,10 +2340,13 @@ Each color uses an 18-step scale: **25, 50, 75, 100, 200\u2013800, 825, 850, 875
|
|
|
2331
2340
|
- **200\u2013800** \u2014 core palette (buttons, text, accents)
|
|
2332
2341
|
- **825\u2013875** \u2014 dark-mode surfaces
|
|
2333
2342
|
- **900\u2013975** \u2014 high-contrast surfaces
|
|
2343
|
+
- **0 / 1000** \u2014 neutral only: pure white and pure black endpoints (\`--color-neutral-0\`, \`--color-neutral-1000\`)
|
|
2334
2344
|
|
|
2335
|
-
|
|
2345
|
+
Chroma variants:
|
|
2336
2346
|
- \`--color-{name}-{step}\` \u2014 full chroma (interactive elements)
|
|
2337
|
-
- \`--color-
|
|
2347
|
+
- \`--color-surface-{step}\` \u2014 the brand's ${pct}%-chroma counterpart (backgrounds, containers)
|
|
2348
|
+
- \`--color-error-surface-{step}\` and \`--color-{accent}-surface-{step}\` \u2014 reduced-chroma twins for error and extra accents
|
|
2349
|
+
- \`--color-neutral-{step}\` \u2014 0% chroma, no surface twin
|
|
2338
2350
|
|
|
2339
2351
|
## Settings
|
|
2340
2352
|
|
|
@@ -3453,7 +3465,7 @@ ${output}`);
|
|
|
3453
3465
|
}
|
|
3454
3466
|
|
|
3455
3467
|
// src/server.ts
|
|
3456
|
-
var SERVER_VERSION = "0.1.
|
|
3468
|
+
var SERVER_VERSION = "0.1.5";
|
|
3457
3469
|
function createServer() {
|
|
3458
3470
|
const server2 = new McpServer(
|
|
3459
3471
|
{ name: "standby-design", version: SERVER_VERSION },
|
package/package.json
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "standby-design-mcp",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"mcpName": "io.github.KarstenKreh/standby-design-mcp",
|
|
5
|
-
"description": "MCP server for standby.design — generate production-ready design systems (OKLCH color palettes, fluid type scales, spacing & layout, shape and icon tokens) and export them as CSS, Tailwind v4, or W3C design tokens. Every result links back to the standby.design web UI for visual fine-tuning.",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"homepage": "https://standby.design",
|
|
9
|
-
"repository": {
|
|
10
|
-
"type": "git",
|
|
11
|
-
"url": "git+https://github.com/KarstenKreh/Standby.Design.git",
|
|
12
|
-
"directory": "packages/mcp-server"
|
|
13
|
-
},
|
|
14
|
-
"bugs": {
|
|
15
|
-
"url": "https://github.com/KarstenKreh/Standby.Design/issues"
|
|
16
|
-
},
|
|
17
|
-
"bin": {
|
|
18
|
-
"standby-design-mcp": "./dist/index.js"
|
|
19
|
-
},
|
|
20
|
-
"files": [
|
|
21
|
-
"dist"
|
|
22
|
-
],
|
|
23
|
-
"engines": {
|
|
24
|
-
"node": ">=18"
|
|
25
|
-
},
|
|
26
|
-
"scripts": {
|
|
27
|
-
"build": "node build.mjs",
|
|
28
|
-
"prepublishOnly": "node build.mjs && node smoke.mjs",
|
|
29
|
-
"typecheck": "tsc --noEmit",
|
|
30
|
-
"smoke": "node smoke.mjs",
|
|
31
|
-
"start": "node dist/index.js"
|
|
32
|
-
},
|
|
33
|
-
"keywords": [
|
|
34
|
-
"mcp",
|
|
35
|
-
"model-context-protocol",
|
|
36
|
-
"design-system",
|
|
37
|
-
"design-tokens",
|
|
38
|
-
"color-palette",
|
|
39
|
-
"oklch",
|
|
40
|
-
"typography",
|
|
41
|
-
"tailwind",
|
|
42
|
-
"shadcn"
|
|
43
|
-
],
|
|
44
|
-
"dependencies": {
|
|
45
|
-
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
46
|
-
"zod": "^3.24.0"
|
|
47
|
-
},
|
|
48
|
-
"devDependencies": {
|
|
49
|
-
"@types/node": "^22.19.21",
|
|
50
|
-
"esbuild": "^0.25.0",
|
|
51
|
-
"typescript": "^5.6.0"
|
|
52
|
-
}
|
|
53
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "standby-design-mcp",
|
|
3
|
+
"version": "0.1.5",
|
|
4
|
+
"mcpName": "io.github.KarstenKreh/standby-design-mcp",
|
|
5
|
+
"description": "MCP server for standby.design — generate production-ready design systems (OKLCH color palettes, fluid type scales, spacing & layout, shape and icon tokens) and export them as CSS, Tailwind v4, or W3C design tokens. Every result links back to the standby.design web UI for visual fine-tuning.",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"homepage": "https://standby.design",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/KarstenKreh/Standby.Design.git",
|
|
12
|
+
"directory": "packages/mcp-server"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/KarstenKreh/Standby.Design/issues"
|
|
16
|
+
},
|
|
17
|
+
"bin": {
|
|
18
|
+
"standby-design-mcp": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=18"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "node build.mjs",
|
|
28
|
+
"prepublishOnly": "node build.mjs && node smoke.mjs",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"smoke": "node smoke.mjs",
|
|
31
|
+
"start": "node dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"mcp",
|
|
35
|
+
"model-context-protocol",
|
|
36
|
+
"design-system",
|
|
37
|
+
"design-tokens",
|
|
38
|
+
"color-palette",
|
|
39
|
+
"oklch",
|
|
40
|
+
"typography",
|
|
41
|
+
"tailwind",
|
|
42
|
+
"shadcn"
|
|
43
|
+
],
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
46
|
+
"zod": "^3.24.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^22.19.21",
|
|
50
|
+
"esbuild": "^0.25.0",
|
|
51
|
+
"typescript": "^5.6.0"
|
|
52
|
+
}
|
|
53
|
+
}
|