pigment-mcp 0.11.0 → 0.15.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 (105) hide show
  1. package/cli.js +1 -1
  2. package/content/registry.json +28 -4
  3. package/content/shots.json +64 -0
  4. package/content/templates/graphite-blueprint/1.2.0/CHANGELOG.md +373 -0
  5. package/content/templates/graphite-blueprint/1.2.0/agent/instructions.md +41 -0
  6. package/content/templates/graphite-blueprint/1.2.0/components/badge.md +15 -0
  7. package/content/templates/graphite-blueprint/1.2.0/components/button.md +18 -0
  8. package/content/templates/graphite-blueprint/1.2.0/components/card.md +13 -0
  9. package/content/templates/graphite-blueprint/1.2.0/components/checkbox.md +11 -0
  10. package/content/templates/graphite-blueprint/1.2.0/components/dialog.md +11 -0
  11. package/content/templates/graphite-blueprint/1.2.0/components/empty-state.md +9 -0
  12. package/content/templates/graphite-blueprint/1.2.0/components/index.json +17 -0
  13. package/content/templates/graphite-blueprint/1.2.0/components/navigation.md +21 -0
  14. package/content/templates/graphite-blueprint/1.2.0/components/select.md +11 -0
  15. package/content/templates/graphite-blueprint/1.2.0/components/switch.md +11 -0
  16. package/content/templates/graphite-blueprint/1.2.0/components/table.md +52 -0
  17. package/content/templates/graphite-blueprint/1.2.0/components/tabs.md +12 -0
  18. package/content/templates/graphite-blueprint/1.2.0/components/text-field.md +17 -0
  19. package/content/templates/graphite-blueprint/1.2.0/components/toast.md +12 -0
  20. package/content/templates/graphite-blueprint/1.2.0/dist/agent.md +1037 -0
  21. package/content/templates/graphite-blueprint/1.2.0/dist/tokens.css +349 -0
  22. package/content/templates/graphite-blueprint/1.2.0/dist/tokens.json +540 -0
  23. package/content/templates/graphite-blueprint/1.2.0/manifest.json +77 -0
  24. package/content/templates/graphite-blueprint/1.2.0/principles/visual-language.md +506 -0
  25. package/content/templates/graphite-blueprint/1.2.0/tokens/primitives.json +714 -0
  26. package/content/templates/graphite-blueprint/1.2.0/tokens/semantic.dark.json +245 -0
  27. package/content/templates/graphite-blueprint/1.2.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.3.0/CHANGELOG.md +516 -0
  83. package/content/templates/night-cartridge/1.3.0/agent/instructions.md +40 -0
  84. package/content/templates/night-cartridge/1.3.0/components/badge.md +5 -0
  85. package/content/templates/night-cartridge/1.3.0/components/button.md +13 -0
  86. package/content/templates/night-cartridge/1.3.0/components/card.md +7 -0
  87. package/content/templates/night-cartridge/1.3.0/components/checkbox.md +7 -0
  88. package/content/templates/night-cartridge/1.3.0/components/dialog.md +7 -0
  89. package/content/templates/night-cartridge/1.3.0/components/empty-state.md +5 -0
  90. package/content/templates/night-cartridge/1.3.0/components/index.json +17 -0
  91. package/content/templates/night-cartridge/1.3.0/components/navigation.md +18 -0
  92. package/content/templates/night-cartridge/1.3.0/components/select.md +7 -0
  93. package/content/templates/night-cartridge/1.3.0/components/switch.md +7 -0
  94. package/content/templates/night-cartridge/1.3.0/components/table.md +17 -0
  95. package/content/templates/night-cartridge/1.3.0/components/tabs.md +7 -0
  96. package/content/templates/night-cartridge/1.3.0/components/text-field.md +7 -0
  97. package/content/templates/night-cartridge/1.3.0/components/toast.md +7 -0
  98. package/content/templates/night-cartridge/1.3.0/dist/agent.md +717 -0
  99. package/content/templates/night-cartridge/1.3.0/dist/tokens.css +196 -0
  100. package/content/templates/night-cartridge/1.3.0/dist/tokens.json +226 -0
  101. package/content/templates/night-cartridge/1.3.0/manifest.json +99 -0
  102. package/content/templates/night-cartridge/1.3.0/principles/visual-language.md +367 -0
  103. package/content/templates/night-cartridge/1.3.0/tokens/primitives.json +520 -0
  104. package/content/templates/night-cartridge/1.3.0/tokens/semantic.dark.json +220 -0
  105. package/package.json +1 -1
