@augurworks/augur 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/CANVAS.md +858 -0
  2. package/INSTALL.md +603 -0
  3. package/LICENSE +27 -0
  4. package/README.md +150 -0
  5. package/TRADEMARKS.md +72 -0
  6. package/agents/README.md +65 -0
  7. package/agents/canon-extract.md +117 -0
  8. package/agents/canon.md +151 -0
  9. package/agents/canvas.md +88 -0
  10. package/agents/currency.md +74 -0
  11. package/agents/drafts.md +92 -0
  12. package/agents/identity.md +148 -0
  13. package/agents/prototype-contract.md +69 -0
  14. package/agents/publishing.md +324 -0
  15. package/agents/review-feedback.md +76 -0
  16. package/agents/space-json.md +132 -0
  17. package/agents/ui-skill.md +101 -0
  18. package/agents/working-marks.md +86 -0
  19. package/brand/augur-eye.svg +3 -0
  20. package/brand/augur-icon.svg +41 -0
  21. package/brand/augur-mark.svg +5 -0
  22. package/brand/lentianova-bulky.otf +0 -0
  23. package/brand/lentianova-median.otf +0 -0
  24. package/brand/lentianova.woff2 +0 -0
  25. package/build.js +8409 -0
  26. package/changelog.md +133 -0
  27. package/fonts/inter-latin-wght-normal.woff2 +0 -0
  28. package/package.json +57 -0
  29. package/pitis/PETS.md +121 -0
  30. package/pitis/README.md +117 -0
  31. package/pitis/index.html +266 -0
  32. package/pitis/piti.build.js +81 -0
  33. package/pitis/piti.js +929 -0
  34. package/pitis/roast-agent.md +185 -0
  35. package/realtime/src/index.js +119 -0
  36. package/realtime/wrangler.example.toml +44 -0
  37. package/scripts/adopt.mjs +106 -0
  38. package/scripts/board-snapshot.mjs +197 -0
  39. package/scripts/build-seed-pack.mjs +33 -0
  40. package/scripts/bundle-rekey.mjs +112 -0
  41. package/scripts/bundle-tenancy-rehearsal.mjs +781 -0
  42. package/scripts/canon-extract.mjs +578 -0
  43. package/scripts/canon.mjs +599 -0
  44. package/scripts/canvas-screen.mjs +333 -0
  45. package/scripts/check-local.mjs +136 -0
  46. package/scripts/clawd-art.mjs +75 -0
  47. package/scripts/clawd-canvas.mjs +741 -0
  48. package/scripts/cli.mjs +100 -0
  49. package/scripts/clone.mjs +422 -0
  50. package/scripts/close.mjs +30 -0
  51. package/scripts/connect.mjs +103 -0
  52. package/scripts/deploy.mjs +157 -0
  53. package/scripts/dev.mjs +54 -0
  54. package/scripts/doc-lint.mjs +143 -0
  55. package/scripts/export.mjs +300 -0
  56. package/scripts/fork.mjs +64 -0
  57. package/scripts/freeze.mjs +74 -0
  58. package/scripts/frontdoor-parity.mjs +180 -0
  59. package/scripts/hook.mjs +67 -0
  60. package/scripts/identity-rekey.mjs +112 -0
  61. package/scripts/init.mjs +122 -0
  62. package/scripts/land.mjs +40 -0
  63. package/scripts/lib/adapters.mjs +156 -0
  64. package/scripts/lib/board-snapshot.mjs +511 -0
  65. package/scripts/lib/draft.mjs +385 -0
  66. package/scripts/lib/graduate.mjs +276 -0
  67. package/scripts/lib/instance.mjs +74 -0
  68. package/scripts/lib/marks.mjs +107 -0
  69. package/scripts/lib/materialize.mjs +138 -0
  70. package/scripts/lib/merge3.mjs +124 -0
  71. package/scripts/lib/offline-posture.mjs +120 -0
  72. package/scripts/lib/offline-respawn.mjs +18 -0
  73. package/scripts/lib/offline-wrangler.mjs +78 -0
  74. package/scripts/lib/publish-compose.mjs +12 -0
  75. package/scripts/lib/publish-conflict.mjs +78 -0
  76. package/scripts/lib/publish-evidence.mjs +144 -0
  77. package/scripts/lib/refine-compare.mjs +140 -0
  78. package/scripts/lib/refine-ledger.mjs +150 -0
  79. package/scripts/lib/refine-png.mjs +149 -0
  80. package/scripts/lib/seed-pack-build.mjs +141 -0
  81. package/scripts/lib/state-compare.mjs +68 -0
  82. package/scripts/lib/store.mjs +122 -0
  83. package/scripts/login.mjs +84 -0
  84. package/scripts/mark.mjs +112 -0
  85. package/scripts/migrate-board-keys.mjs +164 -0
  86. package/scripts/migrate.mjs +265 -0
  87. package/scripts/no-foreign-vocabulary.mjs +216 -0
  88. package/scripts/no-product-names.mjs +157 -0
  89. package/scripts/no-tenant-globals.mjs +1134 -0
  90. package/scripts/offline.mjs +247 -0
  91. package/scripts/og.mjs +170 -0
  92. package/scripts/one-tenant-resolver.mjs +146 -0
  93. package/scripts/open.mjs +63 -0
  94. package/scripts/publish.mjs +1041 -0
  95. package/scripts/read.mjs +31 -0
  96. package/scripts/refine.mjs +455 -0
  97. package/scripts/release-drift.mjs +138 -0
  98. package/scripts/restore.mjs +322 -0
  99. package/scripts/review.mjs +125 -0
  100. package/scripts/save.mjs +21 -0
  101. package/scripts/shell-lint.mjs +189 -0
  102. package/scripts/ship.mjs +460 -0
  103. package/scripts/shoot.mjs +264 -0
  104. package/scripts/smoke-invite.mjs +113 -0
  105. package/scripts/state-inventory.mjs +223 -0
  106. package/scripts/status.mjs +177 -0
  107. package/scripts/sync.mjs +27 -0
  108. package/scripts/tenant-do-rehearsal.mjs +1314 -0
  109. package/scripts/ui-copy-lint.mjs +202 -0
  110. package/scripts/watch.mjs +32 -0
  111. package/scripts/wrangler-preflight.mjs +246 -0
  112. package/seed/CANON.md +43 -0
  113. package/seed/README.md +119 -0
  114. package/seed/prototype-status.json +9 -0
  115. package/seed/registry.json +88 -0
  116. package/seed/skills/starter-ui/SKILL.md +52 -0
  117. package/seed/skills/starter-ui/skill.json +11 -0
  118. package/seed/skills/starter-ui/starter-tokens.css +73 -0
  119. package/seed/skills/starter-ui/starter-ui.css +318 -0
  120. package/seed/skills/starter-ui/starter-ui.js +50 -0
  121. package/seed/space.json +5 -0
  122. package/seed/start-here/prototypes/connect-your-terminal/index.html +428 -0
  123. package/seed/start-here/prototypes/connect-your-terminal/preview.webp +0 -0
  124. package/seed/start-here/prototypes/sample-with-comments/index.html +172 -0
  125. package/seed/start-here/prototypes/sample-with-comments/preview.webp +0 -0
  126. package/seed/start-here/prototypes/set-up-your-design-system/index.html +353 -0
  127. package/seed/start-here/prototypes/set-up-your-design-system/preview.webp +0 -0
  128. package/seed/threads.json +52 -0
  129. package/seed/worked-examples/prototypes/field-readings/index.html +273 -0
  130. package/seed/worked-examples/prototypes/field-readings/preview.webp +0 -0
  131. package/seed/worked-examples/prototypes/slide-deck/index.html +214 -0
  132. package/seed/worked-examples/prototypes/slide-deck/preview.webp +0 -0
  133. package/seed/worked-examples/prototypes/specimen-viewer/index.html +203 -0
  134. package/seed/worked-examples/prototypes/specimen-viewer/preview.webp +0 -0
  135. package/src/_worker.js +12668 -0
  136. package/src/board-key.mjs +57 -0
  137. package/src/board-room.mjs +881 -0
  138. package/src/bundle-keys.mjs +138 -0
  139. package/src/canon/collect-in-browser.js +215 -0
  140. package/src/canon/emit.mjs +232 -0
  141. package/src/canon/observe.mjs +260 -0
  142. package/src/canon/schema.mjs +451 -0
  143. package/src/canvas/DSEG-LICENSE.txt +95 -0
  144. package/src/canvas/DSEG7Classic-Bold.woff2 +0 -0
  145. package/src/canvas/canvas.css +885 -0
  146. package/src/canvas/canvas.js +5780 -0
  147. package/src/canvas/capture.js +485 -0
  148. package/src/chrome/appchrome.mjs +568 -0
  149. package/src/currency.mjs +203 -0
  150. package/src/delete-confirmation.mjs +254 -0
  151. package/src/drafts/drafts.js +326 -0
  152. package/src/entry.js +58 -0
  153. package/src/galleries.mjs +400 -0
  154. package/src/health-cron.mjs +173 -0
  155. package/src/identity.json +1 -0
  156. package/src/kv-codec.mjs +135 -0
  157. package/src/kv-identity.mjs +259 -0
  158. package/src/mail.mjs +599 -0
  159. package/src/provenance.mjs +74 -0
  160. package/src/publish-compose.mjs +363 -0
  161. package/src/publish-fork.mjs +221 -0
  162. package/src/publish-units.mjs +44 -0
  163. package/src/purge.mjs +81 -0
  164. package/src/review/COMMENTING-UX.md +306 -0
  165. package/src/review/cat.png +0 -0
  166. package/src/review/comment-cursor.svg +7 -0
  167. package/src/review/comments.js +1738 -0
  168. package/src/room-ticket.mjs +96 -0
  169. package/src/roster-chip.mjs +32 -0
  170. package/src/seed-pack.mjs +261 -0
  171. package/src/state-inventory.mjs +249 -0
  172. package/src/sw-logic.mjs +48 -0
  173. package/src/tenant-cache.mjs +141 -0
  174. package/src/tenant-context.mjs +386 -0
  175. package/src/tenant-do.js +2940 -0
  176. package/src/tenant-host.mjs +144 -0
  177. package/src/tenant-quotas.mjs +140 -0
  178. package/src/unit-core.mjs +103 -0
  179. package/src/unit-object.mjs +338 -0
  180. package/templates/README.md +67 -0
  181. package/templates/shell/deploy.yml +145 -0
  182. package/templates/shell/engine-bump.yml +142 -0
  183. package/templates/shell/health.yml +233 -0
  184. package/templates/shell/kv-backup.yml +201 -0
  185. package/templates/shell/roster-update.yml +110 -0
  186. package/templates/shell/space-preflight.yml +35 -0
  187. package/templates/shell/space-rebake.yml +79 -0
  188. package/templates/shell/store-backup.yml +152 -0
  189. package/templates/shell/wrangler.example.toml +266 -0
  190. package/templates/space/publish.yml +91 -0
