@graview/core 0.1.29 → 0.1.32

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 (404) hide show
  1. package/README.md +11 -1
  2. package/dist/app-places.d.ts +2 -2
  3. package/dist/app-places.d.ts.map +1 -1
  4. package/dist/app-places.js +53 -3
  5. package/dist/app-places.js.map +1 -1
  6. package/dist/app.d.ts +24 -0
  7. package/dist/app.d.ts.map +1 -1
  8. package/dist/app.js.map +1 -1
  9. package/dist/arrange.d.ts +3 -1
  10. package/dist/arrange.d.ts.map +1 -1
  11. package/dist/arrange.js +3 -1
  12. package/dist/arrange.js.map +1 -1
  13. package/dist/arrangement.d.ts +18 -0
  14. package/dist/arrangement.d.ts.map +1 -1
  15. package/dist/arrangement.js +34 -0
  16. package/dist/arrangement.js.map +1 -1
  17. package/dist/arranging.d.ts.map +1 -1
  18. package/dist/arranging.js +17 -6
  19. package/dist/arranging.js.map +1 -1
  20. package/dist/blocks.d.ts +1 -1
  21. package/dist/blocks.d.ts.map +1 -1
  22. package/dist/catalog.d.ts +312 -0
  23. package/dist/catalog.d.ts.map +1 -0
  24. package/dist/catalog.js +459 -0
  25. package/dist/catalog.js.map +1 -0
  26. package/dist/cli/check/brand.d.ts.map +1 -1
  27. package/dist/cli/check/brand.js +29 -1
  28. package/dist/cli/check/brand.js.map +1 -1
  29. package/dist/cli/check/lenses.d.ts.map +1 -1
  30. package/dist/cli/check/lenses.js +6 -1
  31. package/dist/cli/check/lenses.js.map +1 -1
  32. package/dist/cli/check/relations.d.ts +23 -0
  33. package/dist/cli/check/relations.d.ts.map +1 -1
  34. package/dist/cli/check/relations.js +53 -3
  35. package/dist/cli/check/relations.js.map +1 -1
  36. package/dist/cli/create.d.ts.map +1 -1
  37. package/dist/cli/create.js +32 -0
  38. package/dist/cli/create.js.map +1 -1
  39. package/dist/cli/describe.d.ts.map +1 -1
  40. package/dist/cli/describe.js +27 -4
  41. package/dist/cli/describe.js.map +1 -1
  42. package/dist/cli/doctor.d.ts +18 -1
  43. package/dist/cli/doctor.d.ts.map +1 -1
  44. package/dist/cli/doctor.js +58 -5
  45. package/dist/cli/doctor.js.map +1 -1
  46. package/dist/cli/document-schema.d.ts +2 -0
  47. package/dist/cli/document-schema.d.ts.map +1 -1
  48. package/dist/cli/document-schema.js +163 -5
  49. package/dist/cli/document-schema.js.map +1 -1
  50. package/dist/cli/index.d.ts +1 -1
  51. package/dist/cli/index.d.ts.map +1 -1
  52. package/dist/cli/types.d.ts.map +1 -1
  53. package/dist/cli/types.js +6 -1
  54. package/dist/cli/types.js.map +1 -1
  55. package/dist/conformance/fixtures.d.ts.map +1 -1
  56. package/dist/conformance/fixtures.js +165 -0
  57. package/dist/conformance/fixtures.js.map +1 -1
  58. package/dist/coverage-words.d.ts +18 -0
  59. package/dist/coverage-words.d.ts.map +1 -0
  60. package/dist/coverage-words.js +18 -0
  61. package/dist/coverage-words.js.map +1 -0
  62. package/dist/days.d.ts +7 -1
  63. package/dist/days.d.ts.map +1 -1
  64. package/dist/days.js +10 -4
  65. package/dist/days.js.map +1 -1
  66. package/dist/document/act-findings.d.ts.map +1 -1
  67. package/dist/document/act-findings.js +21 -3
  68. package/dist/document/act-findings.js.map +1 -1
  69. package/dist/document/blocks.d.ts +20 -7
  70. package/dist/document/blocks.d.ts.map +1 -1
  71. package/dist/document/blocks.js +85 -15
  72. package/dist/document/blocks.js.map +1 -1
  73. package/dist/document/brand-check.d.ts +5 -0
  74. package/dist/document/brand-check.d.ts.map +1 -1
  75. package/dist/document/brand-check.js +16 -2
  76. package/dist/document/brand-check.js.map +1 -1
  77. package/dist/document/compile-checked.d.ts.map +1 -1
  78. package/dist/document/compile-checked.js +12 -4
  79. package/dist/document/compile-checked.js.map +1 -1
  80. package/dist/document/compile.d.ts +0 -2
  81. package/dist/document/compile.d.ts.map +1 -1
  82. package/dist/document/compile.js +19 -17
  83. package/dist/document/compile.js.map +1 -1
  84. package/dist/document/compiled.d.ts +2 -0
  85. package/dist/document/compiled.d.ts.map +1 -1
  86. package/dist/document/compiled.js +51 -12
  87. package/dist/document/compiled.js.map +1 -1
  88. package/dist/document/computed-values.d.ts +3 -0
  89. package/dist/document/computed-values.d.ts.map +1 -1
  90. package/dist/document/computed-values.js +12 -2
  91. package/dist/document/computed-values.js.map +1 -1
  92. package/dist/document/connection-findings.d.ts +6 -0
  93. package/dist/document/connection-findings.d.ts.map +1 -0
  94. package/dist/document/connection-findings.js +110 -0
  95. package/dist/document/connection-findings.js.map +1 -0
  96. package/dist/document/connection-spec.d.ts +38 -0
  97. package/dist/document/connection-spec.d.ts.map +1 -0
  98. package/dist/document/connection-spec.js +43 -0
  99. package/dist/document/connection-spec.js.map +1 -0
  100. package/dist/document/describe-coverage.d.ts +3 -0
  101. package/dist/document/describe-coverage.d.ts.map +1 -1
  102. package/dist/document/describe-coverage.js +12 -5
  103. package/dist/document/describe-coverage.js.map +1 -1
  104. package/dist/document/describe-place.d.ts.map +1 -1
  105. package/dist/document/describe-place.js +3 -1
  106. package/dist/document/describe-place.js.map +1 -1
  107. package/dist/document/diff.d.ts.map +1 -1
  108. package/dist/document/diff.js +39 -8
  109. package/dist/document/diff.js.map +1 -1
  110. package/dist/document/edit.d.ts +1 -1
  111. package/dist/document/edit.d.ts.map +1 -1
  112. package/dist/document/edit.js +251 -15
  113. package/dist/document/edit.js.map +1 -1
  114. package/dist/document/expr/evaluate.d.ts +25 -0
  115. package/dist/document/expr/evaluate.d.ts.map +1 -1
  116. package/dist/document/expr/evaluate.js +38 -0
  117. package/dist/document/expr/evaluate.js.map +1 -1
  118. package/dist/document/format-words.d.ts +1 -1
  119. package/dist/document/format-words.d.ts.map +1 -1
  120. package/dist/document/format-words.js +3 -1
  121. package/dist/document/format-words.js.map +1 -1
  122. package/dist/document/framework-path.d.ts +11 -0
  123. package/dist/document/framework-path.d.ts.map +1 -0
  124. package/dist/document/framework-path.js +122 -0
  125. package/dist/document/framework-path.js.map +1 -0
  126. package/dist/document/index.d.ts +2 -2
  127. package/dist/document/index.d.ts.map +1 -1
  128. package/dist/document/index.js +1 -1
  129. package/dist/document/index.js.map +1 -1
  130. package/dist/document/linked-findings.d.ts +5 -0
  131. package/dist/document/linked-findings.d.ts.map +1 -0
  132. package/dist/document/linked-findings.js +100 -0
  133. package/dist/document/linked-findings.js.map +1 -0
  134. package/dist/document/migrate.d.ts.map +1 -1
  135. package/dist/document/migrate.js +4 -1
  136. package/dist/document/migrate.js.map +1 -1
  137. package/dist/document/policy-words.d.ts +2 -0
  138. package/dist/document/policy-words.d.ts.map +1 -1
  139. package/dist/document/policy-words.js +16 -1
  140. package/dist/document/policy-words.js.map +1 -1
  141. package/dist/document/right-names.d.ts +10 -0
  142. package/dist/document/right-names.d.ts.map +1 -0
  143. package/dist/document/right-names.js +57 -0
  144. package/dist/document/right-names.js.map +1 -0
  145. package/dist/document/rules.d.ts.map +1 -1
  146. package/dist/document/rules.js +13 -5
  147. package/dist/document/rules.js.map +1 -1
  148. package/dist/document/schema.d.ts +86 -8
  149. package/dist/document/schema.d.ts.map +1 -1
  150. package/dist/document/schema.js +64 -7
  151. package/dist/document/schema.js.map +1 -1
  152. package/dist/document/template-parse.d.ts.map +1 -1
  153. package/dist/document/template-parse.js +36 -3
  154. package/dist/document/template-parse.js.map +1 -1
  155. package/dist/document/template.d.ts +13 -1
  156. package/dist/document/template.d.ts.map +1 -1
  157. package/dist/document/template.js +29 -9
  158. package/dist/document/template.js.map +1 -1
  159. package/dist/document/to-document.d.ts.map +1 -1
  160. package/dist/document/to-document.js +12 -0
  161. package/dist/document/to-document.js.map +1 -1
  162. package/dist/document/views.d.ts +36 -4
  163. package/dist/document/views.d.ts.map +1 -1
  164. package/dist/document/views.js +64 -21
  165. package/dist/document/views.js.map +1 -1
  166. package/dist/document.schema.json +1184 -51
  167. package/dist/field-sight.js +2 -2
  168. package/dist/field-sight.js.map +1 -1
  169. package/dist/forms.d.ts +1 -0
  170. package/dist/forms.d.ts.map +1 -1
  171. package/dist/forms.js +2 -0
  172. package/dist/forms.js.map +1 -1
  173. package/dist/graph/archived.d.ts +9 -0
  174. package/dist/graph/archived.d.ts.map +1 -1
  175. package/dist/graph/archived.js +9 -0
  176. package/dist/graph/archived.js.map +1 -1
  177. package/dist/graph/diff.d.ts +16 -0
  178. package/dist/graph/diff.d.ts.map +1 -1
  179. package/dist/graph/diff.js +18 -0
  180. package/dist/graph/diff.js.map +1 -1
  181. package/dist/graph/graph.d.ts.map +1 -1
  182. package/dist/graph/graph.js +5 -8
  183. package/dist/graph/graph.js.map +1 -1
  184. package/dist/grid-sort.d.ts +20 -0
  185. package/dist/grid-sort.d.ts.map +1 -0
  186. package/dist/grid-sort.js +58 -0
  187. package/dist/grid-sort.js.map +1 -0
  188. package/dist/history.d.ts +88 -0
  189. package/dist/history.d.ts.map +1 -0
  190. package/dist/history.js +146 -0
  191. package/dist/history.js.map +1 -0
  192. package/dist/index.d.ts +18 -6
  193. package/dist/index.d.ts.map +1 -1
  194. package/dist/index.js +14 -3
  195. package/dist/index.js.map +1 -1
  196. package/dist/installation.d.ts +1 -1
  197. package/dist/kind-list.d.ts +78 -0
  198. package/dist/kind-list.d.ts.map +1 -0
  199. package/dist/kind-list.js +176 -0
  200. package/dist/kind-list.js.map +1 -0
  201. package/dist/linked.d.ts +95 -0
  202. package/dist/linked.d.ts.map +1 -0
  203. package/dist/linked.js +181 -0
  204. package/dist/linked.js.map +1 -0
  205. package/dist/mutations/arg-shape.d.ts +2 -0
  206. package/dist/mutations/arg-shape.d.ts.map +1 -1
  207. package/dist/mutations/arg-shape.js +4 -0
  208. package/dist/mutations/arg-shape.js.map +1 -1
  209. package/dist/mutations/derive-edits.d.ts.map +1 -1
  210. package/dist/mutations/derive-edits.js +89 -38
  211. package/dist/mutations/derive-edits.js.map +1 -1
  212. package/dist/mutations/derived-names.d.ts +3 -1
  213. package/dist/mutations/derived-names.d.ts.map +1 -1
  214. package/dist/mutations/derived-names.js +5 -3
  215. package/dist/mutations/derived-names.js.map +1 -1
  216. package/dist/mutations/edit-start.d.ts +28 -0
  217. package/dist/mutations/edit-start.d.ts.map +1 -0
  218. package/dist/mutations/edit-start.js +24 -0
  219. package/dist/mutations/edit-start.js.map +1 -0
  220. package/dist/mutations/form.d.ts +14 -0
  221. package/dist/mutations/form.d.ts.map +1 -1
  222. package/dist/mutations/form.js +5 -1
  223. package/dist/mutations/form.js.map +1 -1
  224. package/dist/mutations/kept-arguments.js +2 -2
  225. package/dist/mutations/kept-arguments.js.map +1 -1
  226. package/dist/mutations/types.d.ts +1 -1
  227. package/dist/mutations/types.d.ts.map +1 -1
  228. package/dist/navigate.d.ts +13 -0
  229. package/dist/navigate.d.ts.map +1 -0
  230. package/dist/navigate.js +13 -0
  231. package/dist/navigate.js.map +1 -0
  232. package/dist/ops/digest.d.ts +33 -0
  233. package/dist/ops/digest.d.ts.map +1 -0
  234. package/dist/ops/digest.js +47 -0
  235. package/dist/ops/digest.js.map +1 -0
  236. package/dist/ops/lineage.d.ts +13 -0
  237. package/dist/ops/lineage.d.ts.map +1 -1
  238. package/dist/ops/lineage.js +6 -4
  239. package/dist/ops/lineage.js.map +1 -1
  240. package/dist/ops/log.d.ts +6 -0
  241. package/dist/ops/log.d.ts.map +1 -1
  242. package/dist/ops/log.js +19 -12
  243. package/dist/ops/log.js.map +1 -1
  244. package/dist/ops/suggestions.d.ts +26 -0
  245. package/dist/ops/suggestions.d.ts.map +1 -0
  246. package/dist/ops/suggestions.js +21 -0
  247. package/dist/ops/suggestions.js.map +1 -0
  248. package/dist/ops/tidying.d.ts +48 -0
  249. package/dist/ops/tidying.d.ts.map +1 -0
  250. package/dist/ops/tidying.js +84 -0
  251. package/dist/ops/tidying.js.map +1 -0
  252. package/dist/ops/types.d.ts +17 -0
  253. package/dist/ops/types.d.ts.map +1 -1
  254. package/dist/ops/undo.d.ts.map +1 -1
  255. package/dist/ops/undo.js +10 -0
  256. package/dist/ops/undo.js.map +1 -1
  257. package/dist/past.d.ts +35 -0
  258. package/dist/past.d.ts.map +1 -0
  259. package/dist/past.js +173 -0
  260. package/dist/past.js.map +1 -0
  261. package/dist/permissions/policy.d.ts +8 -1
  262. package/dist/permissions/policy.d.ts.map +1 -1
  263. package/dist/permissions/policy.js +20 -5
  264. package/dist/permissions/policy.js.map +1 -1
  265. package/dist/places.d.ts +6 -2
  266. package/dist/places.d.ts.map +1 -1
  267. package/dist/places.js +48 -3
  268. package/dist/places.js.map +1 -1
  269. package/dist/scaffold/agents.d.ts.map +1 -1
  270. package/dist/scaffold/agents.js +13 -0
  271. package/dist/scaffold/agents.js.map +1 -1
  272. package/dist/scaffold/project.d.ts.map +1 -1
  273. package/dist/scaffold/project.js +8 -0
  274. package/dist/scaffold/project.js.map +1 -1
  275. package/dist/scaffold/ui.d.ts.map +1 -1
  276. package/dist/scaffold/ui.js +18 -5
  277. package/dist/scaffold/ui.js.map +1 -1
  278. package/dist/schema/app-address.d.ts +5 -0
  279. package/dist/schema/app-address.d.ts.map +1 -0
  280. package/dist/schema/app-address.js +10 -0
  281. package/dist/schema/app-address.js.map +1 -0
  282. package/dist/schema/app-link.d.ts +1 -4
  283. package/dist/schema/app-link.d.ts.map +1 -1
  284. package/dist/schema/app-link.js +5 -7
  285. package/dist/schema/app-link.js.map +1 -1
  286. package/dist/schema/define-node.d.ts +16 -0
  287. package/dist/schema/define-node.d.ts.map +1 -1
  288. package/dist/schema/define-node.js +6 -0
  289. package/dist/schema/define-node.js.map +1 -1
  290. package/dist/schema/files.d.ts +8 -0
  291. package/dist/schema/files.d.ts.map +1 -1
  292. package/dist/schema/files.js.map +1 -1
  293. package/dist/schema/json-schema.d.ts.map +1 -1
  294. package/dist/schema/json-schema.js +19 -1
  295. package/dist/schema/json-schema.js.map +1 -1
  296. package/dist/schema/linked-field.d.ts +6 -0
  297. package/dist/schema/linked-field.d.ts.map +1 -0
  298. package/dist/schema/linked-field.js +34 -0
  299. package/dist/schema/linked-field.js.map +1 -0
  300. package/dist/schema/linked-reads.d.ts +20 -0
  301. package/dist/schema/linked-reads.d.ts.map +1 -0
  302. package/dist/schema/linked-reads.js +69 -0
  303. package/dist/schema/linked-reads.js.map +1 -0
  304. package/dist/schema/linked-schema.d.ts +5 -0
  305. package/dist/schema/linked-schema.d.ts.map +1 -0
  306. package/dist/schema/linked-schema.js +9 -0
  307. package/dist/schema/linked-schema.js.map +1 -0
  308. package/dist/schema/linked.d.ts +147 -0
  309. package/dist/schema/linked.d.ts.map +1 -0
  310. package/dist/schema/linked.js +151 -0
  311. package/dist/schema/linked.js.map +1 -0
  312. package/dist/schema/reading.d.ts.map +1 -1
  313. package/dist/schema/reading.js +82 -27
  314. package/dist/schema/reading.js.map +1 -1
  315. package/dist/schema/schema.d.ts.map +1 -1
  316. package/dist/schema/schema.js +11 -4
  317. package/dist/schema/schema.js.map +1 -1
  318. package/dist/schema/types.d.ts +17 -0
  319. package/dist/schema/types.d.ts.map +1 -1
  320. package/dist/search.d.ts.map +1 -1
  321. package/dist/search.js +30 -2
  322. package/dist/search.js.map +1 -1
  323. package/dist/seat-of.d.ts +9 -0
  324. package/dist/seat-of.d.ts.map +1 -0
  325. package/dist/seat-of.js +14 -0
  326. package/dist/seat-of.js.map +1 -0
  327. package/dist/seen.d.ts +0 -12
  328. package/dist/seen.d.ts.map +1 -1
  329. package/dist/seen.js +5 -0
  330. package/dist/seen.js.map +1 -1
  331. package/dist/store.d.ts +58 -0
  332. package/dist/store.d.ts.map +1 -1
  333. package/dist/store.js +96 -11
  334. package/dist/store.js.map +1 -1
  335. package/dist/subscription-shape.d.ts +135 -0
  336. package/dist/subscription-shape.d.ts.map +1 -0
  337. package/dist/subscription-shape.js +55 -0
  338. package/dist/subscription-shape.js.map +1 -0
  339. package/dist/subscriptions.d.ts +68 -0
  340. package/dist/subscriptions.d.ts.map +1 -0
  341. package/dist/subscriptions.js +425 -0
  342. package/dist/subscriptions.js.map +1 -0
  343. package/dist/sync/connection-filter.d.ts +12 -0
  344. package/dist/sync/connection-filter.d.ts.map +1 -0
  345. package/dist/sync/connection-filter.js +34 -0
  346. package/dist/sync/connection-filter.js.map +1 -0
  347. package/dist/sync/connection.d.ts +65 -0
  348. package/dist/sync/connection.d.ts.map +1 -0
  349. package/dist/sync/connection.js +148 -0
  350. package/dist/sync/connection.js.map +1 -0
  351. package/dist/sync/engine.d.ts.map +1 -1
  352. package/dist/sync/engine.js +4 -0
  353. package/dist/sync/engine.js.map +1 -1
  354. package/dist/sync/google-calendar.d.ts +27 -2
  355. package/dist/sync/google-calendar.d.ts.map +1 -1
  356. package/dist/sync/google-calendar.js +55 -14
  357. package/dist/sync/google-calendar.js.map +1 -1
  358. package/dist/sync/index.d.ts +3 -1
  359. package/dist/sync/index.d.ts.map +1 -1
  360. package/dist/sync/index.js +1 -0
  361. package/dist/sync/index.js.map +1 -1
  362. package/dist/theme/derive.d.ts +16 -0
  363. package/dist/theme/derive.d.ts.map +1 -1
  364. package/dist/theme/derive.js +14 -0
  365. package/dist/theme/derive.js.map +1 -1
  366. package/dist/theme/marks.d.ts +19 -2
  367. package/dist/theme/marks.d.ts.map +1 -1
  368. package/dist/theme/marks.js +67 -2
  369. package/dist/theme/marks.js.map +1 -1
  370. package/dist/theme/types.d.ts +7 -2
  371. package/dist/theme/types.d.ts.map +1 -1
  372. package/dist/theme/types.js.map +1 -1
  373. package/dist/tidying.d.ts +62 -0
  374. package/dist/tidying.d.ts.map +1 -0
  375. package/dist/tidying.js +131 -0
  376. package/dist/tidying.js.map +1 -0
  377. package/dist/typed.d.ts +1 -1
  378. package/dist/typed.d.ts.map +1 -1
  379. package/dist/version.d.ts +1 -1
  380. package/dist/version.js +1 -1
  381. package/dist/via.d.ts.map +1 -1
  382. package/dist/via.js +2 -1
  383. package/dist/via.js.map +1 -1
  384. package/dist/views/address.d.ts +13 -0
  385. package/dist/views/address.d.ts.map +1 -0
  386. package/dist/views/address.js +29 -0
  387. package/dist/views/address.js.map +1 -0
  388. package/dist/views/types.d.ts +52 -3
  389. package/dist/views/types.d.ts.map +1 -1
  390. package/dist/views/types.js +4 -3
  391. package/dist/views/types.js.map +1 -1
  392. package/dist/wall-time.d.ts +60 -0
  393. package/dist/wall-time.d.ts.map +1 -0
  394. package/dist/wall-time.js +111 -0
  395. package/dist/wall-time.js.map +1 -0
  396. package/dist/when-typed.d.ts +15 -0
  397. package/dist/when-typed.d.ts.map +1 -0
  398. package/dist/when-typed.js +158 -0
  399. package/dist/when-typed.js.map +1 -0
  400. package/dist/words.d.ts +6 -1
  401. package/dist/words.d.ts.map +1 -1
  402. package/dist/words.js +6 -1
  403. package/dist/words.js.map +1 -1
  404. package/package.json +29 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://unpkg.com/@graview/core@0.1.29/dist/document.schema.json",
