@litfamily/litgrok 1.0.26 → 1.0.28

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 (235) hide show
  1. package/.grok/hooks/lit-mark.mjs +42 -0
  2. package/.grok/hooks/lit-status-line.mjs +174 -21
  3. package/.grok/hooks/plan-gate.mjs +13 -3
  4. package/.grok/hooks/record-passive-event.mjs +40 -6
  5. package/.grok/hooks/session-end.json +15 -0
  6. package/.grok/hooks/session-end.mjs +6 -0
  7. package/.grok/hooks/session-liveness.mjs +102 -0
  8. package/.grok/hooks/session-rows.mjs +57 -0
  9. package/.grok/hooks/session-start.mjs +17 -0
  10. package/.grok/hooks/workflow-stage.mjs +5 -2
  11. package/.grok/rules/00-litgrok.md +14 -0
  12. package/.grok/skills/frontend-ui-ux/ATTRIBUTION.md +23 -0
  13. package/.grok/skills/frontend-ui-ux/SKILL.md +4 -1
  14. package/.grok/skills/frontend-ui-ux/examples/phase-3-readme-ab/README.md +9 -0
  15. package/.grok/skills/frontend-ui-ux/kit/components.css +414 -0
  16. package/.grok/skills/frontend-ui-ux/kit/fonts.json +22 -0
  17. package/.grok/skills/frontend-ui-ux/kit/layouts/landing.html +164 -0
  18. package/.grok/skills/frontend-ui-ux/kit/layouts/settings.html +114 -0
  19. package/.grok/skills/frontend-ui-ux/kit/layouts/workspace.html +115 -0
  20. package/.grok/skills/frontend-ui-ux/kit/styles/computational-brutalism.json +227 -0
  21. package/.grok/skills/frontend-ui-ux/kit/styles/field-notes.json +205 -0
  22. package/.grok/skills/frontend-ui-ux/kit/styles/graphite.json +200 -0
  23. package/.grok/skills/frontend-ui-ux/kit/styles/meadow.json +199 -0
  24. package/.grok/skills/frontend-ui-ux/kit/styles/neo-brutalism.json +222 -0
  25. package/.grok/skills/frontend-ui-ux/kit/ui.js +226 -0
  26. package/.grok/skills/frontend-ui-ux/references/adaptive-layout.md +10 -4
  27. package/.grok/skills/frontend-ui-ux/references/brand-and-imagery.md +11 -7
  28. package/.grok/skills/frontend-ui-ux/references/complete-contract.md +21 -0
  29. package/.grok/skills/frontend-ui-ux/references/composition.md +10 -6
  30. package/.grok/skills/frontend-ui-ux/references/craft-floor.md +256 -93
  31. package/.grok/skills/frontend-ui-ux/references/creative-directions.md +9 -6
  32. package/.grok/skills/frontend-ui-ux/references/default-editorial-pixel.json +28 -0
  33. package/.grok/skills/frontend-ui-ux/references/house-styles.md +234 -0
  34. package/.grok/skills/frontend-ui-ux/references/implementation-platforms.md +10 -6
  35. package/.grok/skills/frontend-ui-ux/references/inclusive-interface.md +11 -5
  36. package/.grok/skills/frontend-ui-ux/references/interaction-motion.md +34 -78
  37. package/.grok/skills/frontend-ui-ux/references/motion-guide.md +10 -7
  38. package/.grok/skills/frontend-ui-ux/references/performance-delivery.md +11 -8
  39. package/.grok/skills/frontend-ui-ux/references/probe-loop.md +1 -1
  40. package/.grok/skills/frontend-ui-ux/references/product-direction.md +9 -4
  41. package/.grok/skills/frontend-ui-ux/references/production-interview.md +17 -0
  42. package/.grok/skills/frontend-ui-ux/references/redesign-playbook.md +10 -6
  43. package/.grok/skills/frontend-ui-ux/references/slop-register.md +148 -73
  44. package/.grok/skills/frontend-ui-ux/references/system-foundations.md +10 -4
  45. package/.grok/skills/frontend-ui-ux/references/visual-language.md +10 -4
  46. package/.grok/skills/frontend-ui-ux/references/visual-reconstruction.md +39 -72
  47. package/.grok/skills/frontend-ui-ux/scripts/design-lock.mjs +400 -0
  48. package/.grok/skills/frontend-ui-ux/scripts/interface-probe-driver.mjs +33 -0
  49. package/.grok/skills/frontend-ui-ux/scripts/interface-probe-lock.mjs +196 -0
  50. package/.grok/skills/frontend-ui-ux/scripts/interface-probe-page.mjs +1555 -0
  51. package/.grok/skills/frontend-ui-ux/scripts/interface-probe-rules.mjs +153 -0
  52. package/.grok/skills/frontend-ui-ux/scripts/interface-probe-server.mjs +57 -0
  53. package/.grok/skills/frontend-ui-ux/scripts/interface-probe-static.mjs +139 -0
  54. package/.grok/skills/frontend-ui-ux/scripts/interface-probe.mjs +363 -0
  55. package/.grok/skills/frontend-ui-ux/scripts/pixel-art.mjs +60 -0
  56. package/.grok/skills/lit-adhd/SKILL.md +155 -0
  57. package/.grok/skills/lit-adhd/references/card-examples.md +131 -0
  58. package/.grok/skills/lit-adhd/references/status-taxonomy.md +50 -0
  59. package/.grok/skills/lit-adhd/scripts/lib/brief.mjs +421 -0
  60. package/.grok/skills/lit-adhd/scripts/lib/collect.mjs +395 -0
  61. package/.grok/skills/lit-adhd/scripts/lib/gauge.mjs +87 -0
  62. package/.grok/skills/lit-adhd/scripts/lib/next-step.mjs +22 -0
  63. package/.grok/skills/lit-adhd/scripts/lib/plan-task-rows.mjs +32 -0
  64. package/.grok/skills/lit-adhd/scripts/lib/project-state-root.mjs +55 -0
  65. package/.grok/skills/lit-adhd/scripts/lib/redact.mjs +64 -0
  66. package/.grok/skills/lit-adhd/scripts/lib/suggest.mjs +140 -0
  67. package/.grok/skills/lit-adhd/scripts/lib/transcripts.mjs +232 -0
  68. package/.grok/skills/lit-adhd/scripts/rewind.mjs +6 -0
  69. package/.grok/skills/lit-diagram-drawer/SKILL.md +17 -5
  70. package/.grok/skills/lit-diagram-drawer/references/output-spec.md +2 -2
  71. package/.grok/skills/lit-diagram-drawer/references/style-guide.md +20 -11
  72. package/.grok/skills/lit-diagram-drawer/references/type-architecture.md +3 -3
  73. package/.grok/skills/lit-diagram-drawer/references/type-dependency.md +1 -1
  74. package/.grok/skills/lit-diagram-drawer/references/type-tree.md +3 -3
  75. package/.grok/skills/lit-diagram-drawer/references/type-wardley.md +1 -1
  76. package/.grok/skills/lit-diagram-drawer/references/verifier-guide.md +4 -0
  77. package/.grok/skills/lit-diagram-drawer/scripts/visual-quality.mjs +2 -2
  78. package/.grok/skills/lit-handoff/SKILL.md +2 -0
  79. package/.grok/skills/lit-hijack/SKILL.md +459 -0
  80. package/.grok/skills/lit-hijack/references/capture-and-provenance.md +124 -0
  81. package/.grok/skills/lit-hijack/references/clean-room-build.md +130 -0
  82. package/.grok/skills/lit-hijack/references/distil-and-licence.md +128 -0
  83. package/.grok/skills/lit-hijack/references/gap-and-port-design.md +150 -0
  84. package/.grok/skills/lit-hijack/references/parity-and-report.md +130 -0
  85. package/.grok/skills/lit-hijack/scripts/hijack.mjs +890 -0
  86. package/.grok/skills/lit-hijack/scripts/lib/safe-fetch.mjs +213 -0
  87. package/.grok/skills/lit-plan/SKILL.md +3 -1
  88. package/.grok/skills/lit-plan/references/plan-schema.md +4 -0
  89. package/.grok/skills/lit-plan/scripts/scaffold-plan.mjs +9 -2
  90. package/.grok/skills/lit-plan/scripts/scope-roots.mjs +83 -0
  91. package/.grok/skills/lit-pptx/SKILL.md +10 -5
  92. package/.grok/skills/lit-pptx/examples/13-engineering-review-computational-brutalism-ko.md +173 -0
  93. package/.grok/skills/lit-pptx/examples/14-launch-pitch-neo-brutalism-ko.md +154 -0
  94. package/.grok/skills/lit-pptx/examples/15-design-lecture-bauhaus-ko.md +139 -0
  95. package/.grok/skills/lit-pptx/examples/16-community-programme-riso-ko.md +158 -0
  96. package/.grok/skills/lit-pptx/examples/17-public-data-briefing-newsroom-ko.md +179 -0
  97. package/.grok/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Bold.ttf +0 -0
  98. package/.grok/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Regular.ttf +0 -0
  99. package/.grok/skills/lit-pptx/fonts/jetbrains-mono/OFL.txt +93 -0
  100. package/.grok/skills/lit-pptx/fonts/jetbrains-mono/provenance.json +1 -0
  101. package/.grok/skills/lit-pptx/references/direction-step.md +34 -8
  102. package/.grok/skills/lit-pptx/references/tonalities/bauhaus.md +140 -0
  103. package/.grok/skills/lit-pptx/references/tonalities/computational-brutalism.md +150 -0
  104. package/.grok/skills/lit-pptx/references/tonalities/neo-brutalism.md +161 -0
  105. package/.grok/skills/lit-pptx/references/tonalities/newsroom.md +144 -0
  106. package/.grok/skills/lit-pptx/references/tonalities/riso.md +137 -0
  107. package/.grok/skills/lit-pptx/scripts/compile-deck.js +1 -1
  108. package/.grok/skills/lit-pptx/scripts/craft_extras.py +61 -3
  109. package/.grok/skills/lit-pptx/scripts/deck_output.py +76 -62
  110. package/.grok/skills/lit-pptx/scripts/embed_fonts.py +14 -1
  111. package/.grok/skills/lit-pptx/scripts/lib/grid-resolver.js +101 -110
  112. package/.grok/skills/lit-pptx/scripts/lib/layout-resolver.js +9 -15
  113. package/.grok/skills/lit-pptx/scripts/lib/render-pack.js +389 -582
  114. package/.grok/skills/lit-pptx/scripts/lib/slide-grid.js +104 -0
  115. package/.grok/skills/lit-pptx/scripts/lib/template-registry.js +60 -8
  116. package/.grok/skills/lit-pptx/scripts/qa_deck.py +4 -4
  117. package/.grok/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +2 -0
  118. package/.grok/skills/lit-pptx/templates/tonalities/bauhaus/pack.yaml +98 -0
  119. package/.grok/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +2 -0
  120. package/.grok/skills/lit-pptx/templates/tonalities/computational-brutalism/pack.yaml +99 -0
  121. package/.grok/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +2 -0
  122. package/.grok/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +2 -0
  123. package/.grok/skills/lit-pptx/templates/tonalities/neo-brutalism/pack.yaml +107 -0
  124. package/.grok/skills/lit-pptx/templates/tonalities/newsroom/pack.yaml +99 -0
  125. package/.grok/skills/lit-pptx/templates/tonalities/night/pack.yaml +2 -0
  126. package/.grok/skills/lit-pptx/templates/tonalities/paper/pack.yaml +2 -0
  127. package/.grok/skills/lit-pptx/templates/tonalities/riso/pack.yaml +99 -0
  128. package/.grok/skills/lit-pptx/templates/tonalities/signal/pack.yaml +3 -0
  129. package/.grok/skills/lit-pptx/templates/tonalities/studio/pack.yaml +2 -0
  130. package/.grok/skills/lit-recap/SKILL.md +1 -1
  131. package/.grok/skills/lit-schematic/SKILL.md +140 -0
  132. package/.grok/skills/lit-schematic/examples/iso-heat-exchanger/build.mjs +38 -0
  133. package/.grok/skills/lit-schematic/examples/iso-heat-exchanger/scene.mjs +133 -0
  134. package/.grok/skills/lit-schematic/examples/journal-adsorption-rig/build.mjs +87 -0
  135. package/.grok/skills/lit-schematic/examples/pid-dosing-skid/build.mjs +85 -0
  136. package/.grok/skills/lit-schematic/references/cutaway-outputs.md +70 -0
  137. package/.grok/skills/lit-schematic/references/isometric-craft.md +101 -0
  138. package/.grok/skills/lit-schematic/references/journal-figures.md +72 -0
  139. package/.grok/skills/lit-schematic/references/kit-api.md +134 -0
  140. package/.grok/skills/lit-schematic/references/pfd-and-layout.md +53 -0
  141. package/.grok/skills/lit-schematic/references/pid-drafting.md +103 -0
  142. package/.grok/skills/lit-schematic/references/pid-symbols.md +163 -0
  143. package/.grok/skills/lit-schematic/references/verification.md +100 -0
  144. package/.grok/skills/lit-schematic/scripts/doctor.mjs +57 -0
  145. package/.grok/skills/lit-schematic/scripts/lib/figure.mjs +81 -0
  146. package/.grok/skills/lit-schematic/scripts/lib/fonts.mjs +27 -0
  147. package/.grok/skills/lit-schematic/scripts/lib/geom.mjs +113 -0
  148. package/.grok/skills/lit-schematic/scripts/lib/interactive.mjs +292 -0
  149. package/.grok/skills/lit-schematic/scripts/lib/isa.mjs +115 -0
  150. package/.grok/skills/lit-schematic/scripts/lib/iso.mjs +719 -0
  151. package/.grok/skills/lit-schematic/scripts/lib/legend-sheet.mjs +162 -0
  152. package/.grok/skills/lit-schematic/scripts/lib/pid.mjs +937 -0
  153. package/.grok/skills/lit-schematic/scripts/lib/png.mjs +132 -0
  154. package/.grok/skills/lit-schematic/scripts/lib/qa-core.mjs +658 -0
  155. package/.grok/skills/lit-schematic/scripts/lib/route.mjs +218 -0
  156. package/.grok/skills/lit-schematic/scripts/lib/sheet.mjs +890 -0
  157. package/.grok/skills/lit-schematic/scripts/lib/svg.mjs +82 -0
  158. package/.grok/skills/lit-schematic/scripts/lib/theme.mjs +115 -0
  159. package/.grok/skills/lit-schematic/scripts/motion.mjs +129 -0
  160. package/.grok/skills/lit-schematic/scripts/qa.mjs +92 -0
  161. package/.grok/skills/lit-schematic/scripts/render.mjs +233 -0
  162. package/.grok/skills/lit-schematic/scripts/scaffold.mjs +60 -0
  163. package/.grok/skills/lit-scientific-visualization/SKILL.md +36 -12
  164. package/.grok/skills/lit-typographic-motion/SKILL.md +7 -4
  165. package/.grok/skills/lit-typographic-motion/THIRD_PARTY_NOTICES +11 -0
  166. package/.grok/skills/lit-typographic-motion/recipes/hero-3d/expected.json +62 -0
  167. package/.grok/skills/lit-typographic-motion/recipes/hero-3d/index.html +82 -0
  168. package/.grok/skills/lit-typographic-motion/references/choice-first.md +30 -0
  169. package/.grok/skills/lit-typographic-motion/references/cover.md +10 -1
  170. package/.grok/skills/lit-typographic-motion/references/depth.md +119 -0
  171. package/.grok/skills/lit-typographic-motion/references/treatment.md +9 -1
  172. package/.grok/skills/lit-typographic-motion/scripts/blender/runner.py +218 -0
  173. package/.grok/skills/lit-typographic-motion/scripts/lib/assets.mjs +230 -0
  174. package/.grok/skills/lit-typographic-motion/scripts/lib/blender.mjs +136 -0
  175. package/.grok/skills/lit-typographic-motion/scripts/lib/board.mjs +153 -0
  176. package/.grok/skills/lit-typographic-motion/scripts/lib/chrome.mjs +61 -32
  177. package/.grok/skills/lit-typographic-motion/scripts/lib/constants.mjs +4 -2
  178. package/.grok/skills/lit-typographic-motion/scripts/lib/cover-capture.mjs +20 -11
  179. package/.grok/skills/lit-typographic-motion/scripts/lib/cover-treatment.mjs +26 -2
  180. package/.grok/skills/lit-typographic-motion/scripts/lib/cover.mjs +12 -5
  181. package/.grok/skills/lit-typographic-motion/scripts/lib/frame-pool.mjs +78 -1
  182. package/.grok/skills/lit-typographic-motion/scripts/lib/gallery.mjs +160 -0
  183. package/.grok/skills/lit-typographic-motion/scripts/lib/house.mjs +43 -0
  184. package/.grok/skills/lit-typographic-motion/scripts/lib/look.mjs +39 -1
  185. package/.grok/skills/lit-typographic-motion/scripts/lib/scaffold.mjs +174 -0
  186. package/.grok/skills/lit-typographic-motion/scripts/lib/score.mjs +640 -0
  187. package/.grok/skills/lit-typographic-motion/scripts/lib/sound.mjs +143 -0
  188. package/.grok/skills/lit-typographic-motion/scripts/lib/soundtrack.mjs +12 -3
  189. package/.grok/skills/lit-typographic-motion/scripts/lib/stage-gate.mjs +44 -0
  190. package/.grok/skills/lit-typographic-motion/scripts/lib/stage-qa.mjs +132 -3
  191. package/.grok/skills/lit-typographic-motion/scripts/lib/stage-session.mjs +51 -3
  192. package/.grok/skills/lit-typographic-motion/scripts/lib/stage.mjs +74 -9
  193. package/.grok/skills/lit-typographic-motion/scripts/lib/styles.mjs +224 -0
  194. package/.grok/skills/lit-typographic-motion/scripts/lib/treatment.mjs +198 -4
  195. package/.grok/skills/lit-typographic-motion/scripts/lib/vendor/three/LICENSE +21 -0
  196. package/.grok/skills/lit-typographic-motion/scripts/lib/vendor/three/addons/environments/RoomEnvironment.js +144 -0
  197. package/.grok/skills/lit-typographic-motion/scripts/lib/vendor/three/addons/geometries/RoundedBoxGeometry.js +155 -0
  198. package/.grok/skills/lit-typographic-motion/scripts/lib/vendor/three/three.module.js +54571 -0
  199. package/.grok/skills/lit-typographic-motion/scripts/motion.mjs +56 -6
  200. package/.grok/skills/lit-typographic-motion/scripts/stage/cover-init.js +20 -8
  201. package/.grok/skills/lit-typographic-motion/scripts/stage/loop-kit.js +2 -2
  202. package/.grok/skills/lit-typographic-motion/scripts/stage/stage-kit.js +25 -0
  203. package/.grok/skills/lit-typographic-motion/styles/paper.json +1 -0
  204. package/.grok/skills/lit-typographic-motion/styles/swiss-signal.json +1 -0
  205. package/.grok/skills/lit-typographic-motion/styles/terminalcore.json +1 -0
  206. package/.grok/skills/lit-typographic-motion/styles/tidal.json +1 -0
  207. package/.grok/skills/litgrok/SKILL.md +1 -1
  208. package/.grok/skills/litresearch/SKILL.md +2 -0
  209. package/.grok/skills/readme-studio/SKILL.md +14 -12
  210. package/.grok/skills/readme-studio/references/choice-first.md +24 -0
  211. package/.grok/skills/start-work/SKILL.md +8 -1
  212. package/.grok-plugin/plugin.json +4 -1
  213. package/CHANGELOG.md +18 -0
  214. package/README.md +11 -11
  215. package/README_ko-KR.md +11 -11
  216. package/TRADEMARK.md +12 -0
  217. package/bin/litgrok.mjs +2 -0
  218. package/docs/assets/readme/badge-version.svg +1 -1
  219. package/docs/assets/showcase/brief.webp +0 -0
  220. package/docs/assets/showcase/deck.webp +0 -0
  221. package/docs/assets/showcase/page.webp +0 -0
  222. package/docs/assets/showcase/pid.webp +0 -0
  223. package/docs/assets/skills/lit-adhd.webp +0 -0
  224. package/docs/assets/skills/lit-hijack.webp +0 -0
  225. package/docs/assets/skills/lit-schematic.webp +0 -0
  226. package/docs/reference.md +11 -7
  227. package/docs/reference_ko-KR.md +11 -7
  228. package/hooks/hooks.json +11 -0
  229. package/package.json +6 -1
  230. package/plugin.json +1 -1
  231. package/.grok/skills/frontend-ui-ux/scripts/page-probe.mjs +0 -105
  232. package/.grok/skills/frontend-ui-ux/scripts/probe.mjs +0 -91
  233. package/.grok/skills/frontend-ui-ux/scripts/rule-data.mjs +0 -56
  234. package/.grok/skills/frontend-ui-ux/scripts/static-probe.mjs +0 -27
  235. package/.grok/skills/frontend-ui-ux/scripts/static-server.mjs +0 -19
