@refrakt-md/runes 0.33.0 → 0.35.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 (305) hide show
  1. package/dist/aggregate-resolve.d.ts.map +1 -1
  2. package/dist/aggregate-resolve.js +18 -4
  3. package/dist/aggregate-resolve.js.map +1 -1
  4. package/dist/attributes.d.ts +15 -0
  5. package/dist/attributes.d.ts.map +1 -1
  6. package/dist/attributes.js +22 -7
  7. package/dist/attributes.js.map +1 -1
  8. package/dist/collection-helpers.d.ts.map +1 -1
  9. package/dist/collection-helpers.js +1 -1
  10. package/dist/collection-helpers.js.map +1 -1
  11. package/dist/collection-resolve.d.ts.map +1 -1
  12. package/dist/collection-resolve.js +31 -8
  13. package/dist/collection-resolve.js.map +1 -1
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +218 -77
  16. package/dist/config.js.map +1 -1
  17. package/dist/data-adapters.d.ts.map +1 -1
  18. package/dist/data-adapters.js +28 -11
  19. package/dist/data-adapters.js.map +1 -1
  20. package/dist/data-emit.d.ts.map +1 -1
  21. package/dist/data-emit.js.map +1 -1
  22. package/dist/data-pipeline.d.ts.map +1 -1
  23. package/dist/data-pipeline.js +45 -12
  24. package/dist/data-pipeline.js.map +1 -1
  25. package/dist/data-projection.d.ts.map +1 -1
  26. package/dist/data-projection.js +4 -3
  27. package/dist/data-projection.js.map +1 -1
  28. package/dist/data-resolve.d.ts.map +1 -1
  29. package/dist/data-resolve.js +5 -2
  30. package/dist/data-resolve.js.map +1 -1
  31. package/dist/documents/page.d.ts.map +1 -1
  32. package/dist/documents/page.js.map +1 -1
  33. package/dist/drawer-pipeline.d.ts.map +1 -1
  34. package/dist/drawer-pipeline.js +3 -2
  35. package/dist/drawer-pipeline.js.map +1 -1
  36. package/dist/expand-pipeline.d.ts.map +1 -1
  37. package/dist/expand-pipeline.js +3 -3
  38. package/dist/expand-pipeline.js.map +1 -1
  39. package/dist/fence-escape.d.ts.map +1 -1
  40. package/dist/fence-escape.js +1 -3
  41. package/dist/fence-escape.js.map +1 -1
  42. package/dist/field-match.d.ts.map +1 -1
  43. package/dist/field-match.js.map +1 -1
  44. package/dist/file-ref-resolve.js +6 -4
  45. package/dist/file-ref-resolve.js.map +1 -1
  46. package/dist/fixtures.js +2 -2
  47. package/dist/fixtures.js.map +1 -1
  48. package/dist/functions.d.ts.map +1 -1
  49. package/dist/functions.js +16 -3
  50. package/dist/functions.js.map +1 -1
  51. package/dist/include-pipeline.d.ts.map +1 -1
  52. package/dist/include-pipeline.js +3 -1
  53. package/dist/include-pipeline.js.map +1 -1
  54. package/dist/index.d.ts +95 -37
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +273 -60
  57. package/dist/index.js.map +1 -1
  58. package/dist/interfaces.d.ts.map +1 -1
  59. package/dist/interfaces.js.map +1 -1
  60. package/dist/layouts/grid.d.ts +2 -2
  61. package/dist/layouts/grid.d.ts.map +1 -1
  62. package/dist/layouts/grid.js +4 -6
  63. package/dist/layouts/grid.js.map +1 -1
  64. package/dist/lib/component.d.ts.map +1 -1
  65. package/dist/lib/component.js +7 -7
  66. package/dist/lib/component.js.map +1 -1
  67. package/dist/lib/icon-resolve.d.ts.map +1 -1
  68. package/dist/lib/icon-resolve.js.map +1 -1
  69. package/dist/lib/image-schemes.js +2 -2
  70. package/dist/lib/image-schemes.js.map +1 -1
  71. package/dist/lib/index.d.ts +29 -1
  72. package/dist/lib/index.d.ts.map +1 -1
  73. package/dist/lib/index.js +298 -51
  74. package/dist/lib/index.js.map +1 -1
  75. package/dist/lib/node.d.ts.map +1 -1
  76. package/dist/lib/node.js +3 -2
  77. package/dist/lib/node.js.map +1 -1
  78. package/dist/lib/placeholder.d.ts.map +1 -1
  79. package/dist/lib/placeholder.js +6 -9
  80. package/dist/lib/placeholder.js.map +1 -1
  81. package/dist/lib/read-file.d.ts.map +1 -1
  82. package/dist/lib/read-file.js.map +1 -1
  83. package/dist/lib/renderable.d.ts.map +1 -1
  84. package/dist/lib/renderable.js +5 -5
  85. package/dist/lib/renderable.js.map +1 -1
  86. package/dist/lib/resolver.d.ts.map +1 -1
  87. package/dist/lib/resolver.js +42 -36
  88. package/dist/lib/resolver.js.map +1 -1
  89. package/dist/lib/schema-table.d.ts +176 -0
  90. package/dist/lib/schema-table.d.ts.map +1 -0
  91. package/dist/lib/schema-table.js +427 -0
  92. package/dist/lib/schema-table.js.map +1 -0
  93. package/dist/lib/svg.d.ts.map +1 -1
  94. package/dist/lib/svg.js.map +1 -1
  95. package/dist/nodes.d.ts.map +1 -1
  96. package/dist/nodes.js +9 -11
  97. package/dist/nodes.js.map +1 -1
  98. package/dist/outline-scope.js +1 -3
  99. package/dist/outline-scope.js.map +1 -1
  100. package/dist/plugins.d.ts.map +1 -1
  101. package/dist/plugins.js +13 -10
  102. package/dist/plugins.js.map +1 -1
  103. package/dist/reference.d.ts +33 -0
  104. package/dist/reference.d.ts.map +1 -1
  105. package/dist/reference.js +60 -23
  106. package/dist/reference.js.map +1 -1
  107. package/dist/relationships-resolve.d.ts.map +1 -1
  108. package/dist/relationships-resolve.js +31 -7
  109. package/dist/relationships-resolve.js.map +1 -1
  110. package/dist/rune.d.ts +0 -2
  111. package/dist/rune.d.ts.map +1 -1
  112. package/dist/rune.js +0 -1
  113. package/dist/rune.js.map +1 -1
  114. package/dist/sandbox-sources.js +6 -6
  115. package/dist/sandbox-sources.js.map +1 -1
  116. package/dist/schema-row.d.ts +89 -0
  117. package/dist/schema-row.d.ts.map +1 -0
  118. package/dist/schema-row.js +78 -0
  119. package/dist/schema-row.js.map +1 -0
  120. package/dist/seo.d.ts +9 -0
  121. package/dist/seo.d.ts.map +1 -1
  122. package/dist/seo.js +88 -11
  123. package/dist/seo.js.map +1 -1
  124. package/dist/snippet-pipeline.d.ts.map +1 -1
  125. package/dist/snippet-pipeline.js +1 -1
  126. package/dist/snippet-pipeline.js.map +1 -1
  127. package/dist/tags/accordion.d.ts +58 -0
  128. package/dist/tags/accordion.d.ts.map +1 -1
  129. package/dist/tags/accordion.js +69 -23
  130. package/dist/tags/accordion.js.map +1 -1
  131. package/dist/tags/aggregate.d.ts.map +1 -1
  132. package/dist/tags/aggregate.js +65 -10
  133. package/dist/tags/aggregate.js.map +1 -1
  134. package/dist/tags/annotate.d.ts.map +1 -1
  135. package/dist/tags/annotate.js +12 -9
  136. package/dist/tags/annotate.js.map +1 -1
  137. package/dist/tags/badge.d.ts.map +1 -1
  138. package/dist/tags/badge.js.map +1 -1
  139. package/dist/tags/bar.d.ts.map +1 -1
  140. package/dist/tags/bar.js +3 -7
  141. package/dist/tags/bar.js.map +1 -1
  142. package/dist/tags/bg.d.ts.map +1 -1
  143. package/dist/tags/bg.js +60 -12
  144. package/dist/tags/bg.js.map +1 -1
  145. package/dist/tags/blog.d.ts.map +1 -1
  146. package/dist/tags/blog.js +43 -10
  147. package/dist/tags/blog.js.map +1 -1
  148. package/dist/tags/breadcrumb.d.ts +30 -0
  149. package/dist/tags/breadcrumb.d.ts.map +1 -1
  150. package/dist/tags/breadcrumb.js +57 -28
  151. package/dist/tags/breadcrumb.js.map +1 -1
  152. package/dist/tags/budget.d.ts.map +1 -1
  153. package/dist/tags/budget.js +60 -16
  154. package/dist/tags/budget.js.map +1 -1
  155. package/dist/tags/card.d.ts.map +1 -1
  156. package/dist/tags/card.js +24 -6
  157. package/dist/tags/card.js.map +1 -1
  158. package/dist/tags/chart.d.ts.map +1 -1
  159. package/dist/tags/chart.js +33 -11
  160. package/dist/tags/chart.js.map +1 -1
  161. package/dist/tags/codegroup.d.ts.map +1 -1
  162. package/dist/tags/codegroup.js +39 -21
  163. package/dist/tags/codegroup.js.map +1 -1
  164. package/dist/tags/collection.d.ts.map +1 -1
  165. package/dist/tags/collection.js +55 -9
  166. package/dist/tags/collection.js.map +1 -1
  167. package/dist/tags/common.d.ts.map +1 -1
  168. package/dist/tags/common.js +34 -9
  169. package/dist/tags/common.js.map +1 -1
  170. package/dist/tags/compare.d.ts.map +1 -1
  171. package/dist/tags/compare.js +26 -14
  172. package/dist/tags/compare.js.map +1 -1
  173. package/dist/tags/conversation.d.ts.map +1 -1
  174. package/dist/tags/conversation.js +19 -17
  175. package/dist/tags/conversation.js.map +1 -1
  176. package/dist/tags/data.d.ts.map +1 -1
  177. package/dist/tags/data.js +67 -13
  178. package/dist/tags/data.js.map +1 -1
  179. package/dist/tags/datatable.d.ts.map +1 -1
  180. package/dist/tags/datatable.js +27 -8
  181. package/dist/tags/datatable.js.map +1 -1
  182. package/dist/tags/deflist.d.ts.map +1 -1
  183. package/dist/tags/deflist.js +5 -11
  184. package/dist/tags/deflist.js.map +1 -1
  185. package/dist/tags/details.d.ts.map +1 -1
  186. package/dist/tags/details.js +8 -5
  187. package/dist/tags/details.js.map +1 -1
  188. package/dist/tags/diagram.d.ts.map +1 -1
  189. package/dist/tags/diagram.js +9 -5
  190. package/dist/tags/diagram.js.map +1 -1
  191. package/dist/tags/diff.d.ts.map +1 -1
  192. package/dist/tags/diff.js +43 -24
  193. package/dist/tags/diff.js.map +1 -1
  194. package/dist/tags/drawer.d.ts.map +1 -1
  195. package/dist/tags/drawer.js +4 -6
  196. package/dist/tags/drawer.js.map +1 -1
  197. package/dist/tags/embed.d.ts +8 -0
  198. package/dist/tags/embed.d.ts.map +1 -1
  199. package/dist/tags/embed.js +28 -10
  200. package/dist/tags/embed.js.map +1 -1
  201. package/dist/tags/expand.d.ts.map +1 -1
  202. package/dist/tags/expand.js.map +1 -1
  203. package/dist/tags/figure.d.ts +7 -0
  204. package/dist/tags/figure.d.ts.map +1 -1
  205. package/dist/tags/figure.js +42 -13
  206. package/dist/tags/figure.js.map +1 -1
  207. package/dist/tags/file-ref.d.ts.map +1 -1
  208. package/dist/tags/file-ref.js.map +1 -1
  209. package/dist/tags/form.d.ts.map +1 -1
  210. package/dist/tags/form.js +52 -25
  211. package/dist/tags/form.js.map +1 -1
  212. package/dist/tags/gallery.d.ts.map +1 -1
  213. package/dist/tags/gallery.js +33 -12
  214. package/dist/tags/gallery.js.map +1 -1
  215. package/dist/tags/grid.d.ts.map +1 -1
  216. package/dist/tags/grid.js +57 -14
  217. package/dist/tags/grid.js.map +1 -1
  218. package/dist/tags/hint.d.ts.map +1 -1
  219. package/dist/tags/hint.js +9 -5
  220. package/dist/tags/hint.js.map +1 -1
  221. package/dist/tags/icon.d.ts.map +1 -1
  222. package/dist/tags/icon.js +5 -1
  223. package/dist/tags/icon.js.map +1 -1
  224. package/dist/tags/include.d.ts.map +1 -1
  225. package/dist/tags/include.js +1 -1
  226. package/dist/tags/include.js.map +1 -1
  227. package/dist/tags/juxtapose.d.ts.map +1 -1
  228. package/dist/tags/juxtapose.js +32 -14
  229. package/dist/tags/juxtapose.js.map +1 -1
  230. package/dist/tags/layout.d.ts.map +1 -1
  231. package/dist/tags/layout.js +7 -4
  232. package/dist/tags/layout.js.map +1 -1
  233. package/dist/tags/mediatext.d.ts.map +1 -1
  234. package/dist/tags/mediatext.js +19 -8
  235. package/dist/tags/mediatext.js.map +1 -1
  236. package/dist/tags/nav.d.ts.map +1 -1
  237. package/dist/tags/nav.js +43 -23
  238. package/dist/tags/nav.js.map +1 -1
  239. package/dist/tags/pagination.d.ts.map +1 -1
  240. package/dist/tags/pagination.js +27 -5
  241. package/dist/tags/pagination.js.map +1 -1
  242. package/dist/tags/progress.d.ts.map +1 -1
  243. package/dist/tags/progress.js +25 -5
  244. package/dist/tags/progress.js.map +1 -1
  245. package/dist/tags/pullquote.d.ts.map +1 -1
  246. package/dist/tags/pullquote.js +16 -9
  247. package/dist/tags/pullquote.js.map +1 -1
  248. package/dist/tags/region.d.ts.map +1 -1
  249. package/dist/tags/region.js +9 -4
  250. package/dist/tags/region.js.map +1 -1
  251. package/dist/tags/relationships.d.ts.map +1 -1
  252. package/dist/tags/relationships.js +55 -9
  253. package/dist/tags/relationships.js.map +1 -1
  254. package/dist/tags/reveal.d.ts.map +1 -1
  255. package/dist/tags/reveal.js +16 -7
  256. package/dist/tags/reveal.js.map +1 -1
  257. package/dist/tags/sandbox.d.ts.map +1 -1
  258. package/dist/tags/sandbox.js +104 -44
  259. package/dist/tags/sandbox.js.map +1 -1
  260. package/dist/tags/section.d.ts.map +1 -1
  261. package/dist/tags/section.js +13 -3
  262. package/dist/tags/section.js.map +1 -1
  263. package/dist/tags/showcase.d.ts.map +1 -1
  264. package/dist/tags/showcase.js +33 -11
  265. package/dist/tags/showcase.js.map +1 -1
  266. package/dist/tags/sidenote.d.ts.map +1 -1
  267. package/dist/tags/sidenote.js +9 -5
  268. package/dist/tags/sidenote.js.map +1 -1
  269. package/dist/tags/snippet.d.ts.map +1 -1
  270. package/dist/tags/snippet.js.map +1 -1
  271. package/dist/tags/tabs.d.ts.map +1 -1
  272. package/dist/tags/tabs.js +16 -9
  273. package/dist/tags/tabs.js.map +1 -1
  274. package/dist/tags/textblock.d.ts.map +1 -1
  275. package/dist/tags/textblock.js +9 -5
  276. package/dist/tags/textblock.js.map +1 -1
  277. package/dist/tags/tint.d.ts +1 -1
  278. package/dist/tags/tint.d.ts.map +1 -1
  279. package/dist/tags/tint.js +14 -2
  280. package/dist/tags/tint.js.map +1 -1
  281. package/dist/tags/toc.d.ts.map +1 -1
  282. package/dist/tags/toc.js +16 -7
  283. package/dist/tags/toc.js.map +1 -1
  284. package/dist/tags/xref.d.ts.map +1 -1
  285. package/dist/tags/xref.js.map +1 -1
  286. package/dist/universal-attributes.d.ts.map +1 -1
  287. package/dist/universal-attributes.js +28 -5
  288. package/dist/universal-attributes.js.map +1 -1
  289. package/dist/util.d.ts.map +1 -1
  290. package/dist/util.js +4 -4
  291. package/dist/util.js.map +1 -1
  292. package/dist/xref-patterns.js +1 -1
  293. package/dist/xref-patterns.js.map +1 -1
  294. package/dist/xref-preview-resolve.js +3 -4
  295. package/dist/xref-preview-resolve.js.map +1 -1
  296. package/dist/xref-resolve.d.ts.map +1 -1
  297. package/dist/xref-resolve.js +4 -4
  298. package/dist/xref-resolve.js.map +1 -1
  299. package/i18n/de.json +67 -67
  300. package/i18n/en.json +67 -67
  301. package/package.json +3 -3
  302. package/dist/tags/error.d.ts +0 -3
  303. package/dist/tags/error.d.ts.map +0 -1
  304. package/dist/tags/error.js +0 -34
  305. package/dist/tags/error.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,7 +1,6 @@