4
- "title": "Graview declaration document, format 1 (@graview/core 0.1.29)",
3
+ "$id": "https://unpkg.com/@graview/core@0.1.32/dist/document.schema.json",
4
+ "title": "Graview declaration document, format 1 (@graview/core 0.1.32)",
5
5
  "description": "A whole Graview app as one JSON object: its kinds, fields, relations, acts, rules, roles, views and brand. `graview check --document <file>` compiles it and says what is wrong in words; this schema is the same shape, for an editor. Name it in a document's \"$schema\".",
6
6
  "type": "object",
7
7
  "properties": {
@@ -35,7 +35,8 @@
35
35
  "type": "object",
36
36
  "propertyNames": {
37
37
  "type": "string",
38
- "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
38
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
39
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
39
40
  },
40
41
  "additionalProperties": {
41
42
  "type": "object",
@@ -77,7 +78,8 @@
77
78
  "__proto__",
78
79
  "toLocaleString"
79
80
  ]
80
- }
81
+ },
82
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
81
83
  },
82
84
  "additionalProperties": {
83
85
  "type": "object",
@@ -212,7 +214,8 @@
212
214
  }
213
215
  ]
214
216
  },
215
- "minProperties": 1
217
+ "minProperties": 1,
218
+ "description": "The kind's fields, by name. Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
216
219
  },