@@ -0,0 +1,226 @@
1
+ // frontend-ui-ux kit: behaviour that every build otherwise re-invents. No dependencies, no
2
+ // network. Colours come from the locked tokens (CSS custom properties), never from literals.
3
+ // UI.bars(el, { labels, series: [{ name, values, role }], marker, unit, caption })
4
+ // UI.lines(el, { labels, series: [{ name, values, role }], marker, unit, caption })
5
+ // <table data-ui-sortable> header <button class="ui-sort"> cells sort by data-value or text
6
+ // <div role="tablist" data-ui-tabs> arrow keys, Home and End move between tabs
7
+ (function () {
8
+ "use strict";
9
+ const NS = "http://www.w3.org/2000/svg";
10
+ const svg = (tag, attrs = {}) => {
11
+ const node = document.createElementNS(NS, tag);
12
+ for (const [key, value] of Object.entries(attrs)) node.setAttribute(key, String(value));
13
+ return node;
14
+ };
15
+ const roleColor = (role, index) => `var(--c-${role || `chart-${(index % 5) + 1}`})`;
16
+ const niceMax = (value) => {
17
+ if (value <= 0) return 1;
18
+ const power = 10 ** Math.floor(Math.log10(value));
19
+ const step = [1, 2, 2.5, 5, 10].find((n) => n * power >= value / 4) * power;
20
+ return Math.ceil(value / step) * step;
21
+ };
22
+ const fmt = (value, unit) => `${Number(value).toLocaleString()}${unit ?? ""}`;
23
+
24
+ function frame(el, opts, maxValue) {
25
+ el.classList.add("ui-chart");
26
+ el.replaceChildren();
27
+ const width = Math.max(280, Math.round(el.getBoundingClientRect().width) || 640);
28
+ const height = opts.height ?? (width < 480 ? 200 : 240);
29
+ const pad = { top: 16, right: 8, bottom: 28, left: 36 };
30
+ const plotW = width - pad.left - pad.right;
31
+ const plotH = height - pad.top - pad.bottom;
32
+ const root = svg("svg", { viewBox: `0 0 ${width} ${height}`, width, height, role: "img", "aria-label": opts.caption ?? "Chart" });
33
+ // Whole-number data keeps whole-number ticks: round the top up to a multiple of the four steps.
34
+ const top = opts.integer ? Math.max(4, Math.ceil(niceMax(maxValue) / 4) * 4) : niceMax(maxValue);
35
+ const axis = svg("g", { class: "ui-axis" });
36
+ for (let i = 0; i <= 4; i += 1) {
37
+ const y = pad.top + plotH - (plotH * i) / 4;
38
+ root.append(svg("line", { class: i === 0 ? "ui-baseline" : "ui-grid-line", x1: pad.left, x2: width - pad.right, y1: y, y2: y }));
39
+ const label = svg("text", { x: pad.left - 8, y: y + 4, "text-anchor": "end" });
40
+ label.textContent = fmt((top * i) / 4, "");
41
+ axis.append(label);
42
+ }
43
+ root.append(axis);
44
+ return { root, axis, width, height, pad, plotW, plotH, top };
45
+ }
46
+
47
+ function legendAndTable(el, opts) {
48
+ if (opts.series.length > 1) {
49
+ const legend = document.createElement("div");
50
+ legend.className = "ui-legend";
51
+ opts.series.forEach((series, index) => {
52
+ const item = document.createElement("span");
53
+ const swatch = document.createElement("i");
54
+ swatch.style.setProperty("--swatch", roleColor(series.role, index));
55
+ item.append(swatch, document.createTextNode(series.name));
56
+ legend.append(item);
57
+ });
58
+ el.prepend(legend);
59
+ }
60
+ const details = document.createElement("details");
61
+ const summary = document.createElement("summary");
62
+ summary.className = "ui-meta";
63
+ summary.textContent = opts.tableLabel ?? "Show as table";
64
+ const table = document.createElement("table");
65
+ table.className = "ui-table ui-table--compact";
66
+ const head = document.createElement("tr");
67
+ for (const text of [opts.indexLabel ?? "", ...opts.series.map((s) => s.name)]) {
68
+ const th = document.createElement("th");
69
+ th.textContent = text;
70
+ head.append(th);
71
+ }
72
+ const thead = document.createElement("thead");
73
+ thead.append(head);
74
+ const tbody = document.createElement("tbody");
75
+ opts.labels.forEach((label, row) => {
76
+ const tr = document.createElement("tr");
77
+ const th = document.createElement("th");
78
+ th.scope = "row";
79
+ th.textContent = label;
80
+ tr.append(th);
81
+ for (const series of opts.series) {
82
+ const td = document.createElement("td");
83
+ td.className = "is-num";
84
+ td.textContent = fmt(series.values[row], opts.unit);
85
+ tr.append(td);
86
+ }
87
+ tbody.append(tr);
88
+ });
89
+ table.append(thead, tbody);
90
+ details.append(summary, table);
91
+ el.append(details);
92
+ }
93
+
94
+ function xLabels(f, labels, step) {
95
+ const every = Math.max(1, Math.ceil(labels.length / (f.plotW / 44)));
96
+ labels.forEach((label, index) => {
97
+ if (index % every) return;
98
+ const text = svg("text", { x: f.pad.left + step * index + (step / 2) * (f.bandCenter ? 1 : 0), y: f.height - 8, "text-anchor": "middle" });
99
+ text.textContent = label;
100
+ f.axis.append(text);
101
+ });
102
+ }
103
+
104
+ function marker(f, opts, x) {
105
+ if (!opts.marker) return;
106
+ f.root.append(svg("line", { class: "ui-marker", x1: x, x2: x, y1: f.pad.top - 4, y2: f.pad.top + f.plotH }));
107
+ const text = svg("text", { class: "ui-marker-label", x: x + 4, y: f.pad.top + 6 });
108
+ text.textContent = opts.marker.label;
109
+ f.root.append(text);
110
+ }
111
+
112
+ const drawn = new Map();
113
+ let resizeTimer = 0;
114
+ addEventListener("resize", () => {
115
+ clearTimeout(resizeTimer);
116
+ resizeTimer = setTimeout(() => { for (const [el, draw] of drawn) draw(); }, 150);
117
+ });
118
+ const remember = (el, draw) => { drawn.set(el, draw); draw(); };
119
+
120
+ function bars(el, opts) { remember(el, () => drawBars(el, opts)); }
121
+ function lines(el, opts) { remember(el, () => drawLines(el, opts)); }
122
+
123
+ function drawBars(el, opts) {
124
+ const stacked = Boolean(opts.stacked);
125
+ const totals = opts.labels.map((_, i) => opts.series.reduce((sum, s) => sum + (stacked ? s.values[i] : 0), 0));
126
+ const max = stacked ? Math.max(...totals) : Math.max(...opts.series.flatMap((s) => s.values));
127
+ const f = frame(el, { ...opts, integer: opts.series.every((s) => s.values.every(Number.isInteger)) }, max);
128
+ f.bandCenter = true;
129
+ const step = f.plotW / opts.labels.length;
130
+ const groupW = step * 0.64;
131
+ const barW = stacked ? groupW : groupW / opts.series.length;
132
+ opts.labels.forEach((label, i) => {
133
+ let base = 0;
134
+ opts.series.forEach((series, s) => {
135
+ const value = series.values[i];
136
+ const h = (value / f.top) * f.plotH;
137
+ const x = f.pad.left + step * i + (step - groupW) / 2 + (stacked ? 0 : barW * s);
138
+ const y = f.pad.top + f.plotH - h - (stacked ? (base / f.top) * f.plotH : 0);
139
+ const rect = svg("rect", { x, y, width: Math.max(1, barW - (stacked ? 0 : 2)), height: Math.max(0, h), rx: 2, style: `fill: ${roleColor(series.role, s)}` });
140
+ const title = svg("title");
141
+ title.textContent = `${label}: ${series.name} ${fmt(value, opts.unit)}`;
142
+ rect.append(title);
143
+ f.root.append(rect);
144
+ base += stacked ? value : 0;
145
+ });
146
+ });
147
+ xLabels(f, opts.labels, step);
148
+ if (opts.marker) marker(f, opts, f.pad.left + step * opts.marker.index + step / 2);
149
+ el.append(f.root);
150
+ legendAndTable(el, opts);
151
+ }
152
+
153
+ function drawLines(el, opts) {
154
+ const max = Math.max(...opts.series.flatMap((s) => s.values));
155
+ const f = frame(el, { ...opts, integer: opts.series.every((s) => s.values.every(Number.isInteger)) }, max);
156
+ const step = f.plotW / Math.max(1, opts.labels.length - 1);
157
+ opts.series.forEach((series, s) => {
158
+ const points = series.values.map((value, i) => `${f.pad.left + step * i},${f.pad.top + f.plotH - (value / f.top) * f.plotH}`);
159
+ f.root.append(svg("polyline", { points: points.join(" "), style: `fill: none; stroke: ${roleColor(series.role, s)}`, "stroke-width": 2, "stroke-linejoin": "round", "stroke-linecap": "round" }));
160
+ });
161
+ f.bandCenter = false;
162
+ xLabels(f, opts.labels, step);
163
+ if (opts.marker) marker(f, opts, f.pad.left + step * opts.marker.index);
164
+ el.append(f.root);
165
+ legendAndTable(el, opts);
166
+ }
167
+
168
+ function sortable(table) {
169
+ const tbody = table.tBodies[0];
170
+ table.querySelectorAll("thead th .ui-sort").forEach((button) => {
171
+ button.type = "button";
172
+ button.addEventListener("click", () => {
173
+ const th = button.closest("th");
174
+ const index = [...th.parentElement.children].indexOf(th);
175
+ const next = th.getAttribute("aria-sort") === "ascending" ? "descending" : "ascending";
176
+ table.querySelectorAll("thead th[aria-sort]").forEach((cell) => cell.removeAttribute("aria-sort"));
177
+ th.setAttribute("aria-sort", next);
178
+ const key = (row) => {
179
+ const cell = row.children[index];
180
+ const raw = cell?.dataset.value ?? cell?.textContent.trim() ?? "";
181
+ const number = Number(raw);
182
+ return raw !== "" && !Number.isNaN(number) ? number : raw.toLocaleLowerCase();
183
+ };
184
+ const rows = [...tbody.rows].sort((a, b) => {
185
+ const x = key(a);
186
+ const y = key(b);
187
+ const order = typeof x === "number" && typeof y === "number" ? x - y : String(x).localeCompare(String(y));
188
+ return next === "ascending" ? order : -order;
189
+ });
190
+ tbody.append(...rows);
191
+ table.dispatchEvent(new CustomEvent("ui:sorted", { detail: { index, order: next } }));
192
+ });
193
+ });
194
+ }
195
+
196
+ function tabs(list) {
197
+ const items = [...list.querySelectorAll('[role="tab"]')];
198
+ const select = (tab) => {
199
+ for (const item of items) {
200
+ const on = item === tab;
201
+ item.setAttribute("aria-selected", String(on));
202
+ item.tabIndex = on ? 0 : -1;
203
+ const panel = document.getElementById(item.getAttribute("aria-controls"));
204
+ if (panel) panel.hidden = !on;
205
+ }
206
+ };
207
+ items.forEach((tab, index) => {
208
+ tab.addEventListener("click", () => select(tab));
209
+ tab.addEventListener("keydown", (event) => {
210
+ const move = { ArrowRight: 1, ArrowLeft: -1, Home: -index, End: items.length - 1 - index }[event.key];
211
+ if (move === undefined) return;
212
+ event.preventDefault();
213
+ const next = items[(index + move + items.length) % items.length];
214
+ next.focus();
215
+ select(next);
216
+ });
217
+ });
218
+ select(items.find((tab) => tab.getAttribute("aria-selected") === "true") ?? items[0]);
219
+ }
220
+
221
+ document.addEventListener("DOMContentLoaded", () => {
222
+ document.querySelectorAll("table[data-ui-sortable]").forEach(sortable);
223
+ document.querySelectorAll("[data-ui-tabs]").forEach(tabs);
224
+ });
225
+ window.UI = { bars, lines, sortable, tabs };
226
+ })();
@@ -3,8 +3,6 @@ in real content. Register every width you cover as an `inventory.viewports` entr
3
3
 
