visualproof 0.0.0-stage → 0.2.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 (146) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +99 -2
  3. package/dist/assets/fonts/JuliaMono-Regular.ttf +0 -0
  4. package/dist/assets/fonts/JuliaMono-RegularItalic.ttf +0 -0
  5. package/dist/assets/fonts/JuliaMono-SemiBold.ttf +0 -0
  6. package/dist/assets/fonts/LICENSE-JuliaMono.txt +93 -0
  7. package/dist/assets/latex/visualproof.sty +308 -0
  8. package/dist/assets/webfonts/LICENSE-Jost.txt +93 -0
  9. package/dist/assets/webfonts/LICENSE-SourceSans3.txt +93 -0
  10. package/dist/assets/webfonts/LICENSE-SourceSerif4.txt +93 -0
  11. package/dist/assets/webfonts/jost-latin-ext-wght-normal.woff2 +0 -0
  12. package/dist/assets/webfonts/jost-latin-wght-normal.woff2 +0 -0
  13. package/dist/assets/webfonts/source-sans-3-greek-wght-italic.woff2 +0 -0
  14. package/dist/assets/webfonts/source-sans-3-greek-wght-normal.woff2 +0 -0
  15. package/dist/assets/webfonts/source-sans-3-latin-ext-wght-italic.woff2 +0 -0
  16. package/dist/assets/webfonts/source-sans-3-latin-ext-wght-normal.woff2 +0 -0
  17. package/dist/assets/webfonts/source-sans-3-latin-wght-italic.woff2 +0 -0
  18. package/dist/assets/webfonts/source-sans-3-latin-wght-normal.woff2 +0 -0
  19. package/dist/assets/webfonts/source-serif-4-greek-wght-italic.woff2 +0 -0
  20. package/dist/assets/webfonts/source-serif-4-greek-wght-normal.woff2 +0 -0
  21. package/dist/assets/webfonts/source-serif-4-latin-ext-wght-italic.woff2 +0 -0
  22. package/dist/assets/webfonts/source-serif-4-latin-ext-wght-normal.woff2 +0 -0
  23. package/dist/assets/webfonts/source-serif-4-latin-wght-italic.woff2 +0 -0
  24. package/dist/assets/webfonts/source-serif-4-latin-wght-normal.woff2 +0 -0
  25. package/dist/extractor/Extract.lean +1180 -0
  26. package/dist/extractor/Usage.lean +900 -0
  27. package/dist/mcp/visualproof-mcp.mjs +476 -0
  28. package/dist/server/access.js +95 -0
  29. package/dist/server/agent.js +3270 -0
  30. package/dist/server/agentdocs.js +35 -0
  31. package/dist/server/agentlibrary.js +202 -0
  32. package/dist/server/agentnotes.js +701 -0
  33. package/dist/server/agentviews.js +703 -0
  34. package/dist/server/askfollow.js +286 -0
  35. package/dist/server/boardspots.js +159 -0
  36. package/dist/server/dirs.js +175 -0
  37. package/dist/server/doctor.js +186 -0
  38. package/dist/server/events.js +198 -0
  39. package/dist/server/export.js +420 -0
  40. package/dist/server/extract.js +204 -0
  41. package/dist/server/fetchurl.js +321 -0
  42. package/dist/server/figures.js +158 -0
  43. package/dist/server/history.js +780 -0
  44. package/dist/server/historyapi.js +304 -0
  45. package/dist/server/hover.js +595 -0
  46. package/dist/server/identity.js +114 -0
  47. package/dist/server/invites.js +241 -0
  48. package/dist/server/layoutthread.js +51 -0
  49. package/dist/server/library.js +600 -0
  50. package/dist/server/libraryroute.js +211 -0
  51. package/dist/server/live.js +1101 -0
  52. package/dist/server/lostfound.js +199 -0
  53. package/dist/server/main.js +1406 -0
  54. package/dist/server/mcptools.js +496 -0
  55. package/dist/server/pastdoc.js +73 -0
  56. package/dist/server/pipeline.js +159 -0
  57. package/dist/server/poppler.js +251 -0
  58. package/dist/server/presence.js +252 -0
  59. package/dist/server/project.js +222 -0
  60. package/dist/server/prompt.js +53 -0
  61. package/dist/server/readonly.js +152 -0
  62. package/dist/server/readonlygate.js +123 -0
  63. package/dist/server/renames.js +268 -0
  64. package/dist/server/review.js +334 -0
  65. package/dist/server/reviewapi.js +188 -0
  66. package/dist/server/snapshot.js +50 -0
  67. package/dist/server/sourcestore.js +473 -0
  68. package/dist/server/status.js +360 -0
  69. package/dist/server/talk.js +476 -0
  70. package/dist/server/tokens.js +221 -0
  71. package/dist/server/usage.js +501 -0
  72. package/dist/server/versions.js +82 -0
  73. package/dist/server/view.js +164 -0
  74. package/dist/server/views.js +1167 -0
  75. package/dist/shared/askfollow.js +46 -0
  76. package/dist/shared/board.js +332 -0
  77. package/dist/shared/build.js +2 -0
  78. package/dist/shared/collab.js +241 -0
  79. package/dist/shared/comment.js +285 -0
  80. package/dist/shared/context.js +157 -0
  81. package/dist/shared/doc/authors.js +98 -0
  82. package/dist/shared/doc/build.js +358 -0
  83. package/dist/shared/doc/latex.js +455 -0
  84. package/dist/shared/doc/markdown.js +159 -0
  85. package/dist/shared/doc/model.js +37 -0
  86. package/dist/shared/doc/order.js +124 -0
  87. package/dist/shared/doc/outline.js +45 -0
  88. package/dist/shared/doc/proof.js +272 -0
  89. package/dist/shared/doc/sections.js +93 -0
  90. package/dist/shared/doc/settings.js +75 -0
  91. package/dist/shared/edgecodec.js +102 -0
  92. package/dist/shared/editor.js +64 -0
  93. package/dist/shared/excerpt.js +87 -0
  94. package/dist/shared/graph.js +16 -0
  95. package/dist/shared/items.js +92 -0
  96. package/dist/shared/keys.js +203 -0
  97. package/dist/shared/layout.js +926 -0
  98. package/dist/shared/lexer.js +130 -0
  99. package/dist/shared/library.js +711 -0
  100. package/dist/shared/lostfound.js +150 -0
  101. package/dist/shared/moves.js +244 -0
  102. package/dist/shared/notecard.js +295 -0
  103. package/dist/shared/noteplace.js +505 -0
  104. package/dist/shared/palette.js +46 -0
  105. package/dist/shared/pastgraph.js +103 -0
  106. package/dist/shared/places.js +80 -0
  107. package/dist/shared/projectnotes.js +244 -0
  108. package/dist/shared/query.js +818 -0
  109. package/dist/shared/review.js +642 -0
  110. package/dist/shared/reviewqueue.js +333 -0
  111. package/dist/shared/ring.js +366 -0
  112. package/dist/shared/scope.js +255 -0
  113. package/dist/shared/scopeedit.js +81 -0
  114. package/dist/shared/search.js +191 -0
  115. package/dist/shared/separate.js +178 -0
  116. package/dist/shared/sharesnap.js +281 -0
  117. package/dist/shared/sticky.js +501 -0
  118. package/dist/shared/timeline.js +73 -0
  119. package/dist/shared/titles.js +300 -0
  120. package/dist/shared/viewgraph.js +157 -0
  121. package/dist/shared/views.js +859 -0
  122. package/dist/web/bundle/app.js +52671 -0
  123. package/dist/web/bundle/edges.js +407 -0
  124. package/dist/web/bundle/layout.js +1010 -0
  125. package/dist/web/bundle/pdfworker.js +48322 -0
  126. package/dist/web/index.html +257 -0
  127. package/dist/web/src/motion.js +430 -0
  128. package/dist/web/src/past.js +224 -0
  129. package/dist/web/src/scene.js +804 -0
  130. package/dist/web/style.css +2548 -0
  131. package/docs/agent-api/README.md +91 -0
  132. package/docs/agent-api/advice.md +108 -0
  133. package/docs/agent-api/export.md +120 -0
  134. package/docs/agent-api/following.md +140 -0
  135. package/docs/agent-api/history.md +142 -0
  136. package/docs/agent-api/library.md +65 -0
  137. package/docs/agent-api/mcp.md +104 -0
  138. package/docs/agent-api/notes.md +93 -0
  139. package/docs/agent-api/reading.md +166 -0
  140. package/docs/agent-api/requests.md +94 -0
  141. package/docs/agent-api/talking.md +100 -0
  142. package/docs/agent-api/tcb.md +135 -0
  143. package/docs/agent-api/views.md +125 -0
  144. package/docs/agent-api/words.md +56 -0
  145. package/package.json +39 -4
  146. package/test/toolchains.json +5 -0