217
220
  "label": {
218
221
  "type": "string",
@@ -247,7 +250,8 @@
247
250
  "__proto__",
248
251
  "toLocaleString"
249
252
  ]
250
- }
253
+ },
254
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
251
255
  },
252
256
  "retired": {
253
257
  "minItems": 1,
@@ -295,7 +299,8 @@
295
299
  "__proto__",
296
300
  "toLocaleString"
297
301
  ]
298
- }
302
+ },
303
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
299
304
  }
300
305
  },
301
306
  "page": {
@@ -325,7 +330,8 @@
325
330
  "__proto__",
326
331
  "toLocaleString"
327
332
  ]
328
- }
333
+ },
334
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
329
335
  }
330
336
  },
331
337
  "groups": {
@@ -364,7 +370,8 @@
364
370
  "__proto__",
365
371
  "toLocaleString"
366
372
  ]
367
- }
373
+ },
374
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
368
375
  }
369
376
  }
370
377
  },
@@ -398,7 +405,8 @@
398
405
  "__proto__",
399
406
  "toLocaleString"
400
407
  ]
401
- }
408
+ },
409
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
402
410
  },
403
411
  "additionalProperties": {
404
412
  "type": "object",
@@ -410,7 +418,7 @@
410
418
  "type": "array",
411
419
  "items": {
412
420
  "type": "string",
413
- "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
421
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$|^@(?:https?:\\/\\/[^\\s<>\"'`\\\\#?]+|[A-Za-z0-9][\\w.~-]*(?:\\/[\\w.~-]+)*)\\/[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
414
422
  }
415
423
  },
416
424
  {
@@ -441,13 +449,18 @@
441
449
  },
442
450
  "renamedFrom": {
443
451
  "type": "string"
452
+ },
453
+ "tidying": {
454
+ "type": "string",
455
+ "const": "never"
444
456
  }
445
457
  },
446
458
  "required": [
447
459
  "to"
448
460
  ],
449
461
  "additionalProperties": false
450
- }
462
+ },
463
+ "description": "The kind's relations, by name. Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
451
464
  },