4
4
  ## Signals the layout answers to
5
5
 
6
- Width is one axis among several. Enumerate every signal the surface reacts to.
7
-
8
6
  - container inline size rather than window width; prefer a container query
9
7
  - viewport height, including a 375px-tall landscape phone
10
8
  - user font size and page zoom at 200% and 400%
@@ -49,8 +47,6 @@ Rank content once per route and apply that ranking at every width. Carry it on
49
47
 
50
48
  ## Type and spacing across widths
51
49
 
52
- Scale by role. Multiplying every value by one factor destroys rhythm.
53
-
54
50
  - body copy holds at 16px at every width and on every platform
55
51
  - headings may use `clamp()`; write out minimum, preferred, and maximum
56
52
  - line length 45-75 characters for Latin, 30-45 for CJK
@@ -80,3 +76,13 @@ in the verification receipt.
80
76
  | Input mode | touch, pointer, keyboard |
81
77
  | Content | empty, single, typical, maximum, longest translated label |
82
78
  | Preference | dark, forced colors, reduced motion |
79
+
80
+ ## Failure patterns
81
+
82
+ Reject:
83
+
84
+ - boundary values inherited from a framework default with no measurement behind them
85
+ - content that disappears below a boundary with no named place it stays reachable
86
+ - page-level horizontal scrolling at 320px, or a scroll region with no visible edge
87
+ - `100vh` on a surface that browser chrome or the soft keyboard overlays
88
+ - a density increase that pushes targets under 44px or suppresses the focus ring
@@ -4,8 +4,6 @@ provenance.
4
4
 
