create-specfuse 0.2.3 → 0.3.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/dist/design-md/__tests__/archetype-schema.test.d.ts +2 -0
- package/dist/design-md/__tests__/archetype-schema.test.d.ts.map +1 -0
- package/dist/design-md/__tests__/archetype-schema.test.js +60 -0
- package/dist/design-md/__tests__/archetype-schema.test.js.map +1 -0
- package/dist/design-md/__tests__/archetypes.test.d.ts +2 -0
- package/dist/design-md/__tests__/archetypes.test.d.ts.map +1 -0
- package/dist/design-md/__tests__/archetypes.test.js +45 -0
- package/dist/design-md/__tests__/archetypes.test.js.map +1 -0
- package/dist/design-md/__tests__/fine-tuner.test.d.ts +2 -0
- package/dist/design-md/__tests__/fine-tuner.test.d.ts.map +1 -0
- package/dist/design-md/__tests__/fine-tuner.test.js +38 -0
- package/dist/design-md/__tests__/fine-tuner.test.js.map +1 -0
- package/dist/design-md/__tests__/index.test.d.ts +2 -0
- package/dist/design-md/__tests__/index.test.d.ts.map +1 -0
- package/dist/design-md/__tests__/index.test.js +66 -0
- package/dist/design-md/__tests__/index.test.js.map +1 -0
- package/dist/design-md/__tests__/matcher.test.d.ts +2 -0
- package/dist/design-md/__tests__/matcher.test.d.ts.map +1 -0
- package/dist/design-md/__tests__/matcher.test.js +74 -0
- package/dist/design-md/__tests__/matcher.test.js.map +1 -0
- package/dist/design-md/__tests__/questionnaire.test.d.ts +2 -0
- package/dist/design-md/__tests__/questionnaire.test.d.ts.map +1 -0
- package/dist/design-md/__tests__/questionnaire.test.js +57 -0
- package/dist/design-md/__tests__/questionnaire.test.js.map +1 -0
- package/dist/design-md/__tests__/renderer.test.d.ts +2 -0
- package/dist/design-md/__tests__/renderer.test.d.ts.map +1 -0
- package/dist/design-md/__tests__/renderer.test.js +51 -0
- package/dist/design-md/__tests__/renderer.test.js.map +1 -0
- package/dist/design-md/__tests__/types.test.d.ts +2 -0
- package/dist/design-md/__tests__/types.test.d.ts.map +1 -0
- package/dist/design-md/__tests__/types.test.js +63 -0
- package/dist/design-md/__tests__/types.test.js.map +1 -0
- package/dist/design-md/archetypes.d.ts +3 -0
- package/dist/design-md/archetypes.d.ts.map +1 -0
- package/dist/design-md/archetypes.js +18 -0
- package/dist/design-md/archetypes.js.map +1 -0
- package/dist/design-md/fine-tuner.d.ts +4 -0
- package/dist/design-md/fine-tuner.d.ts.map +1 -0
- package/dist/design-md/fine-tuner.js +13 -0
- package/dist/design-md/fine-tuner.js.map +1 -0
- package/dist/design-md/index.d.ts +2 -0
- package/dist/design-md/index.d.ts.map +1 -0
- package/dist/design-md/index.js +49 -0
- package/dist/design-md/index.js.map +1 -0
- package/dist/design-md/matcher.d.ts +8 -0
- package/dist/design-md/matcher.d.ts.map +1 -0
- package/dist/design-md/matcher.js +116 -0
- package/dist/design-md/matcher.js.map +1 -0
- package/dist/design-md/questionnaire.d.ts +15 -0
- package/dist/design-md/questionnaire.d.ts.map +1 -0
- package/dist/design-md/questionnaire.js +96 -0
- package/dist/design-md/questionnaire.js.map +1 -0
- package/dist/design-md/renderer.d.ts +3 -0
- package/dist/design-md/renderer.d.ts.map +1 -0
- package/dist/design-md/renderer.js +43 -0
- package/dist/design-md/renderer.js.map +1 -0
- package/dist/design-md/schema.d.ts +69 -0
- package/dist/design-md/schema.d.ts.map +1 -0
- package/dist/design-md/schema.js +30 -0
- package/dist/design-md/schema.js.map +1 -0
- package/dist/design-md/templates/_schema.yaml +71 -0
- package/dist/design-md/templates/consumer-media.yaml +34 -0
- package/dist/design-md/templates/consumer-social.yaml +34 -0
- package/dist/design-md/templates/content-blog.yaml +34 -0
- package/dist/design-md/templates/content-docs.yaml +34 -0
- package/dist/design-md/templates/dashboard-analytics.yaml +34 -0
- package/dist/design-md/templates/dashboard-monitoring.yaml +34 -0
- package/dist/design-md/templates/developer-portal.yaml +33 -0
- package/dist/design-md/templates/e-commerce.yaml +34 -0
- package/dist/design-md/templates/form-heavy.yaml +34 -0
- package/dist/design-md/templates/internal-tool.yaml +34 -0
- package/dist/design-md/templates/marketing-corporate.yaml +34 -0
- package/dist/design-md/templates/marketing-creative.yaml +34 -0
- package/dist/design-md/templates/mobile-lifestyle.yaml +34 -0
- package/dist/design-md/templates/mobile-utility.yaml +33 -0
- package/dist/design-md/templates/saas-dashboard.yaml +34 -0
- package/dist/design-md/templates/templates/_schema.yaml +71 -0
- package/dist/design-md/templates/templates/consumer-media.yaml +34 -0
- package/dist/design-md/templates/templates/consumer-social.yaml +34 -0
- package/dist/design-md/templates/templates/content-blog.yaml +34 -0
- package/dist/design-md/templates/templates/content-docs.yaml +34 -0
- package/dist/design-md/templates/templates/dashboard-analytics.yaml +34 -0
- package/dist/design-md/templates/templates/dashboard-monitoring.yaml +34 -0
- package/dist/design-md/templates/templates/developer-portal.yaml +33 -0
- package/dist/design-md/templates/templates/e-commerce.yaml +34 -0
- package/dist/design-md/templates/templates/form-heavy.yaml +34 -0
- package/dist/design-md/templates/templates/internal-tool.yaml +34 -0
- package/dist/design-md/templates/templates/marketing-corporate.yaml +34 -0
- package/dist/design-md/templates/templates/marketing-creative.yaml +34 -0
- package/dist/design-md/templates/templates/mobile-lifestyle.yaml +34 -0
- package/dist/design-md/templates/templates/mobile-utility.yaml +33 -0
- package/dist/design-md/templates/templates/saas-dashboard.yaml +34 -0
- package/dist/design-md/types.d.ts +33 -0
- package/dist/design-md/types.d.ts.map +1 -0
- package/dist/design-md/types.js +2 -0
- package/dist/design-md/types.js.map +1 -0
- package/dist/scaffolder.d.ts.map +1 -1
- package/dist/scaffolder.js +10 -0
- package/dist/scaffolder.js.map +1 -1
- package/dist/templates/design-md-skill.d.ts +2 -0
- package/dist/templates/design-md-skill.d.ts.map +1 -0
- package/dist/templates/design-md-skill.js +32 -0
- package/dist/templates/design-md-skill.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fine-tuner.d.ts","sourceRoot":"","sources":["../../src/design-md/fine-tuner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,YAAY,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhF,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,GAAG,eAAe,CAYpG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function applyOverrides(base, overrides) {
|
|
2
|
+
const result = { ...base };
|
|
3
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
4
|
+
if (value === undefined)
|
|
5
|
+
continue;
|
|
6
|
+
if (!Number.isInteger(value) || value < 1 || value > 5) {
|
|
7
|
+
throw new Error(`Invalid dimension value for ${key}: ${value} (must be integer 1-5)`);
|
|
8
|
+
}
|
|
9
|
+
result[key] = value;
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=fine-tuner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fine-tuner.js","sourceRoot":"","sources":["../../src/design-md/fine-tuner.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,cAAc,CAAC,IAAqB,EAAE,SAA6B;IACjF,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,KAAK,KAAK,wBAAwB,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,CAAC,GAA4B,CAAC,GAAG,KAAuB,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/design-md/index.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+ChF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { existsSync, writeFileSync, copyFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { runQuestionnaire } from './questionnaire.js';
|
|
4
|
+
import { matchArchetype } from './matcher.js';
|
|
5
|
+
import { deriveVector } from './matcher.js';
|
|
6
|
+
import { applyOverrides } from './fine-tuner.js';
|
|
7
|
+
import { renderDesignMd } from './renderer.js';
|
|
8
|
+
export async function generateDesignMd(targetDir) {
|
|
9
|
+
const { confirm, select, number } = await import('@inquirer/prompts');
|
|
10
|
+
const outputPath = join(targetDir, 'DESIGN.md');
|
|
11
|
+
if (existsSync(outputPath)) {
|
|
12
|
+
const overwrite = await confirm({ message: 'DESIGN.md already exists. Overwrite?' });
|
|
13
|
+
if (!overwrite)
|
|
14
|
+
return null;
|
|
15
|
+
copyFileSync(outputPath, join(targetDir, 'DESIGN.md.bak'));
|
|
16
|
+
}
|
|
17
|
+
const answers = await runQuestionnaire();
|
|
18
|
+
const results = matchArchetype(answers);
|
|
19
|
+
const top = results[0];
|
|
20
|
+
const accepted = await confirm({
|
|
21
|
+
message: `Best match: ${top.archetype.name} (distance: ${top.distance.toFixed(2)}). Accept?`,
|
|
22
|
+
});
|
|
23
|
+
if (!accepted)
|
|
24
|
+
return null;
|
|
25
|
+
const baseVector = deriveVector(answers);
|
|
26
|
+
const action = await select({
|
|
27
|
+
message: 'Fine-tune dimensions?',
|
|
28
|
+
choices: [
|
|
29
|
+
{ value: 'accept', name: 'Accept as-is' },
|
|
30
|
+
{ value: 'tune', name: 'Adjust dimensions manually' },
|
|
31
|
+
],
|
|
32
|
+
});
|
|
33
|
+
let finalVector = baseVector;
|
|
34
|
+
if (action === 'tune') {
|
|
35
|
+
const overrides = {};
|
|
36
|
+
for (const key of Object.keys(baseVector)) {
|
|
37
|
+
const val = await number({
|
|
38
|
+
message: `${key} (current: ${baseVector[key]}, 1-5, Enter to keep):`,
|
|
39
|
+
});
|
|
40
|
+
if (val !== undefined)
|
|
41
|
+
overrides[key] = val;
|
|
42
|
+
}
|
|
43
|
+
finalVector = applyOverrides(baseVector, overrides);
|
|
44
|
+
}
|
|
45
|
+
const content = renderDesignMd(top.archetype, finalVector);
|
|
46
|
+
writeFileSync(outputPath, content, 'utf-8');
|
|
47
|
+
return outputPath;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/design-md/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,cAAc,EAA2B,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEhD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B,OAAO,EAAE,eAAe,GAAG,CAAC,SAAS,CAAC,IAAI,eAAe,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY;KAC7F,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE;YACzC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,EAAE;SACtD;KACF,CAAC,CAAC;IAEH,IAAI,WAAW,GAAoB,UAAU,CAAC;IAE9C,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,SAAS,GAAuB,EAAE,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAA8B,EAAE,CAAC;YACvE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;gBACvB,OAAO,EAAE,GAAG,GAAG,cAAc,UAAU,CAAC,GAAG,CAAC,wBAAwB;aACrE,CAAC,CAAC;YACH,IAAI,GAAG,KAAK,SAAS;gBAAE,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAC9C,CAAC;QACD,WAAW,GAAG,cAAc,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC3D,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5C,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Archetype, DimensionVector, QuestionnaireAnswers } from './types.js';
|
|
2
|
+
export interface MatchResult {
|
|
3
|
+
archetype: Archetype;
|
|
4
|
+
distance: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function deriveVector(answers: QuestionnaireAnswers): DimensionVector;
|
|
7
|
+
export declare function matchArchetype(answers: QuestionnaireAnswers): MatchResult[];
|
|
8
|
+
//# sourceMappingURL=matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/design-md/matcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAkB,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEnG,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA2CD,wBAAgB,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,eAAe,CA4D3E;AAYD,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,WAAW,EAAE,CAe3E"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { loadArchetypes } from './archetypes.js';
|
|
2
|
+
const MOOD_MAP = {
|
|
3
|
+
clean: { lightness: 4, tone: 2 },
|
|
4
|
+
playful: { colorTemp: 4, tone: 5, borderRadius: 4 },
|
|
5
|
+
serious: { colorTemp: 2, tone: 1, borderRadius: 2 },
|
|
6
|
+
warm: { colorTemp: 4, lightness: 3, tone: 3 },
|
|
7
|
+
bold: { colorTemp: 3, tone: 4, lightness: 2 },
|
|
8
|
+
calm: { colorTemp: 3, lightness: 4, tone: 2 },
|
|
9
|
+
dark: { colorTemp: 1, lightness: 1, tone: 1 },
|
|
10
|
+
luxurious: { colorTemp: 3, lightness: 2, borderRadius: 3, tone: 3 },
|
|
11
|
+
};
|
|
12
|
+
const AUDIENCE_MAP = {
|
|
13
|
+
developers: { density: 1, borderRadius: 2, tone: 1 },
|
|
14
|
+
business: { density: 2, tone: 2, lightness: 3 },
|
|
15
|
+
general: { density: 3, borderRadius: 4, tone: 4 },
|
|
16
|
+
designers: { lightness: 4, borderRadius: 4, tone: 3 },
|
|
17
|
+
enterprise: { density: 2, tone: 1, borderRadius: 2 },
|
|
18
|
+
};
|
|
19
|
+
const DENSITY_MAP = {
|
|
20
|
+
compact: 1,
|
|
21
|
+
balanced: 3,
|
|
22
|
+
spacious: 5,
|
|
23
|
+
};
|
|
24
|
+
const CATEGORY_MAP = {
|
|
25
|
+
'internal-tool': { colorTemp: 2, lightness: 3, density: 1, borderRadius: 2, tone: 1 },
|
|
26
|
+
dashboard: { colorTemp: 1, lightness: 1, density: 1, borderRadius: 2, tone: 1 },
|
|
27
|
+
consumer: { colorTemp: 4, lightness: 4, density: 3, borderRadius: 4, tone: 4 },
|
|
28
|
+
developer: { colorTemp: 2, lightness: 2, density: 2, borderRadius: 2, tone: 1 },
|
|
29
|
+
mobile: { colorTemp: 3, lightness: 4, density: 3, borderRadius: 5, tone: 4 },
|
|
30
|
+
'e-commerce': { colorTemp: 3, lightness: 4, density: 2, borderRadius: 3, tone: 3 },
|
|
31
|
+
marketing: { colorTemp: 4, lightness: 4, density: 4, borderRadius: 4, tone: 5 },
|
|
32
|
+
'form-heavy': { colorTemp: 2, lightness: 3, density: 2, borderRadius: 2, tone: 2 },
|
|
33
|
+
content: { colorTemp: 3, lightness: 4, density: 3, borderRadius: 3, tone: 3 },
|
|
34
|
+
};
|
|
35
|
+
function clamp(val) {
|
|
36
|
+
return Math.max(1, Math.min(5, Math.round(val)));
|
|
37
|
+
}
|
|
38
|
+
export function deriveVector(answers) {
|
|
39
|
+
const accumulator = { colorTemp: 0, lightness: 0, density: 0, borderRadius: 0, tone: 0 };
|
|
40
|
+
const weights = { colorTemp: 0, lightness: 0, density: 0, borderRadius: 0, tone: 0 };
|
|
41
|
+
// Q1: product type (primary 0.7, secondary 0.3)
|
|
42
|
+
const primary = answers.productType[0];
|
|
43
|
+
const secondaries = answers.productType.slice(1);
|
|
44
|
+
const primaryVec = CATEGORY_MAP[primary];
|
|
45
|
+
if (primaryVec) {
|
|
46
|
+
for (const [k, v] of Object.entries(primaryVec)) {
|
|
47
|
+
const key = k;
|
|
48
|
+
accumulator[key] += v * 0.7;
|
|
49
|
+
weights[key] += 0.7;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const secWeight = secondaries.length > 0 ? 0.3 / secondaries.length : 0;
|
|
53
|
+
for (const sec of secondaries) {
|
|
54
|
+
const secVec = CATEGORY_MAP[sec];
|
|
55
|
+
if (secVec) {
|
|
56
|
+
for (const [k, v] of Object.entries(secVec)) {
|
|
57
|
+
const key = k;
|
|
58
|
+
accumulator[key] += v * secWeight;
|
|
59
|
+
weights[key] += secWeight;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Q2: audience
|
|
64
|
+
const audienceVec = AUDIENCE_MAP[answers.audience];
|
|
65
|
+
if (audienceVec) {
|
|
66
|
+
for (const [k, v] of Object.entries(audienceVec)) {
|
|
67
|
+
const key = k;
|
|
68
|
+
accumulator[key] += v * 0.5;
|
|
69
|
+
weights[key] += 0.5;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Q3: mood
|
|
73
|
+
const moodVec = MOOD_MAP[answers.mood];
|
|
74
|
+
if (moodVec) {
|
|
75
|
+
for (const [k, v] of Object.entries(moodVec)) {
|
|
76
|
+
const key = k;
|
|
77
|
+
accumulator[key] += v * 0.6;
|
|
78
|
+
weights[key] += 0.6;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Q4: density (direct mapping)
|
|
82
|
+
const densityVal = DENSITY_MAP[answers.density] ?? 3;
|
|
83
|
+
accumulator.density += densityVal * 0.8;
|
|
84
|
+
weights.density += 0.8;
|
|
85
|
+
// Compute weighted average for each dimension
|
|
86
|
+
return {
|
|
87
|
+
colorTemp: clamp(weights.colorTemp > 0 ? accumulator.colorTemp / weights.colorTemp : 3),
|
|
88
|
+
lightness: clamp(weights.lightness > 0 ? accumulator.lightness / weights.lightness : 3),
|
|
89
|
+
density: clamp(weights.density > 0 ? accumulator.density / weights.density : 3),
|
|
90
|
+
borderRadius: clamp(weights.borderRadius > 0 ? accumulator.borderRadius / weights.borderRadius : 3),
|
|
91
|
+
tone: clamp(weights.tone > 0 ? accumulator.tone / weights.tone : 3),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function euclideanDistance(a, b) {
|
|
95
|
+
return Math.sqrt((a.colorTemp - b.colorTemp) ** 2 +
|
|
96
|
+
(a.lightness - b.lightness) ** 2 +
|
|
97
|
+
(a.density - b.density) ** 2 +
|
|
98
|
+
(a.borderRadius - b.borderRadius) ** 2 +
|
|
99
|
+
(a.tone - b.tone) ** 2);
|
|
100
|
+
}
|
|
101
|
+
export function matchArchetype(answers) {
|
|
102
|
+
const targetVector = deriveVector(answers);
|
|
103
|
+
const archetypes = loadArchetypes();
|
|
104
|
+
const primaryCategory = answers.productType[0];
|
|
105
|
+
const CATEGORY_BONUS = 0.2;
|
|
106
|
+
return archetypes
|
|
107
|
+
.map((archetype) => {
|
|
108
|
+
let distance = euclideanDistance(targetVector, archetype.dimensions);
|
|
109
|
+
if (archetype.category === primaryCategory) {
|
|
110
|
+
distance *= 1 - CATEGORY_BONUS;
|
|
111
|
+
}
|
|
112
|
+
return { archetype, distance };
|
|
113
|
+
})
|
|
114
|
+
.sort((a, b) => a.distance - b.distance);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/design-md/matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { QuestionnaireAnswers } from './types.js';
|
|
2
|
+
export interface QuestionChoice {
|
|
3
|
+
value: string;
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
export interface QuestionDefinition {
|
|
7
|
+
id: keyof QuestionnaireAnswers | 'productType' | 'audience' | 'mood' | 'density' | 'reference';
|
|
8
|
+
type: 'checkbox' | 'select' | 'input';
|
|
9
|
+
message: string;
|
|
10
|
+
choices: QuestionChoice[];
|
|
11
|
+
required: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const QUESTIONS: QuestionDefinition[];
|
|
14
|
+
export declare function runQuestionnaire(): Promise<QuestionnaireAnswers>;
|
|
15
|
+
//# sourceMappingURL=questionnaire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questionnaire.d.ts","sourceRoot":"","sources":["../../src/design-md/questionnaire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,oBAAoB,GAAG,aAAa,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IAC/F,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,SAAS,EAAE,kBAAkB,EAiEzC,CAAC;AAEF,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAkCtE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export const QUESTIONS = [
|
|
2
|
+
{
|
|
3
|
+
id: 'productType',
|
|
4
|
+
type: 'checkbox',
|
|
5
|
+
message: 'What type of product are you building? (first = primary, rest = secondary)',
|
|
6
|
+
required: true,
|
|
7
|
+
choices: [
|
|
8
|
+
{ value: 'internal-tool', name: 'Internal Tool' },
|
|
9
|
+
{ value: 'dashboard', name: 'Dashboard / Analytics' },
|
|
10
|
+
{ value: 'consumer', name: 'Consumer App' },
|
|
11
|
+
{ value: 'developer', name: 'Developer Tool / API' },
|
|
12
|
+
{ value: 'mobile', name: 'Mobile App' },
|
|
13
|
+
{ value: 'e-commerce', name: 'E-Commerce' },
|
|
14
|
+
{ value: 'marketing', name: 'Marketing / Landing' },
|
|
15
|
+
{ value: 'form-heavy', name: 'Form-Heavy / Workflow' },
|
|
16
|
+
{ value: 'content', name: 'Content / Documentation' },
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 'audience',
|
|
21
|
+
type: 'select',
|
|
22
|
+
message: 'Who is the primary audience?',
|
|
23
|
+
required: true,
|
|
24
|
+
choices: [
|
|
25
|
+
{ value: 'developers', name: 'Developers / Engineers' },
|
|
26
|
+
{ value: 'business', name: 'Business Users / Analysts' },
|
|
27
|
+
{ value: 'general', name: 'General Public' },
|
|
28
|
+
{ value: 'designers', name: 'Designers / Creatives' },
|
|
29
|
+
{ value: 'enterprise', name: 'Enterprise / Compliance-sensitive' },
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 'mood',
|
|
34
|
+
type: 'checkbox',
|
|
35
|
+
message: 'Select mood keywords that describe the feel you want:',
|
|
36
|
+
required: true,
|
|
37
|
+
choices: [
|
|
38
|
+
{ value: 'clean', name: 'Clean / Minimal' },
|
|
39
|
+
{ value: 'playful', name: 'Playful / Fun' },
|
|
40
|
+
{ value: 'serious', name: 'Serious / Professional' },
|
|
41
|
+
{ value: 'warm', name: 'Warm / Friendly' },
|
|
42
|
+
{ value: 'bold', name: 'Bold / Energetic' },
|
|
43
|
+
{ value: 'calm', name: 'Calm / Neutral' },
|
|
44
|
+
{ value: 'dark', name: 'Dark / Techy' },
|
|
45
|
+
{ value: 'luxurious', name: 'Luxurious / Premium' },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: 'density',
|
|
50
|
+
type: 'select',
|
|
51
|
+
message: 'How dense should the interface be?',
|
|
52
|
+
required: true,
|
|
53
|
+
choices: [
|
|
54
|
+
{ value: 'compact', name: 'Compact — dense tables, small spacing' },
|
|
55
|
+
{ value: 'balanced', name: 'Balanced — moderate spacing' },
|
|
56
|
+
{ value: 'spacious', name: 'Spacious — generous whitespace' },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: 'reference',
|
|
61
|
+
type: 'input',
|
|
62
|
+
message: 'Any reference product or site for style inspiration? (optional, press Enter to skip)',
|
|
63
|
+
required: false,
|
|
64
|
+
choices: [],
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
export async function runQuestionnaire() {
|
|
68
|
+
const { checkbox, select, input } = await import('@inquirer/prompts');
|
|
69
|
+
const productType = await checkbox({
|
|
70
|
+
message: QUESTIONS[0].message,
|
|
71
|
+
choices: QUESTIONS[0].choices,
|
|
72
|
+
});
|
|
73
|
+
const audience = await select({
|
|
74
|
+
message: QUESTIONS[1].message,
|
|
75
|
+
choices: QUESTIONS[1].choices,
|
|
76
|
+
});
|
|
77
|
+
const mood = await select({
|
|
78
|
+
message: QUESTIONS[2].message,
|
|
79
|
+
choices: QUESTIONS[2].choices,
|
|
80
|
+
});
|
|
81
|
+
const density = await select({
|
|
82
|
+
message: QUESTIONS[3].message,
|
|
83
|
+
choices: QUESTIONS[3].choices,
|
|
84
|
+
});
|
|
85
|
+
const reference = await input({
|
|
86
|
+
message: QUESTIONS[4].message,
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
productType,
|
|
90
|
+
audience,
|
|
91
|
+
mood,
|
|
92
|
+
density,
|
|
93
|
+
reference: reference || null,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=questionnaire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questionnaire.js","sourceRoot":"","sources":["../../src/design-md/questionnaire.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/design-md/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7D,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CA4CpF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { stringify as yamlStringify, parse as parseYaml } from 'yaml';
|
|
2
|
+
export function renderDesignMd(archetype, vector) {
|
|
3
|
+
const templateTokens = parseYaml(archetype.template);
|
|
4
|
+
const frontMatter = {
|
|
5
|
+
archetype: archetype.id,
|
|
6
|
+
dimensions: vector,
|
|
7
|
+
tokens: templateTokens.tokens,
|
|
8
|
+
};
|
|
9
|
+
const yamlContent = yamlStringify(frontMatter).trim();
|
|
10
|
+
const markdown = `
|
|
11
|
+
# Style Direction
|
|
12
|
+
|
|
13
|
+
Based on **${archetype.name}** archetype (reference: ${archetype.anchors.primary}).
|
|
14
|
+
|
|
15
|
+
Dimension profile: colorTemp=${vector.colorTemp}, lightness=${vector.lightness}, density=${vector.density}, borderRadius=${vector.borderRadius}, tone=${vector.tone}.
|
|
16
|
+
|
|
17
|
+
## Color Palette
|
|
18
|
+
|
|
19
|
+
Primary: \`${templateTokens.tokens.colors.primary}\`
|
|
20
|
+
Background: \`${templateTokens.tokens.colors.background}\`
|
|
21
|
+
Surface: \`${templateTokens.tokens.colors.surface}\`
|
|
22
|
+
Text: \`${templateTokens.tokens.colors.text}\`
|
|
23
|
+
Accent: \`${templateTokens.tokens.colors.accent}\`
|
|
24
|
+
|
|
25
|
+
## Typography
|
|
26
|
+
|
|
27
|
+
Font family: ${templateTokens.tokens.typography.fontFamily}
|
|
28
|
+
Scale: ${templateTokens.tokens.typography.scale.join(', ')}
|
|
29
|
+
|
|
30
|
+
## Spacing
|
|
31
|
+
|
|
32
|
+
Base unit: ${templateTokens.tokens.spacing.base}
|
|
33
|
+
Scale: ${templateTokens.tokens.spacing.scale.join(', ')}
|
|
34
|
+
|
|
35
|
+
## Components
|
|
36
|
+
|
|
37
|
+
Border radius: ${templateTokens.tokens.radius.default} (default), ${templateTokens.tokens.radius.large} (large)
|
|
38
|
+
Density: ${templateTokens.tokens.density.compact ? 'compact' : 'comfortable'}
|
|
39
|
+
Table row height: ${templateTokens.tokens.density.tableRowHeight}
|
|
40
|
+
`;
|
|
41
|
+
return `---\n${yamlContent}\n---\n${markdown}`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/design-md/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAGtE,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,MAAuB;IAC1E,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAErD,MAAM,WAAW,GAAG;QAClB,SAAS,EAAE,SAAS,CAAC,EAAE;QACvB,UAAU,EAAE,MAAM;QAClB,MAAM,EAAE,cAAc,CAAC,MAAM;KAC9B,CAAC;IAEF,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtD,MAAM,QAAQ,GAAG;;;aAGN,SAAS,CAAC,IAAI,4BAA4B,SAAS,CAAC,OAAO,CAAC,OAAO;;+BAEjD,MAAM,CAAC,SAAS,eAAe,MAAM,CAAC,SAAS,aAAa,MAAM,CAAC,OAAO,kBAAkB,MAAM,CAAC,YAAY,UAAU,MAAM,CAAC,IAAI;;;;aAItJ,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;gBACjC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU;aAC1C,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;UACvC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;YAC/B,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;;;;eAIhC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU;SACjD,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;aAI7C,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;SACtC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;iBAItC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,eAAe,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;WAC3F,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;oBACxD,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc;CAC/D,CAAC;IAEA,OAAO,QAAQ,WAAW,UAAU,QAAQ,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ArchetypeSchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
category: z.ZodEnum<["internal-tool", "dashboard", "consumer", "developer", "mobile", "e-commerce", "marketing", "form-heavy", "content"]>;
|
|
6
|
+
dimensions: z.ZodObject<{
|
|
7
|
+
colorTemp: z.ZodNumber;
|
|
8
|
+
lightness: z.ZodNumber;
|
|
9
|
+
density: z.ZodNumber;
|
|
10
|
+
borderRadius: z.ZodNumber;
|
|
11
|
+
tone: z.ZodNumber;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
colorTemp: number;
|
|
14
|
+
lightness: number;
|
|
15
|
+
density: number;
|
|
16
|
+
borderRadius: number;
|
|
17
|
+
tone: number;
|
|
18
|
+
}, {
|
|
19
|
+
colorTemp: number;
|
|
20
|
+
lightness: number;
|
|
21
|
+
density: number;
|
|
22
|
+
borderRadius: number;
|
|
23
|
+
tone: number;
|
|
24
|
+
}>;
|
|
25
|
+
anchors: z.ZodObject<{
|
|
26
|
+
primary: z.ZodString;
|
|
27
|
+
auxiliary: z.ZodArray<z.ZodString, "many">;
|
|
28
|
+
}, "strip", z.ZodTypeAny, {
|
|
29
|
+
primary: string;
|
|
30
|
+
auxiliary: string[];
|
|
31
|
+
}, {
|
|
32
|
+
primary: string;
|
|
33
|
+
auxiliary: string[];
|
|
34
|
+
}>;
|
|
35
|
+
template: z.ZodString;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
category: "internal-tool" | "dashboard" | "consumer" | "developer" | "mobile" | "e-commerce" | "marketing" | "form-heavy" | "content";
|
|
40
|
+
dimensions: {
|
|
41
|
+
colorTemp: number;
|
|
42
|
+
lightness: number;
|
|
43
|
+
density: number;
|
|
44
|
+
borderRadius: number;
|
|
45
|
+
tone: number;
|
|
46
|
+
};
|
|
47
|
+
anchors: {
|
|
48
|
+
primary: string;
|
|
49
|
+
auxiliary: string[];
|
|
50
|
+
};
|
|
51
|
+
template: string;
|
|
52
|
+
}, {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
category: "internal-tool" | "dashboard" | "consumer" | "developer" | "mobile" | "e-commerce" | "marketing" | "form-heavy" | "content";
|
|
56
|
+
dimensions: {
|
|
57
|
+
colorTemp: number;
|
|
58
|
+
lightness: number;
|
|
59
|
+
density: number;
|
|
60
|
+
borderRadius: number;
|
|
61
|
+
tone: number;
|
|
62
|
+
};
|
|
63
|
+
anchors: {
|
|
64
|
+
primary: string;
|
|
65
|
+
auxiliary: string[];
|
|
66
|
+
};
|
|
67
|
+
template: string;
|
|
68
|
+
}>;
|
|
69
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/design-md/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B1B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const DimensionValueSchema = z.number().int().min(1).max(5);
|
|
3
|
+
export const ArchetypeSchema = z.object({
|
|
4
|
+
id: z.string().regex(/^[a-z][a-z0-9-]*$/),
|
|
5
|
+
name: z.string().min(1),
|
|
6
|
+
category: z.enum([
|
|
7
|
+
'internal-tool',
|
|
8
|
+
'dashboard',
|
|
9
|
+
'consumer',
|
|
10
|
+
'developer',
|
|
11
|
+
'mobile',
|
|
12
|
+
'e-commerce',
|
|
13
|
+
'marketing',
|
|
14
|
+
'form-heavy',
|
|
15
|
+
'content',
|
|
16
|
+
]),
|
|
17
|
+
dimensions: z.object({
|
|
18
|
+
colorTemp: DimensionValueSchema,
|
|
19
|
+
lightness: DimensionValueSchema,
|
|
20
|
+
density: DimensionValueSchema,
|
|
21
|
+
borderRadius: DimensionValueSchema,
|
|
22
|
+
tone: DimensionValueSchema,
|
|
23
|
+
}),
|
|
24
|
+
anchors: z.object({
|
|
25
|
+
primary: z.string().min(1),
|
|
26
|
+
auxiliary: z.array(z.string().min(1)).min(1).max(2),
|
|
27
|
+
}),
|
|
28
|
+
template: z.string().min(1),
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/design-md/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC;QACf,eAAe;QACf,WAAW;QACX,UAAU;QACV,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,SAAS;KACV,CAAC;IACF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,oBAAoB;QAC/B,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,oBAAoB;QAC7B,YAAY,EAAE,oBAAoB;QAClC,IAAI,EAAE,oBAAoB;KAC3B,CAAC;IACF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KACpD,CAAC;IACF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC5B,CAAC,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
type: object
|
|
2
|
+
required:
|
|
3
|
+
- id
|
|
4
|
+
- name
|
|
5
|
+
- category
|
|
6
|
+
- dimensions
|
|
7
|
+
- anchors
|
|
8
|
+
- template
|
|
9
|
+
properties:
|
|
10
|
+
id:
|
|
11
|
+
type: string
|
|
12
|
+
pattern: "^[a-z][a-z0-9-]*$"
|
|
13
|
+
name:
|
|
14
|
+
type: string
|
|
15
|
+
category:
|
|
16
|
+
type: string
|
|
17
|
+
enum:
|
|
18
|
+
- internal-tool
|
|
19
|
+
- dashboard
|
|
20
|
+
- consumer
|
|
21
|
+
- developer
|
|
22
|
+
- mobile
|
|
23
|
+
- e-commerce
|
|
24
|
+
- marketing
|
|
25
|
+
- form-heavy
|
|
26
|
+
- content
|
|
27
|
+
dimensions:
|
|
28
|
+
type: object
|
|
29
|
+
required:
|
|
30
|
+
- colorTemp
|
|
31
|
+
- lightness
|
|
32
|
+
- density
|
|
33
|
+
- borderRadius
|
|
34
|
+
- tone
|
|
35
|
+
properties:
|
|
36
|
+
colorTemp:
|
|
37
|
+
type: integer
|
|
38
|
+
minimum: 1
|
|
39
|
+
maximum: 5
|
|
40
|
+
lightness:
|
|
41
|
+
type: integer
|
|
42
|
+
minimum: 1
|
|
43
|
+
maximum: 5
|
|
44
|
+
density:
|
|
45
|
+
type: integer
|
|
46
|
+
minimum: 1
|
|
47
|
+
maximum: 5
|
|
48
|
+
borderRadius:
|
|
49
|
+
type: integer
|
|
50
|
+
minimum: 1
|
|
51
|
+
maximum: 5
|
|
52
|
+
tone:
|
|
53
|
+
type: integer
|
|
54
|
+
minimum: 1
|
|
55
|
+
maximum: 5
|
|
56
|
+
anchors:
|
|
57
|
+
type: object
|
|
58
|
+
required:
|
|
59
|
+
- primary
|
|
60
|
+
- auxiliary
|
|
61
|
+
properties:
|
|
62
|
+
primary:
|
|
63
|
+
type: string
|
|
64
|
+
auxiliary:
|
|
65
|
+
type: array
|
|
66
|
+
items:
|
|
67
|
+
type: string
|
|
68
|
+
minItems: 1
|
|
69
|
+
maxItems: 2
|
|
70
|
+
template:
|
|
71
|
+
type: string
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: consumer-media
|
|
2
|
+
name: Consumer Media
|
|
3
|
+
category: consumer
|
|
4
|
+
dimensions:
|
|
5
|
+
colorTemp: 3
|
|
6
|
+
lightness: 2
|
|
7
|
+
density: 4
|
|
8
|
+
borderRadius: 3
|
|
9
|
+
tone: 4
|
|
10
|
+
anchors:
|
|
11
|
+
primary: Spotify
|
|
12
|
+
auxiliary:
|
|
13
|
+
- Netflix
|
|
14
|
+
- Apple Music
|
|
15
|
+
template: |
|
|
16
|
+
tokens:
|
|
17
|
+
colors:
|
|
18
|
+
primary: "#1DB954"
|
|
19
|
+
background: "#121212"
|
|
20
|
+
surface: "#1E1E1E"
|
|
21
|
+
text: "#FFFFFF"
|
|
22
|
+
accent: "#1ED760"
|
|
23
|
+
spacing:
|
|
24
|
+
base: "4px"
|
|
25
|
+
scale: [4, 8, 12, 16, 24, 32, 48, 64]
|
|
26
|
+
radius:
|
|
27
|
+
default: "8px"
|
|
28
|
+
large: "12px"
|
|
29
|
+
typography:
|
|
30
|
+
fontFamily: "'Circular', 'Helvetica Neue', sans-serif"
|
|
31
|
+
scale: [12, 14, 16, 20, 24, 32, 48]
|
|
32
|
+
density:
|
|
33
|
+
compact: false
|
|
34
|
+
tableRowHeight: "48px"
|