452
465
  "computed": {
453
466
  "type": "object",
@@ -508,6 +521,13 @@
508
521
  "archives": {
509
522
  "type": "boolean",
510
523
  "const": false
524
+ },
525
+ "tidying": {
526
+ "type": "string",
527
+ "enum": [
528
+ "never",
529
+ "no-links"
530
+ ]
511
531
  }
512
532
  },
513
533
  "required": [
@@ -516,7 +536,8 @@
516
536
  "additionalProperties": false
517
537
  },
518
538
  "minProperties": 1,
519
- "maxProperties": 40
539
+ "maxProperties": 40,
540
+ "description": "The kinds of record, by name. Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
520
541
  },
521
542
  "computed": {
522
543
  "type": "object",
@@ -561,7 +582,8 @@
561
582
  "type": "object",
562
583
  "propertyNames": {
563
584
  "type": "string",
564
- "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
585
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
586
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
565
587
  },
566
588
  "additionalProperties": {
567
589
  "type": "object",
@@ -623,7 +645,8 @@
623
645
  "__proto__",
624
646
  "toLocaleString"
625
647
  ]
626
- }
648
+ },
649
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
627
650
  },
628
651
  "additionalProperties": {
629
652
  "anyOf": [
@@ -683,7 +706,8 @@
683
706
  "__proto__",
684
707
  "toLocaleString"
685
708
  ]
686
- }
709
+ },
710
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
687
711
  }
688
712
  },
689
713
  "connects": {
@@ -716,7 +740,8 @@
716
740
  "__proto__",
717
741
  "toLocaleString"
718
742
  ]
719
- }
743
+ },
744
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
720
745
  },
721
746
  "additionalProperties": {
722
747
  "anyOf": [
@@ -781,7 +806,8 @@
781
806
  "__proto__",
782
807
  "toLocaleString"
783
808
  ]
784
- }
809
+ },
810
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
785
811
  }
786
812
  }
787
813
  ]
@@ -812,7 +838,8 @@
812
838
  "__proto__",
813
839
  "toLocaleString"
814
840
  ]
815
- }
841
+ },
842
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
816
843
  },
817
844
  "additionalProperties": {
818
845
  "type": "object",
@@ -987,7 +1014,8 @@
987
1014
  "__proto__",
988
1015
  "toLocaleString"
989
1016
  ]
990
- }
1017
+ },
1018
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
991
1019
  },
992
1020
  "additionalProperties": {
993
1021
  "anyOf": [
@@ -1055,7 +1083,8 @@
1055
1083
  "__proto__",
1056
1084
  "toLocaleString"
1057
1085
  ]
1058
- }
1086
+ },
1087
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
1059
1088
  },
1060
1089
  "additionalProperties": {
1061
1090
  "anyOf": [
@@ -1123,7 +1152,8 @@
1123
1152
  "__proto__",
1124
1153
  "toLocaleString"
1125
1154
  ]
1126
- }
1155
+ },
1156
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
1127
1157
  },
1128
1158
  "from": {
1129
1159
  "type": "string",
@@ -1162,7 +1192,8 @@
1162
1192
  "__proto__",
1163
1193
  "toLocaleString"
1164
1194
  ]
1165
- }
1195
+ },
1196
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
1166
1197
  },