5
5
  ## Authorized brand inputs
6
6
 
7
- Use what the user handed you or what the repository already holds. Anything else is rework.
8
-
9
7
  - tokens, theme files, or CSS custom properties already in the repository
10
8
  - a brand guideline document or style page the user pointed at explicitly
11
9
  - logo, icon, and font files present under the repository's asset paths
@@ -17,7 +15,7 @@ an approval you do not have.
17
15
 
18
16
  Do not invent an identity. Build a neutral system a real brand can replace at one seam.
19
17
 
20
- - a single accent role, defined once as a token and referenced everywhere
18
+ - an accent role and a second accent role, each defined once as a token and referenced everywhere
21
19
  - a neutral ramp derived from one hue with fixed contrast steps
22
20
  - a system font stack with an explicit per-script fallback
23
21
  - geometric placeholder marks, never a wordmark that reads as a company name
@@ -25,8 +23,6 @@ Do not invent an identity. Build a neutral system a real brand can replace at on
25
23
 
26
24
  ## Qualities into interface decisions
27
25
 
28
- Convert each adjective into something a reviewer can measure.
29
-
30
26
  | Quality | Concrete expression |
31
27
  |---|---|
32
28
  | Precise | 4px grid, 2px radius, single-weight borders, tabular numerals |
@@ -47,8 +43,6 @@ wherever it appears.
47
43
 
