pigment-mcp 0.9.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/cli.js +36 -14
  2. package/content/registry.json +34 -4
  3. package/content/shots.json +74 -0
  4. package/content/templates/graphite-blueprint/1.1.0/CHANGELOG.md +280 -0
  5. package/content/templates/graphite-blueprint/1.1.0/agent/instructions.md +41 -0
  6. package/content/templates/graphite-blueprint/1.1.0/components/badge.md +15 -0
  7. package/content/templates/graphite-blueprint/1.1.0/components/button.md +18 -0
  8. package/content/templates/graphite-blueprint/1.1.0/components/card.md +12 -0
  9. package/content/templates/graphite-blueprint/1.1.0/components/checkbox.md +11 -0
  10. package/content/templates/graphite-blueprint/1.1.0/components/dialog.md +11 -0
  11. package/content/templates/graphite-blueprint/1.1.0/components/empty-state.md +9 -0
  12. package/content/templates/graphite-blueprint/1.1.0/components/index.json +17 -0
  13. package/content/templates/graphite-blueprint/1.1.0/components/navigation.md +21 -0
  14. package/content/templates/graphite-blueprint/1.1.0/components/select.md +11 -0
  15. package/content/templates/graphite-blueprint/1.1.0/components/switch.md +11 -0
  16. package/content/templates/graphite-blueprint/1.1.0/components/table.md +52 -0
  17. package/content/templates/graphite-blueprint/1.1.0/components/tabs.md +12 -0
  18. package/content/templates/graphite-blueprint/1.1.0/components/text-field.md +17 -0
  19. package/content/templates/graphite-blueprint/1.1.0/components/toast.md +12 -0
  20. package/content/templates/graphite-blueprint/1.1.0/dist/agent.md +1016 -0
  21. package/content/templates/graphite-blueprint/1.1.0/dist/tokens.css +349 -0
  22. package/content/templates/graphite-blueprint/1.1.0/dist/tokens.json +540 -0
  23. package/content/templates/graphite-blueprint/1.1.0/manifest.json +77 -0
  24. package/content/templates/graphite-blueprint/1.1.0/principles/visual-language.md +486 -0
  25. package/content/templates/graphite-blueprint/1.1.0/tokens/primitives.json +714 -0
  26. package/content/templates/graphite-blueprint/1.1.0/tokens/semantic.dark.json +245 -0
  27. package/content/templates/graphite-blueprint/1.1.0/tokens/semantic.light.json +245 -0
  28. package/content/templates/inkleaf/1.1.0/CHANGELOG.md +197 -0
  29. package/content/templates/inkleaf/1.1.0/agent/instructions.md +44 -0
  30. package/content/templates/inkleaf/1.1.0/components/avatar.md +8 -0
  31. package/content/templates/inkleaf/1.1.0/components/badge.md +8 -0
  32. package/content/templates/inkleaf/1.1.0/components/button.md +16 -0
  33. package/content/templates/inkleaf/1.1.0/components/card.md +14 -0
  34. package/content/templates/inkleaf/1.1.0/components/checkbox.md +11 -0
  35. package/content/templates/inkleaf/1.1.0/components/dialog.md +10 -0
  36. package/content/templates/inkleaf/1.1.0/components/empty-state.md +8 -0
  37. package/content/templates/inkleaf/1.1.0/components/index.json +18 -0
  38. package/content/templates/inkleaf/1.1.0/components/navigation.md +26 -0
  39. package/content/templates/inkleaf/1.1.0/components/select.md +10 -0
  40. package/content/templates/inkleaf/1.1.0/components/switch.md +11 -0
  41. package/content/templates/inkleaf/1.1.0/components/table.md +25 -0
  42. package/content/templates/inkleaf/1.1.0/components/tabs.md +12 -0
  43. package/content/templates/inkleaf/1.1.0/components/text-field.md +12 -0
  44. package/content/templates/inkleaf/1.1.0/components/toast.md +8 -0
  45. package/content/templates/inkleaf/1.1.0/dist/agent.md +967 -0
  46. package/content/templates/inkleaf/1.1.0/dist/tokens.css +283 -0
  47. package/content/templates/inkleaf/1.1.0/dist/tokens.json +462 -0
  48. package/content/templates/inkleaf/1.1.0/manifest.json +77 -0
  49. package/content/templates/inkleaf/1.1.0/principles/visual-language.md +493 -0
  50. package/content/templates/inkleaf/1.1.0/tokens/primitives.json +214 -0
  51. package/content/templates/inkleaf/1.1.0/tokens/semantic.dark.json +69 -0
  52. package/content/templates/inkleaf/1.1.0/tokens/semantic.light.json +69 -0
  53. package/content/templates/margin-notes/1.2.0/CHANGELOG.md +130 -0
  54. package/content/templates/margin-notes/1.2.0/agent/instructions.md +44 -0
  55. package/content/templates/margin-notes/1.2.0/components/badge.md +9 -0
  56. package/content/templates/margin-notes/1.2.0/components/button.md +11 -0
  57. package/content/templates/margin-notes/1.2.0/components/callout.md +9 -0
  58. package/content/templates/margin-notes/1.2.0/components/card.md +11 -0
  59. package/content/templates/margin-notes/1.2.0/components/checkbox.md +21 -0
  60. package/content/templates/margin-notes/1.2.0/components/chip.md +9 -0
  61. package/content/templates/margin-notes/1.2.0/components/code-block.md +9 -0
  62. package/content/templates/margin-notes/1.2.0/components/dialog.md +9 -0
  63. package/content/templates/margin-notes/1.2.0/components/empty-state.md +9 -0
  64. package/content/templates/margin-notes/1.2.0/components/index.json +22 -0
  65. package/content/templates/margin-notes/1.2.0/components/media-frame.md +9 -0
  66. package/content/templates/margin-notes/1.2.0/components/navigation.md +11 -0
  67. package/content/templates/margin-notes/1.2.0/components/segmented-control.md +9 -0
  68. package/content/templates/margin-notes/1.2.0/components/select.md +9 -0
  69. package/content/templates/margin-notes/1.2.0/components/switch.md +9 -0
  70. package/content/templates/margin-notes/1.2.0/components/table.md +31 -0
  71. package/content/templates/margin-notes/1.2.0/components/tabs.md +9 -0
  72. package/content/templates/margin-notes/1.2.0/components/text-field.md +11 -0
  73. package/content/templates/margin-notes/1.2.0/components/toast.md +9 -0
  74. package/content/templates/margin-notes/1.2.0/dist/agent.md +707 -0
  75. package/content/templates/margin-notes/1.2.0/dist/tokens.css +301 -0
  76. package/content/templates/margin-notes/1.2.0/dist/tokens.json +462 -0
  77. package/content/templates/margin-notes/1.2.0/manifest.json +108 -0
  78. package/content/templates/margin-notes/1.2.0/principles/visual-language.md +228 -0
  79. package/content/templates/margin-notes/1.2.0/tokens/primitives.json +611 -0
  80. package/content/templates/margin-notes/1.2.0/tokens/semantic.dark.json +200 -0
  81. package/content/templates/margin-notes/1.2.0/tokens/semantic.light.json +199 -0
  82. package/content/templates/night-cartridge/1.2.0/CHANGELOG.md +438 -0
  83. package/content/templates/night-cartridge/1.2.0/agent/instructions.md +40 -0
  84. package/content/templates/night-cartridge/1.2.0/components/badge.md +5 -0
  85. package/content/templates/night-cartridge/1.2.0/components/button.md +13 -0
  86. package/content/templates/night-cartridge/1.2.0/components/card.md +7 -0
  87. package/content/templates/night-cartridge/1.2.0/components/checkbox.md +7 -0
  88. package/content/templates/night-cartridge/1.2.0/components/dialog.md +7 -0
  89. package/content/templates/night-cartridge/1.2.0/components/empty-state.md +5 -0
  90. package/content/templates/night-cartridge/1.2.0/components/index.json +17 -0
  91. package/content/templates/night-cartridge/1.2.0/components/navigation.md +18 -0
  92. package/content/templates/night-cartridge/1.2.0/components/select.md +7 -0
  93. package/content/templates/night-cartridge/1.2.0/components/switch.md +7 -0
  94. package/content/templates/night-cartridge/1.2.0/components/table.md +17 -0
  95. package/content/templates/night-cartridge/1.2.0/components/tabs.md +7 -0
  96. package/content/templates/night-cartridge/1.2.0/components/text-field.md +7 -0
  97. package/content/templates/night-cartridge/1.2.0/components/toast.md +7 -0
  98. package/content/templates/night-cartridge/1.2.0/dist/agent.md +713 -0
  99. package/content/templates/night-cartridge/1.2.0/dist/tokens.css +196 -0
  100. package/content/templates/night-cartridge/1.2.0/dist/tokens.json +226 -0
  101. package/content/templates/night-cartridge/1.2.0/manifest.json +99 -0
  102. package/content/templates/night-cartridge/1.2.0/principles/visual-language.md +363 -0
  103. package/content/templates/night-cartridge/1.2.0/tokens/primitives.json +520 -0
  104. package/content/templates/night-cartridge/1.2.0/tokens/semantic.dark.json +220 -0
  105. package/content/templates/night-cartridge/1.3.0/CHANGELOG.md +516 -0
  106. package/content/templates/night-cartridge/1.3.0/agent/instructions.md +40 -0
  107. package/content/templates/night-cartridge/1.3.0/components/badge.md +5 -0
  108. package/content/templates/night-cartridge/1.3.0/components/button.md +13 -0
  109. package/content/templates/night-cartridge/1.3.0/components/card.md +7 -0
  110. package/content/templates/night-cartridge/1.3.0/components/checkbox.md +7 -0
  111. package/content/templates/night-cartridge/1.3.0/components/dialog.md +7 -0
  112. package/content/templates/night-cartridge/1.3.0/components/empty-state.md +5 -0
  113. package/content/templates/night-cartridge/1.3.0/components/index.json +17 -0
  114. package/content/templates/night-cartridge/1.3.0/components/navigation.md +18 -0
  115. package/content/templates/night-cartridge/1.3.0/components/select.md +7 -0
  116. package/content/templates/night-cartridge/1.3.0/components/switch.md +7 -0
  117. package/content/templates/night-cartridge/1.3.0/components/table.md +17 -0
  118. package/content/templates/night-cartridge/1.3.0/components/tabs.md +7 -0
  119. package/content/templates/night-cartridge/1.3.0/components/text-field.md +7 -0
  120. package/content/templates/night-cartridge/1.3.0/components/toast.md +7 -0
  121. package/content/templates/night-cartridge/1.3.0/dist/agent.md +717 -0
  122. package/content/templates/night-cartridge/1.3.0/dist/tokens.css +196 -0
  123. package/content/templates/night-cartridge/1.3.0/dist/tokens.json +226 -0
  124. package/content/templates/night-cartridge/1.3.0/manifest.json +99 -0
  125. package/content/templates/night-cartridge/1.3.0/principles/visual-language.md +367 -0
  126. package/content/templates/night-cartridge/1.3.0/tokens/primitives.json +520 -0
  127. package/content/templates/night-cartridge/1.3.0/tokens/semantic.dark.json +220 -0
  128. package/package.json +1 -1