1167
1198
  "from": {
1168
1199
  "type": "string",
@@ -1217,7 +1248,8 @@
1217
1248
  "type": "object",
1218
1249
  "propertyNames": {
1219
1250
  "type": "string",
1220
- "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
1251
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
1252
+ "description": "Kinds, acts, rules and roles are kebab-case, like \"tool-note\"; fields and relations are camelCase, like \"supersededBy\", so a rule can say them bare. A kind keeps the name it is given, because every record stores it."
1221
1253
  },
1222
1254
  "additionalProperties": {
1223
1255
  "type": "object",
@@ -1484,13 +1516,388 @@
1484
1516
  "additionalProperties": {}
1485
1517
  },
1486
1518
  "lenses": {
1519
+ "description": "The pictures the app draws beside its lists: each names a lens Graview ships, binds it to the kinds it stands on, and, with a title, is a place of its own.",
1487
1520
  "type": "array",
1488
1521
  "items": {
1489
1522
  "type": "object",
1490
- "propertyNames": {
1491
- "type": "string"
1523
+ "required": [
1524
+ "name"
1525
+ ],
1526
+ "properties": {
1527
+ "name": {
1528
+ "description": "Which lens: timeline, calendar, coverage, board, plan, reach, blocks, columns.",
1529
+ "enum": [
1530
+ "timeline",
1531
+ "calendar",
1532
+ "coverage",
1533
+ "board",
1534
+ "plan",
1535
+ "reach",
1536
+ "blocks",
1537
+ "columns"
1538
+ ]
1539
+ },
1540
+ "title": {
1541
+ "type": "string",
1542
+ "minLength": 1,
1543
+ "maxLength": 80,
1544
+ "description": "With a title, the lens is a place: a pill on the bar and a page of its own."
1545
+ },
1546
+ "on": {
1547
+ "type": "string",
1548
+ "description": "The kind it is a place over, when its bindings do not say."
1549
+ },
1550
+ "options": {
1551
+ "type": "object"
1552
+ },
1553
+ "bindings": {
1554
+ "type": "object"
1555
+ },
1556
+ "binds": {
1557
+ "enum": [
1558
+ "fields",
1559
+ "entities"
1560
+ ]
1561
+ },
1562
+ "requiredRoles": {
1563
+ "type": "array",
1564
+ "items": {
1565
+ "type": "string"
1566
+ }
1567
+ },
1568
+ "provenBy": {
1569
+ "type": "string"
1570
+ },
1571
+ "arrangedBy": {
1572
+ "description": "What the picture opens arranged by, in the arrangement grammar."
1573
+ },
1574
+ "hidden": {
1575
+ "type": "boolean",
1576
+ "description": "Kept off the lists: reached by its address, a link or navigate."
1577
+ },
1578
+ "create": {
1579
+ "type": "boolean"
1580
+ }
1492
1581
  },
1493
- "additionalProperties": {}
1582
+ "additionalProperties": false,
1583
+ "allOf": [
1584
+ {
1585
+ "if": {
1586
+ "properties": {
1587
+ "name": {
1588
+ "const": "timeline"
1589
+ }
1590
+ },
1591
+ "required": [
1592
+ "name"
1593
+ ]
1594
+ },
1595
+ "then": {
1596
+ "properties": {
1597
+ "options": {
1598
+ "description": "What the timeline lens takes besides its roles: columns, extent, tick, minWindow, arranging.",
1599
+ "type": "object",
1600
+ "properties": {
1601
+ "columns": {},
1602
+ "extent": {},
1603
+ "tick": {},
1604
+ "minWindow": {},
1605
+ "arranging": {}
1606
+ },
1607
+ "additionalProperties": false
1608
+ },
1609
+ "bindings": {
1610
+ "description": "Per kind, each role bound to a field — \"start\": \"due\" — or to a field and the values that make it true — { \"field\": \"status\", \"is\": [\"done\"] }. It binds start, end.",
1611
+ "type": "object",
1612
+ "additionalProperties": {
1613
+ "type": "object",
1614
+ "additionalProperties": {
1615
+ "anyOf": [
1616
+ {
1617
+ "type": "string"
1618
+ },
1619
+ {
1620
+ "type": "object",
1621
+ "properties": {
1622
+ "field": {
1623
+ "type": "string"
1624
+ },
1625
+ "is": {
1626
+ "type": "array"
1627
+ }
1628
+ },
1629
+ "required": [
1630
+ "field",
1631
+ "is"
1632
+ ],
1633
+ "additionalProperties": false
1634
+ }
1635
+ ]
1636
+ }
1637
+ }
1638
+ }
1639
+ }
1640
+ }
1641
+ },
1642
+ {
1643
+ "if": {
1644
+ "properties": {
1645
+ "name": {
1646
+ "const": "calendar"
1647
+ }
1648
+ },
1649
+ "required": [
1650
+ "name"
1651
+ ]
1652
+ },
1653
+ "then": {
1654
+ "properties": {
1655
+ "options": {
1656
+ "description": "What the calendar lens takes besides its roles: today, range, weekStartsOn, perCell, horizon, arranging.",
1657
+ "type": "object",
1658
+ "properties": {
1659
+ "today": {},
1660
+ "range": {},
1661
+ "weekStartsOn": {},
1662
+ "perCell": {},
1663
+ "horizon": {},
1664
+ "arranging": {}
1665
+ },
1666
+ "additionalProperties": false
1667
+ },
1668
+ "bindings": {
1669
+ "description": "Per kind, each role bound to a field — \"start\": \"due\" — or to a field and the values that make it true — { \"field\": \"status\", \"is\": [\"done\"] }. It binds start.",
1670
+ "type": "object",
1671
+ "additionalProperties": {
1672
+ "type": "object",
1673
+ "additionalProperties": {
1674
+ "anyOf": [
1675
+ {
1676
+ "type": "string"
1677
+ },
1678
+ {
1679
+ "type": "object",
1680
+ "properties": {
1681
+ "field": {
1682
+ "type": "string"
1683
+ },
1684
+ "is": {
1685
+ "type": "array"
1686
+ }
1687
+ },
1688
+ "required": [
1689
+ "field",
1690
+ "is"
1691
+ ],
1692
+ "additionalProperties": false
1693
+ }
1694
+ ]
1695
+ }
1696
+ }
1697
+ }
1698
+ }
1699
+ }
1700
+ },
1701
+ {
1702
+ "if": {
1703
+ "properties": {
1704
+ "name": {
1705
+ "const": "coverage"
1706
+ }
1707
+ },
1708
+ "required": [
1709
+ "name"
1710
+ ]
1711
+ },
1712
+ "then": {
1713
+ "properties": {
1714
+ "options": {
1715
+ "description": "What the coverage lens takes besides its roles: rowRef, rowGroup, groupOrder, requiredGroups, requiredVia, badge, columnGroup, sort, columnSort.",
1716
+ "type": "object",
1717
+ "properties": {
1718
+ "rowRef": {},
1719
+ "rowGroup": {},
1720
+ "groupOrder": {},
1721
+ "requiredGroups": {},
1722
+ "requiredVia": {},
1723
+ "badge": {},
1724
+ "columnGroup": {},
1725
+ "sort": {},
1726
+ "columnSort": {}
1727
+ },
1728
+ "additionalProperties": false
1729
+ }
1730
+ }
1731
+ }
1732
+ },
1733
+ {
1734
+ "if": {
1735
+ "properties": {
1736
+ "name": {
1737
+ "const": "board"
1738
+ }
1739
+ },
1740
+ "required": [
1741
+ "name"
1742
+ ]
1743
+ },
1744
+ "then": {
1745
+ "properties": {
1746
+ "options": {
1747
+ "description": "What the board lens takes besides its roles: fillFrom, slotCode, zones, aspect, emptyLabel, pickTarget, arranging, arrange.",
1748
+ "type": "object",
1749
+ "properties": {
1750
+ "fillFrom": {},
1751
+ "slotCode": {},
1752
+ "zones": {},
1753
+ "aspect": {},
1754
+ "emptyLabel": {},
1755
+ "pickTarget": {},
1756
+ "arranging": {},
1757
+ "arrange": {}
1758
+ },
1759
+ "additionalProperties": false
1760
+ }
1761
+ }
1762
+ }
1763
+ },
1764
+ {
1765
+ "if": {
1766
+ "properties": {
1767
+ "name": {
1768
+ "const": "plan"
1769
+ }
1770
+ },
1771
+ "required": [
1772
+ "name"
1773
+ ]
1774
+ },
1775
+ "then": {
1776
+ "properties": {
1777
+ "options": {
1778
+ "description": "What the plan lens takes besides its roles: hues, aspect, undrawnLabel, strayLabel, draw, place, help.",
1779
+ "type": "object",
1780
+ "properties": {
1781
+ "hues": {},
1782
+ "aspect": {},
1783
+ "undrawnLabel": {},
1784
+ "strayLabel": {},
1785
+ "draw": {},
1786
+ "place": {},
1787
+ "help": {}
1788
+ },
1789
+ "additionalProperties": false
1790
+ }
1791
+ }
1792
+ }
1793
+ },
1794
+ {
1795
+ "if": {
1796
+ "properties": {
1797
+ "name": {
1798
+ "const": "reach"
1799
+ }
1800
+ },
1801
+ "required": [
1802
+ "name"
1803
+ ]
1804
+ },
1805
+ "then": {
1806
+ "properties": {
1807
+ "options": {
1808
+ "description": "The reach lens takes no options.",
1809
+ "type": "object",
1810
+ "properties": {},
1811
+ "additionalProperties": false
1812
+ }
1813
+ }
1814
+ }
1815
+ },
1816
+ {
1817
+ "if": {
1818
+ "properties": {
1819
+ "name": {
1820
+ "const": "blocks"
1821
+ }
1822
+ },
1823
+ "required": [
1824
+ "name"
1825
+ ]
1826
+ },
1827
+ "then": {
1828
+ "properties": {
1829
+ "options": {
1830
+ "description": "What the blocks lens takes besides its roles: blocks.",
1831
+ "type": "object",
1832
+ "properties": {
1833
+ "blocks": {
1834
+ "description": "The blocks the lens draws, about no one record.",
1835
+ "type": "array",
1836
+ "items": {
1837
+ "$ref": "#/$defs/ViewBlock"
1838
+ }
1839
+ }
1840
+ },
1841
+ "additionalProperties": false
1842
+ }
1843
+ }
1844
+ }
1845
+ },
1846
+ {
1847
+ "if": {
1848
+ "properties": {
1849
+ "name": {
1850
+ "const": "columns"
1851
+ }
1852
+ },
1853
+ "required": [
1854
+ "name"
1855
+ ]
1856
+ },
1857
+ "then": {
1858
+ "properties": {
1859
+ "options": {
1860
+ "description": "What the columns lens takes besides its roles: sort.",
1861
+ "type": "object",
1862
+ "properties": {
1863
+ "sort": {}
1864
+ },
1865
+ "additionalProperties": false
1866
+ },
1867
+ "bindings": {
1868
+ "description": "Per kind, each role bound to a field — \"start\": \"due\" — or to a field and the values that make it true — { \"field\": \"status\", \"is\": [\"done\"] }. It binds column.",
1869
+ "type": "object",
1870
+ "additionalProperties": {
1871
+ "type": "object",
1872
+ "additionalProperties": {
1873
+ "anyOf": [
1874
+ {
1875
+ "type": "string"
1876
+ },
1877
+ {
1878
+ "type": "object",
1879
+ "properties": {
1880
+ "field": {
1881
+ "type": "string"
1882
+ },
1883
+ "is": {
1884
+ "type": "array"
1885
+ }
1886
+ },
1887
+ "required": [
1888
+ "field",
1889
+ "is"
1890
+ ],
1891
+ "additionalProperties": false
1892
+ }
1893
+ ]
1894
+ }
1895
+ }
1896
+ }
1897
+ }
1898
+ }
1899
+ }
1900
+ ]
1494
1901
  }
1495
1902
  },
1496
1903
  "pages": {
@@ -1546,42 +1953,153 @@
1546
1953
  "minLength": 1,
1547
1954
  "maxLength": 120
1548
1955
  }
1549
- }
1550
- },
1551
- "additionalProperties": false
1552
- }
1553
- }
1554
- },
1555
- "additionalProperties": {}
1556
- },
1557
- "views": {
1558
- "type": "object",
1559
- "propertyNames": {
1560
- "type": "string"
1561
- },
1562
- "additionalProperties": {
1563
- "anyOf": [
1564
- {
1956
+ },
1957
+ "sort": {
1958
+ "anyOf": [
1959
+ {
1960
+ "type": "string",
1961
+ "minLength": 1,
1962
+ "maxLength": 120
1963
+ },
1964
+ {
1965
+ "type": "object",
1966
+ "properties": {
1967
+ "by": {
1968
+ "type": "string",
1969
+ "minLength": 1,
1970
+ "maxLength": 120
1971
+ },
1972
+ "direction": {
1973
+ "type": "string",
1974
+ "enum": [
1975
+ "asc",
1976
+ "desc"
1977
+ ]
1978
+ },
1979
+ "then": {
1980
+ "anyOf": [
1981
+ {
1982
+ "type": "string",
1983
+ "minLength": 1,
1984
+ "maxLength": 120
1985
+ },
1986
+ {
1987
+ "type": "object",
1988
+ "properties": {
1989
+ "by": {
1990
+ "type": "string",
1991
+ "minLength": 1,
1992
+ "maxLength": 120
1993
+ },
1994
+ "direction": {
1995
+ "type": "string",
1996
+ "enum": [
1997
+ "asc",
1998
+ "desc"
1999
+ ]
2000
+ }
2001
+ },
2002
+ "required": [
2003
+ "by"
2004
+ ],
2005
+ "additionalProperties": false
2006
+ }
2007
+ ]
2008
+ }
2009
+ },
2010
+ "required": [
2011
+ "by"
2012
+ ],
2013
+ "additionalProperties": false
2014
+ }
2015
+ ]
2016
+ },
2017
+ "group": {
2018
+ "anyOf": [
2019
+ {
2020
+ "type": "string",
2021
+ "minLength": 1,
2022
+ "maxLength": 120
2023
+ },
2024
+ {
2025
+ "type": "object",
2026
+ "properties": {
2027
+ "by": {
2028
+ "type": "string",
2029
+ "minLength": 1,
2030
+ "maxLength": 120
2031
+ },
2032
+ "order": {
2033
+ "maxItems": 40,
2034
+ "type": "array",
2035
+ "items": {
2036
+ "type": "string",
2037
+ "minLength": 1,
2038
+ "maxLength": 80
2039
+ }
2040
+ },
2041
+ "closed": {
2042
+ "maxItems": 40,
2043
+ "type": "array",
2044
+ "items": {
2045
+ "type": "string",
2046
+ "minLength": 1,
2047
+ "maxLength": 80
2048
+ }
2049
+ }
2050
+ },
2051
+ "required": [
2052
+ "by"
2053
+ ],
2054
+ "additionalProperties": false
2055
+ }
2056
+ ]
2057
+ }
2058
+ },
2059
+ "additionalProperties": false
2060
+ }
2061
+ }
2062
+ },
2063
+ "additionalProperties": {}
2064
+ },
2065
+ "views": {
2066
+ "description": "Each kind's views by kind — its card, row and page, each a list of blocks — and `home`: the home view, a list of blocks about no one record.",
2067
+ "type": "object",
2068
+ "additionalProperties": {
2069
+ "anyOf": [
2070
+ {
1565
2071
  "type": "object",
1566
2072
  "properties": {
1567
2073
  "card": {
2074
+ "description": "The blocks a card draws.",
1568
2075
  "type": "array",
1569
- "items": {}
2076
+ "items": {
2077
+ "$ref": "#/$defs/ViewBlock"
2078
+ }
1570
2079
  },
1571
2080
  "row": {
2081
+ "description": "The blocks a row draws.",
1572
2082
  "type": "array",
1573
- "items": {}
2083
+ "items": {
2084
+ "$ref": "#/$defs/ViewBlock"
2085
+ }
1574
2086
  },
1575
2087
  "page": {
2088
+ "description": "The blocks a page draws.",
1576
2089
  "type": "array",
1577
- "items": {}
2090
+ "items": {
2091
+ "$ref": "#/$defs/ViewBlock"
2092
+ }
1578
2093
  }
1579
2094
  },
1580
2095
  "additionalProperties": false
1581
2096
  },
1582
2097
  {
2098
+ "description": "The home view's blocks (under `home`).",
1583
2099
  "type": "array",
1584
- "items": {}
2100
+ "items": {
2101
+ "$ref": "#/$defs/ViewBlock"
2102
+ }
1585
2103
  }
1586
2104
  ]
1587
2105
  }
@@ -1636,9 +2154,25 @@
1636
2154
  ]