1
- import { heading, paragraph, fence, list, item, em, strong, text, link, hardbreak, image, table, td } from './nodes.js';
1
+ import { heading, paragraph, fence, list, item, em, strong, text, link, hardbreak, image, table, td, } from './nodes.js';
2
2
  export { Page } from './documents/page.js';
3
3
  import { DocPage } from './documents/doc.js';
4
- import { error } from './tags/error.js';
5
4
  import { grid } from './tags/grid.js';
6
5
  import { codegroup } from './tags/codegroup.js';
7
6
  import { snippet } from './tags/snippet.js';
@@ -63,18 +62,25 @@ import Markdoc from '@markdoc/markdoc';
63
62
  import { defineRune, runeTagMap } from './rune.js';
64
63
  export * from './interfaces.js';
65
64
  export { Rune, defineRune, runeTagMap } from './rune.js';
65
+ /** Custom Markdoc attribute types. Exported since SPEC-132, which is the first
66
+ * release in which their `validate()` runs in a build at all — `transform()`
67
+ * never invoked it, only `Markdoc.validate()` does. `plugins/media` carries its
68
+ * own copies of these classes, which is what an unexported utility tends to
69
+ * produce. */
70
+ export { SeparatedString, CommaSeparatedList, SpaceSeparatedList, SpaceSeparatedNumberList, } from './attributes.js';
66
71
  export { RenderableNodeCursor } from './lib/renderable.js';