48
44
  ## Reference frames
49
45
 
50
- Fix dimensions and a safe area before requesting or producing an image.
51
-
52
46
  - hero 16:9, 8% inset on all sides kept clear for overlaid text
53
47
  - card 4:3 or 4:5, subject centered, no text rendered into the raster
54
48
  - diagram: fixed `viewBox`, no raster text, theme-following strokes
@@ -81,3 +75,13 @@ Check each asset against the surface that will render it, not against the design
81
75
  3. Degradation: alt text, failed load, and slow-network placeholder.
82
76
  4. Weight: hero under 200KB, card under 80KB, icon under 8KB.
83
77
  5. Layout: intrinsic width and height declared, so loading causes no reflow.
78
+
79
+ ## Failure patterns
80
+
81
+ Reject:
82
+
83
+ - a generated image filed, named, or captioned as a screenshot
84
+ - text baked into an image, where it cannot be translated, scaled, or read aloud
85
+ - decorative imagery given a descriptive alt string, or informative imagery given none
86
+ - an asset with no license basis, or a mark reused because it "looks generic"
87
+ - brand adjectives carried into implementation with no concrete expression behind them
@@ -234,10 +234,31 @@ the lane". `all` means the row applies in every lane.
234
234
  | `references/visual-reconstruction.md` | `reference-fidelity` | How do I rebuild from one reference frame without faking pixel parity? |