1637
2155
  },
1638
2156
  "favicon": {
1639
- "type": "string",
1640
- "minLength": 1,
1641
- "maxLength": 65536
2157
+ "anyOf": [
2158
+ {
2159
+ "type": "string",
2160
+ "minLength": 1,
2161
+ "maxLength": 65536
2162
+ },
2163
+ {
2164
+ "type": "object",
2165
+ "properties": {
2166
+ "emoji": {
2167
+ "type": "string"
2168
+ }
2169
+ },
2170
+ "required": [
2171
+ "emoji"
2172
+ ],
2173
+ "additionalProperties": false
2174
+ }
2175
+ ]
1642
2176
  },
1643
2177
  "typography": {
1644
2178
  "type": "object",
@@ -1718,6 +2252,153 @@
1718
2252
  },
1719
2253
  "additionalProperties": {}
1720
2254
  }
2255
+ },
2256
+ "connections": {
2257
+ "description": "Other systems this app is kept in step with, by name: today, Google calendars. `graview serve` and `graview preview` run them, with credentials from the environment; none is ever written here.",
2258
+ "type": "object",
2259
+ "propertyNames": {
2260
+ "type": "string",
2261
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
2262
+ },
2263
+ "additionalProperties": {
2264
+ "type": "object",
2265
+ "properties": {
2266
+ "system": {
2267
+ "type": "string",
2268
+ "const": "google-calendar"
2269
+ },
2270
+ "description": {
2271
+ "type": "string",
2272
+ "minLength": 1,
2273
+ "maxLength": 500
2274
+ },
2275
+ "calendar": {
2276
+ "anyOf": [
2277
+ {
2278
+ "type": "string",
2279
+ "minLength": 1,
2280
+ "maxLength": 300
2281
+ },
2282
+ {
2283
+ "type": "object",
2284
+ "properties": {
2285
+ "env": {
2286
+ "type": "string",
2287
+ "pattern": "^[A-Z][A-Z0-9_]*$"
2288
+ }
2289
+ },
2290
+ "required": [
2291
+ "env"
2292
+ ],
2293
+ "additionalProperties": false
2294
+ }
2295
+ ]
2296
+ },
2297
+ "auth": {
2298
+ "type": "object",
2299
+ "properties": {
2300
+ "env": {
2301
+ "type": "string",
2302
+ "pattern": "^[A-Z][A-Z0-9_]*$"
2303
+ },
2304
+ "file": {
2305
+ "type": "string",
2306
+ "minLength": 1,
2307
+ "maxLength": 500
2308
+ }
2309
+ },
2310
+ "required": [
2311
+ "env"
2312
+ ],
2313
+ "additionalProperties": false
2314
+ },
2315
+ "kind": {
2316
+ "type": "string",
2317
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
2318
+ },
2319
+ "fields": {
2320
+ "type": "object",
2321
+ "properties": {
2322
+ "summary": {
2323
+ "type": "string",
2324
+ "pattern": "^[a-z][A-Za-z0-9]*$"
2325
+ },
2326
+ "start": {
2327
+ "type": "string",
2328
+ "pattern": "^[a-z][A-Za-z0-9]*$"
2329
+ },
2330
+ "end": {
2331
+ "type": "string",
2332
+ "pattern": "^[a-z][A-Za-z0-9]*$"
2333
+ },
2334
+ "location": {
2335
+ "type": "string",
2336
+ "pattern": "^[a-z][A-Za-z0-9]*$"
2337
+ },
2338
+ "description": {
2339
+ "type": "string",
2340
+ "pattern": "^[a-z][A-Za-z0-9]*$"
2341
+ }
2342
+ },
2343
+ "required": [
2344
+ "summary",
2345
+ "start",
2346
+ "end"
2347
+ ],
2348
+ "additionalProperties": false
2349
+ },
2350
+ "filter": {
2351
+ "type": "object",
2352
+ "properties": {
2353
+ "color": {
2354
+ "type": "string",
2355
+ "minLength": 1,
2356
+ "maxLength": 40
2357
+ },
2358
+ "tag": {
2359
+ "type": "string",
2360
+ "minLength": 1,
2361
+ "maxLength": 40
2362
+ },
2363
+ "keep": {
2364
+ "type": "boolean"
2365
+ }
2366
+ },
2367
+ "additionalProperties": false
2368
+ },
2369
+ "direction": {
2370
+ "type": "string",
2371
+ "enum": [
2372
+ "read",
2373
+ "both"
2374
+ ]
2375
+ },
2376
+ "conflicts": {
2377
+ "type": "string",
2378
+ "enum": [
2379
+ "report",
2380
+ "theirs",
2381
+ "ours"
2382
+ ]
2383
+ },
2384
+ "every": {
2385
+ "type": "integer",
2386
+ "minimum": 2,
2387
+ "maximum": 86400
2388
+ },
2389
+ "paused": {
2390
+ "type": "boolean"
2391
+ }
2392
+ },
2393
+ "required": [
2394
+ "system",
2395
+ "calendar",
2396
+ "kind",
2397
+ "fields",
2398
+ "direction"
2399
+ ],
2400
+ "additionalProperties": false
2401
+ }
1721
2402
  }