67
- export { createContentModelSchema, createComponentRenderable, asNodes, schemaContentModels, schemaRuneStructures, declareUniversalPosture, sanitizeSandboxContent } from './lib/index.js';
72
+ export { createContentModelSchema, createComponentRenderable, asNodes, schemaContentModels, schemaRuneStructures, declareUniversalPosture, sanitizeSandboxContent, schemaTables, applySchemaTable, validateSchemaTable, SCHEMA_TYPE_EXPLICIT, selectRow, findByName, } from './lib/index.js';
73
+ export { describeSchemaRow, bySchemaProperty, collectSchemaRows, tableFor } from './schema-row.js';
68
74
  // SPEC-125 Phase 3 — the declared rule for universal-attribute availability
69
- export { resolveUniversalAttributes, AXIS_ATTRIBUTES, POSTURE_REASONS } from './universal-attributes.js';
75
+ export { resolveUniversalAttributes, AXIS_ATTRIBUTES, POSTURE_REASONS, } from './universal-attributes.js';
70
76
  export { describeSchemaUniversals, UNRECORDED_REASON } from './schema-universals.js';
71
- export { resolve, resolveSequence, resolveDelimited, resolveContentModel, resolveListItems, evaluateCondition, matchesType } from './lib/resolver.js';
77
+ export { resolve, resolveSequence, resolveDelimited, resolveContentModel, resolveListItems, evaluateCondition, matchesType, } from './lib/resolver.js';
72
78
  export { registerImageScheme, resolveImageScheme, hasImageScheme } from './lib/image-schemes.js';
