@mandujs/core 0.53.3 → 0.54.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +654 -654
- package/package.json +1 -1
- package/src/a11y/__tests__/run-audit.test.ts +333 -333
- package/src/a11y/fix-hints.ts +76 -76
- package/src/a11y/index.ts +18 -18
- package/src/a11y/run-audit.ts +394 -394
- package/src/a11y/types.ts +125 -125
- package/src/auth/__tests__/login.test.ts +1 -1
- package/src/auth/__tests__/password.test.ts +122 -122
- package/src/auth/__tests__/tokens.test.ts +274 -274
- package/src/auth/__tests__/verification.test.ts +274 -274
- package/src/auth/index.ts +76 -76
- package/src/auth/login.ts +225 -225
- package/src/auth/password.ts +120 -120
- package/src/auth/reset.ts +243 -243
- package/src/auth/tokens.ts +612 -612
- package/src/auth/verification.ts +253 -253
- package/src/brain/__tests__/redactor.test.ts +94 -94
- package/src/brain/adapters/__tests__/_helpers.ts +83 -83
- package/src/brain/adapters/__tests__/anthropic-oauth.test.ts +196 -196
- package/src/brain/adapters/__tests__/chatgpt-auth.test.ts +193 -193
- package/src/brain/adapters/__tests__/openai-oauth.test.ts +209 -209
- package/src/brain/adapters/__tests__/resolver.test.ts +143 -143
- package/src/brain/adapters/anthropic-oauth.ts +1 -1
- package/src/brain/adapters/chatgpt-auth.ts +300 -300
- package/src/brain/adapters/index.ts +319 -319
- package/src/brain/adapters/oauth-flow.ts +439 -439
- package/src/brain/consent.ts +240 -240
- package/src/brain/credentials.ts +396 -396
- package/src/bundler/__tests__/build-runner.ts +113 -113
- package/src/bundler/__tests__/dev-reliability.test.ts +619 -619
- package/src/bundler/__tests__/extended-watch.test.ts +711 -711
- package/src/bundler/__tests__/fast-refresh.test.ts +10 -10
- package/src/bundler/__tests__/hdr.test.ts +353 -353
- package/src/bundler/__tests__/hmr-client.test.ts +532 -532
- package/src/bundler/__tests__/manifest-schema.test.ts +266 -266
- package/src/bundler/__tests__/prod-smoke.test.ts +138 -138
- package/src/bundler/__tests__/reverse-import-graph.test.ts +519 -519
- package/src/bundler/__tests__/slot-dispatch.test.ts +573 -573
- package/src/bundler/__tests__/url-cap-and-slot-regex.test.ts +286 -286
- package/src/bundler/__tests__/vendor-cache.test.ts +455 -455
- package/src/bundler/budget.ts +404 -404
- package/src/bundler/build.test.ts +179 -179
- package/src/bundler/build.ts +55 -55
- package/src/bundler/dev.ts +42 -42
- package/src/bundler/manifest-schema.ts +301 -301
- package/src/bundler/plugins/__tests__/block-generated-imports.test.ts +263 -263
- package/src/bundler/plugins/__tests__/react-compiler-config.test.ts +83 -83
- package/src/bundler/plugins/__tests__/react-compiler-lint.test.ts +110 -110
- package/src/bundler/plugins/block-generated-imports.ts +155 -155
- package/src/bundler/plugins/index.ts +83 -83
- package/src/bundler/plugins/react-compiler-config.ts +108 -108
- package/src/bundler/plugins/react-compiler-lint.ts +253 -253
- package/src/bundler/plugins/react-compiler.ts +162 -162
- package/src/bundler/reverse-import-graph.ts +339 -339
- package/src/bundler/safe-build.test.ts +201 -201
- package/src/bundler/safe-build.ts +103 -103
- package/src/bundler/scenario-matrix.ts +229 -229
- package/src/bundler/types.ts +10 -10
- package/src/bundler/vendor-cache-types.ts +130 -130
- package/src/bundler/vendor-cache.ts +526 -526
- package/src/change/snapshot.ts +18 -18
- package/src/client/Form.tsx +105 -105
- package/src/client/Link.tsx +9 -9
- package/src/client/__tests__/use-sse.test.ts +153 -153
- package/src/client/globals.ts +1 -1
- package/src/client/hooks.ts +362 -362
- package/src/client/hydrate.ts +340 -340
- package/src/client/prefetch-helper.ts +55 -55
- package/src/client/router.ts +11 -11
- package/src/client/runtime.ts +47 -47
- package/src/client/serialize.ts +404 -404
- package/src/client/use-fetch.ts +6 -6
- package/src/client/use-head.ts +197 -197
- package/src/client/use-sse.ts +378 -378
- package/src/client/window-state.ts +101 -101
- package/src/components/Image.tsx +162 -162
- package/src/config/validate.ts +3 -3
- package/src/config/watcher.ts +311 -311
- package/src/constants.ts +40 -40
- package/src/content/collection.ts +8 -8
- package/src/content/content-layer.ts +7 -7
- package/src/content/data-store.ts +245 -245
- package/src/content/frontmatter.ts +189 -189
- package/src/content/loader-context.ts +171 -171
- package/src/content/loaders/api.ts +216 -216
- package/src/content/loaders/file.ts +172 -172
- package/src/content/loaders/glob.ts +253 -253
- package/src/content/loaders/index.ts +34 -34
- package/src/content/loaders/types.ts +137 -137
- package/src/content/meta-store.ts +209 -209
- package/src/content/prebuild.test.ts +571 -571
- package/src/content/prebuild.ts +636 -636
- package/src/content/schema.ts +20 -20
- package/src/content/sidebar.ts +630 -630
- package/src/content/slug.ts +110 -110
- package/src/content/types.ts +282 -282
- package/src/content/watcher.ts +135 -135
- package/src/contract/client-safe.test.ts +42 -42
- package/src/contract/client-safe.ts +114 -114
- package/src/contract/define.ts +11 -11
- package/src/contract/index.ts +1 -1
- package/src/contract/normalize.test.ts +276 -276
- package/src/contract/normalize.ts +410 -410
- package/src/contract/registry.test.ts +206 -206
- package/src/contract/route-helpers.ts +1 -1
- package/src/contract/rpc.ts +443 -443
- package/src/contract/schema.ts +48 -48
- package/src/contract/types.ts +58 -58
- package/src/db/__tests__/db.test.ts +482 -482
- package/src/db/index.ts +138 -138
- package/src/db/migrations/history-table.ts +345 -345
- package/src/db/migrations/index.ts +3 -3
- package/src/db/migrations/lock.ts +324 -324
- package/src/db/migrations/runner.ts +650 -650
- package/src/deploy/cache.ts +140 -140
- package/src/deploy/compile/vercel.ts +344 -344
- package/src/deploy/index.ts +87 -87
- package/src/deploy/inference/brain.ts +268 -268
- package/src/deploy/inference/context.ts +182 -182
- package/src/deploy/inference/filling-extract.ts +245 -245
- package/src/deploy/inference/heuristic.ts +182 -182
- package/src/deploy/intent.ts +173 -173
- package/src/deploy/plan.ts +178 -178
- package/src/design/__tests__/agents-link.test.ts +109 -109
- package/src/design/__tests__/extract-patch-diff.test.ts +265 -265
- package/src/design/__tests__/lint.test.ts +110 -110
- package/src/design/__tests__/parser.test.ts +195 -195
- package/src/design/__tests__/tailwind-theme.test.ts +229 -229
- package/src/design/agents-link.ts +165 -165
- package/src/design/diff.ts +138 -138
- package/src/design/extract.ts +285 -285
- package/src/design/index.ts +102 -102
- package/src/design/lint.ts +209 -209
- package/src/design/parser.ts +555 -555
- package/src/design/patch.ts +241 -241
- package/src/design/scaffold.ts +147 -147
- package/src/design/tailwind-theme.ts +441 -441
- package/src/design/types.ts +210 -210
- package/src/desktop/__tests__/webview-fallback.test.ts +254 -254
- package/src/desktop/__tests__/window.test.ts +248 -248
- package/src/desktop/__tests__/worker.test.ts +266 -266
- package/src/desktop/index.ts +43 -43
- package/src/desktop/types.ts +158 -158
- package/src/desktop/worker.ts +180 -180
- package/src/dev-error-overlay/__tests__/overlay-injector.test.ts +241 -241
- package/src/dev-error-overlay/index.ts +30 -30
- package/src/dev-error-overlay/overlay-injector.ts +243 -243
- package/src/dev-error-overlay/overlay-styles.ts +52 -52
- package/src/dev-error-overlay/types.ts +66 -66
- package/src/devtools/ai/context-builder.ts +375 -375
- package/src/devtools/ai/index.ts +25 -25
- package/src/devtools/ai/mcp-connector.ts +25 -25
- package/src/devtools/client/catchers/error-catcher.ts +344 -344
- package/src/devtools/client/catchers/index.ts +18 -18
- package/src/devtools/client/components/index.ts +39 -39
- package/src/devtools/client/components/mandu-character.tsx +331 -331
- package/src/devtools/client/components/overlay.tsx +368 -368
- package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
- package/src/devtools/client/components/panel/guard-panel.tsx +30 -30
- package/src/devtools/client/components/panel/islands-panel.tsx +320 -320
- package/src/devtools/client/components/panel/network-panel.tsx +291 -291
- package/src/devtools/client/components/panel/panel-container.tsx +500 -500
- package/src/devtools/client/components/panel/preview-panel.tsx +46 -46
- package/src/devtools/client/filters/context-filters.ts +282 -282
- package/src/devtools/client/filters/index.ts +16 -16
- package/src/devtools/client/index.ts +63 -63
- package/src/devtools/client/persistence.ts +335 -335
- package/src/devtools/hook/create-hook.ts +207 -207
- package/src/devtools/hook/index.ts +13 -13
- package/src/devtools/index.ts +439 -439
- package/src/devtools/init.ts +265 -265
- package/src/devtools/protocol.ts +237 -237
- package/src/devtools/server/index.ts +17 -17
- package/src/devtools/server/source-context.ts +450 -450
- package/src/devtools/types.ts +35 -35
- package/src/devtools/worker/index.ts +25 -25
- package/src/devtools/worker/redaction-worker.ts +233 -233
- package/src/devtools/worker/worker-manager.ts +410 -410
- package/src/diagnose/__tests__/checks.test.ts +451 -451
- package/src/diagnose/checks.ts +832 -832
- package/src/diagnose/index.ts +17 -17
- package/src/diagnose/run.ts +93 -93
- package/src/diagnose/types.ts +53 -53
- package/src/email/__tests__/email.test.ts +355 -355
- package/src/email/index.ts +282 -282
- package/src/email/smtp.ts +64 -64
- package/src/error/domains.ts +265 -265
- package/src/error/result.ts +60 -60
- package/src/error/types.ts +6 -6
- package/src/errors/extractor.ts +409 -409
- package/src/errors/index.ts +19 -19
- package/src/filling/__tests__/session-sqlite.test.ts +454 -454
- package/src/filling/auth.ts +308 -308
- package/src/filling/cookie-codec.ts +299 -299
- package/src/filling/deps.ts +265 -265
- package/src/filling/session-sqlite.ts +617 -617
- package/src/filling/sse.ts +5 -5
- package/src/filling/ws.ts +78 -78
- package/src/generator/index.ts +3 -3
- package/src/guard/__tests__/design-inline-class.test.ts +219 -219
- package/src/guard/__tests__/tsgolint-bridge.test.ts +347 -347
- package/src/guard/analyzer.ts +360 -360
- package/src/guard/auto-correct.ts +1 -1
- package/src/guard/contract-guard.ts +9 -9
- package/src/guard/define-rule.ts +243 -243
- package/src/guard/design-inline-class.ts +393 -393
- package/src/guard/file-type.test.ts +24 -24
- package/src/guard/graph.ts +1 -1
- package/src/guard/healing.ts +36 -36
- package/src/guard/presets/atomic.ts +70 -70
- package/src/guard/presets/clean.ts +77 -77
- package/src/guard/presets/fsd.ts +79 -79
- package/src/guard/presets/hexagonal.ts +68 -68
- package/src/guard/reporter.ts +442 -442
- package/src/guard/rule-presets.ts +379 -379
- package/src/guard/semantic-slots.ts +1 -1
- package/src/guard/suggestions.ts +358 -358
- package/src/guard/tsgolint-bridge.ts +512 -512
- package/src/guard/types.ts +348 -348
- package/src/guard/watcher.ts +405 -405
- package/src/i18n/define.ts +126 -126
- package/src/i18n/index.ts +52 -52
- package/src/i18n/message-registry.ts +173 -173
- package/src/i18n/types.ts +112 -112
- package/src/id/index.ts +105 -105
- package/src/index.ts +2 -2
- package/src/kitchen/api/agent-devtools-api.ts +779 -544
- package/src/kitchen/api/errors-grouping.ts +126 -0
- package/src/kitchen/kitchen-handler.ts +192 -63
- package/src/kitchen/kitchen-ui.ts +842 -464
- package/src/logging/index.ts +22 -22
- package/src/logging/transports.ts +365 -365
- package/src/middleware/bridge.ts +147 -147
- package/src/middleware/compose.ts +134 -134
- package/src/middleware/compress.ts +62 -62
- package/src/middleware/cors.ts +47 -47
- package/src/middleware/csrf.ts +328 -328
- package/src/middleware/define.ts +132 -132
- package/src/middleware/jwt.ts +134 -134
- package/src/middleware/logger.ts +58 -58
- package/src/middleware/oauth/__tests__/oauth.test.ts +1 -1
- package/src/middleware/oauth/index.ts +505 -505
- package/src/middleware/oauth/providers.ts +115 -115
- package/src/middleware/rate-limit/index.ts +522 -522
- package/src/middleware/rate-limit/sqlite-store.ts +382 -382
- package/src/middleware/scheduler-cron.ts +96 -96
- package/src/middleware/secure/__tests__/secure.test.ts +360 -360
- package/src/middleware/secure/csp.ts +193 -193
- package/src/middleware/session.ts +174 -174
- package/src/middleware/timeout.ts +55 -55
- package/src/observability/logger-adapter.ts +36 -36
- package/src/observability/sqlite-store.ts +254 -254
- package/src/openapi/generator.ts +1 -1
- package/src/openapi/openapi.test.ts +43 -43
- package/src/perf/__tests__/user-marks.test.ts +354 -354
- package/src/perf/index.ts +133 -133
- package/src/plugins/__tests__/lifecycle-integration.test.ts +272 -272
- package/src/plugins/__tests__/runner.test.ts +409 -409
- package/src/plugins/define.ts +124 -124
- package/src/plugins/examples/dep-check-plugin.ts +80 -80
- package/src/plugins/examples/prerender-cache-plugin.ts +111 -111
- package/src/plugins/examples/sitemap-plugin.ts +65 -65
- package/src/plugins/runner.ts +361 -361
- package/src/plugins/types.ts +368 -368
- package/src/report/index.ts +1 -1
- package/src/resource/__tests__/generator.test.ts +32 -32
- package/src/resource/ddl/__tests__/diff.test.ts +639 -639
- package/src/resource/ddl/__tests__/emit.test.ts +823 -823
- package/src/resource/ddl/__tests__/snapshot.test.ts +499 -499
- package/src/resource/ddl/emit.ts +559 -559
- package/src/resource/ddl/persistence-types.ts +218 -218
- package/src/resource/ddl/type-map.ts +223 -223
- package/src/resource/ddl/types.ts +232 -232
- package/src/resource/generator-repo.ts +630 -630
- package/src/resource/schema.ts +1 -1
- package/src/router/fs-patterns.test.ts +96 -96
- package/src/router/fs-routes.ts +6 -6
- package/src/routes/index.ts +74 -74
- package/src/routes/metadata-routes.ts +427 -427
- package/src/routes/types.ts +341 -341
- package/src/runtime/__tests__/error-boundary-redaction.test.ts +141 -141
- package/src/runtime/__tests__/hdr-client.test.ts +223 -223
- package/src/runtime/__tests__/http-errors.test.ts +117 -117
- package/src/runtime/__tests__/not-found.test.ts +152 -152
- package/src/runtime/adapter.ts +47 -47
- package/src/runtime/boundary.tsx +252 -252
- package/src/runtime/cache.ts +494 -494
- package/src/runtime/compose.ts +222 -222
- package/src/runtime/fast-refresh-runtime.ts +322 -322
- package/src/runtime/handler.ts +65 -65
- package/src/runtime/handlers.ts +300 -300
- package/src/runtime/http-errors.ts +113 -113
- package/src/runtime/image-handler.ts +1 -1
- package/src/runtime/lifecycle.ts +381 -381
- package/src/runtime/logger.test.ts +345 -345
- package/src/runtime/middleware.ts +264 -264
- package/src/runtime/not-found.ts +93 -93
- package/src/runtime/openapi-endpoint.ts +236 -236
- package/src/runtime/ppr.ts +74 -74
- package/src/runtime/registry.ts +171 -171
- package/src/runtime/router.ts +105 -105
- package/src/runtime/server.ts +67 -67
- package/src/runtime/shims.ts +48 -48
- package/src/runtime/trace.ts +144 -144
- package/src/scheduler/validate.ts +169 -169
- package/src/seo/index.ts +219 -219
- package/src/seo/integration/ssr.ts +306 -306
- package/src/seo/render/basic.ts +435 -435
- package/src/seo/render/index.ts +143 -143
- package/src/seo/render/jsonld.ts +539 -539
- package/src/seo/render/opengraph.ts +197 -197
- package/src/seo/render/robots.ts +116 -116
- package/src/seo/render/sitemap.ts +137 -137
- package/src/seo/render/twitter.ts +127 -127
- package/src/seo/resolve/opengraph.ts +143 -143
- package/src/seo/resolve/robots.ts +73 -73
- package/src/seo/resolve/title.ts +94 -94
- package/src/seo/resolve/twitter.ts +73 -73
- package/src/seo/resolve/url.ts +104 -104
- package/src/seo/routes/index.ts +290 -290
- package/src/seo/types.ts +588 -588
- package/src/slot/validator.ts +39 -39
- package/src/storage/s3/__tests__/s3.test.ts +479 -479
- package/src/storage/s3/index.ts +412 -412
- package/src/testing/__tests__/assertions.test.ts +632 -632
- package/src/testing/__tests__/reporter.test.ts +454 -454
- package/src/testing/assertions.ts +986 -986
- package/src/testing/db.ts +157 -157
- package/src/testing/mocks.ts +203 -203
- package/src/testing/session.ts +190 -190
- package/src/types/branded.ts +56 -56
- package/src/types/index.ts +1 -1
- package/src/utils/safe-io.ts +188 -188
- package/src/utils/string-safe.ts +298 -298
- package/src/watcher/watcher.ts +18 -18
package/src/design/types.ts
CHANGED
|
@@ -1,210 +1,210 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DESIGN.md type surface.
|
|
3
|
-
*
|
|
4
|
-
* The 9-section schema is borrowed verbatim from Google Stitch's
|
|
5
|
-
* DESIGN.md convention (also used by VoltAgent's awesome-design-md
|
|
6
|
-
* catalog of 69 brand spec files). Mandu adopts it as a first-class
|
|
7
|
-
* format rather than inventing its own — see Issue #245 v2 plan.
|
|
8
|
-
*
|
|
9
|
-
* Parsing is **permissive**: a DESIGN.md may include any subset of
|
|
10
|
-
* sections, in any order, with arbitrary free-form content between
|
|
11
|
-
* structured tokens. The parser populates the sections it understands
|
|
12
|
-
* and stores the rest as `rawBody` so round-trips don't lose user
|
|
13
|
-
* prose. Tools (Guard, MCP, token bridge) consume only the structured
|
|
14
|
-
* fields they care about.
|
|
15
|
-
*
|
|
16
|
-
* @module core/design/types
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
export const DESIGN_SECTION_IDS = [
|
|
20
|
-
"theme",
|
|
21
|
-
"color-palette",
|
|
22
|
-
"typography",
|
|
23
|
-
"components",
|
|
24
|
-
"layout",
|
|
25
|
-
"shadows",
|
|
26
|
-
"dos-donts",
|
|
27
|
-
"responsive",
|
|
28
|
-
"agent-prompts",
|
|
29
|
-
] as const;
|
|
30
|
-
|
|
31
|
-
export type DesignSectionId = (typeof DESIGN_SECTION_IDS)[number];
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Color palette entry. `hex` may be missing when a row only carries a
|
|
35
|
-
* semantic role (e.g. "primary — brand color, see Stripe docs"); the
|
|
36
|
-
* Guard rule and the token bridge skip rows without a parseable value.
|
|
37
|
-
*/
|
|
38
|
-
export interface ColorToken {
|
|
39
|
-
name: string;
|
|
40
|
-
/** `#rrggbb`, `#rrggbbaa`, `rgb(...)`, `rgba(...)`, `oklch(...)`, etc. */
|
|
41
|
-
value?: string;
|
|
42
|
-
/** Functional role — "primary", "surface", "text-muted", … (free-form). */
|
|
43
|
-
role?: string;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface TypographyToken {
|
|
47
|
-
name: string;
|
|
48
|
-
fontFamily?: string;
|
|
49
|
-
weight?: string;
|
|
50
|
-
size?: string;
|
|
51
|
-
lineHeight?: string;
|
|
52
|
-
/** Free-form usage hint ("h1 hero", "body small", …). */
|
|
53
|
-
usage?: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface ComponentToken {
|
|
57
|
-
name: string;
|
|
58
|
-
/** Variants surfaced as a `name → list` map. Empty when not declared. */
|
|
59
|
-
variants: Record<string, string[]>;
|
|
60
|
-
/** Free-form description / props notes from markdown body. */
|
|
61
|
-
notes?: string;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface SpacingToken {
|
|
65
|
-
/** "xs", "sm", "md", "lg", "xl" — caller-defined. */
|
|
66
|
-
name: string;
|
|
67
|
-
value?: string;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export interface ShadowToken {
|
|
71
|
-
/** "card", "popover", "modal" — caller-defined elevation name. */
|
|
72
|
-
name: string;
|
|
73
|
-
value?: string;
|
|
74
|
-
/** Free-form usage hint. */
|
|
75
|
-
usage?: string;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export interface DoDontRule {
|
|
79
|
-
/** "do" or "dont" — Guard rule consumes "dont" as `forbidInlineClasses` candidates. */
|
|
80
|
-
kind: "do" | "dont";
|
|
81
|
-
/** Plain-text rule body. */
|
|
82
|
-
text: string;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export interface ResponsiveBreakpoint {
|
|
86
|
-
name: string;
|
|
87
|
-
value?: string;
|
|
88
|
-
/** Free-form notes (touch target, scaling strategy, …). */
|
|
89
|
-
notes?: string;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export interface AgentPrompt {
|
|
93
|
-
/** Heading or first sentence used as a label. */
|
|
94
|
-
title: string;
|
|
95
|
-
/** Body of the prompt — passed through verbatim. */
|
|
96
|
-
body: string;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Per-section payload. Every section carries:
|
|
101
|
-
* - `present`: whether the heading was found at all
|
|
102
|
-
* - `rawBody`: original markdown body for round-trip / fallback
|
|
103
|
-
* - structured fields where applicable (`tokens`, `rules`, …)
|
|
104
|
-
*
|
|
105
|
-
* Tools that only care about presence (e.g. `mandu design validate`)
|
|
106
|
-
* read `present`; structured consumers (Guard, token bridge) read the
|
|
107
|
-
* typed fields and treat empties as "not declared".
|
|
108
|
-
*/
|
|
109
|
-
export interface DesignSection {
|
|
110
|
-
id: DesignSectionId;
|
|
111
|
-
present: boolean;
|
|
112
|
-
/** Heading line as written by the user (e.g. "## Color Palette"). */
|
|
113
|
-
headingText?: string;
|
|
114
|
-
/** Raw markdown body between this heading and the next H2. */
|
|
115
|
-
rawBody: string;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export interface ThemeSection extends DesignSection {
|
|
119
|
-
id: "theme";
|
|
120
|
-
/** First non-empty paragraph — quick "vibe" answer. */
|
|
121
|
-
summary?: string;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export interface ColorPaletteSection extends DesignSection {
|
|
125
|
-
id: "color-palette";
|
|
126
|
-
tokens: ColorToken[];
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export interface TypographySection extends DesignSection {
|
|
130
|
-
id: "typography";
|
|
131
|
-
tokens: TypographyToken[];
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export interface ComponentsSection extends DesignSection {
|
|
135
|
-
id: "components";
|
|
136
|
-
tokens: ComponentToken[];
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
export interface LayoutSection extends DesignSection {
|
|
140
|
-
id: "layout";
|
|
141
|
-
tokens: SpacingToken[];
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export interface ShadowsSection extends DesignSection {
|
|
145
|
-
id: "shadows";
|
|
146
|
-
tokens: ShadowToken[];
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export interface DosDontsSection extends DesignSection {
|
|
150
|
-
id: "dos-donts";
|
|
151
|
-
rules: DoDontRule[];
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export interface ResponsiveSection extends DesignSection {
|
|
155
|
-
id: "responsive";
|
|
156
|
-
breakpoints: ResponsiveBreakpoint[];
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export interface AgentPromptsSection extends DesignSection {
|
|
160
|
-
id: "agent-prompts";
|
|
161
|
-
prompts: AgentPrompt[];
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export type AnyDesignSection =
|
|
165
|
-
| ThemeSection
|
|
166
|
-
| ColorPaletteSection
|
|
167
|
-
| TypographySection
|
|
168
|
-
| ComponentsSection
|
|
169
|
-
| LayoutSection
|
|
170
|
-
| ShadowsSection
|
|
171
|
-
| DosDontsSection
|
|
172
|
-
| ResponsiveSection
|
|
173
|
-
| AgentPromptsSection;
|
|
174
|
-
|
|
175
|
-
export interface DesignSpec {
|
|
176
|
-
/** Original source string (for round-trip). */
|
|
177
|
-
source: string;
|
|
178
|
-
/**
|
|
179
|
-
* Sections in canonical order. `present: false` when the user omitted
|
|
180
|
-
* the section — Mandu still reserves the slot so consumers can index
|
|
181
|
-
* by id without `find()`.
|
|
182
|
-
*/
|
|
183
|
-
sections: {
|
|
184
|
-
theme: ThemeSection;
|
|
185
|
-
"color-palette": ColorPaletteSection;
|
|
186
|
-
typography: TypographySection;
|
|
187
|
-
components: ComponentsSection;
|
|
188
|
-
layout: LayoutSection;
|
|
189
|
-
shadows: ShadowsSection;
|
|
190
|
-
"dos-donts": DosDontsSection;
|
|
191
|
-
responsive: ResponsiveSection;
|
|
192
|
-
"agent-prompts": AgentPromptsSection;
|
|
193
|
-
};
|
|
194
|
-
/** Extra H2 sections the user wrote that don't map to the 9-section spec. */
|
|
195
|
-
extraSections: Array<{ heading: string; body: string }>;
|
|
196
|
-
/** Optional H1 title at the top of the file. */
|
|
197
|
-
title?: string;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export interface ValidationIssue {
|
|
201
|
-
/** "missing" — section absent. "empty" — section present but no structured tokens. "malformed" — parse error inside a section. */
|
|
202
|
-
kind: "missing" | "empty" | "malformed";
|
|
203
|
-
section: DesignSectionId;
|
|
204
|
-
message: string;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export interface ValidationResult {
|
|
208
|
-
ok: boolean;
|
|
209
|
-
issues: ValidationIssue[];
|
|
210
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* DESIGN.md type surface.
|
|
3
|
+
*
|
|
4
|
+
* The 9-section schema is borrowed verbatim from Google Stitch's
|
|
5
|
+
* DESIGN.md convention (also used by VoltAgent's awesome-design-md
|
|
6
|
+
* catalog of 69 brand spec files). Mandu adopts it as a first-class
|
|
7
|
+
* format rather than inventing its own — see Issue #245 v2 plan.
|
|
8
|
+
*
|
|
9
|
+
* Parsing is **permissive**: a DESIGN.md may include any subset of
|
|
10
|
+
* sections, in any order, with arbitrary free-form content between
|
|
11
|
+
* structured tokens. The parser populates the sections it understands
|
|
12
|
+
* and stores the rest as `rawBody` so round-trips don't lose user
|
|
13
|
+
* prose. Tools (Guard, MCP, token bridge) consume only the structured
|
|
14
|
+
* fields they care about.
|
|
15
|
+
*
|
|
16
|
+
* @module core/design/types
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export const DESIGN_SECTION_IDS = [
|
|
20
|
+
"theme",
|
|
21
|
+
"color-palette",
|
|
22
|
+
"typography",
|
|
23
|
+
"components",
|
|
24
|
+
"layout",
|
|
25
|
+
"shadows",
|
|
26
|
+
"dos-donts",
|
|
27
|
+
"responsive",
|
|
28
|
+
"agent-prompts",
|
|
29
|
+
] as const;
|
|
30
|
+
|
|
31
|
+
export type DesignSectionId = (typeof DESIGN_SECTION_IDS)[number];
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Color palette entry. `hex` may be missing when a row only carries a
|
|
35
|
+
* semantic role (e.g. "primary — brand color, see Stripe docs"); the
|
|
36
|
+
* Guard rule and the token bridge skip rows without a parseable value.
|
|
37
|
+
*/
|
|
38
|
+
export interface ColorToken {
|
|
39
|
+
name: string;
|
|
40
|
+
/** `#rrggbb`, `#rrggbbaa`, `rgb(...)`, `rgba(...)`, `oklch(...)`, etc. */
|
|
41
|
+
value?: string;
|
|
42
|
+
/** Functional role — "primary", "surface", "text-muted", … (free-form). */
|
|
43
|
+
role?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface TypographyToken {
|
|
47
|
+
name: string;
|
|
48
|
+
fontFamily?: string;
|
|
49
|
+
weight?: string;
|
|
50
|
+
size?: string;
|
|
51
|
+
lineHeight?: string;
|
|
52
|
+
/** Free-form usage hint ("h1 hero", "body small", …). */
|
|
53
|
+
usage?: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface ComponentToken {
|
|
57
|
+
name: string;
|
|
58
|
+
/** Variants surfaced as a `name → list` map. Empty when not declared. */
|
|
59
|
+
variants: Record<string, string[]>;
|
|
60
|
+
/** Free-form description / props notes from markdown body. */
|
|
61
|
+
notes?: string;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface SpacingToken {
|
|
65
|
+
/** "xs", "sm", "md", "lg", "xl" — caller-defined. */
|
|
66
|
+
name: string;
|
|
67
|
+
value?: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ShadowToken {
|
|
71
|
+
/** "card", "popover", "modal" — caller-defined elevation name. */
|
|
72
|
+
name: string;
|
|
73
|
+
value?: string;
|
|
74
|
+
/** Free-form usage hint. */
|
|
75
|
+
usage?: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface DoDontRule {
|
|
79
|
+
/** "do" or "dont" — Guard rule consumes "dont" as `forbidInlineClasses` candidates. */
|
|
80
|
+
kind: "do" | "dont";
|
|
81
|
+
/** Plain-text rule body. */
|
|
82
|
+
text: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface ResponsiveBreakpoint {
|
|
86
|
+
name: string;
|
|
87
|
+
value?: string;
|
|
88
|
+
/** Free-form notes (touch target, scaling strategy, …). */
|
|
89
|
+
notes?: string;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface AgentPrompt {
|
|
93
|
+
/** Heading or first sentence used as a label. */
|
|
94
|
+
title: string;
|
|
95
|
+
/** Body of the prompt — passed through verbatim. */
|
|
96
|
+
body: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Per-section payload. Every section carries:
|
|
101
|
+
* - `present`: whether the heading was found at all
|
|
102
|
+
* - `rawBody`: original markdown body for round-trip / fallback
|
|
103
|
+
* - structured fields where applicable (`tokens`, `rules`, …)
|
|
104
|
+
*
|
|
105
|
+
* Tools that only care about presence (e.g. `mandu design validate`)
|
|
106
|
+
* read `present`; structured consumers (Guard, token bridge) read the
|
|
107
|
+
* typed fields and treat empties as "not declared".
|
|
108
|
+
*/
|
|
109
|
+
export interface DesignSection {
|
|
110
|
+
id: DesignSectionId;
|
|
111
|
+
present: boolean;
|
|
112
|
+
/** Heading line as written by the user (e.g. "## Color Palette"). */
|
|
113
|
+
headingText?: string;
|
|
114
|
+
/** Raw markdown body between this heading and the next H2. */
|
|
115
|
+
rawBody: string;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface ThemeSection extends DesignSection {
|
|
119
|
+
id: "theme";
|
|
120
|
+
/** First non-empty paragraph — quick "vibe" answer. */
|
|
121
|
+
summary?: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface ColorPaletteSection extends DesignSection {
|
|
125
|
+
id: "color-palette";
|
|
126
|
+
tokens: ColorToken[];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export interface TypographySection extends DesignSection {
|
|
130
|
+
id: "typography";
|
|
131
|
+
tokens: TypographyToken[];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export interface ComponentsSection extends DesignSection {
|
|
135
|
+
id: "components";
|
|
136
|
+
tokens: ComponentToken[];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export interface LayoutSection extends DesignSection {
|
|
140
|
+
id: "layout";
|
|
141
|
+
tokens: SpacingToken[];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export interface ShadowsSection extends DesignSection {
|
|
145
|
+
id: "shadows";
|
|
146
|
+
tokens: ShadowToken[];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export interface DosDontsSection extends DesignSection {
|
|
150
|
+
id: "dos-donts";
|
|
151
|
+
rules: DoDontRule[];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export interface ResponsiveSection extends DesignSection {
|
|
155
|
+
id: "responsive";
|
|
156
|
+
breakpoints: ResponsiveBreakpoint[];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export interface AgentPromptsSection extends DesignSection {
|
|
160
|
+
id: "agent-prompts";
|
|
161
|
+
prompts: AgentPrompt[];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export type AnyDesignSection =
|
|
165
|
+
| ThemeSection
|
|
166
|
+
| ColorPaletteSection
|
|
167
|
+
| TypographySection
|
|
168
|
+
| ComponentsSection
|
|
169
|
+
| LayoutSection
|
|
170
|
+
| ShadowsSection
|
|
171
|
+
| DosDontsSection
|
|
172
|
+
| ResponsiveSection
|
|
173
|
+
| AgentPromptsSection;
|
|
174
|
+
|
|
175
|
+
export interface DesignSpec {
|
|
176
|
+
/** Original source string (for round-trip). */
|
|
177
|
+
source: string;
|
|
178
|
+
/**
|
|
179
|
+
* Sections in canonical order. `present: false` when the user omitted
|
|
180
|
+
* the section — Mandu still reserves the slot so consumers can index
|
|
181
|
+
* by id without `find()`.
|
|
182
|
+
*/
|
|
183
|
+
sections: {
|
|
184
|
+
theme: ThemeSection;
|
|
185
|
+
"color-palette": ColorPaletteSection;
|
|
186
|
+
typography: TypographySection;
|
|
187
|
+
components: ComponentsSection;
|
|
188
|
+
layout: LayoutSection;
|
|
189
|
+
shadows: ShadowsSection;
|
|
190
|
+
"dos-donts": DosDontsSection;
|
|
191
|
+
responsive: ResponsiveSection;
|
|
192
|
+
"agent-prompts": AgentPromptsSection;
|
|
193
|
+
};
|
|
194
|
+
/** Extra H2 sections the user wrote that don't map to the 9-section spec. */
|
|
195
|
+
extraSections: Array<{ heading: string; body: string }>;
|
|
196
|
+
/** Optional H1 title at the top of the file. */
|
|
197
|
+
title?: string;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export interface ValidationIssue {
|
|
201
|
+
/** "missing" — section absent. "empty" — section present but no structured tokens. "malformed" — parse error inside a section. */
|
|
202
|
+
kind: "missing" | "empty" | "malformed";
|
|
203
|
+
section: DesignSectionId;
|
|
204
|
+
message: string;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export interface ValidationResult {
|
|
208
|
+
ok: boolean;
|
|
209
|
+
issues: ValidationIssue[];
|
|
210
|
+
}
|