1722
2403
  },
1723
2404
  "required": [
@@ -1726,5 +2407,457 @@
1726
2407
  "name",
1727
2408
  "kinds"
1728
2409
  ],
1729
- "additionalProperties": false
2410
+ "additionalProperties": false,
2411
+ "$defs": {
2412
+ "ViewBlock": {
2413
+ "description": "A block from the closed set every view is written in: title, headline, list, text, badge, field, image, progress, group, when, divider, figure.",
2414
+ "anyOf": [
2415
+ {
2416
+ "type": "object",
2417
+ "properties": {
2418
+ "title": {
2419
+ "type": "string",
2420
+ "minLength": 1,
2421
+ "maxLength": 300,
2422
+ "description": "Words with {field} in braces, like \"{name}\" or \"{quote|money}\"."
2423
+ },
2424
+ "key": {
2425
+ "type": "string",
2426
+ "description": "What a face claims this block by."
2427
+ }
2428
+ },
2429
+ "required": [
2430
+ "title"
2431
+ ],
2432
+ "additionalProperties": false
2433
+ },
2434
+ {
2435
+ "type": "object",
2436
+ "properties": {
2437
+ "headline": {
2438
+ "type": "string",
2439
+ "minLength": 1,
2440
+ "maxLength": 300,
2441
+ "description": "Words with {field} in braces, like \"{name}\" or \"{quote|money}\"."
2442
+ },
2443
+ "key": {
2444
+ "type": "string",
2445
+ "description": "What a face claims this block by."
2446
+ }
2447
+ },
2448
+ "required": [
2449
+ "headline"
2450
+ ],
2451
+ "additionalProperties": false
2452
+ },
2453
+ {
2454
+ "type": "object",
2455
+ "properties": {
2456
+ "list": {
2457
+ "type": "string",
2458
+ "minLength": 1,
2459
+ "maxLength": 2000,
2460
+ "description": "A line of the rule language, like \"status == 'booked'\" or \"count(all('offer'))\"."
2461
+ },
2462
+ "sort": {
2463
+ "description": "A key read from each record, lowest first, or { \"by\": key, \"direction\": \"asc\" | \"desc\" | \"choices\" }.",
2464
+ "anyOf": [
2465
+ {
2466
+ "type": "string",
2467
+ "minLength": 1,
2468
+ "maxLength": 2000,
2469
+ "description": "A line of the rule language, like \"status == 'booked'\" or \"count(all('offer'))\"."
2470
+ },
2471
+ {
2472
+ "type": "object",
2473
+ "properties": {
2474
+ "by": {
2475
+ "type": "string",
2476
+ "minLength": 1,
2477
+ "maxLength": 2000,
2478
+ "description": "A line of the rule language, like \"status == 'booked'\" or \"count(all('offer'))\"."
2479
+ },
2480
+ "direction": {
2481
+ "enum": [
2482
+ "asc",
2483
+ "desc",
2484
+ "choices"
2485
+ ]
2486
+ }
2487
+ },
2488
+ "required": [
2489
+ "by"
2490
+ ],
2491
+ "additionalProperties": false
2492
+ }
2493
+ ]
2494
+ },
2495
+ "limit": {
2496
+ "type": "integer",
2497
+ "minimum": 1,
2498
+ "maximum": 1000
2499
+ },
2500
+ "group": {
2501
+ "description": "A choice field, or { \"by\": field, \"headings\": { choice: words } }.",
2502
+ "anyOf": [
2503
+ {
2504
+ "type": "string",
2505
+ "minLength": 1
2506
+ },
2507
+ {
2508
+ "type": "object",
2509
+ "properties": {
2510
+ "by": {
2511
+ "type": "string",
2512
+ "minLength": 1
2513
+ },
2514
+ "headings": {
2515
+ "type": "object",
2516
+ "additionalProperties": {
2517
+ "type": "string"
2518
+ }
2519
+ }
2520
+ },
2521
+ "required": [
2522
+ "by"
2523
+ ],
2524
+ "additionalProperties": false
2525
+ }
2526
+ ]
2527
+ },
2528
+ "empty": {
2529
+ "type": "string",
2530
+ "minLength": 1
2531
+ },
2532
+ "as": {
2533
+ "enum": [
2534
+ "card",
2535
+ "row"
2536
+ ]
2537
+ },
2538
+ "key": {
2539
+ "type": "string",
2540
+ "description": "What a face claims this block by."
2541
+ }
2542
+ },
2543
+ "required": [
2544
+ "list"
2545
+ ],
2546
+ "additionalProperties": false
2547
+ },
2548
+ {
2549
+ "type": "object",
2550
+ "properties": {
2551
+ "text": {
2552
+ "type": "string",
2553
+ "minLength": 1,
2554
+ "maxLength": 300,
2555
+ "description": "Words with {field} in braces, like \"{name}\" or \"{quote|money}\"."
2556
+ },
2557
+ "tone": {
2558
+ "description": "good, warn, bad, neutral, accent, or { \"expr\": … } that works one out.",
2559
+ "anyOf": [
2560
+ {
2561
+ "enum": [
2562
+ "good",
2563
+ "warn",
2564
+ "bad",
2565
+ "neutral",
2566
+ "accent"
2567
+ ]
2568
+ },
2569
+ {
2570
+ "type": "object",
2571
+ "properties": {
2572
+ "expr": {
2573
+ "type": "string",
2574
+ "minLength": 1,
2575
+ "maxLength": 2000,
2576
+ "description": "A line of the rule language, like \"status == 'booked'\" or \"count(all('offer'))\"."
2577
+ }
2578
+ },
2579
+ "required": [
2580
+ "expr"
2581
+ ],
2582
+ "additionalProperties": false
2583
+ }
2584
+ ]
2585
+ },
2586
+ "key": {
2587
+ "type": "string",
2588
+ "description": "What a face claims this block by."
2589
+ }
2590
+ },
2591
+ "required": [
2592
+ "text"
2593
+ ],
2594
+ "additionalProperties": false
2595
+ },
2596
+ {
2597
+ "type": "object",
2598
+ "properties": {
2599
+ "badge": {
2600
+ "type": "string",
2601
+ "minLength": 1,
2602
+ "maxLength": 300,
2603
+ "description": "Words with {field} in braces, like \"{name}\" or \"{quote|money}\"."
2604
+ },
2605
+ "tone": {
2606
+ "description": "good, warn, bad, neutral, accent, or { \"expr\": … } that works one out.",
2607
+ "anyOf": [
2608
+ {
2609
+ "enum": [
2610
+ "good",
2611
+ "warn",
2612
+ "bad",
2613
+ "neutral",
2614
+ "accent"
2615
+ ]
2616
+ },
2617
+ {
2618
+ "type": "object",
2619
+ "properties": {
2620
+ "expr": {
2621
+ "type": "string",
2622
+ "minLength": 1,
2623
+ "maxLength": 2000,
2624
+ "description": "A line of the rule language, like \"status == 'booked'\" or \"count(all('offer'))\"."
2625
+ }
2626
+ },
2627
+ "required": [
2628
+ "expr"
2629
+ ],
2630
+ "additionalProperties": false
2631
+ }
2632
+ ]
2633
+ },
2634
+ "key": {
2635
+ "type": "string",
2636
+ "description": "What a face claims this block by."
2637
+ }
2638
+ },
2639
+ "required": [
2640
+ "badge"
2641
+ ],
2642
+ "additionalProperties": false
2643
+ },
2644
+ {
2645
+ "type": "object",
2646
+ "properties": {
2647
+ "field": {
2648
+ "type": "string",
2649
+ "description": "A field of the record, drawn as it is declared."
2650
+ },
2651
+ "as": {
2652
+ "enum": [
2653
+ "money",
2654
+ "percent",
2655
+ "date",
2656
+ "relative",
2657
+ "count"
2658
+ ]
2659
+ },
2660
+ "currency": {
2661
+ "type": "string",
2662
+ "minLength": 1
2663
+ },
2664
+ "label": {
2665
+ "type": "string",
2666
+ "minLength": 1
2667
+ },
2668
+ "key": {
2669
+ "type": "string",
2670
+ "description": "What a face claims this block by."
2671
+ }
2672
+ },
2673
+ "required": [
2674
+ "field"
2675
+ ],
2676
+ "additionalProperties": false
2677
+ },
2678
+ {
2679
+ "type": "object",
2680
+ "properties": {
2681
+ "image": {
2682
+ "type": "string",
2683
+ "description": "A field holding pictures."
2684
+ },
2685
+ "as": {
2686
+ "enum": [
2687
+ "thumb",
2688
+ "gallery"
2689
+ ]
2690
+ },
2691
+ "label": {
2692
+ "type": "string",
2693
+ "minLength": 1
2694
+ },
2695
+ "key": {
2696
+ "type": "string",
2697
+ "description": "What a face claims this block by."
2698
+ }
2699
+ },
2700
+ "required": [
2701
+ "image"
2702
+ ],
2703
+ "additionalProperties": false
2704
+ },
2705
+ {
2706
+ "type": "object",
2707
+ "properties": {
2708
+ "progress": {
2709
+ "type": "object",
2710
+ "properties": {
2711
+ "value": {
2712
+ "type": "string",
2713
+ "minLength": 1,
2714
+ "maxLength": 2000,
2715
+ "description": "A line of the rule language, like \"status == 'booked'\" or \"count(all('offer'))\"."
2716
+ },
2717
+ "max": {
2718
+ "type": "string",
2719
+ "minLength": 1,
2720
+ "maxLength": 2000,
2721
+ "description": "A line of the rule language, like \"status == 'booked'\" or \"count(all('offer'))\"."
2722
+ }
2723
+ },
2724
+ "required": [
2725
+ "value",
2726
+ "max"
2727
+ ],
2728
+ "additionalProperties": false
2729
+ },
2730
+ "label": {
2731
+ "type": "string",
2732
+ "minLength": 1
2733
+ },
2734
+ "key": {
2735
+ "type": "string",
2736
+ "description": "What a face claims this block by."
2737
+ }
2738
+ },
2739
+ "required": [
2740
+ "progress"
2741
+ ],
2742
+ "additionalProperties": false
2743
+ },
2744
+ {
2745
+ "type": "object",
2746
+ "properties": {
2747
+ "group": {
2748
+ "description": "The blocks drawn together.",
2749
+ "type": "array",
2750
+ "items": {
2751
+ "$ref": "#/$defs/ViewBlock"
2752
+ }
2753
+ },
2754
+ "direction": {
2755
+ "enum": [
2756
+ "row",
2757
+ "column"
2758
+ ]
2759
+ },
2760
+ "key": {
2761
+ "type": "string",
2762
+ "description": "What a face claims this block by."
2763
+ }
2764
+ },
2765
+ "required": [
2766
+ "group"
2767
+ ],
2768
+ "additionalProperties": false
2769
+ },
2770
+ {
2771
+ "type": "object",
2772
+ "properties": {
2773
+ "when": {
2774
+ "type": "string",
2775
+ "minLength": 1,
2776
+ "maxLength": 2000,
2777
+ "description": "A line of the rule language, like \"status == 'booked'\" or \"count(all('offer'))\"."
2778
+ },
2779
+ "show": {
2780
+ "description": "The blocks shown while the expression holds.",
2781
+ "type": "array",
2782
+ "items": {
2783
+ "$ref": "#/$defs/ViewBlock"
2784
+ }
2785
+ },
2786
+ "key": {
2787
+ "type": "string",
2788
+ "description": "What a face claims this block by."
2789
+ }
2790
+ },
2791
+ "required": [
2792
+ "when",
2793
+ "show"
2794
+ ],
2795
+ "additionalProperties": false
2796
+ },
2797
+ {
2798
+ "type": "object",
2799
+ "properties": {
2800
+ "divider": {
2801
+ "const": true
2802
+ },
2803
+ "key": {
2804
+ "type": "string",
2805
+ "description": "What a face claims this block by."
2806
+ }
2807
+ },
2808
+ "required": [
2809
+ "divider"
2810
+ ],
2811
+ "additionalProperties": false
2812
+ },
2813
+ {
2814
+ "type": "object",
2815
+ "properties": {
2816
+ "figure": {
2817
+ "description": "An expression for a number worked out, or true for the kind's picture: {\"figure\": true}.",
2818
+ "anyOf": [
2819
+ {
2820
+ "type": "string",
2821
+ "minLength": 1,
2822
+ "maxLength": 2000,
2823
+ "description": "A line of the rule language, like \"status == 'booked'\" or \"count(all('offer'))\"."
2824
+ },
2825
+ {
2826
+ "const": true
2827
+ }
2828
+ ]
2829
+ },
2830
+ "as": {
2831
+ "enum": [
2832
+ "number",
2833
+ "money",
2834
+ "percent"
2835
+ ]
2836
+ },
2837
+ "currency": {
2838
+ "type": "string",
2839
+ "minLength": 1
2840
+ },
2841
+ "label": {
2842
+ "type": "string",
2843
+ "minLength": 1
2844
+ },
2845
+ "emphasis": {
2846
+ "enum": [
2847
+ "large"
2848
+ ]
2849
+ },
2850
+ "key": {
2851
+ "type": "string",
2852
+ "description": "What a face claims this block by."
2853
+ }
2854
+ },
2855
+ "required": [
2856
+ "figure"
2857
+ ],
2858
+ "additionalProperties": false
2859
+ }
2860
+ ]
2861
+ }
2862
+ }
1730
2863
  }