package/cli.js CHANGED
@@ -34993,7 +34993,7 @@ var init_package = __esm({
34993
34993
  "package.json"() {
34994
34994
  package_default = {
34995
34995
  name: "@pigment/mcp",
34996
- version: "0.11.0",
34996
+ version: "0.15.0",
34997
34997
  private: true,
34998
34998
  type: "module",
34999
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.2.0",
47
+ "latest": "1.3.0",
36
48
  "versions": [
37
49
  {
38
50
  "version": "1.0.0",
@@ -51,12 +63,18 @@
51
63
  "status": "published",
52
64
  "publishedAt": "2026-10-18T13:46:07.189Z",
53
65
  "sha256": "82dcfe93ef26940ddbb6a3d6bf15c4ab4539638de605ee9b206512e42a98ad63"
66
+ },
67
+ {
68
+ "version": "1.3.0",
69
+ "status": "published",
70
+ "publishedAt": "2026-10-19T07:10:06.232Z",
71
+ "sha256": "8dfc70ec02127dbf36f6c439290c2fc4a64fe4efef971ac76ec48522411f2717"
54
72
  }
55
73
  ]
56
74
  },
57
75
  {
58
76
  "id": "graphite-blueprint",
59
- "latest": "1.1.0",
77
+ "latest": "1.2.0",
60
78
  "versions": [
61
79
  {
62
80
  "version": "1.0.0",
@@ -69,6 +87,12 @@
69
87
  "status": "published",
70
88
  "publishedAt": "2026-10-18T11:26:12.349Z",
71
89
  "sha256": "f15b112756c795d50a806d53754f2946f3436bbb81a841154c6220da93139063"
90
+ },
91
+ {
92
+ "version": "1.2.0",
93
+ "status": "published",
94
+ "publishedAt": "2026-10-19T09:29:56.846Z",
95
+ "sha256": "a357b7988afbc8af16f9e8d0a63b01b4d2c216fe83aded344365823af3484b90"
72
96
  }
73
97
  ]
74
98
  }
@@ -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",
@@ -91,6 +127,16 @@
91
127
  "settings.desktopDark": "/showcase/night-cartridge/1.2.0/settings/settings-profile-desktop-dark.png",
92
128
  "settings.mobileDark": "/showcase/night-cartridge/1.2.0/settings/settings-profile-mobile-dark.png"
93
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
+ },
94
140
  "graphite-blueprint@1.0.0": {
95
141
  "blog.desktopLight": "/showcase/graphite-blueprint/1.0.0/blog/home-desktop-light.png",
96
142
  "blog.desktopDark": "/showcase/graphite-blueprint/1.0.0/blog/home-desktop-dark.png",
@@ -126,5 +172,23 @@
126
172
  "settings.desktopDark": "/showcase/graphite-blueprint/1.1.0/settings/settings-profile-desktop-dark.png",
127
173
  "settings.mobileLight": "/showcase/graphite-blueprint/1.1.0/settings/settings-profile-mobile-light.png",
128
174
  "settings.mobileDark": "/showcase/graphite-blueprint/1.1.0/settings/settings-profile-mobile-dark.png"
175
+ },
176
+ "graphite-blueprint@1.2.0": {
177
+ "blog.desktopLight": "/showcase/graphite-blueprint/1.2.0/blog/home-desktop-light.png",
178
+ "blog.desktopDark": "/showcase/graphite-blueprint/1.2.0/blog/home-desktop-dark.png",
179
+ "blog.mobileLight": "/showcase/graphite-blueprint/1.2.0/blog/home-mobile-light.png",
180
+ "blog.mobileDark": "/showcase/graphite-blueprint/1.2.0/blog/home-mobile-dark.png",
181
+ "commerce.desktopLight": "/showcase/graphite-blueprint/1.2.0/commerce/home-desktop-light.png",
182
+ "commerce.desktopDark": "/showcase/graphite-blueprint/1.2.0/commerce/home-desktop-dark.png",
183
+ "commerce.mobileLight": "/showcase/graphite-blueprint/1.2.0/commerce/home-mobile-light.png",
184
+ "commerce.mobileDark": "/showcase/graphite-blueprint/1.2.0/commerce/home-mobile-dark.png",
185
+ "dashboard.desktopLight": "/showcase/graphite-blueprint/1.2.0/dashboard/home-desktop-light.png",
186
+ "dashboard.desktopDark": "/showcase/graphite-blueprint/1.2.0/dashboard/home-desktop-dark.png",
187
+ "dashboard.mobileLight": "/showcase/graphite-blueprint/1.2.0/dashboard/home-mobile-light.png",
188
+ "dashboard.mobileDark": "/showcase/graphite-blueprint/1.2.0/dashboard/home-mobile-dark.png",
189
+ "settings.desktopLight": "/showcase/graphite-blueprint/1.2.0/settings/settings-profile-desktop-light.png",
190
+ "settings.desktopDark": "/showcase/graphite-blueprint/1.2.0/settings/settings-profile-desktop-dark.png",
191
+ "settings.mobileLight": "/showcase/graphite-blueprint/1.2.0/settings/settings-profile-mobile-light.png",
192
+ "settings.mobileDark": "/showcase/graphite-blueprint/1.2.0/settings/settings-profile-mobile-dark.png"
129
193
  }
130
194
  }
@@ -0,0 +1,373 @@
1
+ # Changelog
2
+
3
+ ## 1.2.0
4
+
5
+ Graphite Blueprint now fits any product. The rules that were written around example screens are rewritten for the
6
+ kind of screen they describe, so a CRM, a booking flow or a docs site gets the same design as a store or a dashboard.
7
+ The look itself is unchanged.
8
+
9
+ - Page close: a page that ends in one final action for the reader (subscribe, sign up, contact, buy) ends in one
10
+ two-sentence, two-tone statement over the dot field, with the mono label above it and the block's own form under
11
+ it. A form that is a screen's main content (a checkout, a settings form) keeps its plain section heading; a page
12
+ without a final action gets no page close.
13
+ - Plate captions: the item's number plus one attribute it really has that nothing beside the plate already shows
14
+ (a property from its own data first, its kind name last); never a status, a name or a repeated value.
15
+ - Dashboards: the main chart sits on a quiet stage and panels in a row end level, by stretching the shorter one or
16
+ capping the longer one with a link to the rest; no fixed set of parts.
17
+ - Settings: only form inputs, switches and a live preview stop at the form width; every other block, even a
18
+ one-row card, ends at the controls column's right edge. Choice cards draw one slab per rank, for any number of
19
+ choices.
20
+ - Tables on phones: the pinned column is the one a person needs to act on or judge the row by; examples are neutral.
21
+ - Featured items take a mono label, not a second large headline; item grids and item detail pages are described
22
+ by what any item has, not by one kind of shop.
23
+ - Counts and result lines are mono labels everywhere in the product; the ordinal dot meter shows any 1 to 5 level
24
+ with its value.
25
+
26
+ ## 1.2.0-rc.5
27
+
28
+ Internal candidate: a form that is a screen's main content is no longer rewritten into the page close.
29
+
30
+ - Typography, Closing statement: the rewrite applies only to a block that ends the page with one final action; a form
31
+ that is the main content of its screen keeps its plain section heading at the section size.
32
+ - Applying the concept, Page close row: the same exclusion; a page whose last block is its main form has no page close.
33
+ - Agent instructions, Verification: the page-close check adds that such a form keeps its plain heading.
34
+
35
+ ## 1.2.0-rc.4
36
+
37
+ Internal candidate: the page close has one sentence rule instead of two that disagreed.
38
+
39
+ - Typography, Closing statement: "one or two short sentences, each one tone" became "always exactly two short
40
+ sentences in two tones": a primary lead in `<b>`, then a secondary answer in `color.text.secondary`, each in its own
41
+ nowrap span. A block's plain heading is rewritten into the statement, never kept unchanged (it may become the
42
+ `.mono-label`). A secondary line under it fits one line at `breakpoint.lg`.
43
+ - Applying the concept, Page close row: points to that rule and says rewriting the heading is restyling, not adding a
44
+ part. Signature 6 Limits: "1 to 3 sentences" now excepts the page close (always 2).
45
+ - Agent instructions, Verification: "one tone per sentence" became "every page close is exactly two sentences, the
46
+ second secondary, never the plain heading unchanged; it and any line under it one line at 1440px".
47
+
48
+ ## 1.2.0-rc.3
49
+
50
+ Internal candidate: the settings column says which blocks stop at the form width and which span the column.
51
+
52
+ - Layout adaptation, Settings controls column: "wide blocks span the controls column" became a rule by kind. Only
53
+ form inputs and a live preview or banner with them stop at `size.form`; every card (saved item, connected account),
54
+ grid of choices, list or table ends at the column's right edge, even with one row. Applying the concept, Settings row
55
+ says the same.
56
+ - Agent instructions, Verification: on each settings screen every non-form block has the same right x.
57
+
58
+ ## 1.2.0-rc.2
59
+
60
+ Internal candidate: the page close and the plate caption get decision rules instead of an "optional" and a category
61
+ example.
62
+
63
+ - Applying the concept, Page close: "optional" became a trigger. A page that ends in one final action for the reader
64
+ (subscribe, sign up, start, contact, buy) styles that existing block as the page close (centered two-tone statement
65
+ over the dot field, `.mono-label` above, the block's own form or pills under it); a page without one gets none and
66
+ never gains an action to make one. Signature 2 Limits: the dot field sits only behind a page close.
67
+ - Signature 4, Spec plate caption: the attribute must be one no label in the same card, row or screen head already
68
+ shows; a concrete property from the item's data first, type or category only when nothing else is shown, number and
69
+ kind name when everything is visible; never a status, name or neighboring value. Examples `FIG 03 · ATTRIBUTE` and
70
+ `NO. 07 · CATEGORY` replaced by `FIG 03 · 48 MIN` (an attribute not on the card).
71
+ - Agent instructions, Verification: plate captions carry an attribute no neighboring label shows; a page ending in a
72
+ final action has a page close, a page without one has none.
73
+
74
+ ## 1.2.0-rc.1
75
+
76
+ Internal candidate: the package is written for any product, not for the demo apps (overfit review 2026-10-19).
77
+ Design language, tokens and signature recipes unchanged.
78
+
79
+ - Applying the concept: rows name kinds of screens and what any screen of that kind has (14 contexts); store grid,
80
+ product detail, cart/checkout, blog and plan rows became item grid, item detail, form/multi-step flow,
81
+ success/confirmation, content index and settings; the table intro says a row is never a checklist of parts.
82
+ - Page close: optional, one or two short sentences, each one line from `breakpoint.lg`; no per-kind mapping, product
83
+ promise, character count or form assumption.
84
+ - Dashboard and Signature 1: the main chart on a quiet stage; panels in a row end level (stretch, or cap the longer
85
+ content); no fixed set of parts.
86
+ - Spec plate caption: the item's number and one attribute it really has, neutral examples, no invented physical facts.
87
+ - Dot meter: any small ordinal 1-5 level beside its value; ordinary numbers stay numbers.
88
+ - Table: the pin is the one column a user needs to act on or judge the row; neutral head, unit and badge examples.
89
+ - Featured item: a mono label, never a second large headline; no pixel position.
90
+ - Settings: wide blocks span the controls column; `bp--sm` ranked choice stacks of any count; Card: metric and choice
91
+ cards, a badge naming the state.
92
+ - Text field: neutral counter example; the banner rule applies however short the form.
93
+ - Agent instructions: screens take their closest context's elements without adding parts; checks say "everywhere in
94
+ the product"; the KPI check left the table step; long-form left-edge check is general.
95
+
96
+ ## 1.1.0
97
+
98
+ Phone tables, blueprints and section openers are steadier. On phones a table keeps only its first and pinned
99
+ columns, so nothing runs under the pin; blueprints keep their size in rows and pairs; every content section opens
100
+ the same way, and settings groups, hairlines and closings are built into the recipes instead of described.
101
+
102
+ - Table, small screens: under `breakpoint.sm` only the first and the pinned column show; the first cell holds at most
103
+ two single-line lines ending in an ellipsis and every row has the same number of lines (was: secondary columns
104
+ hidden by name, so others could show under the pin). The pin's head is a short visible mono word; a badge naming
105
+ the row shows its dot only, its label kept for screen readers; first and last cells sit on the section's edges.
106
+ - Table, sort: the chevron shows only on the sorted column, before the label in right-aligned heads, so the label
107
+ ends on the cells' edge.
108
+ - Isometric blueprint: new `pair()` and `blueprint()` helpers; sizes are rendered CSS pixels; a row of three draws
109
+ each at `size.blueprintLg` (now 300px, was 280px) or its full column, never under `size.blueprintMd`; captions and
110
+ titles sit level across a row.
111
+ - Split opener: every content section opens with the full opener (h2 and description), never a filter or count in
112
+ its place; prose sits `space.32` under its opener (was `space.96`); a content home's featured block is a mono
113
+ "FEATURED" label over its plate; the opener link ends in "→" ("↓" for an in-page anchor).
114
+ - Hairlines: never two hairlines with nothing between them, at any distance (was: under 32px apart).
115
+ - Typography: the closing statement is `clamp(h2, 6vw, display)`, two short sentences that break only between them;
116
+ counts and result lines are uppercase mono labels in every app; headings balance and paragraphs wrap pretty;
117
+ fonts are self-hosted, never from a font CDN.
118
+ - Spacing and layout: settings groups are `space.48` apart, built into the recipe CSS; one left edge per page
119
+ (articles narrow from the right instead of centering); a form keeps its error summary directly above its actions
120
+ and moves focus to the first invalid field.
121
+ - Spec plate: the first eight items use all eight kinds, and no kind repeats in a grid row, a grid column or
122
+ between neighbours; a caption fact is at most 18 characters and wraps rather than truncates.
123
+ - Navigation: a detail page keeps its section marked; phone navigation wraps instead of clipping or scrolling.
124
+
125
+ ## 1.1.0-rc.7
126
+
127
+ Four recurring findings fixed in the recipes: settings gaps stay 48px with an empty status line, plate grids never
128
+ stack a kind in one column, a detail page keeps its section marked, and tables sit on their section's edges.
129
+
130
+ - Spacing: `:is(.settings-group,.stack) [role=status]:empty` is visually hidden (`position:absolute`, 1px,
131
+ `clip-path:inset(50%)`) and stays in the accessibility tree; the 48px check runs with status regions empty (was: an
132
+ empty status paragraph as last child kept the grid gap, 56 to 64px).
133
+ - Spec plate, `specKinds`: the first 8 items take all 8 kinds, each later pass of 8 is shifted by 3
134
+ (`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).
135
+ - Navigation: on a detail route the section's pill or row shows the current look via an `is-section` class; `end`
136
+ and `aria-current` unchanged (was: no item marked on product detail).
137
+ - Table: first cell `padding-left:0`, last cell `padding-right:0`, so text aligns with the section head and its count
138
+ (was: `space.12` inset on both ends).
139
+
140
+ ## 1.1.0-rc.6
141
+
142
+ Rules that kept coming back now live in the recipe CSS: sort heads, the gap between settings groups and the rule
143
+ under a masthead are built in, and pages keep one left edge.
144
+
145
+ - Table, sort: `.tbl :is(.num,.pin) .sort-button{flex-direction:row-reverse}` in the recipe, and the chevron is
146
+ rendered only on the sorted column (was: prose naming `.sort-button` alone, plus an always-rendered empty chevron
147
+ that pushed the pin head 16px off its cells).
148
+ - Never: two hairlines with nothing between them, at any distance (was: under 32px apart). Split opener: `.masthead`
149
+ gets the head's rule and the block after it draws none (`:is(.screen-head,.masthead)+*`), the first opener under a
150
+ masthead starts `space.96` below it; a rule always has content directly on both sides.
151
+ - Split opener: `.opener{margin-bottom:space.96}` (`space.48` under 768px) and `.opener:has(+.prose){margin-bottom:space.32}`,
152
+ so prose sits 32px under its opener (was: 96px whatever followed). The opener link ends in "→" ("↓" for an in-page
153
+ anchor), never "+" (was: "→" or "+").
154
+ - Spacing: settings groups are `.settings-group` siblings with the 48px gap in CSS (padding-bottom `space.48`, the next
155
+ group's hairline and `space.48` above its content, no margin under the last child) (was: a prose rule, measured at
156
+ 51 to 64px).
157
+ - Spec plate: a caption fact is at most 18 characters and never ellipsised; the caption spans the plate (`right:space.12`)
158
+ and wraps rather than truncates (was: no length limit).
159
+ - Layout: one left edge per page; every page uses `size.container`, articles and docs narrow from the right (body at
160
+ `size.measure`, rail right), never centered in `size.containerProse` (was: `size.containerProse` for articles, which
161
+ gave articles a second left edge).
162
+ - Verification: one measured line at 1440px and 390px with numbers and method: blueprint widths, right-aligned head x
163
+ against cells, every settings gap, the article's shared left x; the check line adds no double hairline, no
164
+ ellipsised caption, no "+" link.
165
+ - Budget: true duplicates cut (Sig 3's "captions level" now in the subgrid CSS, Table's "only first and pin show" and
166
+ badge-dot sentences now in the CSS, Color use's banner pointer, Sig 6's restated h2 size, h1 note and mono-figures
167
+ 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).
168
+
169
+ ## 1.1.0-rc.5
170
+
171
+ A content home opens with one large headline again, counts read the same in every app, phone table pins keep a
172
+ visible label, and closings and failed forms behave the same way everywhere.
173
+
174
+ - Split opener, Limits: a content home's featured block is a mono "FEATURED" label over its plate and text, no h2
175
+ (was: a full h2 opener, which pushed the lead plate below the fold); the plate's top sits above 900px at 1440px.
176
+ - Split opener, Limits: prose beside an opener is one paragraph, longer prose goes under it; the description repeats no
177
+ phrase of the prose and each destination is linked once per section (was: only the first sentence was protected).
178
+ - Typography: counts, result lines and the label over a closing are uppercase `.mono-label` in every app (was:
179
+ unstated, so two apps set them in sentence-case sans).
180
+ - Typography, closing statement: two sentences of at most 12 characters, each one tone in a no-wrap span, one line from
181
+ `breakpoint.lg` and breaking only between sentences (was: a 24-character limit, which let a tone split mid-phrase).
182
+ - Table, small screens: the pin head is a short visible mono word, or the value carries its unit ("4 projects") under a
183
+ hidden head; only an actions pin's head may be empty (was: hidden over any number).
184
+ - Text field, error: when the first invalid field is more than a viewport above the banner, the same banner is repeated
185
+ as the form's first child, and the one above the actions stays (was: "the banner also opens the form").
186
+ - Spacing: the 48px settings-group gap also runs from a form's actions to the next hairline. Layout: cards, grids and
187
+ tables in a settings group span the controls column's full width.
188
+ - Verification: blueprint widths can be measured in a browser or from a 2x screenshot (pixels divided by 2); new checks
189
+ for one headline in the first viewport, no repeated phrase or link, readable pin heads, and the same mono counts and
190
+ one-line closing across apps.
191
+ - Budget: true duplicates removed (pointer sentences, restated test-id and status-region notes, the group-count and
192
+ appearance notes now covered by Typography and Ongoing development).
193
+
194
+ ## 1.1.0-rc.4
195
+
196
+ Closings stay two short lines on phones, blueprint rows and section prose line up, article pages open with their
197
+ title and a wide plate again, and failed forms keep their summary next to the fields.
198
+
199
+ - Typography, closing statement: copy at most 24 characters ("New posts. One email."), so it sets in 2 lines or fewer
200
+ at 48px at 390px (was: 1 or 2 sentences, which ran to 6 lines on phones); size stays
201
+ `clamp(h2, 6vw, display)`, longer copy in the form's helper line.
202
+ - Isometric blueprint: `.bp-row` aligns to the start and each figure is a 3-row subgrid (caption, drawing on a shared
203
+ base, title and text), so captions and titles are level across the row. `slab()` draws the front vertical edge
204
+ (`.bp-edge`) and a rib round the sides when h is at least 0.3w.
205
+ - Split opener, Limits: a section's prose follows its opener (right column or at `size.measure`), never below a figure
206
+ row in one half; the description never repeats the prose.
207
+ - Applying the concept, new Article row: breadcrumb, h1, meta, then a `plate--wide` lead plate; the contents list is a
208
+ side rail on wide screens and a closed "On this page" after the plate on small ones, never above the h1.
209
+ - Table, sort: in a right-aligned head the chevron comes before the label so the label ends on the cells' edge.
210
+ - Text field, error: the banner sits directly above the actions; focus moves to the first invalid field, and the
211
+ banner also opens the form when that field is more than a viewport away. Layout: a form's preview sits above the
212
+ fields.
213
+ - Spacing: settings groups are `space.48` from one group's last content to the next hairline, card grids included.
214
+ - Verification: blueprint widths measured in the browser and pasted; new checks for the closing, blueprint captions,
215
+ section prose, article order, sortable heads, settings gaps and failed-submit focus.
216
+ - Budget: true duplicates removed (Applying's app-header row, placements repeated from components, restated notes).
217
+
218
+ ## 1.1.0-rc.3
219
+
220
+ Phone tables keep a row's second line whole, product pages show one figure number and get their stock line and
221
+ numbered details back, and closings, legends, headings and KPI labels line up the same way in every app.
222
+
223
+ - Table: a badge naming the row moves from beside the first cell's lines to inline at the end of the first line
224
+ (`margin-left:space.8`); under `breakpoint.sm` it shows its dot only, label in `.badge-label` for screen readers. The
225
+ pin's head is one short word or `.sr-only`, the pin at most its widest value plus `space.24`, and `.pin` (now
226
+ `.tbl .pin`) goes on the `th` too so the head aligns right like its cells.
227
+ - Spec plate, Limits: one figure number per plate (its caption or a `.fig`, never both); the item name once per
228
+ viewport; no shared kind in a grid row or between adjacent posts. `specKinds` now waits until all 8 kinds are used
229
+ before repeating one (was: not among the previous 4), over the full list.
230
+ - Applying → Product detail: the plate's caption is the only FIG; a mono `CATEGORY · IN STOCK` line over the name;
231
+ Details rows numbered in mono.
232
+ - Never: a closing statement under `font.size.h2`. Typography: closing statement
233
+ `clamp(h2, 6vw, display)`, 1 or 2 sentences, longer copy in the form's helper line (was "`display` size").
234
+ - Root setup: fonts self-hosted (font packages or local files, never a font CDN); headings `text-wrap:balance`,
235
+ `p, li` `text-wrap:pretty`; fieldset and legend padding and borders reset. Existing projects apply the same.
236
+ - Card, KPI: the label stays on one line (ellipsis, full label in `title`; shorter or one card per row on phones) so
237
+ values align.
238
+ - Layout: a preview, banner or panel stacked in a form column takes the form's width.
239
+ - Verification: review pieces are rendered by temporarily editing an existing page and undoing the edit, never in new
240
+ files; at 390px a badged row's second line is uncut and KPI values are level.
241
+ - Budget: true duplicates shortened (Character, Verification's recipe values and token-file check, Shape's checkbox
242
+ and toast radii, a few repeated parentheticals).
243
+
244
+ ## 1.1.0-rc.2
245
+
246
+ Blueprints now fill their frame, content pages keep a large headline and description at every section, and phone
247
+ navigation, segmented options and table pins stop clipping. Working rules trimmed in the previous candidate are back.
248
+
249
+ - Isometric blueprint: new `pair()` (slab 2 at 2w right, w down, a marching link between their sides) and
250
+ `blueprint()` (viewBox cropped to the slabs' bounds plus 5%, figure group `g.bp-fig`); size is measured on the
251
+ drawn group (at least 85% of the svg; about 270px in a row of three, at least 240px at 1440px). `.bp--pair` CSS
252
+ removed (its 368px minimum did not fit a phone column); `.bp--md`, `.bp--sm` and a full-width `.bp--lg` under
253
+ `breakpoint.sm` added. Where: the about row is a stack, a connected pair and a box, never two that differ only in
254
+ slab count; 1-2-3 tier stacks only on plan cards. `size.blueprintLg` 280px → 300px.
255
+ - Split opener, Limits: "one headline of `font.size.h2` or larger per viewport" replaced by: every content section
256
+ down the page opens with the full opener (48px h2 and the description right), filters or counts never replace the
257
+ description, section h2s never shrink to protect the h1. Applying → Blog: "one opener" → "an opener per section".
258
+ - Split opener, Where: app sections (cart, checkout, settings groups) get a mono counter and title left, a one-line
259
+ description right; Applying → Cart says the same.
260
+ - `.screen-head + *` loses its top border; Never: two hairlines under 32px apart with nothing between.
261
+ - Navigation, sidebar under `breakpoint.lg`: "a pill row that scrolls inside itself" → text-only pills that wrap
262
+ (over 6 items: one pill named after the current page opens the sheet); never a clipped or scrolling nav row.
263
+ - Table: row actions are bordered pills at every width; a badge naming the row stays in the first cell with its dot;
264
+ the pin holds one action or one status, right-aligned (`text-align:right`), empty when a row has no action.
265
+ - Tabs, segmented pills: native radios visually hidden, selected by `:has(:checked)`, never a drawn circle or dot
266
+ (also in Never).
267
+ - Spec plate: caption is number and one fact (`FIG 03 · 18 OZ CANVAS`, `NO. 07 · DESIGN`), never the number or
268
+ category alone.
269
+ - Text field: the failed-submit banner on every form, one-field forms (newsletter) included.
270
+ - Applying → Data table: a 1-to-5 load shows the dot meter beside its number.
271
+ - Restored from the published version: "Closing sections: the dot field", "Closing statement: `display` size",
272
+ "never bare red text", the checkbox `z-index` note, the Motion pointer to signatures 1, 2, 3, 5, "(actions column
273
+ pinned)", the dashboard fallback wording, the `specKinds` comment, "exclamation marks or emoji", the empty-state
274
+ test-id note.
275
+ - Verification: at 390px every nav item visible; blueprints measured on `.bp-fig`; every review route, page and
276
+ script deleted before finishing.
277
+ - Budget: duplicate lines cut (surface map, quiet-stage values, glyph and dot-field values, Interaction lines for
278
+ tabs, menu items and checked controls, the dialog row of Applying, and others that repeat a recipe or component).
279
+
280
+ ## 1.1.0-rc.1
281
+
282
+ Tables on phones now show only the first column and the pinned one, with long values ending in an ellipsis, and
283
+ blueprints keep their size in groups.
284
+
285
+ - Table, small screens: "hide secondary columns (location, last active, owner)" is replaced by: under `breakpoint.sm`
286
+ every column except the first and the pinned one is `display:none`; the first cell holds at most two single-line
287
+ lines with an ellipsis (`white-space:nowrap`, `text-overflow:ellipsis`, `max-width:0` cell), the second from the
288
+ cell's own text or `data-sub`; every row of a table has the same number of lines. New CSS block in the recipe.
289
+ - Isometric blueprint, Limits: sizes are now rendered CSS pixels (`getBoundingClientRect().width`): a row of three
290
+ renders each drawing at `size.blueprintLg` or its full column, never under `size.blueprintMd`; each slab of a
291
+ connected pair at least `size.blueprintMd`. Was "a row of three at `size.blueprintLg`" and "half-widths are rendered
292
+ px". New `.bp-row`, `.bp--lg`, `.bp--pair` CSS.
293
+ - Verification: two new steps, tables at 390px (two columns, no stray glyph, no cut word, equal rows) and a measured
294
+ width for every blueprint.
295
+ - Budget: duplicate lines cut to stay under 7,500 words (Character shortened; stage gradient stops, dot-field and
296
+ toast-shimmer placements, Motion's signature pointer, checkbox z-index note, empty-state test-id note and others
297
+ that repeat a recipe, Applying or the Never list).
298
+
299
+ ## 1.0.0
300
+
301
+ First release of Graphite Blueprint: a near-black instrument panel. Graphite greys stacked in five steps,
302
+ 1px hairlines, pill controls and one indigo kept for focus and selection. The product's own interface is the
303
+ main image, set on a softly lit stage; work in progress speaks in a 5x5 dot matrix and a passing shimmer, and
304
+ explanations are drawn as isometric hairline blueprints with mono figure captions. Dark is the default, with a
305
+ light mode in cool neutral greys.
306
+
307
+ - Ten defining rules and a Never list: the ground covers most of every screen, text in four steps of grey,
308
+ indigo at most three times a screen, hairlines instead of shadows, pills and 8px panels.
309
+ - Six signature recipes: the spotlit stage, the dot-matrix status glyph, isometric blueprints with marching
310
+ connectors, spec plates for items without a picture, the working shimmer, and the split section opener.
311
+ - Motion in two speeds: state changes in 100 to 160ms, slow stepped loops only for work in progress, and every
312
+ loop frozen on a readable frame under reduced motion.
313
+ - Layout rules for dense screens: side-by-side panels end together, tables keep a pinned first column on small
314
+ screens, and frames never nest more than two deep.
315
+ - 13 specified components with designed states, Inter and Geist Mono (both openly licensed).
316
+
317
+ ## 0.1.0-rc.3
318
+
319
+ Panels side by side now end on one line, pinned table columns on phones no longer cut the text beside them, and
320
+ stores close with a statement over the dot field again. Spec plates have twice as many figures, so neighbouring cards
321
+ no longer look alike.
322
+
323
+ - Spotlit stage: "panels in one row align to their content" is replaced by "panels in one row end together": the chart
324
+ stage stretches to the row height (at least `size.stageMini`) or the list beside it is capped with "View all →";
325
+ no empty band inside a panel, no column ending more than `space.48` above its neighbour.
326
+ - Applying the concept, dashboard: the chart and the activity list end on one line, otherwise the chart takes the full
327
+ row and activity goes below.
328
+ - Table, small screens: the pinned column is opaque (`color.surface.default`, or `card` inside a card), with a 1px
329
+ `color.border.subtle` edge and a 16px fade over the scrolling cells; under `breakpoint.sm` secondary columns are
330
+ hidden instead of half-visible.
331
+ - Applying the concept, closing: was "newsletter" only; now newsletter, store and blog list pages end with a two-tone
332
+ statement over the dot field (a store: its shipping or returns promise).
333
+ - Spec plate: figure kinds 4 → 8 (bars, perspective grid, ringed sphere, square lattice added); neighbours in a grid
334
+ never share a kind (`specKinds`).
335
+ - Blueprint: slab half-widths are rendered pixels, at least 40; slabs side by side get `size.blueprintMd` each, and a
336
+ narrow column shows one slab and the connector instead of four shrunk ones.
337
+ - Text field: a failed submit shows the danger banner (hairline box, `color.status.dangerTint` wash, danger dot) on
338
+ every form, checkout included; never bare red text.
339
+ - Verification: rows at 1440px end within 48px of each other; no table cell cut mid-letter at 390px.
340
+
341
+ ## 0.1.0-rc.2
342
+
343
+ Rows and controls stay clickable, count badges are readable, captions describe the item, and frames no longer stack
344
+ inside each other. Slab drawings have tighter corners, plate figures sit centred and connectors move.
345
+
346
+ - Checkbox and radio: the row's hit area now comes from wrapping input and text in the `<label>` (or padding the
347
+ label), never from an overlay; controls inside a row or card with a stretched link get `position:relative;z-index:1`.
348
+ - Never: nothing stacked above a native control; no stage inside a bordered card or frames nested more than two deep;
349
+ no copy that explains the system or how a drawing was made.
350
+ - Badge: the count badge is its own `.count` class (16px, `color.action.primary` fill, `color.text.onAction`
351
+ numeral), never combined with the generic badge.
352
+ - Spotlit stage: sits on the ground or in one hairline cell; a panel whose content is a quiet stage drops its border
353
+ and fill; panels in a row align to their content. The blog featured post is a wide plate, not a stage.
354
+ - Blueprint: vertex rounding `r` 14% → 8% and `s` 7% → 5% of the half-width; every connector marches except a
355
+ stopped connection.
356
+ - Spec plate: the fan figure is centred (origin at the tile's centre line, length 66 to 78); every figure stays inside
357
+ the central 78%; captions name the item.
358
+ - Table: under `breakpoint.md` the first column keeps `white-space:nowrap` and `min-width:160px`, cells wrap to at
359
+ most 2 lines.
360
+ - Verification: click each checkbox, radio and switch on the box itself, run the project's end-to-end tests (or say
361
+ they were not run), and check badge and count legibility in both modes.
362
+ - Unused primitives `space.64`, `motion.easing.inOut` and `motion.distance.flow` removed.
363
+
364
+ ## 0.1.0-rc.1
365
+
366
+ First candidate of Graphite Blueprint, derived from the reference study. Dark is canonical; light comes from the
367
+ reference's documentation theme, with derived light versions of the stage, blueprint, spec plate and glyph.
368
+
369
+ - Tokens: graphite ladder, four text steps, white-alpha hairlines, one indigo, light and dark semantics; tertiary text
370
+ and control outlines lifted for contrast.
371
+ - Signature elements: spotlit stage (lit and quiet), dot-matrix glyph with dot field and meter, isometric hairline
372
+ blueprint, spec plate, working shimmer and live edges, split opener with two-tone voice and mono figures.
373
+ - 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; give each screen the signature elements of its closest context in Applying the concept, at that strength, using the parts the screen really has.
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 takes the signature elements of its closest context in Applying the concept, at that row's strength. A row says which elements and how strongly, never which parts a screen must have: add no panel, block or section to match it. A screen with none of the elements 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; each plate caption carries an attribute no label beside it shows; 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; a closing statement 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.
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 section's last visible block to the next rule, status regions empty (48); on each settings screen, every non-form block's right x (cards, grids, lists, tables: all equal, at the controls column's edge, wider than `size.form`); a long-form page's main blocks, header brand to footer (one left x).
33
+ - Check: blueprint-row captions and titles level; section prose beside or under its opener, no phrase or link twice in a section; every first viewport has one large headline; long-form pages 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; everywhere in the product, counts, result lines and a closing's label are the same uppercase `.mono-label`; a page that ends in one final action closes with it as the page close, a page without one has none, and a form that is a screen's main content keeps its plain heading and is never rewritten into a page close; every page close is one statement of exactly two sentences, the first primary, the second in `color.text.secondary`, never the block's plain heading unchanged; each closing sentence and any secondary line under it one line at 1440px.
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
+