@@ -0,0 +1,353 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Set up your design system</title>
7
+ <meta name="description" content="The workspace's design system, read live from its own token file: change the ink here and watch every component move, then copy the two lines that make it permanent.">
8
+ <link rel="stylesheet" href="../../../skills/starter-ui/starter-tokens.css">
9
+ <link rel="stylesheet" href="../../../skills/starter-ui/starter-ui.css">
10
+ <style>
11
+ .swatches { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: var(--starter-s4); }
12
+ .scale { display: grid; gap: var(--starter-s3); }
13
+ .scale__row { display: grid; grid-template-columns: 7rem minmax(0, 1fr); gap: var(--starter-s4); align-items: baseline; border-bottom: var(--starter-hair); padding-bottom: var(--starter-s3); }
14
+ .scale__row:last-child { border-bottom: 0; }
15
+ .scale__key { font: var(--starter-text-xs)/1.6 var(--starter-font-display); letter-spacing: .1em; text-transform: uppercase; color: var(--starter-ink-3); }
16
+ .scale__spec { display: block; font: var(--starter-text-xs)/1.6 var(--starter-font-display); color: var(--starter-ink-3); letter-spacing: 0; text-transform: none; }
17
+ .ramp { display: grid; gap: var(--starter-s2); }
18
+ .ramp__row { display: grid; grid-template-columns: 5rem minmax(0, 1fr) 4rem; gap: var(--starter-s3); align-items: center; font: var(--starter-text-xs)/1.6 var(--starter-font-display); color: var(--starter-ink-2); }
19
+ .ramp__bar { height: 10px; background: var(--starter-ink-2); border-radius: 2px; }
20
+
21
+ .inks { display: flex; flex-wrap: wrap; gap: var(--starter-s2); align-items: center; }
22
+ .ink {
23
+ width: 2.4rem; height: 2.4rem; padding: 0;
24
+ border: 2px solid transparent; border-radius: 50%;
25
+ box-shadow: inset 0 0 0 1px rgba(29, 27, 36, .18);
26
+ cursor: pointer;
27
+ }
28
+ .ink[aria-pressed="true"] { border-color: var(--starter-ink); }
29
+ .ink--custom { position: relative; overflow: hidden; }
30
+ .ink--custom input { position: absolute; inset: -25%; width: 150%; height: 150%; border: 0; padding: 0; cursor: pointer; }
31
+
32
+ .specimens { display: grid; gap: var(--starter-s5); }
33
+ .specimen { display: grid; grid-template-columns: 8rem minmax(0, 1fr); gap: var(--starter-s4); align-items: start; }
34
+ .specimen__label { font: var(--starter-text-xs)/1.9 var(--starter-font-display); letter-spacing: .12em; text-transform: uppercase; color: var(--starter-ink-3); }
35
+ @media (max-width: 700px) {
36
+ .specimen, .scale__row { grid-template-columns: minmax(0, 1fr); gap: var(--starter-s2); }
37
+ }
38
+ </style>
39
+ </head>
40
+ <body class="s-page">
41
+
42
+ <main class="s-sheet">
43
+
44
+ <header class="s-block">
45
+ <div class="s-block__rail">02 / 03</div>
46
+ <div>
47
+ <p class="s-eyebrow">Start here</p>
48
+ <h1 class="s-title s-title--hero">Your design system</h1>
49
+ <p class="s-lede">Every screen in this workspace is drawn from one small file of tokens. This
50
+ page reads that file live — the values below are not a picture of the system, they are the
51
+ system.</p>
52
+ </div>
53
+ </header>
54
+
55
+ <section class="s-block">
56
+ <div class="s-block__rail">Colour</div>
57
+ <div>
58
+ <h2 class="s-h2">Six colours, one of them hot</h2>
59
+ <p class="s-prose">Five quiet values carry the paper and the ink. The sixth marks the one thing
60
+ on a screen you are meant to act on — a primary button, a step you are on, a pin. If two
61
+ things on a screen wear it, neither one reads.</p>
62
+ <div class="swatches" id="swatches"></div>
63
+ </div>
64
+ </section>
65
+
66
+ <section class="s-block">
67
+ <div class="s-block__rail">Try it</div>
68
+ <div>
69
+ <h2 class="s-h2">Change the hot ink</h2>
70
+ <p class="s-prose">Pick one. Everything below — and the swatches above, and this page's own
71
+ buttons — moves at once, because they all read the same token.</p>
72
+ <div class="inks" role="group" aria-label="Hot ink">
73
+ <button type="button" class="ink" data-ink="#cf4224" style="background:#cf4224" aria-pressed="true" title="Vermilion"></button>
74
+ <button type="button" class="ink" data-ink="#2f4bd8" style="background:#2f4bd8" aria-pressed="false" title="Ultramarine"></button>
75
+ <button type="button" class="ink" data-ink="#3d7a4a" style="background:#3d7a4a" aria-pressed="false" title="Moss"></button>
76
+ <button type="button" class="ink" data-ink="#7b3fa0" style="background:#7b3fa0" aria-pressed="false" title="Plum"></button>
77
+ <button type="button" class="ink" data-ink="#c98a0e" style="background:#c98a0e" aria-pressed="false" title="Marigold"></button>
78
+ <span class="ink ink--custom" title="Any colour">
79
+ <input type="color" id="ink-custom" value="#cf4224" aria-label="Pick any hot ink">
80
+ </span>
81
+ <button type="button" class="s-btn s-btn--quiet" id="ink-reset">Reset</button>
82
+ </div>
83
+
84
+ <p class="s-prose" style="margin-top: var(--starter-s5)">To keep it, write these three lines into
85
+ <code>skills/starter-ui/starter-tokens.css</code>. The second is the same ink darkened until it
86
+ passes contrast as text; the third is its quietest wash.</p>
87
+ <div class="s-cmd s-cmd--paste">
88
+ <code class="s-cmd__text s-cmd__text--plain" id="token-code"></code>
89
+ <button type="button" class="s-cmd__btn" data-s-copy="#token-code">Copy</button>
90
+ </div>
91
+ <details class="s-prose s-disclosure" style="margin-top: var(--starter-s4)">
92
+ <summary>Or have your agent do it</summary>
93
+ <div class="s-cmd s-cmd--paste" style="margin-top: var(--starter-s3)">
94
+ <code class="s-cmd__text s-cmd__text--plain" id="token-ask"></code>
95
+ <button type="button" class="s-cmd__btn" data-s-copy="#token-ask">Copy</button>
96
+ </div>
97
+ </details>
98
+ </div>
99
+ </section>
100
+
101
+ <section class="s-block">
102
+ <div class="s-block__rail">Type</div>
103
+ <div>
104
+ <h2 class="s-h2">Two faces, seven sizes</h2>
105
+ <p class="s-prose">Display type is monospaced — this is a workspace made of plain files, and the
106
+ type says so. Body copy is the system sans, which every machine already has, so a screen looks
107
+ the same the moment it opens with nothing to download.</p>
108
+ <div class="scale" id="scale"></div>
109
+ </div>
110
+ </section>
111
+
112
+ <section class="s-block">
113
+ <div class="s-block__rail">Space</div>
114
+ <div>
115
+ <h2 class="s-h2">One rhythm, eight steps</h2>
116
+ <p class="s-prose">Every gap in this workspace is one of these. Reaching for a number that is not
117
+ on the ramp is the first sign a screen is drifting.</p>
118
+ <div class="ramp" id="ramp"></div>
119
+ </div>
120
+ </section>
121
+
122
+ <section class="s-block">
123
+ <div class="s-block__rail">Parts</div>
124
+ <div>
125
+ <h2 class="s-h2">What is already built</h2>
126
+ <p class="s-prose">Twelve parts, all classed <code>.s-*</code>, all drinking from the tokens.
127
+ Brief your agent to use these before it invents anything new — that is what keeps twenty
128
+ screens looking like one product.</p>
129
+
130
+ <div class="specimens">
131
+ <div class="specimen">
132
+ <div class="specimen__label">Buttons</div>
133
+ <div class="s-row">
134
+ <button type="button" class="s-btn s-btn--mark">Primary</button>
135
+ <button type="button" class="s-btn">Secondary</button>
136
+ <button type="button" class="s-btn s-btn--quiet">Quiet</button>
137
+ <button type="button" class="s-btn" disabled>Disabled</button>
138
+ </div>
139
+ </div>
140
+ <div class="specimen">
141
+ <div class="specimen__label">Chips</div>
142
+ <div class="s-row">
143
+ <span class="s-chip">Default</span>
144
+ <span class="s-chip s-chip--mark">Needs you</span>
145
+ <span class="s-chip s-chip--ok">Done</span>
146
+ </div>
147
+ </div>
148
+ <div class="specimen">
149
+ <div class="specimen__label">Card</div>
150
+ <div class="s-grid s-grid--2">
151
+ <div class="s-card">
152
+ <h3 class="s-h3">Plain card</h3>
153
+ <p class="s-caption">A panel on the sheet. Hairline, no shadow.</p>
154
+ </div>
155
+ <div class="s-card s-card--mark">
156
+ <h3 class="s-h3">Marked card</h3>
157
+ <p class="s-caption">The one panel that wants attention.</p>
158
+ </div>
159
+ </div>
160
+ </div>
161
+ <div class="specimen">
162
+ <div class="specimen__label">Command</div>
163
+ <div>
164
+ <div class="s-cmd">
165
+ <code class="s-cmd__text" id="demo-cmd">augur land</code>
166
+ <button type="button" class="s-cmd__btn" data-s-copy="#demo-cmd">Copy</button>
167
+ </div>
168
+ </div>
169
+ </div>
170
+ <div class="specimen">
171
+ <div class="specimen__label">Field</div>
172
+ <div>
173
+ <label class="s-label" for="demo-field">Screen name</label>
174
+ <input class="s-field" id="demo-field" placeholder="watering log">
175
+ </div>
176
+ </div>
177
+ <div class="specimen">
178
+ <div class="specimen__label">Table</div>
179
+ <table class="s-table">
180
+ <thead><tr><th>Part</th><th>Class</th><th>Where it earns its place</th></tr></thead>
181
+ <tbody>
182
+ <tr><td>Sheet</td><td><code>.s-sheet</code></td><td>Every page in the workspace.</td></tr>
183
+ <tr><td>Steps</td><td><code>.s-step</code></td><td>Anything where the order is the instruction.</td></tr>
184
+ <tr><td>Stage</td><td><code>.s-stage</code></td><td>Media, 3D, a terminal.</td></tr>
185
+ </tbody>
186
+ </table>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </section>
191
+
192
+ <p class="s-note"><strong>The whole system is three files</strong>, at
193
+ <code>skills/starter-ui/</code>: the tokens, the components, and one line of behaviour. Nothing is
194
+ generated and nothing is compiled — open them and read them. Rename the parts, delete the ones you
195
+ never use, add your own. It is yours the moment you edit it.</p>
196
+
197
+ </main>
198
+
199
+ <script src="../../../skills/starter-ui/starter-ui.js" defer></script>
200
+ <script>
201
+ (function () {
202
+ "use strict";
203
+
204
+ var root = document.documentElement;
205
+ var css = function (name) { return getComputedStyle(root).getPropertyValue(name).trim(); };
206
+
207
+ /* ── Colour maths ────────────────────────────────────────────────────────
208
+ Two derived values per hot ink: a darker one that passes contrast as text
209
+ on the sheet, and a wash for quiet fills. Derived rather than picked, so
210
+ a colour anyone chooses still lands legibly. */
211
+ function hex2rgb(h) {
212
+ h = h.replace("#", "");
213
+ if (h.length === 3) h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
214
+ return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
215
+ }
216
+ function rgb2hex(c) {
217
+ return "#" + c.map(function (v) {
218
+ return Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, "0");
219
+ }).join("");
220
+ }
221
+ function mix(a, b, t) {
222
+ var x = hex2rgb(a), y = hex2rgb(b);
223
+ return rgb2hex([0, 1, 2].map(function (i) { return x[i] + (y[i] - x[i]) * t; }));
224
+ }
225
+ function luminance(hex) {
226
+ return hex2rgb(hex).map(function (v) {
227
+ v /= 255;
228
+ return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
229
+ }).reduce(function (l, v, i) { return l + v * [0.2126, 0.7152, 0.0722][i]; }, 0);
230
+ }
231
+ function contrast(a, b) {
232
+ var la = luminance(a), lb = luminance(b);
233
+ return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);
234
+ }
235
+ function readableInk(hex, on) {
236
+ /* A fill and a text colour are not the same job: start one shade down, then
237
+ keep going until it clears 4.5:1 on the sheet. */
238
+ var out = mix(hex, "#000000", 0.18);
239
+ for (var t = 0.18; t <= 0.9 && contrast(out, on) < 4.5; t += 0.04) out = mix(hex, "#000000", t);
240
+ return out;
241
+ }
242
+
243
+ /* The page's starting point is the TOKEN, never a value written down here. A workspace
244
+ whose design system was extracted from its own product has a hot ink of its own, and
245
+ a hard-coded default would paint the shipped one over it on load — the one screen
246
+ whose whole job is to show the system would be the only screen not showing it. */
247
+ var DEFAULT_INK = css("--starter-mark") || "#cf4224";
248
+ var sheet = css("--starter-sheet") || "#fbfaf6";
249
+
250
+ function applyInk(hex) {
251
+ var ink = readableInk(hex, sheet);
252
+ var wash = mix(hex, sheet, 0.86);
253
+ root.style.setProperty("--starter-mark", hex);
254
+ root.style.setProperty("--starter-mark-ink", ink);
255
+ root.style.setProperty("--starter-wash", wash);
256
+ document.getElementById("ink-custom").value = hex;
257
+ Array.prototype.forEach.call(document.querySelectorAll("[data-ink]"), function (b) {
258
+ b.setAttribute("aria-pressed", String(b.getAttribute("data-ink").toLowerCase() === hex.toLowerCase()));
259
+ });
260
+ document.getElementById("token-code").textContent =
261
+ ":root {\n" +
262
+ " --starter-mark: " + hex + ";\n" +
263
+ " --starter-mark-ink: " + ink + ";\n" +
264
+ " --starter-wash: " + wash + ";\n" +
265
+ "}";
266
+ document.getElementById("token-ask").textContent =
267
+ "In skills/starter-ui/starter-tokens.css, set --starter-mark to " + hex + ", " +
268
+ "--starter-mark-ink to " + ink + " and --starter-wash to " + wash + ". " +
269
+ "Change nothing else, then show me one of the prototypes so I can check it.";
270
+ paintSwatches();
271
+ }
272
+
273
+ /* ── The live token readouts ─────────────────────────────────────────── */
274
+ var COLOURS = [
275
+ ["--starter-paper", "the desk"],
276
+ ["--starter-sheet", "the sheet"],
277
+ ["--starter-ink", "every word that matters"],
278
+ ["--starter-ink-2", "captions, secondary"],
279
+ ["--starter-rule", "hairlines"],
280
+ ["--starter-mark", "the one hot ink"]
281
+ ];
282
+
283
+ function paintSwatches() {
284
+ var host = document.getElementById("swatches");
285
+ host.innerHTML = "";
286
+ COLOURS.forEach(function (row) {
287
+ var value = css(row[0]);
288
+ var el = document.createElement("div");
289
+ el.className = "s-swatch";
290
+ el.innerHTML =
291
+ '<div class="s-swatch__chip" style="background:' + value + '"></div>' +
292
+ '<div><div class="s-swatch__name">' + row[0] + "</div>" +
293
+ '<div class="s-swatch__val">' + value + " · " + row[1] + "</div></div>";
294
+ host.appendChild(el);
295
+ });
296
+ }
297
+
298
+ var SIZES = [
299
+ ["3xl", "--starter-text-3xl", "One big thing per page"],
300
+ ["2xl", "--starter-text-2xl", "Page title"],
301
+ ["xl", "--starter-text-xl", "Section title"],
302
+ ["lg", "--starter-text-lg", "Lede and step titles"],
303
+ ["md", "--starter-text-md", "Body copy — most of everything"],
304
+ ["sm", "--starter-text-sm", "Captions and chips"],
305
+ ["xs", "--starter-text-xs", "Plate numbers, labels"]
306
+ ];
307
+
308
+ (function paintScale() {
309
+ var host = document.getElementById("scale");
310
+ SIZES.forEach(function (row) {
311
+ var el = document.createElement("div");
312
+ el.className = "scale__row";
313
+ var face = row[0] === "md" || row[0] === "sm" ? "--starter-font-body" : "--starter-font-display";
314
+ el.innerHTML =
315
+ '<div class="scale__key">' + row[0] +
316
+ '<span class="scale__spec">' + css(row[1]) + "</span></div>" +
317
+ '<div style="font-family: var(' + face + '); font-size: var(' + row[1] + '); line-height:1.2; letter-spacing:-.02em">' +
318
+ row[2] + "</div>";
319
+ host.appendChild(el);
320
+ });
321
+ })();
322
+
323
+ (function paintRamp() {
324
+ var host = document.getElementById("ramp");
325
+ for (var i = 1; i <= 8; i++) {
326
+ var name = "--starter-s" + i;
327
+ var el = document.createElement("div");
328
+ el.className = "ramp__row";
329
+ el.innerHTML =
330
+ "<div>s" + i + "</div>" +
331
+ '<div><div class="ramp__bar" style="width: var(' + name + ')"></div></div>' +
332
+ "<div>" + css(name) + "</div>";
333
+ host.appendChild(el);
334
+ }
335
+ })();
336
+
337
+ /* ── Wiring ──────────────────────────────────────────────────────────── */
338
+ document.addEventListener("click", function (e) {
339
+ var b = e.target.closest("[data-ink]");
340
+ if (b) applyInk(b.getAttribute("data-ink"));
341
+ });
342
+ document.getElementById("ink-custom").addEventListener("input", function (e) {
343
+ applyInk(e.target.value);
344
+ });
345
+ document.getElementById("ink-reset").addEventListener("click", function () {
346
+ applyInk(DEFAULT_INK);
347
+ });
348
+
349
+ applyInk(DEFAULT_INK);
350
+ })();
351
+ </script>
352
+ </body>
353
+ </html>
@@ -0,0 +1,52 @@
1
+ {
2
+ "_comment": "Seeded comment threads, keyed by the page path they belong to. Provisioning writes each value verbatim under the comment key for that path (`c:<path>`), in the same write as the first admin, so a new workspace opens with the review loop already running. The record shape is the overlay's own — id, sel (the CSS selector the pin sticks to), fx/fy (where inside that element), resolved, annotation, messages — and `at` should be stamped with the provisioning time so the threads do not read as months old on day one.",
3
+
4
+ "/start-here/sample-with-comments/": [
5
+ {
6
+ "id": "seed-pin-fee",
7
+ "sel": "#fee-note",
8
+ "fx": 0.88,
9
+ "fy": 0.5,
10
+ "px": 0,
11
+ "py": 0,
12
+ "cwx": null,
13
+ "cwy": null,
14
+ "view": null,
15
+ "screen": null,
16
+ "resolved": false,
17
+ "annotation": false,
18
+ "messages": [
19
+ {
20
+ "author": "Augur",
21
+ "verified": false,
22
+ "by": null,
23
+ "body": "A comment sticks to the element, not to a spot on the page — this one is stuck to the fee line, and it stays on it when the screen reflows or the copy changes. Reply here to try it, then press Shift+C and pin one of your own.",
24
+ "at": "2026-01-01T09:00:00.000Z"
25
+ }
26
+ ]
27
+ },
28
+ {
29
+ "id": "seed-pin-actions",
30
+ "sel": "#actions",
31
+ "fx": 0.74,
32
+ "fy": 0.5,
33
+ "px": 0,
34
+ "py": 0,
35
+ "cwx": null,
36
+ "cwy": null,
37
+ "view": null,
38
+ "screen": null,
39
+ "resolved": false,
40
+ "annotation": false,
41
+ "messages": [
42
+ {
43
+ "author": "Augur",
44
+ "verified": false,
45
+ "by": null,
46
+ "body": "And this is what a useful one looks like. Cancel appointment sits right beside Confirm, and only one of the two can be undone. Move it out of the row and make it a plain text link underneath — then send that sentence to your agent and watch the screen change.",
47
+ "at": "2026-01-01T09:01:00.000Z"
48
+ }
49
+ ]
50
+ }
51
+ ]
52
+ }