73
79
  export { resolveIcon, splitIconName } from './lib/icon-resolve.js';
74
- export { placeholderSvg, PLACEHOLDER_SHAPES, DEFAULT_PLACEHOLDER_SHAPE } from './lib/placeholder.js';
80
+ export { placeholderSvg, PLACEHOLDER_SHAPES, DEFAULT_PLACEHOLDER_SHAPE, } from './lib/placeholder.js';
75
81
  export { FIXTURE_ROLES, splitFixture, parseFixtureFilename, validateFixtureFrontmatter, parseFixture, } from './fixtures.js';
76
- export { parseFieldMatch, matchesFieldMatch, matchesFilterExpr, resolveEntityField } from './field-match.js';
77
- export { DEFERRED_BODY_ATTR, captureDeferredBodies, readDeferredBody, transformDeferredTemplate } from './deferred-body.js';
82
+ export { parseFieldMatch, matchesFieldMatch, matchesFilterExpr, resolveEntityField, } from './field-match.js';
83
+ export { DEFERRED_BODY_ATTR, captureDeferredBodies, readDeferredBody, transformDeferredTemplate, } from './deferred-body.js';
78
84
  export { resolveCollections } from './collection-resolve.js';
79
85
  export { resolveRelationships } from './relationships-resolve.js';
80
86
  export { resolveAggregates } from './aggregate-resolve.js';
@@ -88,8 +94,8 @@ export { hoistPreviewDrawers, registerHoistBuilder, getHoistBuilder, pathToSlug,
88
94
  export { Ordering, buildOrdering, sortEntities, groupEntities, groupBy, entityUrl, entityTitle, fieldValue, titleLink, projectItem, renderItemTemplate, } from './collection-helpers.js';
89
95
  export { COLLECTION_SENTINEL } from './tags/collection.js';
90
96
  export { functions, currency, date, number, join, concat, humanize } from './functions.js';
91
- export { linkItem, pageSectionProperties, buildLayoutMetas, splitMediaBodyFooter, extractMediaImage, unwrapParagraphImages, isMediaNode, isSchemeMediaNode, name as nameHelper, description as descriptionHelper, SplitablePageSectionModel, SplitLayoutModel, splitLayoutAttributes } from './tags/common.js';
92
- export { extractHeadings, firstH1, headingsToList, headingSlug, headingText, renderableText } from './util.js';
97
+ export { linkItem, pageSectionProperties, buildLayoutMetas, splitMediaBodyFooter, extractMediaImage, unwrapParagraphImages, isMediaNode, isSchemeMediaNode, name as nameHelper, description as descriptionHelper, SplitablePageSectionModel, SplitLayoutModel, splitLayoutAttributes, } from './tags/common.js';
98
+ export { extractHeadings, firstH1, headingsToList, headingSlug, headingText, renderableText, } from './util.js';
93
99
  export { LANG_MAP, FALLBACK_LANG, inferLanguage } from './lang-map.js';
94
100
  export { extractSeo, collectJsonLd, textContent } from './seo.js';
95
101
  export { serialize, serializeTree } from './serialize.js';
@@ -97,9 +103,9 @@ export { RUNE_EXAMPLES, RUNE_FIXTURE_META } from './examples.js';
97
103
  export { describeRune, renderContentModel, serializeContentModel, stripContentModel, hydrateRuneInfo, hydrateAllRuneInfos, hydrateRuneByName, serializeRune, groupReferenceInfos, renderReferenceMarkdown, EXCLUDED_RUNES, HIDDEN_ATTRIBUTES, } from './reference.js';
98
104
  export { registerAttributePreset, lookupAttributePreset, schemaBasePresets, UNIVERSAL_ATTRIBUTE_NAMES, } from './attribute-presets.js';
99
105
  export { LAYOUT, CANONICAL_LAYOUTS, layoutMatches } from './layout-vocabulary.js';
100
- export { READING_REGISTERS, DEFAULT_READING, READING_CAPABILITIES, resolveReading, coerceRegister } from '@refrakt-md/transform';
101
- export { loadPlugin, mergePlugins, applyAliases, loadLocalRunes, discoverPluginFixtures, discoverPluginFixtureManifest, assertFileRootNamespaceAllowed } from './plugins.js';
102
- export { coreConfig, baseConfig, corePipelineHooks, createCorePipelineHooks, resolveCoreSentinels } from './config.js';
106
+ export { READING_REGISTERS, DEFAULT_READING, READING_CAPABILITIES, resolveReading, coerceRegister, } from '@refrakt-md/transform';
107
+ export { loadPlugin, mergePlugins, applyAliases, loadLocalRunes, discoverPluginFixtures, discoverPluginFixtureManifest, assertFileRootNamespaceAllowed, } from './plugins.js';
108
+ export { coreConfig, baseConfig, corePipelineHooks, createCorePipelineHooks, resolveCoreSentinels, } from './config.js';
103
109
  // SPEC-035 — first-party core translation bundles (generated from i18n/*.json).
104
110
  export { coreTranslations } from './translations.generated.js';
105
111
  export { BREADCRUMB_AUTO_SENTINEL } from './tags/breadcrumb.js';
@@ -120,7 +126,14 @@ export const runes = {
120
126
  description: 'Navigation structure with page slug references and optional grouping',
121
127
  typeName: 'Nav',
122
128
  category: 'Site',
123
- snippet: ['{% nav %}', '## ${1:Section}', '', '- ${2:page-slug}', '- ${3:another-page}', '{% /nav %}'],
129
+ snippet: [
130
+ '{% nav %}',
131
+ '## ${1:Section}',
132
+ '',
133
+ '- ${2:page-slug}',
134
+ '- ${3:another-page}',
135
+ '{% /nav %}',
136
+ ],
124
137
  }),