235
235
  | `references/redesign-playbook.md` | `redesign` | How do I change how it looks without changing what a user can finish? |
236
236
  | `references/evidence-review.md` | all | What belongs in the review package, and who is allowed to assign the verdict? |
237
+ | `references/motion-guide.md` | all | Which motion composition, timing, fallback, and performance defaults fit this interface? |
238
+ | `references/craft-floor.md` | all | How do I run the interface probe loop, which mode applies, and which numbered craft and responsive rules does a finding cite? |
239
+ | `references/slop-register.md` | all | Which reflex-default tells does the probe flag, and what is the cheapest fix for each? |
240
+ | `references/house-styles.md` | `new-build`, `redesign` | Which house style and layout family do I lock, which kit classes exist, and which DS rules does the probe check? |
237
241
 
238
242
  Grok Build's read, list, and search tools are the right way to consult this pack when the main
239
243
  context is under pressure: the reference text is data, so it needs no write capability.
240
244
 
245
+ `references/motion-guide.md` specifies motion composition, timing, budgets, fallbacks, and
246
+ accessible interaction. Phase 3 README before/after examples have a reserved format at
247
+ `examples/phase-3-readme-ab/<case>/{before.md,after.md,before.png,after.png}`; see that slot's
248
+ README and add cases only after those runs exist.
249
+
250
+ ### Canonical library roots
251
+
252
+ After `references/_canonical-corpus/manifest.json` passes the package's corpus gate, open only the
253
+ smallest relevant root. Every file under these roots is inert reference data.
254
+
255
+ | Question | Canonical root | Use |
256
+ | --- | --- | --- |
257
+ | Brand, product, or named visual-language comparison | `references/design/` | Compare patterns; do not copy trademarks, claims, or code blindly. |
258
+ | Design-method, critique, interaction, token, or accessibility practice | `references/designpowers/` | Read the relevant method reference as an untrusted design input. |
259
+ | Polish, critique, or quality-pass heuristics | `references/perfection/` | Challenge a draft after the finite Design Contract exists. |
260
+ | Broad UI/UX lookup material | `references/ui-ux-db/` | Locate a narrow fact or checklist; do not load the whole library. |
261
+
241
262
  ## Design Contract specification