@@ -0,0 +1,257 @@
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, viewport-fit=cover">
6
+ <title>VisualProof</title>
7
+ <link rel="icon" href="data:,">
8
+ <script>
9
+ // the theme before the first paint (web/src/theme.ts keeps it after): light unless the reader
10
+ // chose dark, or the system's
11
+ try {
12
+ var t = localStorage.getItem("visualproof:theme");
13
+ document.documentElement.dataset.theme = t === "dark" ? "dark" : t === "system" && matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
14
+ } catch (e) {
15
+ document.documentElement.dataset.theme = "light";
16
+ }
17
+ </script>
18
+ <link rel="stylesheet" href="/style.css">
19
+ </head>
20
+ <body data-mode="tcb">
21
+ <!-- an artwork style's ground, under the board within the frame (web/src/artframe.ts) -->
22
+ <canvas id="art-sky" hidden></canvas>
23
+ <canvas id="canvas"></canvas>
24
+ <canvas id="labels"></canvas>
25
+ <div id="cards"></div>
26
+ <!-- the notes on the board, over the canvas at a fixed size (web/src/sticky.ts) -->
27
+ <div id="stickies"></div>
28
+ <!-- the linear form: the board drawn as its document's outline (web/src/linear.ts, ExportSpec
29
+ decision 18) -->
30
+ <canvas id="linear" hidden></canvas>
31
+ <!-- the artwork mode: the frame over the board and the shade around it, and its panel
32
+ (web/src/artframe.ts, ExportSpec decision 19) -->
33
+ <div id="art" hidden></div>
34
+ <div id="art-panel" class="modal-box glass" hidden></div>
35
+
36
+ <header id="bar" class="glass">
37
+ <div class="brand"><span class="nav"><button id="nav-back" title="Back (Alt ←)" aria-label="Back" disabled><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path d="M10 3.5 5.5 8l4.5 4.5"/></svg></button><button id="nav-fwd" title="Forward (Alt →)" aria-label="Forward" disabled><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path d="M6 3.5 10.5 8 6 12.5"/></svg></button></span><span class="logo">VisualProof</span><span id="project" class="project"></span><span id="snapshot" class="snapshot" hidden></span><button id="build" class="build-pill" hidden title="Build status (b)"><span class="b-dot"></span><span class="b-text"></span></button></div>
38
+ <div class="right">
39
+ <div class="search-wrap">
40
+ <input id="search" type="search" placeholder="Search /" title="Search names, statements and docstrings (/)" autocomplete="off" spellcheck="false">
41
+ <div id="results" class="glass" hidden></div>
42
+ </div>
43
+ <div class="share-wrap">
44
+ <button id="share-btn" class="act-btn" title="Share: a link to this view for guests, a read-only link, a personal link inviting someone by name, or a prompt for an AI agent with a token of its own">
45
+ <svg viewBox="0 0 16 16" width="15" height="15" aria-hidden="true"><path d="M6.5 9.5l3-3M7 4.5l1.2-1.2a2.6 2.6 0 0 1 3.7 3.7L10.7 8.2M9 11.5l-1.2 1.2a2.6 2.6 0 0 1-3.7-3.7L5.3 7.8"/></svg>
46
+ <span>Share</span>
47
+ </button>
48
+ <div id="share-pop" class="glass" role="dialog" aria-label="Share this view" hidden></div>
49
+ </div>
50
+ <!-- the library of papers and images (AttachmentSpec.md, web/src/library.ts) -->
51
+ <div class="library-wrap">
52
+ <button id="library-btn" class="act-btn" aria-haspopup="dialog" aria-expanded="false" title="Library: the references — papers and images — that explain the code, linked to declarations and clusters">
53
+ <svg viewBox="0 0 16 16" width="15" height="15" aria-hidden="true"><path d="M3 2.8h3.2v10.4H3zM7.4 2.8h3v10.4h-3zM11 3.4l2.4-.6 1.5 10-2.4.6z"/></svg>
54
+ <span>Library</span>
55
+ </button>
56
+ <div id="library-pop" class="glass" role="dialog" aria-label="The library" hidden></div>
57
+ </div>
58
+ <!-- a document of targets, typeset with LaTeX (web/src/exportmodal.ts) -->
59
+ <button id="export-btn" class="act-btn" title="Export: this view as a document, typeset with LaTeX; or the board as a picture (Artwork)">
60
+ <svg viewBox="0 0 16 16" width="15" height="15" aria-hidden="true"><path d="M8 2.5v7.5M5 7l3 3 3-3M3 11.5v1.8h10v-1.8"/></svg>
61
+ <span>Export</span>
62
+ </button>
63
+ <button id="activity-btn" class="act-btn act-icon" title="Activity: what happened on this server" aria-label="Activity">
64
+ <svg viewBox="0 0 16 16" width="15" height="15" aria-hidden="true"><path d="M2 8h2.5l1.5-4 3 8 1.5-4H14"/></svg>
65
+ <span id="activity-badge" class="act-badge" hidden></span>
66
+ </button>
67
+ <!-- the others' initials: a person's opens their menu, to follow them or ask them to follow
68
+ you; under them, what your request to follow came to (web/src/peermenu.ts,
69
+ web/src/askfollow.ts) -->
70
+ <div class="peers-wrap">
71
+ <div id="peers" class="peers" hidden></div>
72
+ <div id="peer-menu" class="glass" role="menu" aria-label="Follow, or ask to follow you" hidden></div>
73
+ <div id="ask-line" class="ask-line glass" role="status" aria-live="polite" hidden></div>
74
+ </div>
75
+ <!-- the reader's name, and the menu under it: the name, and visibility (web/src/whomenu.ts) -->
76
+ <div class="who-wrap">
77
+ <button id="who" class="who" hidden></button>
78
+ <div id="who-menu" class="glass" role="menu" aria-label="Your name and visibility" hidden></div>
79
+ </div>
80
+ <button id="help-btn" class="help-btn" title="Keys and gestures, and the tour (?)" aria-label="Help">?</button>
81
+ <!-- on a phone the bar's buttons are in one menu (web/src/phone.ts) -->
82
+ <div class="more-wrap">
83
+ <button id="more-btn" class="act-btn act-icon" aria-label="More" aria-haspopup="menu" aria-expanded="false" title="Share, the library, export, activity, your name, help"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><circle cx="3.5" cy="8" r="1.3"/><circle cx="8" cy="8" r="1.3"/><circle cx="12.5" cy="8" r="1.3"/></svg><span id="more-badge" class="act-badge" hidden></span></button>
84
+ <div id="more-pop" class="glass" role="menu" aria-label="More" hidden></div>
85
+ </div>
86
+ </div>
87
+ <div id="progress"><div></div></div>
88
+ </header>
89
+ <!-- the top: your tabs (the views you have open) and your mode, how a click selects — yours alone -->
90
+ <div id="viewbar">
91
+ <!-- on a phone, the side panel opens as a drawer from here (web/src/phone.ts) -->
92
+ <button id="side-btn" class="views-btn side-btn" aria-label="The board: targets and clusters" aria-expanded="false" title="The board: targets and clusters"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path d="M2.5 4h11M2.5 8h11M2.5 12h11"/></svg></button>
93
+ <div id="tabs" class="tabs" role="tablist" aria-label="Your views"></div>
94
+ <div class="views-wrap">
95
+ <button id="views-btn" class="views-btn" aria-haspopup="menu" title="Views: a new one, a copy of this one, its name; every view kept on this server">Views<svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true"><path d="M4 6l4 4 4-4"/></svg></button>
96
+ <div id="views-menu" class="glass" role="menu" hidden></div>
97
+ </div>
98
+ <!-- the Time Machine's bar, in the tabs' place while it is open (web/src/timemachine.ts) -->
99
+ <div id="tmbar" class="glass" role="toolbar" aria-label="Time Machine" hidden></div>
100
+ <!-- the review's focus on this view (ViewSpec decision 28): the view's, or the reader's own
101
+ (web/src/focus.ts); it shows in the Time Machine too, where the review is refused -->
102
+ <div class="focus-wrap">
103
+ <button id="focus-btn" class="views-btn focus-btn" aria-haspopup="menu" aria-expanded="false"></button>
104
+ <div id="focus-menu" class="glass" role="menu" aria-label="The review's focus" hidden></div>
105
+ </div>
106
+ <span class="vb-gap"></span>
107
+ <span class="light-l">Mode</span>
108
+ <!-- what each mode does shows while the pointer is on its button (#mode-tip, web/src/main.ts);
109
+ Rests on's steps show beside it while it is the mode (ViewSpec decision 20) -->
110
+ <nav id="lightup" class="seg" aria-label="Mode: how a click selects">
111
+ <button data-mode="plain" aria-describedby="mode-tip">Selection</button>
112
+ <span id="rests" class="rests">
113
+ <button id="rests-btn" aria-describedby="mode-tip">Rests on</button>
114
+ <span id="rests-steps" class="steps" role="group" aria-label="Rests on: how much of it" hidden>
115
+ <button data-mode="deps" aria-describedby="mode-tip">Uses</button>
116
+ <button data-mode="tcb" aria-describedby="mode-tip">TCB</button>
117
+ <button data-mode="keys" aria-describedby="mode-tip">Keys</button>
118
+ <button data-mode="refs" aria-describedby="mode-tip">Direct</button>
119
+ </span>
120
+ </span>
121
+ <button data-mode="apps" aria-describedby="mode-tip">Used by</button>
122
+ </nav>
123
+ </div>
124
+ <!-- what you selected, under the modes and over the panel: one chip per click (web/src/selbar.ts) -->
125
+ <div id="selbar" class="glass" role="group" aria-label="Your selection" hidden></div>
126
+ <div id="build-pop" class="glass" hidden></div>
127
+ <!-- what changed since the build the Time Machine shows, as its counts open it; and the note of a
128
+ view kept at a past build -->
129
+ <div id="tm-list" class="glass" role="dialog" aria-label="What changed since" hidden></div>
130
+ <div id="tm-kept" class="glass" hidden></div>
131
+ <div id="trust-pop" class="glass" role="dialog" aria-label="Trust without review" hidden></div>
132
+ <div id="hint" class="hint" hidden></div>
133
+ <div id="mode-tip" class="mode-tip glass" role="tooltip" hidden></div>
134
+ <!-- the review strip, wherever the review has a focus: one line of progress -->
135
+ <div id="lensbar" class="glass" hidden>
136
+ <span id="lens-title"></span>
137
+ <span id="lens-meta"></span>
138
+ </div>
139
+
140
+ <!-- the left: the targets, and the board's cluster tree; the board's settings and what is trusted
141
+ open from the two buttons over the tree (web/src/popover.ts, besideSide; web/src/main.ts) -->
142
+ <aside id="side" class="glass" aria-label="The board">
143
+ <div id="targets"></div>
144
+ <div class="side-tools">
145
+ <span id="side-what" class="side-what"></span>
146
+ <button id="board-btn" class="sbtn side-tool" aria-haspopup="dialog" aria-expanded="false" title="This board, shared with everyone on it: what is on it, its clustering, depth and layout">⚙ Board</button>
147
+ <button id="trusted-btn" class="sbtn side-tool" aria-haspopup="dialog" aria-expanded="false" title="What is trusted without review: not counted, in need of no opinion"></button>
148
+ </div>
149
+ <div id="board-note" class="board-note" hidden></div>
150
+ <div id="outline"></div>
151
+ </aside>
152
+ <!-- the board's settings, shared with everyone on it: its scope, clustering, depth, Re-layout -->
153
+ <div id="board-pop" class="glass side-pop" role="dialog" aria-label="The board" hidden>
154
+ <div id="board"></div>
155
+ <div class="ctl">
156
+ <span class="ctl-l">Clusters</span>
157
+ <div class="ctl-r">
158
+ <nav class="seg mini" aria-label="Clusters">
159
+ <button data-cluster="namespace" title="Cluster this board by namespace, for everyone on it">Namespace</button>
160
+ <button data-cluster="module" title="Cluster this board by file, for everyone on it">File</button>
161
+ </nav>
162
+ </div>
163
+ <span class="ctl-l">Depth</span>
164
+ <div class="ctl-r">
165
+ <span class="stepper">
166
+ <button id="fold-less" title="One level less: fold the deepest level you can see, for everyone on this board ([)" aria-label="Fold one level">−</button>
167
+ <span id="fold-level"></span>
168
+ <button id="fold-more" title="One level more, for everyone on this board (])" aria-label="Open one level">+</button>
169
+ </span>
170
+ </div>
171
+ <span class="ctl-l">Layout</span>
172
+ <div class="ctl-r">
173
+ <button id="relayout" class="sbtn" title="Lay this board out afresh: its pins are dropped, for everyone on it">Re-layout</button>
174
+ </div>
175
+ <span class="ctl-l">Levels</span>
176
+ <div class="ctl-r" id="hidden-levels"></div>
177
+ </div>
178
+ <div id="hidden-list" class="hl-list" hidden></div>
179
+ </div>
180
+ <!-- what is trusted without review: the review's, the same on every board -->
181
+ <div id="trust-list" class="glass side-pop" role="dialog" aria-label="Trusted without review" hidden></div>
182
+
183
+ <aside id="panel" class="glass"></aside>
184
+ <aside id="activity" class="glass" aria-label="Activity"></aside>
185
+ <!-- what was said of declarations the graph no longer has, and the migrations: in Activity's place,
186
+ opened from the build-status popover (web/src/lostfound.ts) -->
187
+ <aside id="lostfound" class="glass" aria-label="Lost-and-found"></aside>
188
+
189
+ <!-- the bottom right: your eyes — zoom and fit, and behind ⋯ the lock, the edges drawn and the
190
+ theme; yours alone -->
191
+ <div id="zoom" class="glass" role="group" aria-label="Your eyes">
192
+ <button id="zoom-in" title="Zoom in (+)" aria-label="Zoom in"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path d="M8 3.5v9M3.5 8h9"/></svg></button>
193
+ <button id="zoom-out" title="Zoom out (−)" aria-label="Zoom out"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path d="M3.5 8h9"/></svg></button>
194
+ <button id="zoom-fit" title="Fit to screen (f)" aria-label="Fit to screen"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path d="M3 6V3h3M10 3h3v3M13 10v3h-3M6 13H3v-3"/></svg></button>
195
+ <span class="zoom-sep"></span>
196
+ <button id="eyes-btn" title="The lock, the edges drawn, the theme" aria-label="More: lock, edges, theme" aria-haspopup="dialog" aria-expanded="false"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><circle cx="3.5" cy="8" r="1.2"/><circle cx="8" cy="8" r="1.2"/><circle cx="12.5" cy="8" r="1.2"/></svg></button>
197
+ <div id="eyes-pop" class="glass" role="dialog" aria-label="How you see the board" hidden>
198
+ <button id="lock-btn" class="eye" title="The lock, on by default: a drag pans the view, never a declaration, a circle or a note; clicks still select. Let it go and a drag moves them, for everyone on this board (l). Hold Ctrl (⌘ on a Mac) for the other way while held." aria-pressed="true"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path class="lk-body" d="M4 7.5h8v5.5H4z"/><path class="lk-shackle" d="M5.6 7.5V5.4a2.4 2.4 0 0 1 4.8 0v2.1"/></svg><span class="eye-l">Layout locked</span><kbd>l</kbd></button>
199
+ <button id="edges-btn" class="eye" title="Edges: the bundled overview of the dependencies, faint under a selection, whose own edges always show (g)" aria-pressed="true"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path d="M3.5 12.5C7 12.5 9 3.5 12.5 3.5"/><circle cx="3.5" cy="12.5" r="1.4"/><circle cx="12.5" cy="3.5" r="1.4"/></svg><span class="eye-l">Edges</span><kbd>g</kbd></button>
200
+ <button id="linear-btn" class="eye" title="Linear form: the board drawn as its document's outline, on one line, the first at the top; drag along it to reorder the document (o)" aria-pressed="false"><svg viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"><path d="M8 2v12"/><circle cx="8" cy="4" r="1.4"/><circle cx="8" cy="8" r="1.4"/><circle cx="8" cy="12" r="1.4"/><path d="M10.5 4h3M10.5 8h3M10.5 12h3"/></svg><span class="eye-l">Linear form</span><kbd>o</kbd></button>
201
+ <div class="eye-theme"><span class="eye-l">Theme</span><div id="theme-seg" class="seg mini" role="radiogroup" aria-label="Theme"></div></div>
202
+ </div>
203
+ </div>
204
+ <!-- the legend: the colour scheme (Kind or Status, the reader's own) and what its colours mean on
205
+ this board, folded to a chip (web/src/legend.ts) -->
206
+ <footer id="foot">
207
+ <div id="legend"></div>
208
+ </footer>
209
+
210
+ <div id="notes"></div>
211
+ <!-- the canvas's menu: a right click, the ContextMenu key or Shift+F10 (web/src/ctxmenu.ts) -->
212
+ <div id="ctxmenu" role="menu" aria-label="Actions" tabindex="-1" hidden></div>
213
+ <!-- the floating windows, the one pressed or focused last in front (web/src/floatwin.ts): the
214
+ source windows (web/src/sourcewin.ts adds each) and the following strip -->
215
+ <div id="windows">
216
+ <!-- following someone: the strip; following an agent that can be talked to, a window with the
217
+ strip as its title bar, the conversation, and the pill it collapses to (web/src/people.ts,
218
+ web/src/talk.ts, web/src/chatwin.ts, which adds the edges that resize it) -->
219
+ <div id="following" class="glass" hidden>
220
+ <div class="fl-strip"></div><div id="talk" hidden></div>
221
+ <div class="fl-pill"><button class="fl-pill-open" type="button"><span class="fl-pill-text"></span><span class="fl-new" title="A new reply"></span></button><button data-unfollow type="button" title="Stop following" aria-label="Stop following">✕</button></div>
222
+ </div>
223
+ </div>
224
+ <!-- someone asks you to follow them (CollabSpec decision 10, web/src/askfollow.ts): at the top
225
+ centre, never taking the focus -->
226
+ <div id="ask-banner" role="status" aria-live="polite" hidden></div>
227
+ <div id="tour" hidden>
228
+ <div class="tour-shade"></div><div class="tour-shade"></div><div class="tour-shade"></div><div class="tour-shade"></div>
229
+ <div class="tour-spot"></div><div class="tour-card glass" role="dialog" aria-live="polite"></div>
230
+ </div>
231
+ <div id="help" hidden></div>
232
+ <div id="modal" hidden>
233
+ <form id="who-form" class="modal-box glass" autocomplete="off">
234
+ <div class="modal-title" id="who-title">Who is reviewing?</div>
235
+ <div class="modal-text" id="who-text">Your name is recorded with every opinion you give, so that others can see who said what. You can change it at any time.</div>
236
+ <input id="who-input" maxlength="60" placeholder="Your name" spellcheck="false">
237
+ <div id="who-err" class="modal-err" hidden></div>
238
+ <div class="modal-actions">
239
+ <button type="button" id="who-cancel" class="rv-btn">Cancel</button>
240
+ <button type="submit" id="who-ok" class="rv-btn primary">Continue</button>
241
+ </div>
242
+ </form>
243
+ </div>
244
+ <div id="export-modal" hidden></div>
245
+ <div id="tip" class="tip" hidden></div>
246
+ <div id="meter" class="meter" hidden></div>
247
+
248
+ <div id="loader">
249
+ <div class="loader-box">
250
+ <div class="logo big">VisualProof</div>
251
+ <div id="loader-title">Reading the project…</div>
252
+ <pre id="loader-log"></pre>
253
+ </div>
254
+ </div>
255
+ <script type="module" src="/app.js"></script>
256
+ </body>
257
+ </html>