125
138
  region: defineRune({
126
139
  name: 'region',
@@ -133,7 +146,13 @@ export const runes = {
133
146
  schema: layout,
134
147
  description: 'Layout definition containing named regions',
135
148
  category: 'Site',
136
- snippet: ['{% layout %}', '{% region name="${1:header}" %}', '$0', '{% /region %}', '{% /layout %}'],
149
+ snippet: [
150
+ '{% layout %}',
151
+ '{% region name="${1:header}" %}',
152
+ '$0',
153
+ '{% /region %}',
154
+ '{% /layout %}',
155
+ ],
137
156
  }),
138
157
  codegroup: defineRune({
139
158
  name: 'codegroup',
@@ -141,14 +160,17 @@ export const runes = {
141
160
  description: 'Tabbed code block with language tabs',
142
161
  typeName: 'CodeGroup',
143
162
  category: 'Code & Data',
144
- snippet: ['{% codegroup %}', '```${1:js}', '$0', '```', '', '```${2:ts}', '', '```', '{% /codegroup %}'],
145
- }),
146
- error: defineRune({
147
- name: 'error',
148
- schema: error,
149
- description: 'Error reporting table',
150
- typeName: 'Error',
151
- category: 'Semantic',
163
+ snippet: [
164
+ '{% codegroup %}',
165
+ '```${1:js}',
166
+ '$0',
167
+ '```',
168
+ '',
169
+ '```${2:ts}',
170
+ '',
171
+ '```',
172
+ '{% /codegroup %}',
173
+ ],
152
174
  }),
153
175
  grid: defineRune({
154
176
  name: 'grid',
@@ -157,7 +179,15 @@ export const runes = {
157
179
  description: 'Grid layout container with configurable columns and rows',
158
180
  typeName: 'Grid',
159
181
  category: 'Layout',
160
- snippet: ['{% grid columns=${1:2} %}', '${2:First column content}', '', '---', '', '${3:Second column content}', '{% /grid %}'],
182
+ snippet: [
183
+ '{% grid columns=${1:2} %}',
184
+ '${2:First column content}',
185
+ '',
186
+ '---',
187
+ '',
188
+ '${3:Second column content}',
189
+ '{% /grid %}',
190
+ ],
161
191
  }),
162
192
  hint: defineRune({
163
193
  name: 'hint',
@@ -180,7 +210,17 @@ export const runes = {
180
210
  description: 'Tabbed interface with tab panels',
181
211
  typeName: 'TabGroup',
182
212
  category: 'Layout',
183
- snippet: ['{% tabs %}', '## ${1:Tab One}', '', '${2:Content for tab one.}', '', '## ${3:Tab Two}', '', '${4:Content for tab two.}', '{% /tabs %}'],
213
+ snippet: [
214
+ '{% tabs %}',
215
+ '## ${1:Tab One}',
216
+ '',
217
+ '${2:Content for tab one.}',
218
+ '',
219
+ '## ${3:Tab Two}',
220
+ '',
221
+ '${4:Content for tab two.}',
222
+ '{% /tabs %}',
223
+ ],
184
224
  }),
185
225
  details: defineRune({
186
226
  name: 'details',
@@ -196,25 +236,41 @@ export const runes = {
196
236
  description: 'Modal side panel addressed by id. Triggered by xrefs anywhere on the page; falls back to in-flow rendering without JS.',
197
237
  typeName: 'Drawer',
198
238
  category: 'Layout',
199
- snippet: ['{% drawer id="${1:auth-explainer}" title="${2:Auth system}" %}', '$0', '{% /drawer %}'],
239
+ snippet: [
240
+ '{% drawer id="${1:auth-explainer}" title="${2:Auth system}" %}',
241
+ '$0',
242
+ '{% /drawer %}',
243
+ ],
200
244
  }),
201
245
  figure: defineRune({
202
246
  name: 'figure',
203
247
  schema: figure,
204
248
  description: 'Enhanced image with caption, attribution, and sizing',
205
249
  seoType: 'ImageObject',
206
- typeName: 'Figure', schemaOrgType: 'ImageObject',
250
+ typeName: 'Figure',
207
251
  category: 'Content',
208
- snippet: ['{% figure size="${1|medium,small,large,full|}" %}', '![${2:Alt text}](${3:/path/to/image.png})', '', '${4:Caption text}', '{% /figure %}'],
252
+ snippet: [
253
+ '{% figure size="${1|medium,small,large,full|}" %}',
254
+ '![${2:Alt text}](${3:/path/to/image.png})',
255
+ '',
256
+ '${4:Caption text}',
257
+ '{% /figure %}',
258
+ ],
209
259
  }),
210
260
  gallery: defineRune({
211
261
  name: 'gallery',
212
262
  schema: gallery,
213
263
  description: 'Multi-image container with grid, carousel, or masonry layout and optional lightbox',
214
264
  seoType: 'ImageGallery',
215
- typeName: 'Gallery', schemaOrgType: 'ImageGallery',
265
+ typeName: 'Gallery',
216
266
  category: 'Content',
217
- snippet: ['{% gallery layout="${1|grid,carousel,masonry|}" %}', '![${2:Alt text}](${3:/path/to/image1.png})', '', '![${4:Alt text}](${5:/path/to/image2.png})', '{% /gallery %}'],
267
+ snippet: [
268
+ '{% gallery layout="${1|grid,carousel,masonry|}" %}',
269
+ '![${2:Alt text}](${3:/path/to/image1.png})',
270
+ '',
271
+ '![${4:Alt text}](${5:/path/to/image2.png})',
272
+ '{% /gallery %}',
273
+ ],
218
274
  }),
219
275
  accordion: defineRune({
220
276
  name: 'accordion',
@@ -222,15 +278,25 @@ export const runes = {
222
278
  schema: accordion,
223
279
  description: 'Collapsible accordion sections where headings become toggleable headers',
224
280
  seoType: 'FAQPage',
225
- typeName: 'Accordion', schemaOrgType: 'FAQPage',
281
+ typeName: 'Accordion',
226
282
  category: 'Layout',
227
- snippet: ['{% accordion %}', '## ${1:First Question}', '', '${2:Answer to the first question.}', '', '## ${3:Second Question}', '', '${4:Answer to the second question.}', '{% /accordion %}'],
283
+ snippet: [
284
+ '{% accordion %}',
285
+ '## ${1:First Question}',
286
+ '',
287
+ '${2:Answer to the first question.}',
288
+ '',
289
+ '## ${3:Second Question}',
290
+ '',
291
+ '${4:Answer to the second question.}',
292
+ '{% /accordion %}',
293
+ ],
228
294
  }),
229
295
  'accordion-item': defineRune({
230
296
  name: 'accordion-item',
231
297
  schema: accordionItem,
232
298
  description: 'Individual accordion section',
233
- typeName: 'AccordionItem', schemaOrgType: 'Question',
299
+ typeName: 'AccordionItem',
234
300
  }),
235
301
  toc: defineRune({
236
302
  name: 'toc',
@@ -246,7 +312,7 @@ export const runes = {
246
312
  schema: embed,
247
313
  description: 'Embedded content from external services (YouTube, Twitter, CodePen, Spotify)',
248
314
  seoType: 'VideoObject',
249
- typeName: 'Embed', schemaOrgType: 'VideoObject',
315
+ typeName: 'Embed',
250
316
  category: 'Content',
251
317
  snippet: ['{% embed url="${1:https://}" /%}'],
252
318
  }),
@@ -255,7 +321,7 @@ export const runes = {
255
321
  schema: breadcrumb,
256
322
  description: 'Navigation breadcrumb trail showing page hierarchy',
257
323
  seoType: 'BreadcrumbList',
258
- typeName: 'Breadcrumb', schemaOrgType: 'BreadcrumbList',
324
+ typeName: 'Breadcrumb',
259
325
  category: 'Site',
260
326
  snippet: ['{% breadcrumb /%}'],
261
327
  }),
@@ -272,9 +338,16 @@ export const runes = {
272
338
  schema: budget,
273
339
  description: 'Structured cost breakdown with categories, line items, and auto-calculated totals',
274
340
  seoType: 'ItemList',
275
- typeName: 'Budget', schemaOrgType: 'ItemList',
341
+ typeName: 'Budget',
276
342
  category: 'Semantic',
277
- snippet: ['{% budget %}', '## ${1:Category}', '', '- ${2:Item description}: \\$${3:100}', '- ${4:Another item}: \\$${5:200}', '{% /budget %}'],
343
+ snippet: [
344
+ '{% budget %}',
345
+ '## ${1:Category}',
346
+ '',
347
+ '- ${2:Item description}: \\$${3:100}',
348
+ '- ${4:Another item}: \\$${5:200}',
349
+ '{% /budget %}',
350
+ ],
278
351
  }),
279
352
  'budget-category': defineRune({
280
353
  name: 'budget-category',
@@ -294,7 +367,17 @@ export const runes = {
294
367
  description: 'Side-by-side code comparison with labeled panels',
295
368
  typeName: 'Compare',
296
369
  category: 'Code & Data',
297
- snippet: ['{% compare %}', '```${1:js}', '${2:// Before}', '```', '', '```${3:js}', '${4:// After}', '```', '{% /compare %}'],
370
+ snippet: [
371
+ '{% compare %}',
372
+ '```${1:js}',
373
+ '${2:// Before}',
374
+ '```',
375
+ '',
376
+ '```${3:js}',
377
+ '${4:// After}',
378
+ '```',
379
+ '{% /compare %}',
380
+ ],
298
381
  }),
299
382
  datatable: defineRune({
300
383
  name: 'datatable',
@@ -302,9 +385,15 @@ export const runes = {
302
385
  schema: datatable,
303
386
  description: 'Interactive data table with sorting, filtering, and pagination from a Markdown table',
304
387
  seoType: 'Dataset',
305
- typeName: 'DataTable', schemaOrgType: 'Dataset',
388
+ typeName: 'DataTable',
306
389
  category: 'Code & Data',
307
- snippet: ['{% datatable %}', '| ${1:Column A} | ${2:Column B} | ${3:Column C} |', '|---|---|---|', '| ${4:Data} | ${5:Data} | ${6:Data} |', '{% /datatable %}'],
390
+ snippet: [
391
+ '{% datatable %}',
392
+ '| ${1:Column A} | ${2:Column B} | ${3:Column C} |',
393
+ '|---|---|---|',
394
+ '| ${4:Data} | ${5:Data} | ${6:Data} |',
395
+ '{% /datatable %}',
396
+ ],
308
397
  }),
309
398
  diff: defineRune({
310
399
  name: 'diff',
@@ -312,7 +401,17 @@ export const runes = {
312
401
  description: 'Side-by-side or unified diff view between two code blocks',
313
402
  typeName: 'Diff',
314
403
  category: 'Code & Data',
315
- snippet: ['{% diff %}', '```${1:js}', '${2:// Before}', '```', '', '```${3:js}', '${4:// After}', '```', '{% /diff %}'],
404
+ snippet: [
405
+ '{% diff %}',
406
+ '```${1:js}',
407
+ '${2:// Before}',
408
+ '```',
409
+ '',
410
+ '```${3:js}',
411
+ '${4:// After}',
412
+ '```',
413
+ '{% /diff %}',
414
+ ],
316
415
  }),
317
416
  snippet: defineRune({
318
417
  name: 'snippet',
@@ -341,7 +440,7 @@ export const runes = {
341
440
  include: defineRune({
342
441
  name: 'include',
343
442
  schema: include,
344
- description: 'Paste a partial\'s AST into the page before the preprocess phase, so `data` and `snippet` inside it resolve — the case `{% partial %}` cannot serve. Reads the same `_partials/` and file roots (SPEC-129).',
443
+ description: "Paste a partial's AST into the page before the preprocess phase, so `data` and `snippet` inside it resolve — the case `{% partial %}` cannot serve. Reads the same `_partials/` and file roots (SPEC-129).",
345
444
  typeName: 'Include',
346
445
  category: 'Code & Data',
347
446
  snippet: ['{% include file="${1:shared-block.md}" /%}'],
@@ -352,7 +451,14 @@ export const runes = {
352
451
  description: 'Chart visualization from a Markdown table. First column becomes axis labels, header row becomes series names.',
353
452
  typeName: 'Chart',
354
453
  category: 'Code & Data',
355
- snippet: ['{% chart type="${1|bar,line,pie,area|}" %}', '| ${2:Label} | ${3:Series A} | ${4:Series B} |', '|---|---|---|', '| ${5:Item 1} | ${6:10} | ${7:20} |', '| ${8:Item 2} | ${9:30} | ${10:15} |', '{% /chart %}'],
454
+ snippet: [
455
+ '{% chart type="${1|bar,line,pie,area|}" %}',
456
+ '| ${2:Label} | ${3:Series A} | ${4:Series B} |',
457
+ '|---|---|---|',
458
+ '| ${5:Item 1} | ${6:10} | ${7:20} |',
459
+ '| ${8:Item 2} | ${9:30} | ${10:15} |',
460
+ '{% /chart %}',
461
+ ],
356
462
  }),
357
463
  diagram: defineRune({
358
464
  name: 'diagram',
@@ -360,7 +466,13 @@ export const runes = {
360
466
  description: 'Diagram rendering from Mermaid, PlantUML, or ASCII art code blocks',
361
467
  typeName: 'Diagram',
362
468
  category: 'Code & Data',
363
- snippet: ['{% diagram language="${1|mermaid,plantuml,ascii|}" %}', '```${1:mermaid}', '$0', '```', '{% /diagram %}'],
469
+ snippet: [
470
+ '{% diagram language="${1|mermaid,plantuml,ascii|}" %}',
471
+ '```${1:mermaid}',
472
+ '$0',
473
+ '```',
474
+ '{% /diagram %}',
475
+ ],
364
476
  }),
365
477
  sidenote: defineRune({
366
478
  name: 'sidenote',
@@ -378,7 +490,13 @@ export const runes = {
378
490
  description: 'Chat/dialogue display where blockquotes become alternating speaker messages',
379
491
  typeName: 'Conversation',
380
492
  category: 'Semantic',
381
- snippet: ['{% conversation %}', '> **${1:Alice}**: ${2:Hello!}', '', '> **${3:Bob}**: ${4:Hi there!}', '{% /conversation %}'],
493
+ snippet: [
494
+ '{% conversation %}',
495
+ '> **${1:Alice}**: ${2:Hello!}',
496
+ '',
497
+ '> **${3:Bob}**: ${4:Hi there!}',
498
+ '{% /conversation %}',
499
+ ],
382
500
  }),
383
501
  'conversation-message': defineRune({
384
502
  name: 'conversation-message',
@@ -392,7 +510,17 @@ export const runes = {
392
510
  description: 'Progressive disclosure where headings become reveal steps shown one at a time',
393
511
  typeName: 'Reveal',
394
512
  category: 'Layout',
395
- snippet: ['{% reveal %}', '## ${1:Step One}', '', '${2:Content revealed first.}', '', '## ${3:Step Two}', '', '${4:Content revealed next.}', '{% /reveal %}'],
513
+ snippet: [
514
+ '{% reveal %}',
515
+ '## ${1:Step One}',
516
+ '',
517
+ '${2:Content revealed first.}',
518
+ '',
519
+ '## ${3:Step Two}',
520
+ '',
521
+ '${4:Content revealed next.}',
522
+ '{% /reveal %}',
523
+ ],
396
524
  }),
397
525
  'reveal-step': defineRune({
398
526
  name: 'reveal-step',
@@ -406,7 +534,17 @@ export const runes = {
406
534
  description: 'A generic page section: an eyebrow/headline/blurb header above arbitrary body content',
407
535
  typeName: 'Section',
408
536
  category: 'Layout',
409
- snippet: ['{% section %}', 'Eyebrow', '', '## ${1:Section title}', '', '${2:A short supporting blurb.}', '', '${3:Body content — a bento, cards, anything.}', '{% /section %}'],
537
+ snippet: [
538
+ '{% section %}',
539
+ 'Eyebrow',
540
+ '',
541
+ '## ${1:Section title}',
542
+ '',
543
+ '${2:A short supporting blurb.}',
544
+ '',
545
+ '${3:Body content — a bento, cards, anything.}',
546
+ '{% /section %}',
547
+ ],
410
548
  }),
411
549
  juxtapose: defineRune({
412
550
  name: 'juxtapose',
@@ -421,7 +559,17 @@ export const runes = {
421
559
  description: 'Content with margin annotations. Nested note tags appear as margin notes alongside the main text.',
422
560
  typeName: 'Annotate',
423
561
  category: 'Layout',
424
- snippet: ['{% annotate %}', '${1:Main content here.}', '', '{% note %}', '${2:Margin note content.}', '{% /note %}', '', '${3:More main content.}', '{% /annotate %}'],
562
+ snippet: [
563
+ '{% annotate %}',
564
+ '${1:Main content here.}',
565
+ '',
566
+ '{% note %}',
567
+ '${2:Margin note content.}',
568
+ '{% /note %}',
569
+ '',
570
+ '${3:More main content.}',
571
+ '{% /annotate %}',
572
+ ],
425
573
  }),
426
574
  note: defineRune({
427
575
  name: 'note',
@@ -436,7 +584,15 @@ export const runes = {
436
584
  description: 'Accessible HTML form from Markdown. Lists become input fields with smart type inference, blockquotes followed by lists become select/radio/checkbox groups.',
437
585
  typeName: 'Form',
438
586
  category: 'Content',
439
- snippet: ['{% form action="${1:/api/contact}" %}', '- Name', '- Email', '- Message', '', '**${2:Submit}**', '{% /form %}'],
587
+ snippet: [
588
+ '{% form action="${1:/api/contact}" %}',
589
+ '- Name',
590
+ '- Email',
591
+ '- Message',
592
+ '',
593
+ '**${2:Submit}**',
594
+ '{% /form %}',
595
+ ],
440
596
  }),
441
597
  'form-field': defineRune({
442
598
  name: 'form-field',
@@ -450,7 +606,11 @@ export const runes = {
450
606
  description: 'Isolated HTML/CSS/JS rendering in an iframe with optional framework loading',
451
607
  typeName: 'Sandbox',
452
608
  category: 'Code & Data',
453
- snippet: ['{% sandbox framework="${1|,tailwind,bootstrap,bulma,pico|}" %}', '$0', '{% /sandbox %}'],
609
+ snippet: [
610
+ '{% sandbox framework="${1|,tailwind,bootstrap,bulma,pico|}" %}',
611
+ '$0',
612
+ '{% /sandbox %}',
613
+ ],
454
614
  }),
455
615
  pullquote: defineRune({
456
616
  name: 'pullquote',
@@ -459,7 +619,11 @@ export const runes = {
459
619
  description: 'Decorative pull quote for magazine-style emphasis with float and block modes',
460
620
  typeName: 'PullQuote',
461
621
  category: 'Content',
462
- snippet: ['{% pullquote variant="${1|default,accent,editorial|}" %}', '> ${2:Quote text to emphasize.}', '{% /pullquote %}'],
622
+ snippet: [
623
+ '{% pullquote variant="${1|default,accent,editorial|}" %}',
624
+ '> ${2:Quote text to emphasize.}',
625
+ '{% /pullquote %}',
626
+ ],
463
627
  }),
464
628
  textblock: defineRune({
465
629
  name: 'textblock',
@@ -468,7 +632,11 @@ export const runes = {
468
632
  description: 'Text formatting block with drop caps, multi-column layout, lead paragraphs, and alignment control',
469
633
  typeName: 'TextBlock',
470
634
  category: 'Content',
471
- snippet: ['{% textblock dropcap %}', '${1:Formatted text content with drop cap styling.}', '{% /textblock %}'],
635
+ snippet: [
636
+ '{% textblock dropcap %}',
637
+ '${1:Formatted text content with drop cap styling.}',
638
+ '{% /textblock %}',
639
+ ],
472
640
  }),
473
641
  mediatext: defineRune({
474
642
  name: 'mediatext',
@@ -477,7 +645,13 @@ export const runes = {
477
645
  description: 'Image and text side by side with configurable ratio and optional text wrapping',
478
646
  typeName: 'MediaText',
479
647
  category: 'Layout',
480
- snippet: ['{% mediatext align="${1|left,right|}" ratio="${2|1:1,1:2,2:1|}" %}', '![${3:Alt text}](${4:/path/to/image.png})', '', '${5:Text content displayed alongside the image.}', '{% /mediatext %}'],
648
+ snippet: [
649
+ '{% mediatext align="${1|left,right|}" ratio="${2|1:1,1:2,2:1|}" %}',
650
+ '![${3:Alt text}](${4:/path/to/image.png})',
651
+ '',
652
+ '${5:Text content displayed alongside the image.}',
653
+ '{% /mediatext %}',
654
+ ],
481
655
  }),
482
656
  icon: defineRune({
483
657
  name: 'icon',
@@ -491,7 +665,13 @@ export const runes = {
491
665
  schema: tint,
492
666
  description: 'Section-level colour override via CSS custom properties. Declared as first child of a block rune.',
493
667
  typeName: 'Tint',
494
- snippet: ['{% tint %}', '- background: ${1:#1a1a2e}', '- primary: ${2:#e94560}', '- accent: ${3:#0f3460}', '{% /tint %}'],
668
+ snippet: [
669
+ '{% tint %}',
670
+ '- background: ${1:#1a1a2e}',
671
+ '- primary: ${2:#e94560}',
672
+ '- accent: ${3:#0f3460}',
673
+ '{% /tint %}',
674
+ ],
495
675
  }),
496
676
  showcase: defineRune({
497
677
  name: 'showcase',
@@ -513,7 +693,7 @@ export const runes = {
513
693
  schema: blog,
514
694
  description: 'Blog post listing with filtering, sorting, and multiple layouts. Displays pages from a content folder as a navigable blog index.',
515
695
  seoType: 'Blog',
516
- typeName: 'Blog', schemaOrgType: 'Blog',
696
+ typeName: 'Blog',
517
697
  category: 'Semantic',
518
698
  }),
519
699
  xref: defineRune({
@@ -525,7 +705,7 @@ export const runes = {
525
705
  expand: defineRune({
526
706
  name: 'expand',
527
707
  schema: expand,
528
- description: 'Substitute a registered entity\'s source content inline. Reads the entity\'s sourceFile via the plan plugin (or any plugin that registers extractable entities) and inlines it. Symmetric with `xref`: same lookup chain, different output (content rather than a link).',
708
+ description: "Substitute a registered entity's source content inline. Reads the entity's sourceFile via the plan plugin (or any plugin that registers extractable entities) and inlines it. Symmetric with `xref`: same lookup chain, different output (content rather than a link).",
529
709
  typeName: 'Expand',
530
710
  category: 'Content',
531
711
  snippet: ['{% expand "${1:SPEC-001}" /%}'],
@@ -536,7 +716,11 @@ export const runes = {
536
716
  description: 'Inline pill that flags a piece of content (status, category, recency, tag). Visual variant from the universal metadata-system dimensions (sentiment, rank, type).',
537
717
  typeName: 'Badge',
538
718
  category: 'Content',
539
- snippet: ['{% badge sentiment="${1|positive,negative,caution,neutral|}" %}', '${2:Label}', '{% /badge %}'],
719
+ snippet: [
720
+ '{% badge sentiment="${1|positive,negative,caution,neutral|}" %}',
721
+ '${2:Label}',
722
+ '{% /badge %}',
723
+ ],
540
724
  }),
541
725
  bar: defineRune({
542
726
  name: 'bar',
@@ -553,7 +737,12 @@ export const runes = {
553
737
  description: 'Block-level wrapper that renders the SPEC-079 definition-list layout primitive over a markdown list. Each `- **Term:** value` item becomes a <dt>/<dd> pair. Inline runes compose naturally inside <dd>.',
554
738
  typeName: 'Deflist',
555
739
  category: 'Content',
556
- snippet: ['{% deflist %}', '- **${1:Term}:** ${2:Value}', '- **${3:Term}:** ${4:Value}', '{% /deflist %}'],
740
+ snippet: [
741
+ '{% deflist %}',
742
+ '- **${1:Term}:** ${2:Value}',
743
+ '- **${3:Term}:** ${4:Value}',
744
+ '{% /deflist %}',
745
+ ],
557
746
  }),
558
747
  collection: defineRune({
559
748
  name: 'collection',
@@ -585,7 +774,9 @@ export const runes = {
585
774
  description: 'Path-based inline reference to a project file — third member of the Registry family beside `xref` (id → link) and `expand` (id → inlined content). Resolves to a deep-link `<a>` pointing at `{repoUrl}/blob/{repoBranch}/{path}#L{start}-L{end}` on GitHub. With `preview="drawer"`, hoists a drawer containing the file\'s snippet and a "View source on GitHub →" footer link, leaving an inline link at the call site that opens it.',
586
775
  typeName: 'FileRef',
587
776
  category: 'Content',
588
- snippet: ['{% file-ref path="${1:packages/types/src/token-contract.ts}" lines="${2:42-58}" label="${3:ThemeTokensConfig}" /%}'],
777
+ snippet: [
778
+ '{% file-ref path="${1:packages/types/src/token-contract.ts}" lines="${2:42-58}" label="${3:ThemeTokensConfig}" /%}',
779
+ ],
589
780
  }),
590
781
  progress: defineRune({
591
782
  name: 'progress',
@@ -601,7 +792,12 @@ export const runes = {
601
792
  description: 'A generic, self-contained content card. The body splits on `---` into [media] / body / [footer]: the media zone holds any content (image, codegroup, sandbox, …) and lays out beside the body on wide screens / as a full-bleed header on mobile; the footer is a muted meta row. Optional `href` makes the whole card a link. Knows nothing about the registry — usable standalone or inside a collection body template.',
602
793
  typeName: 'Card',
603
794
  category: 'Content',
604
- snippet: ['{% card href="${1:/posts/slug/}" %}', '### ${2:Title}', '${3:A short summary.}', '{% /card %}'],
795
+ snippet: [
796
+ '{% card href="${1:/posts/slug/}" %}',
797
+ '### ${2:Title}',
798
+ '${3:A short summary.}',
799
+ '{% /card %}',
800
+ ],
605
801
  }),
606
802
  };
607
803
  /** Markdoc-compatible tags map derived from runes + Markdoc built-in tags.
@@ -615,6 +811,23 @@ export const tags = {
615
811
  ...runeTagMap(runes),
616
812
  link,
617
813
  ...Markdoc.tags,
814
+ // Markdoc's `if` / `else` declare `primary: { type: Object }`, which is a
815
+ // statement about *expression syntax*: `{% if $var %}` and
816
+ // `{% if equals(a, b) %}` both pass an AST node, and an AST node is an
817
+ // object. It stops being true in this pipeline, because preprocess hooks
818
+ // substitute variables for their values before the page is validated —
819
+ // `bindRow` turns `{% if $row.required %}` into `{% if true %}`, and a
820
+ // boolean is not an Object.
821
+ //
822
+ // SPEC-132's validation pass reported that 3,302 times across `site/`
823
+ // (WORK-557), every one a false positive. The type check cannot catch a
824
+ // real authoring error here: pre-substitution every legal form is already
825
+ // an object, and post-substitution every value is legal. So the constraint
826
+ // is dropped rather than the findings filtered — the root cause, not the
827
+ // symptom. `render: false` is preserved; it is what keeps the condition out
828
+ // of the rendered output.
829
+ if: { ...Markdoc.tags.if, attributes: { primary: { render: false } } },
830
+ else: { ...Markdoc.tags.else, attributes: { primary: { render: false } } },
618
831
  };
619
832
  export const nodes = {
620
833
  heading,