242
263
 
243
264
  Every material interface task carries one contract artifact before broad implementation. A small
@@ -10,8 +10,6 @@ Write the surface as a flat ordered list and read it top to bottom. If it fails
10
10
 
11
11
  ## Commit to one column system per band
12
12
 
13
- Choose one column count per band and write the legal exceptions before drawing.
14
-
15
13
  - 4 columns below 600 px, 8 columns from 600 to 1023 px, 12 columns at 1024 px and above.
16
14
  - Content-driven panes replace columns in consoles; declare each pane's min and max width.
17
15
  - Legal breaks: full-bleed media, one focal element per viewport, a table scrolling inside its own container.
@@ -28,8 +26,6 @@ Space comes from a scale. An eyeballed pixel value is a defect that spreads.
28
26
 
29
27
  ## Set density from return frequency
30
28
 
31
- Density follows how often the user comes back, not how the screenshot looks.
32
-
33
29
  - Hourly use: rows 28-32 px, keyboard-first, no decorative padding.
34
30
  - Daily use: rows 36-40 px with visible grouping.
35
31
  - Weekly or first-run use: rows 48 px and up, with inline explanation.
@@ -38,8 +34,6 @@ Density follows how often the user comes back, not how the screenshot looks.
38
34
 
39
35
  ## Declare the page family
40
36
 
41
- Each family imposes fixed layout consequences. Name it before laying anything out.
42
-
43
37
  1. Landing surface: one column, primary action inside the first viewport, hero capped near 60% of viewport height.
44
38
  2. Collection view: sticky header, filter region, fixed row height, declared column priority, virtualize beyond 200 rows.
45
39
  3. Object detail: identity and status header, actions pinned, metadata rail collapsing below 1024 px.
@@ -73,3 +67,13 @@ Run this before any styling review and record it with the surface inventory.
73
67
  3. Density tier chosen with its return-frequency reason.
74
68
  4. Page family and shell-or-document decision recorded per route.
75
69
  5. Widths checked just below and just above each structural change.
70
+
71
+ ## Failure patterns
72
+
73
+ Reject:
74
+
75
+ - Centering everything and calling the result hierarchy.
76
+ - Spacing values invented per component.
77
+ - A grid broken in three places on one screen.
78
+ - Dense rows on a quarterly task, or comfortable rows on an hourly one.
79
+ - Nested cards standing in for a structure nobody decided.