package/cli.js CHANGED
@@ -34493,7 +34493,7 @@ function resolveTokens(primitives, semantic) {
34493
34493
  for (const [path, token] of all) resolved.set(path, { value: resolveValue(token.value, /* @__PURE__ */ new Set([path])), type: token.type });
34494
34494
  return resolved;
34495
34495
  }
34496
- var TemplateId, SemVer, Hex, AppId, Scenario, TemplateStatus, Manifest, DtcgType, DtcgToken, ComponentCategory, ComponentEntry, ComponentIndex, AUDIT_AREAS, AuditArea, Evidence, Signature, Analysis, RunRecord, GateResult, CriticScores, EvalReport, Registry;
34496
+ var TemplateId, SemVer, Hex, AppId, HoldoutAppId, RunAppId, Scenario, TemplateStatus, Manifest, DtcgType, DtcgToken, ComponentCategory, ComponentEntry, ComponentIndex, AUDIT_AREAS, AuditArea, Evidence, Signature, Analysis, RunRecord, GateResult, CriticFinding, score, CriticScores, EvalReport, Registry;
34497
34497
  var init_src = __esm({
34498
34498
  "../schema/src/index.ts"() {
34499
34499
  "use strict";
@@ -34502,6 +34502,8 @@ var init_src = __esm({
34502
34502
  SemVer = external_exports.string().regex(/^\d+\.\d+\.\d+(-[0-9a-z.-]+)?$/, "semantic version, e.g. 1.0.0 or 0.1.0-rc.1");
34503
34503
  Hex = external_exports.string().regex(/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/, "6 or 8 digit hex");
34504
34504
  AppId = external_exports.enum(["dashboard", "commerce", "blog", "settings"]);
34505
+ HoldoutAppId = external_exports.enum(["landing", "docs"]);
34506
+ RunAppId = external_exports.union([AppId, HoldoutAppId]);
34505
34507
  Scenario = external_exports.enum(["new", "existing", "ongoing"]);
34506
34508
  TemplateStatus = external_exports.enum(["draft", "candidate", "published", "deprecated"]);
34507
34509
  Manifest = external_exports.object({
@@ -34682,7 +34684,7 @@ var init_src = __esm({
34682
34684
  runId: external_exports.string(),
34683
34685
  template: TemplateId,
34684
34686
  version: SemVer,
34685
- app: AppId,
34687
+ app: RunAppId,
34686
34688
  scenario: Scenario,
34687
34689
  agent: external_exports.enum(["claude", "codex"]),
34688
34690
  model: external_exports.string().optional(),
@@ -34700,17 +34702,33 @@ var init_src = __esm({
34700
34702
  threshold: external_exports.union([external_exports.number(), external_exports.string()]).optional(),
34701
34703
  detail: external_exports.string().optional()
34702
34704
  });
34705
+ CriticFinding = external_exports.object({
34706
+ severity: external_exports.enum(["blocker", "major", "minor"]),
34707
+ /** Rubric area: referenceFidelity, crossAppConsistency, hierarchy, spacingRhythm, componentStates, polish, signature. */
34708
+ area: external_exports.string(),
34709
+ summary: external_exports.string(),
34710
+ /** In how many of the evaluated samples it appears, and how many there were. */
34711
+ samples: external_exports.number().int().min(0),
34712
+ of: external_exports.number().int().min(1),
34713
+ /** The spec's own wording or recipe causes it (a missing, ambiguous or contradictory rule). */
34714
+ specCaused: external_exports.boolean().default(false),
34715
+ evidence: external_exports.array(external_exports.string()).default([]),
34716
+ /** A general rule that would prevent it in any product — never a fix tied to one demo app's screen or data. */
34717
+ promptFix: external_exports.string().optional()
34718
+ });
34719
+ score = external_exports.number().min(0).max(5);
34703
34720
  CriticScores = external_exports.object({
34704
- referenceFidelity: external_exports.number().min(0).max(5).nullable(),
34705
- crossAppConsistency: external_exports.number().min(0).max(5),
34706
- hierarchy: external_exports.number().min(0).max(5),
34707
- spacingRhythm: external_exports.number().min(0).max(5),
34708
- componentStates: external_exports.number().min(0).max(5),
34709
- polish: external_exports.number().min(0).max(5),
34710
- /** Are the signature elements present across all four apps, placed per the application map, moving as specified? Null for packages without signatures. */
34711
- signature: external_exports.number().min(0).max(5).nullable().optional(),
34712
- notes: external_exports.array(external_exports.string()),
34713
- promptFixes: external_exports.array(external_exports.string()).describe("Concrete spec changes that would fix the observed problems")
34721
+ /** Descriptive only (the verdict comes from findings). Older critic files gate on them. */
34722
+ referenceFidelity: score.nullable().optional(),
34723
+ crossAppConsistency: score.optional(),
34724
+ hierarchy: score.optional(),
34725
+ spacingRhythm: score.optional(),
34726
+ componentStates: score.optional(),
34727
+ polish: score.optional(),
34728
+ signature: score.nullable().optional(),
34729
+ findings: external_exports.array(CriticFinding).optional(),
34730
+ notes: external_exports.array(external_exports.string()).default([]),
34731
+ promptFixes: external_exports.array(external_exports.string()).default([]).describe("Concrete spec changes that would fix the observed problems")
34714
34732
  });
34715
34733
  EvalReport = external_exports.object({
34716
34734
  template: TemplateId,
@@ -34720,13 +34738,17 @@ var init_src = __esm({
34720
34738
  runs: external_exports.array(
34721
34739
  external_exports.object({
34722
34740
  runId: external_exports.string(),
34723
- app: AppId,
34741
+ app: RunAppId,
34724
34742
  gates: external_exports.array(GateResult),
34725
34743
  metrics: external_exports.record(external_exports.string(), external_exports.number())
34726
34744
  })
34727
34745
  ),
34728
34746
  crossApp: external_exports.array(GateResult).default([]),
34747
+ /** Measured layout defects (clipped or overlapping text, near-miss alignment, doubled rules, repeated drawings). */
34748
+ layout: external_exports.array(external_exports.object({ app: RunAppId, runId: external_exports.string(), route: external_exports.string(), viewport: external_exports.string(), kind: external_exports.string(), where: external_exports.string(), detail: external_exports.string() })).optional(),
34729
34749
  critic: CriticScores.optional(),
34750
+ /** Agent spend of this version and of its whole family (all candidates), for the record. */
34751
+ cost: external_exports.object({ versionUsd: external_exports.number(), familyUsd: external_exports.number(), familyRuns: external_exports.number() }).optional(),
34730
34752
  verdict: external_exports.enum(["pass", "fail", "pending-review"]),
34731
34753
  reasons: external_exports.array(external_exports.string())
34732
34754
  });
@@ -34971,7 +34993,7 @@ var init_package = __esm({
34971
34993
  "package.json"() {
34972
34994
  package_default = {
34973
34995
  name: "@pigment/mcp",
34974
- version: "0.9.0",
34996
+ version: "0.14.0",
34975
34997
  private: true,
34976
34998
  type: "module",
34977
34999
  description: "MCP server for Pigment design systems: tokens, rules, component specs and installation guides for your coding agent.",
@@ -2,7 +2,7 @@
2
2
  "templates": [
3
3
  {
4
4
  "id": "margin-notes",
5
- "latest": "1.1.0",
5
+ "latest": "1.2.0",
6
6
  "versions": [
7
7
  {
8
8
  "version": "1.0.0",
@@ -15,24 +15,36 @@
15
15
  "status": "published",
16
16
  "publishedAt": "2026-10-14T08:33:30.334Z",
17
17
  "sha256": "f6a26186965b8425d7b1ea620c737f58e8e907746b1550fb32a7b4bf98b6fa04"
18
+ },
19
+ {
20
+ "version": "1.2.0",
21
+ "status": "published",
22
+ "publishedAt": "2026-10-19T01:41:09.029Z",
23
+ "sha256": "99fb52e92bdc3b35b474a873f4bb4657e81d4e326cd26f8de56c1dc0b4a225f2"
18
24
  }
19
25
  ]
20
26
  },
21
27
  {
22
28
  "id": "inkleaf",
23
- "latest": "1.0.0",
29
+ "latest": "1.1.0",
24
30
  "versions": [
25
31
  {
26
32
  "version": "1.0.0",
27
33
  "status": "published",
28
34
  "publishedAt": "2026-10-14T00:22:11.356Z",
29
35
  "sha256": "950225ff2a2540952b0acbdd499d07d8f78576262299a979d5d831145f51174b"
36
+ },
37
+ {
38
+ "version": "1.1.0",
39
+ "status": "published",
40
+ "publishedAt": "2026-10-19T05:40:05.888Z",
41
+ "sha256": "e2a38ffc279853fcb8b6de07028f16127319053e8b779f02a981ec396f26f85c"
30
42
  }
31
43
  ]
32
44
  },
33
45
  {
34
46
  "id": "night-cartridge",
35
- "latest": "1.1.0",
47
+ "latest": "1.3.0",
36
48
  "versions": [
37
49
  {
38
50
  "version": "1.0.0",
@@ -45,18 +57,36 @@
45
57
  "status": "published",
46
58
  "publishedAt": "2026-10-15T04:49:09.540Z",
47
59
  "sha256": "a4e943cb722c1506dac7af6ab80341f3c28bbe1aef3184038d4a9cb863a06e30"
60
+ },
61
+ {
62
+ "version": "1.2.0",
63
+ "status": "published",
64
+ "publishedAt": "2026-10-18T13:46:07.189Z",
65
+ "sha256": "82dcfe93ef26940ddbb6a3d6bf15c4ab4539638de605ee9b206512e42a98ad63"
66
+ },
67
+ {
68
+ "version": "1.3.0",
69
+ "status": "published",
70
+ "publishedAt": "2026-10-19T07:10:06.232Z",
71
+ "sha256": "8dfc70ec02127dbf36f6c439290c2fc4a64fe4efef971ac76ec48522411f2717"
48
72
  }
49
73
  ]
50
74
  },
51
75
  {
52
76
  "id": "graphite-blueprint",
53
- "latest": "1.0.0",
77
+ "latest": "1.1.0",
54
78
  "versions": [
55
79
  {
56
80
  "version": "1.0.0",
57
81
  "status": "published",
58
82
  "publishedAt": "2026-10-17T10:38:28.909Z",
59
83
  "sha256": "0a34e9d7f81627182cd5fba1eb0c1aa758350479c5bed36adf2e5962386e49df"
84
+ },
85
+ {
86
+ "version": "1.1.0",
87
+ "status": "published",
88
+ "publishedAt": "2026-10-18T11:26:12.349Z",
89
+ "sha256": "f15b112756c795d50a806d53754f2946f3436bbb81a841154c6220da93139063"
60
90
  }
61
91
  ]
62
92
  }
@@ -35,6 +35,24 @@
35
35
  "settings.mobileLight": "/showcase/margin-notes/1.1.0/settings/settings-profile-mobile-light.png",
36
36
  "settings.mobileDark": "/showcase/margin-notes/1.1.0/settings/settings-profile-mobile-dark.png"
37
37
  },
38
+ "margin-notes@1.2.0": {
39
+ "blog.desktopLight": "/showcase/margin-notes/1.2.0/blog/home-desktop-light.png",
40
+ "blog.desktopDark": "/showcase/margin-notes/1.2.0/blog/home-desktop-dark.png",
41
+ "blog.mobileLight": "/showcase/margin-notes/1.2.0/blog/home-mobile-light.png",
42
+ "blog.mobileDark": "/showcase/margin-notes/1.2.0/blog/home-mobile-dark.png",
43
+ "commerce.desktopLight": "/showcase/margin-notes/1.2.0/commerce/home-desktop-light.png",
44
+ "commerce.desktopDark": "/showcase/margin-notes/1.2.0/commerce/home-desktop-dark.png",
45
+ "commerce.mobileLight": "/showcase/margin-notes/1.2.0/commerce/home-mobile-light.png",
46
+ "commerce.mobileDark": "/showcase/margin-notes/1.2.0/commerce/home-mobile-dark.png",
47
+ "dashboard.desktopLight": "/showcase/margin-notes/1.2.0/dashboard/home-desktop-light.png",
48
+ "dashboard.desktopDark": "/showcase/margin-notes/1.2.0/dashboard/home-desktop-dark.png",
49
+ "dashboard.mobileLight": "/showcase/margin-notes/1.2.0/dashboard/home-mobile-light.png",
50
+ "dashboard.mobileDark": "/showcase/margin-notes/1.2.0/dashboard/home-mobile-dark.png",
51
+ "settings.desktopLight": "/showcase/margin-notes/1.2.0/settings/settings-profile-desktop-light.png",
52
+ "settings.desktopDark": "/showcase/margin-notes/1.2.0/settings/settings-profile-desktop-dark.png",
53
+ "settings.mobileLight": "/showcase/margin-notes/1.2.0/settings/settings-profile-mobile-light.png",
54
+ "settings.mobileDark": "/showcase/margin-notes/1.2.0/settings/settings-profile-mobile-dark.png"
55
+ },
38
56
  "inkleaf@1.0.0": {
39
57
  "blog.desktopLight": "/showcase/inkleaf/1.0.0/blog/home-desktop-light.png",
40
58
  "blog.desktopDark": "/showcase/inkleaf/1.0.0/blog/home-desktop-dark.png",
@@ -53,6 +71,24 @@
53
71
  "settings.mobileLight": "/showcase/inkleaf/1.0.0/settings/settings-profile-mobile-light.png",
54
72
  "settings.mobileDark": "/showcase/inkleaf/1.0.0/settings/settings-profile-mobile-dark.png"
55
73
  },
74
+ "inkleaf@1.1.0": {
75
+ "blog.desktopLight": "/showcase/inkleaf/1.1.0/blog/home-desktop-light.png",
76
+ "blog.desktopDark": "/showcase/inkleaf/1.1.0/blog/home-desktop-dark.png",
77
+ "blog.mobileLight": "/showcase/inkleaf/1.1.0/blog/home-mobile-light.png",
78
+ "blog.mobileDark": "/showcase/inkleaf/1.1.0/blog/home-mobile-dark.png",
79
+ "commerce.desktopLight": "/showcase/inkleaf/1.1.0/commerce/home-desktop-light.png",
80
+ "commerce.desktopDark": "/showcase/inkleaf/1.1.0/commerce/home-desktop-dark.png",
81
+ "commerce.mobileLight": "/showcase/inkleaf/1.1.0/commerce/home-mobile-light.png",
82
+ "commerce.mobileDark": "/showcase/inkleaf/1.1.0/commerce/home-mobile-dark.png",
83
+ "dashboard.desktopLight": "/showcase/inkleaf/1.1.0/dashboard/home-desktop-light.png",
84
+ "dashboard.desktopDark": "/showcase/inkleaf/1.1.0/dashboard/home-desktop-dark.png",
85
+ "dashboard.mobileLight": "/showcase/inkleaf/1.1.0/dashboard/home-mobile-light.png",
86
+ "dashboard.mobileDark": "/showcase/inkleaf/1.1.0/dashboard/home-mobile-dark.png",
87
+ "settings.desktopLight": "/showcase/inkleaf/1.1.0/settings/settings-profile-desktop-light.png",
88
+ "settings.desktopDark": "/showcase/inkleaf/1.1.0/settings/settings-profile-desktop-dark.png",
89
+ "settings.mobileLight": "/showcase/inkleaf/1.1.0/settings/settings-profile-mobile-light.png",
90
+ "settings.mobileDark": "/showcase/inkleaf/1.1.0/settings/settings-profile-mobile-dark.png"
91
+ },
56
92
  "night-cartridge@1.0.0": {
57
93
  "blog.desktopLight": "/showcase/night-cartridge/1.0.0/blog/home-desktop-light.png",
58
94
  "blog.desktopDark": "/showcase/night-cartridge/1.0.0/blog/home-desktop-dark.png",
@@ -81,6 +117,26 @@
81
117
  "settings.desktopDark": "/showcase/night-cartridge/1.1.0/settings/settings-profile-desktop-dark.png",
82
118
  "settings.mobileDark": "/showcase/night-cartridge/1.1.0/settings/settings-profile-mobile-dark.png"
83
119
  },
120
+ "night-cartridge@1.2.0": {
121
+ "blog.desktopDark": "/showcase/night-cartridge/1.2.0/blog/home-desktop-dark.png",
122
+ "blog.mobileDark": "/showcase/night-cartridge/1.2.0/blog/home-mobile-dark.png",
123
+ "commerce.desktopDark": "/showcase/night-cartridge/1.2.0/commerce/home-desktop-dark.png",
124
+ "commerce.mobileDark": "/showcase/night-cartridge/1.2.0/commerce/home-mobile-dark.png",
125
+ "dashboard.desktopDark": "/showcase/night-cartridge/1.2.0/dashboard/home-desktop-dark.png",
126
+ "dashboard.mobileDark": "/showcase/night-cartridge/1.2.0/dashboard/home-mobile-dark.png",
127
+ "settings.desktopDark": "/showcase/night-cartridge/1.2.0/settings/settings-profile-desktop-dark.png",
128
+ "settings.mobileDark": "/showcase/night-cartridge/1.2.0/settings/settings-profile-mobile-dark.png"
129
+ },
130
+ "night-cartridge@1.3.0": {
131
+ "blog.desktopDark": "/showcase/night-cartridge/1.3.0/blog/home-desktop-dark.png",
132
+ "blog.mobileDark": "/showcase/night-cartridge/1.3.0/blog/home-mobile-dark.png",
133
+ "commerce.desktopDark": "/showcase/night-cartridge/1.3.0/commerce/home-desktop-dark.png",
134
+ "commerce.mobileDark": "/showcase/night-cartridge/1.3.0/commerce/home-mobile-dark.png",
135
+ "dashboard.desktopDark": "/showcase/night-cartridge/1.3.0/dashboard/home-desktop-dark.png",
136
+ "dashboard.mobileDark": "/showcase/night-cartridge/1.3.0/dashboard/home-mobile-dark.png",
137
+ "settings.desktopDark": "/showcase/night-cartridge/1.3.0/settings/settings-profile-desktop-dark.png",
138
+ "settings.mobileDark": "/showcase/night-cartridge/1.3.0/settings/settings-profile-mobile-dark.png"
139
+ },
84
140
  "graphite-blueprint@1.0.0": {
85
141
  "blog.desktopLight": "/showcase/graphite-blueprint/1.0.0/blog/home-desktop-light.png",
86
142
  "blog.desktopDark": "/showcase/graphite-blueprint/1.0.0/blog/home-desktop-dark.png",
@@ -98,5 +154,23 @@
98
154
  "settings.desktopDark": "/showcase/graphite-blueprint/1.0.0/settings/settings-profile-desktop-dark.png",
99
155
  "settings.mobileLight": "/showcase/graphite-blueprint/1.0.0/settings/settings-profile-mobile-light.png",
100
156
  "settings.mobileDark": "/showcase/graphite-blueprint/1.0.0/settings/settings-profile-mobile-dark.png"
157
+ },
158
+ "graphite-blueprint@1.1.0": {
159
+ "blog.desktopLight": "/showcase/graphite-blueprint/1.1.0/blog/home-desktop-light.png",
160
+ "blog.desktopDark": "/showcase/graphite-blueprint/1.1.0/blog/home-desktop-dark.png",
161
+ "blog.mobileLight": "/showcase/graphite-blueprint/1.1.0/blog/home-mobile-light.png",
162
+ "blog.mobileDark": "/showcase/graphite-blueprint/1.1.0/blog/home-mobile-dark.png",
163
+ "commerce.desktopLight": "/showcase/graphite-blueprint/1.1.0/commerce/home-desktop-light.png",
164
+ "commerce.desktopDark": "/showcase/graphite-blueprint/1.1.0/commerce/home-desktop-dark.png",
165
+ "commerce.mobileLight": "/showcase/graphite-blueprint/1.1.0/commerce/home-mobile-light.png",
166
+ "commerce.mobileDark": "/showcase/graphite-blueprint/1.1.0/commerce/home-mobile-dark.png",
167
+ "dashboard.desktopLight": "/showcase/graphite-blueprint/1.1.0/dashboard/home-desktop-light.png",
168
+ "dashboard.desktopDark": "/showcase/graphite-blueprint/1.1.0/dashboard/home-desktop-dark.png",
169
+ "dashboard.mobileLight": "/showcase/graphite-blueprint/1.1.0/dashboard/home-mobile-light.png",
170
+ "dashboard.mobileDark": "/showcase/graphite-blueprint/1.1.0/dashboard/home-mobile-dark.png",
171
+ "settings.desktopLight": "/showcase/graphite-blueprint/1.1.0/settings/settings-profile-desktop-light.png",
172
+ "settings.desktopDark": "/showcase/graphite-blueprint/1.1.0/settings/settings-profile-desktop-dark.png",
173
+ "settings.mobileLight": "/showcase/graphite-blueprint/1.1.0/settings/settings-profile-mobile-light.png",
174
+ "settings.mobileDark": "/showcase/graphite-blueprint/1.1.0/settings/settings-profile-mobile-dark.png"
101
175
  }
102
176
  }
@@ -0,0 +1,280 @@
1
+ # Changelog
2
+
3
+ ## 1.1.0
4
+
5
+ Phone tables, blueprints and section openers are steadier. On phones a table keeps only its first and pinned
6
+ columns, so nothing runs under the pin; blueprints keep their size in rows and pairs; every content section opens
7
+ the same way, and settings groups, hairlines and closings are built into the recipes instead of described.
8
+
9
+ - Table, small screens: under `breakpoint.sm` only the first and the pinned column show; the first cell holds at most
10
+ two single-line lines ending in an ellipsis and every row has the same number of lines (was: secondary columns
11
+ hidden by name, so others could show under the pin). The pin's head is a short visible mono word; a badge naming
12
+ the row shows its dot only, its label kept for screen readers; first and last cells sit on the section's edges.
13
+ - Table, sort: the chevron shows only on the sorted column, before the label in right-aligned heads, so the label
14
+ ends on the cells' edge.
15
+ - Isometric blueprint: new `pair()` and `blueprint()` helpers; sizes are rendered CSS pixels; a row of three draws
16
+ each at `size.blueprintLg` (now 300px, was 280px) or its full column, never under `size.blueprintMd`; captions and
17
+ titles sit level across a row.
18
+ - Split opener: every content section opens with the full opener (h2 and description), never a filter or count in
19
+ its place; prose sits `space.32` under its opener (was `space.96`); a content home's featured block is a mono
20
+ "FEATURED" label over its plate; the opener link ends in "→" ("↓" for an in-page anchor).
21
+ - Hairlines: never two hairlines with nothing between them, at any distance (was: under 32px apart).
22
+ - Typography: the closing statement is `clamp(h2, 6vw, display)`, two short sentences that break only between them;
23
+ counts and result lines are uppercase mono labels in every app; headings balance and paragraphs wrap pretty;
24
+ fonts are self-hosted, never from a font CDN.
25
+ - Spacing and layout: settings groups are `space.48` apart, built into the recipe CSS; one left edge per page
26
+ (articles narrow from the right instead of centering); a form keeps its error summary directly above its actions
27
+ and moves focus to the first invalid field.
28
+ - Spec plate: the first eight items use all eight kinds, and no kind repeats in a grid row, a grid column or
29
+ between neighbours; a caption fact is at most 18 characters and wraps rather than truncates.
30
+ - Navigation: a detail page keeps its section marked; phone navigation wraps instead of clipping or scrolling.
31
+
32
+ ## 1.1.0-rc.7
33
+
34
+ Four recurring findings fixed in the recipes: settings gaps stay 48px with an empty status line, plate grids never
35
+ stack a kind in one column, a detail page keeps its section marked, and tables sit on their section's edges.
36
+
37
+ - Spacing: `:is(.settings-group,.stack) [role=status]:empty` is visually hidden (`position:absolute`, 1px,
38
+ `clip-path:inset(50%)`) and stays in the accessibility tree; the 48px check runs with status regions empty (was: an
39
+ empty status paragraph as last child kept the grid gap, 56 to 64px).
40
+ - Spec plate, `specKinds`: the first 8 items take all 8 kinds, each later pass of 8 is shifted by 3
41
+ (`order[(i+floor(i/8)*3)%8]`); Limits: no shared kind in a grid row, a grid column or between adjacent posts (was: the second pass repeated the first in the same order, so row 3 copied row 1 at 4 columns).
42
+ - Navigation: on a detail route the section's pill or row shows the current look via an `is-section` class; `end`
43
+ and `aria-current` unchanged (was: no item marked on product detail).
44
+ - Table: first cell `padding-left:0`, last cell `padding-right:0`, so text aligns with the section head and its count
45
+ (was: `space.12` inset on both ends).
46
+
47
+ ## 1.1.0-rc.6
48
+
49
+ Rules that kept coming back now live in the recipe CSS: sort heads, the gap between settings groups and the rule
50
+ under a masthead are built in, and pages keep one left edge.
51
+
52
+ - Table, sort: `.tbl :is(.num,.pin) .sort-button{flex-direction:row-reverse}` in the recipe, and the chevron is
53
+ rendered only on the sorted column (was: prose naming `.sort-button` alone, plus an always-rendered empty chevron
54
+ that pushed the pin head 16px off its cells).
55
+ - Never: two hairlines with nothing between them, at any distance (was: under 32px apart). Split opener: `.masthead`
56
+ gets the head's rule and the block after it draws none (`:is(.screen-head,.masthead)+*`), the first opener under a
57
+ masthead starts `space.96` below it; a rule always has content directly on both sides.
58
+ - Split opener: `.opener{margin-bottom:space.96}` (`space.48` under 768px) and `.opener:has(+.prose){margin-bottom:space.32}`,
59
+ so prose sits 32px under its opener (was: 96px whatever followed). The opener link ends in "→" ("↓" for an in-page
60
+ anchor), never "+" (was: "→" or "+").
61
+ - Spacing: settings groups are `.settings-group` siblings with the 48px gap in CSS (padding-bottom `space.48`, the next
62
+ group's hairline and `space.48` above its content, no margin under the last child) (was: a prose rule, measured at
63
+ 51 to 64px).
64
+ - Spec plate: a caption fact is at most 18 characters and never ellipsised; the caption spans the plate (`right:space.12`)
65
+ and wraps rather than truncates (was: no length limit).
66
+ - Layout: one left edge per page; every page uses `size.container`, articles and docs narrow from the right (body at
67
+ `size.measure`, rail right), never centered in `size.containerProse` (was: `size.containerProse` for articles, which
68
+ gave articles a second left edge).
69
+ - Verification: one measured line at 1440px and 390px with numbers and method: blueprint widths, right-aligned head x
70
+ against cells, every settings gap, the article's shared left x; the check line adds no double hairline, no
71
+ ellipsised caption, no "+" link.
72
+ - Budget: true duplicates cut (Sig 3's "captions level" now in the subgrid CSS, Table's "only first and pin show" and
73
+ badge-dot sentences now in the CSS, Color use's banner pointer, Sig 6's restated h2 size, h1 note and mono-figures
74
+ line, the review loop's "undo the edit", the second closing example, the merged blueprint-measuring line, shorter wording in Sig 3, Sig 4, Sig 6, Text field and Layout).
75
+
76
+ ## 1.1.0-rc.5
77
+
78
+ A content home opens with one large headline again, counts read the same in every app, phone table pins keep a
79
+ visible label, and closings and failed forms behave the same way everywhere.
80
+
81
+ - Split opener, Limits: a content home's featured block is a mono "FEATURED" label over its plate and text, no h2
82
+ (was: a full h2 opener, which pushed the lead plate below the fold); the plate's top sits above 900px at 1440px.
83
+ - Split opener, Limits: prose beside an opener is one paragraph, longer prose goes under it; the description repeats no
84
+ phrase of the prose and each destination is linked once per section (was: only the first sentence was protected).
85
+ - Typography: counts, result lines and the label over a closing are uppercase `.mono-label` in every app (was:
86
+ unstated, so two apps set them in sentence-case sans).
87
+ - Typography, closing statement: two sentences of at most 12 characters, each one tone in a no-wrap span, one line from
88
+ `breakpoint.lg` and breaking only between sentences (was: a 24-character limit, which let a tone split mid-phrase).
89
+ - Table, small screens: the pin head is a short visible mono word, or the value carries its unit ("4 projects") under a
90
+ hidden head; only an actions pin's head may be empty (was: hidden over any number).
91
+ - Text field, error: when the first invalid field is more than a viewport above the banner, the same banner is repeated
92
+ as the form's first child, and the one above the actions stays (was: "the banner also opens the form").
93
+ - Spacing: the 48px settings-group gap also runs from a form's actions to the next hairline. Layout: cards, grids and
94
+ tables in a settings group span the controls column's full width.
95
+ - Verification: blueprint widths can be measured in a browser or from a 2x screenshot (pixels divided by 2); new checks
96
+ for one headline in the first viewport, no repeated phrase or link, readable pin heads, and the same mono counts and
97
+ one-line closing across apps.
98
+ - Budget: true duplicates removed (pointer sentences, restated test-id and status-region notes, the group-count and
99
+ appearance notes now covered by Typography and Ongoing development).
100
+
101
+ ## 1.1.0-rc.4
102
+
103
+ Closings stay two short lines on phones, blueprint rows and section prose line up, article pages open with their
104
+ title and a wide plate again, and failed forms keep their summary next to the fields.
105
+
106
+ - Typography, closing statement: copy at most 24 characters ("New posts. One email."), so it sets in 2 lines or fewer
107
+ at 48px at 390px (was: 1 or 2 sentences, which ran to 6 lines on phones); size stays
108
+ `clamp(h2, 6vw, display)`, longer copy in the form's helper line.
109
+ - Isometric blueprint: `.bp-row` aligns to the start and each figure is a 3-row subgrid (caption, drawing on a shared
110
+ base, title and text), so captions and titles are level across the row. `slab()` draws the front vertical edge
111
+ (`.bp-edge`) and a rib round the sides when h is at least 0.3w.
112
+ - Split opener, Limits: a section's prose follows its opener (right column or at `size.measure`), never below a figure
113
+ row in one half; the description never repeats the prose.
114
+ - Applying the concept, new Article row: breadcrumb, h1, meta, then a `plate--wide` lead plate; the contents list is a
115
+ side rail on wide screens and a closed "On this page" after the plate on small ones, never above the h1.
116
+ - Table, sort: in a right-aligned head the chevron comes before the label so the label ends on the cells' edge.
117
+ - Text field, error: the banner sits directly above the actions; focus moves to the first invalid field, and the
118
+ banner also opens the form when that field is more than a viewport away. Layout: a form's preview sits above the
119
+ fields.
120
+ - Spacing: settings groups are `space.48` from one group's last content to the next hairline, card grids included.
121
+ - Verification: blueprint widths measured in the browser and pasted; new checks for the closing, blueprint captions,
122
+ section prose, article order, sortable heads, settings gaps and failed-submit focus.
123
+ - Budget: true duplicates removed (Applying's app-header row, placements repeated from components, restated notes).
124
+
125
+ ## 1.1.0-rc.3
126
+
127
+ Phone tables keep a row's second line whole, product pages show one figure number and get their stock line and
128
+ numbered details back, and closings, legends, headings and KPI labels line up the same way in every app.
129
+
130
+ - Table: a badge naming the row moves from beside the first cell's lines to inline at the end of the first line
131
+ (`margin-left:space.8`); under `breakpoint.sm` it shows its dot only, label in `.badge-label` for screen readers. The
132
+ pin's head is one short word or `.sr-only`, the pin at most its widest value plus `space.24`, and `.pin` (now
133
+ `.tbl .pin`) goes on the `th` too so the head aligns right like its cells.
134
+ - Spec plate, Limits: one figure number per plate (its caption or a `.fig`, never both); the item name once per
135
+ viewport; no shared kind in a grid row or between adjacent posts. `specKinds` now waits until all 8 kinds are used
136
+ before repeating one (was: not among the previous 4), over the full list.
137
+ - Applying → Product detail: the plate's caption is the only FIG; a mono `CATEGORY · IN STOCK` line over the name;
138
+ Details rows numbered in mono.
139
+ - Never: a closing statement under `font.size.h2`. Typography: closing statement
140
+ `clamp(h2, 6vw, display)`, 1 or 2 sentences, longer copy in the form's helper line (was "`display` size").
141
+ - Root setup: fonts self-hosted (font packages or local files, never a font CDN); headings `text-wrap:balance`,
142
+ `p, li` `text-wrap:pretty`; fieldset and legend padding and borders reset. Existing projects apply the same.
143
+ - Card, KPI: the label stays on one line (ellipsis, full label in `title`; shorter or one card per row on phones) so
144
+ values align.
145
+ - Layout: a preview, banner or panel stacked in a form column takes the form's width.
146
+ - Verification: review pieces are rendered by temporarily editing an existing page and undoing the edit, never in new
147
+ files; at 390px a badged row's second line is uncut and KPI values are level.
148
+ - Budget: true duplicates shortened (Character, Verification's recipe values and token-file check, Shape's checkbox
149
+ and toast radii, a few repeated parentheticals).
150
+
151
+ ## 1.1.0-rc.2
152
+
153
+ Blueprints now fill their frame, content pages keep a large headline and description at every section, and phone
154
+ navigation, segmented options and table pins stop clipping. Working rules trimmed in the previous candidate are back.
155
+
156
+ - Isometric blueprint: new `pair()` (slab 2 at 2w right, w down, a marching link between their sides) and
157
+ `blueprint()` (viewBox cropped to the slabs' bounds plus 5%, figure group `g.bp-fig`); size is measured on the
158
+ drawn group (at least 85% of the svg; about 270px in a row of three, at least 240px at 1440px). `.bp--pair` CSS
159
+ removed (its 368px minimum did not fit a phone column); `.bp--md`, `.bp--sm` and a full-width `.bp--lg` under
160
+ `breakpoint.sm` added. Where: the about row is a stack, a connected pair and a box, never two that differ only in
161
+ slab count; 1-2-3 tier stacks only on plan cards. `size.blueprintLg` 280px → 300px.
162
+ - Split opener, Limits: "one headline of `font.size.h2` or larger per viewport" replaced by: every content section
163
+ down the page opens with the full opener (48px h2 and the description right), filters or counts never replace the
164
+ description, section h2s never shrink to protect the h1. Applying → Blog: "one opener" → "an opener per section".
165
+ - Split opener, Where: app sections (cart, checkout, settings groups) get a mono counter and title left, a one-line
166
+ description right; Applying → Cart says the same.
167
+ - `.screen-head + *` loses its top border; Never: two hairlines under 32px apart with nothing between.
168
+ - Navigation, sidebar under `breakpoint.lg`: "a pill row that scrolls inside itself" → text-only pills that wrap
169
+ (over 6 items: one pill named after the current page opens the sheet); never a clipped or scrolling nav row.
170
+ - Table: row actions are bordered pills at every width; a badge naming the row stays in the first cell with its dot;
171
+ the pin holds one action or one status, right-aligned (`text-align:right`), empty when a row has no action.
172
+ - Tabs, segmented pills: native radios visually hidden, selected by `:has(:checked)`, never a drawn circle or dot
173
+ (also in Never).
174
+ - Spec plate: caption is number and one fact (`FIG 03 · 18 OZ CANVAS`, `NO. 07 · DESIGN`), never the number or
175
+ category alone.
176
+ - Text field: the failed-submit banner on every form, one-field forms (newsletter) included.
177
+ - Applying → Data table: a 1-to-5 load shows the dot meter beside its number.
178
+ - Restored from the published version: "Closing sections: the dot field", "Closing statement: `display` size",
179
+ "never bare red text", the checkbox `z-index` note, the Motion pointer to signatures 1, 2, 3, 5, "(actions column
180
+ pinned)", the dashboard fallback wording, the `specKinds` comment, "exclamation marks or emoji", the empty-state
181
+ test-id note.
182
+ - Verification: at 390px every nav item visible; blueprints measured on `.bp-fig`; every review route, page and
183
+ script deleted before finishing.
184
+ - Budget: duplicate lines cut (surface map, quiet-stage values, glyph and dot-field values, Interaction lines for
185
+ tabs, menu items and checked controls, the dialog row of Applying, and others that repeat a recipe or component).
186
+
187
+ ## 1.1.0-rc.1
188
+
189
+ Tables on phones now show only the first column and the pinned one, with long values ending in an ellipsis, and
190
+ blueprints keep their size in groups.
191
+
192
+ - Table, small screens: "hide secondary columns (location, last active, owner)" is replaced by: under `breakpoint.sm`
193
+ every column except the first and the pinned one is `display:none`; the first cell holds at most two single-line
194
+ lines with an ellipsis (`white-space:nowrap`, `text-overflow:ellipsis`, `max-width:0` cell), the second from the
195
+ cell's own text or `data-sub`; every row of a table has the same number of lines. New CSS block in the recipe.
196
+ - Isometric blueprint, Limits: sizes are now rendered CSS pixels (`getBoundingClientRect().width`): a row of three
197
+ renders each drawing at `size.blueprintLg` or its full column, never under `size.blueprintMd`; each slab of a
198
+ connected pair at least `size.blueprintMd`. Was "a row of three at `size.blueprintLg`" and "half-widths are rendered
199
+ px". New `.bp-row`, `.bp--lg`, `.bp--pair` CSS.
200
+ - Verification: two new steps, tables at 390px (two columns, no stray glyph, no cut word, equal rows) and a measured
201
+ width for every blueprint.
202
+ - Budget: duplicate lines cut to stay under 7,500 words (Character shortened; stage gradient stops, dot-field and
203
+ toast-shimmer placements, Motion's signature pointer, checkbox z-index note, empty-state test-id note and others
204
+ that repeat a recipe, Applying or the Never list).
205
+
206
+ ## 1.0.0
207
+
208
+ First release of Graphite Blueprint: a near-black instrument panel. Graphite greys stacked in five steps,
209
+ 1px hairlines, pill controls and one indigo kept for focus and selection. The product's own interface is the
210
+ main image, set on a softly lit stage; work in progress speaks in a 5x5 dot matrix and a passing shimmer, and
211
+ explanations are drawn as isometric hairline blueprints with mono figure captions. Dark is the default, with a
212
+ light mode in cool neutral greys.
213
+
214
+ - Ten defining rules and a Never list: the ground covers most of every screen, text in four steps of grey,
215
+ indigo at most three times a screen, hairlines instead of shadows, pills and 8px panels.
216
+ - Six signature recipes: the spotlit stage, the dot-matrix status glyph, isometric blueprints with marching
217
+ connectors, spec plates for items without a picture, the working shimmer, and the split section opener.
218
+ - Motion in two speeds: state changes in 100 to 160ms, slow stepped loops only for work in progress, and every
219
+ loop frozen on a readable frame under reduced motion.
220
+ - Layout rules for dense screens: side-by-side panels end together, tables keep a pinned first column on small
221
+ screens, and frames never nest more than two deep.
222
+ - 13 specified components with designed states, Inter and Geist Mono (both openly licensed).
223
+
224
+ ## 0.1.0-rc.3
225
+
226
+ Panels side by side now end on one line, pinned table columns on phones no longer cut the text beside them, and
227
+ stores close with a statement over the dot field again. Spec plates have twice as many figures, so neighbouring cards
228
+ no longer look alike.
229
+
230
+ - Spotlit stage: "panels in one row align to their content" is replaced by "panels in one row end together": the chart
231
+ stage stretches to the row height (at least `size.stageMini`) or the list beside it is capped with "View all →";
232
+ no empty band inside a panel, no column ending more than `space.48` above its neighbour.
233
+ - Applying the concept, dashboard: the chart and the activity list end on one line, otherwise the chart takes the full
234
+ row and activity goes below.
235
+ - Table, small screens: the pinned column is opaque (`color.surface.default`, or `card` inside a card), with a 1px
236
+ `color.border.subtle` edge and a 16px fade over the scrolling cells; under `breakpoint.sm` secondary columns are
237
+ hidden instead of half-visible.
238
+ - Applying the concept, closing: was "newsletter" only; now newsletter, store and blog list pages end with a two-tone
239
+ statement over the dot field (a store: its shipping or returns promise).
240
+ - Spec plate: figure kinds 4 → 8 (bars, perspective grid, ringed sphere, square lattice added); neighbours in a grid
241
+ never share a kind (`specKinds`).
242
+ - Blueprint: slab half-widths are rendered pixels, at least 40; slabs side by side get `size.blueprintMd` each, and a
243
+ narrow column shows one slab and the connector instead of four shrunk ones.
244
+ - Text field: a failed submit shows the danger banner (hairline box, `color.status.dangerTint` wash, danger dot) on
245
+ every form, checkout included; never bare red text.
246
+ - Verification: rows at 1440px end within 48px of each other; no table cell cut mid-letter at 390px.
247
+
248
+ ## 0.1.0-rc.2
249
+
250
+ Rows and controls stay clickable, count badges are readable, captions describe the item, and frames no longer stack
251
+ inside each other. Slab drawings have tighter corners, plate figures sit centred and connectors move.
252
+
253
+ - Checkbox and radio: the row's hit area now comes from wrapping input and text in the `<label>` (or padding the
254
+ label), never from an overlay; controls inside a row or card with a stretched link get `position:relative;z-index:1`.
255
+ - Never: nothing stacked above a native control; no stage inside a bordered card or frames nested more than two deep;
256
+ no copy that explains the system or how a drawing was made.
257
+ - Badge: the count badge is its own `.count` class (16px, `color.action.primary` fill, `color.text.onAction`
258
+ numeral), never combined with the generic badge.
259
+ - Spotlit stage: sits on the ground or in one hairline cell; a panel whose content is a quiet stage drops its border
260
+ and fill; panels in a row align to their content. The blog featured post is a wide plate, not a stage.
261
+ - Blueprint: vertex rounding `r` 14% → 8% and `s` 7% → 5% of the half-width; every connector marches except a
262
+ stopped connection.
263
+ - Spec plate: the fan figure is centred (origin at the tile's centre line, length 66 to 78); every figure stays inside
264
+ the central 78%; captions name the item.
265
+ - Table: under `breakpoint.md` the first column keeps `white-space:nowrap` and `min-width:160px`, cells wrap to at
266
+ most 2 lines.
267
+ - Verification: click each checkbox, radio and switch on the box itself, run the project's end-to-end tests (or say
268
+ they were not run), and check badge and count legibility in both modes.
269
+ - Unused primitives `space.64`, `motion.easing.inOut` and `motion.distance.flow` removed.
270
+
271
+ ## 0.1.0-rc.1
272
+
273
+ First candidate of Graphite Blueprint, derived from the reference study. Dark is canonical; light comes from the
274
+ reference's documentation theme, with derived light versions of the stage, blueprint, spec plate and glyph.
275
+
276
+ - Tokens: graphite ladder, four text steps, white-alpha hairlines, one indigo, light and dark semantics; tertiary text
277
+ and control outlines lifted for contrast.
278
+ - Signature elements: spotlit stage (lit and quiet), dot-matrix glyph with dot field and meter, isometric hairline
279
+ blueprint, spec plate, working shimmer and live edges, split opener with two-tone voice and mono figures.
280
+ - Thirteen components specified, empty state included.
@@ -0,0 +1,41 @@
1
+ ## New project
2
+
3
+ 1. Inspect the stack; propose an installation plan and wait for approval. Ask which appearances the product supports. Both: tokens.css follows the device; a theme switch sets `data-theme` on `html` only if the product has or asks for one. One: dark (`<html data-theme="dark">`, `color-scheme: dark`) unless the user asks for light.
4
+ 2. Copy `dist/tokens.css` into global styles (or map `dist/tokens.json` into the theme).
5
+ 3. Self-host Inter (variable, weights 400, 510 and 590) and Geist Mono 400 (the npm font packages or local files, `@font-face` with `font-display:swap`); never a font CDN. Root: body `color.surface.default`, `color.text.body`, sans `font.size.body`, `font.lineHeight.body`, `font.tracking.body`; headings primary, `text-wrap:balance`; `p, li{text-wrap:pretty}`; `fieldset{margin:0;padding:0;border:0;min-width:0} legend{padding:0}`; `pre, code, kbd, samp` mono; global `:focus-visible`; the reduced-motion block; `html, body{overflow-x:clip}`.
6
+ 4. Build the six signature elements first, as reusable pieces, one per recipe with all its helpers (`pair`, `blueprint`, `specKinds`, dot meter, `ScreenHead`, `.mono-label`). Review them (Verification) before any screen.
7
+ 5. Build the components with every state; place the signature elements per Applying the concept.
8
+ 6. Create `design-system/` with `VERSION` (`graphite-blueprint, updated <the spec's update date>`), the tokens, and `components.md`: conventions, where each signature element is used, each blueprint's subject by screen.
9
+ 7. Add to `AGENTS.md` and `CLAUDE.md` (create if missing): "UI work follows design-system/ — read it before building screens."
10
+
11
+ ## Existing project
12
+
13
+ 1. Audit styling, components, routes and tests; propose a migration plan and wait for approval. Ask about appearances as in New project.
14
+ 2. Map the tokens onto the existing variables (aliasing old names). A brand action color becomes `color.action.primary` (the inverse pill), never the accent. Fonts and root setup as in New project step 3.
15
+ 3. Build the signature elements, restyle one representative screen with them as a sample, and wait for review.
16
+ 4. Continue screen by screen, one commit each.
17
+ 5. Preserve routes, logic, API contracts, form fields and validation, test ids, text used by tests and accessibility attributes. Restyle existing markup; keep native inputs.
18
+ 6. Finish with `design-system/` and the pointer lines from New project.
19
+
20
+ ## Ongoing development
21
+
22
+ - Read `design-system/` first; use semantic tokens and existing components; no hard-coded colors, sizes, radii, shadows or durations.
23
+ - Every new screen gets the signature elements its context calls for in Applying the concept; a screen without them is unfinished.
24
+ - Uncovered needs: compose from tokens and note it in `components.md`. Conflicting requests (colored primary, spinner, bold headings): present options.
25
+
26
+ ## Verification
27
+
28
+ - Build passes; run the project's unit and end-to-end tests if they exist, else report they were not run.
29
+ - Review loop, two rounds or more: render each signature piece alone at 2x, dark and light, in a temporarily edited existing page (never a new file); compare with its recipe (light falloff, 0.5px strokes, vertex rounding, hidden faces, lit and unlit dots, caption position), note three or more differences, fix, render again.
30
+ - Each screen at 1440px and 390px, dark and light: no sideways scroll; status and row actions visible; no bare `serif` or `monospace` text; captions name the item; every badge, chip and count legible at 2x; columns of a row end within 48px of each other (1440px).
31
+ - At 390px: every nav item fully visible; the closing at most 2 lines; tables show only the first and the pinned column, no stray glyph, no word cut except by an ellipsis, equal rows, a badged row's second line uncut; KPI values level.
32
+ - Measure at 1440px and 390px and paste the numbers with the method (a browser's `getBoundingClientRect()`, or pixels ÷ 2 in a native-size 2x screenshot; never computed from CSS): each `.bp-fig` width against Signature 3 → Limits; each right-aligned head's right x (numbers, pin) beside its cells' (equal); each settings group's last visible block to the next rule, status regions empty (48); an article's left x for brand, breadcrumb, h1, Related and footer (one value).
33
+ - Check: blueprint-row captions and titles level; section prose beside or under its opener, no phrase or link twice in a section; a content home's first viewport has one large headline; articles put h1, meta and lead plate before the contents list; every pin head readable; no two hairlines with nothing between, no plate caption ending in an ellipsis, no "+" on a link; a failed submit focuses the first invalid field, a banner within one viewport of it; across apps, counts, result lines and the closing's label are the same uppercase `.mono-label`, the closing one line at 1440px, one tone per sentence.
34
+ - Reduced motion (emulated): nothing loops, glyphs show their rest frame, every block is final.
35
+ - Tab through every screen: the indigo outline always visible. Click each checkbox, radio and switch on the box, not its label.
36
+ - Walk the ten rules and the Never list. Check the diff: no review edit, page or script remains. Report files changed, what you could not apply, and your decisions.
37
+
38
+ ## Rollback
39
+
40
+ - Each screen is its own commit and can be reverted alone.
41
+ - Tokens, fonts, root setup and the signature pieces are separate commits, reverted last.
@@ -0,0 +1,15 @@
1
+ ### Badge
2
+
3
+ **Anatomy.** Height 20px, `radius.full`, padding 0 `space.8`, 1px `color.border.default`, transparent fill,
4
+ `font.size.caption` sans 510 `color.text.body`; a leading 6px dot in the status hue (or a 12px status icon), gap
5
+ `space.6`; the text in a `.badge-label` span. Count badge: its own class, never combined with `.badge`; on an
6
+ icon button it sits inside the button (`position:absolute`, `pointer-events:none`):
7
+
8
+ ```css
9
+ .count{display:inline-grid;place-items:center;min-width:16px;height:16px;padding:0 var(--space-4);border:0;
10
+ border-radius:var(--radius-full);background:var(--color-action-primary);color:var(--color-text-on-action);
11
+ font:var(--font-weight-semibold) var(--font-size-micro)/1 var(--font-family-sans);font-variant-numeric:tabular-nums;}
12
+ ```
13
+
14
+ **States.** Static; interactive chips: Interaction (filter chip). Current: border `color.border.strong`.
15
+