@refrakt-md/runes 0.16.0 → 0.17.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 (59) hide show
  1. package/dist/config.d.ts +7 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +72 -41
  4. package/dist/config.js.map +1 -1
  5. package/dist/drawer-pipeline.d.ts +72 -1
  6. package/dist/drawer-pipeline.d.ts.map +1 -1
  7. package/dist/drawer-pipeline.js +242 -1
  8. package/dist/drawer-pipeline.js.map +1 -1
  9. package/dist/file-ref-resolve.d.ts +22 -0
  10. package/dist/file-ref-resolve.d.ts.map +1 -0
  11. package/dist/file-ref-resolve.js +233 -0
  12. package/dist/file-ref-resolve.js.map +1 -0
  13. package/dist/index.d.ts +10 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +36 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/nodes.d.ts.map +1 -1
  18. package/dist/nodes.js +62 -8
  19. package/dist/nodes.js.map +1 -1
  20. package/dist/snippet-pipeline.d.ts +7 -5
  21. package/dist/snippet-pipeline.d.ts.map +1 -1
  22. package/dist/snippet-pipeline.js +32 -13
  23. package/dist/snippet-pipeline.js.map +1 -1
  24. package/dist/tags/badge.d.ts +5 -6
  25. package/dist/tags/badge.d.ts.map +1 -1
  26. package/dist/tags/badge.js +7 -18
  27. package/dist/tags/badge.js.map +1 -1
  28. package/dist/tags/bar.d.ts +23 -0
  29. package/dist/tags/bar.d.ts.map +1 -0
  30. package/dist/tags/bar.js +64 -0
  31. package/dist/tags/bar.js.map +1 -0
  32. package/dist/tags/codegroup.d.ts.map +1 -1
  33. package/dist/tags/codegroup.js +41 -2
  34. package/dist/tags/codegroup.js.map +1 -1
  35. package/dist/tags/deflist.d.ts +20 -0
  36. package/dist/tags/deflist.d.ts.map +1 -0
  37. package/dist/tags/deflist.js +173 -0
  38. package/dist/tags/deflist.js.map +1 -0
  39. package/dist/tags/diff.d.ts.map +1 -1
  40. package/dist/tags/diff.js +85 -18
  41. package/dist/tags/diff.js.map +1 -1
  42. package/dist/tags/drawer.d.ts.map +1 -1
  43. package/dist/tags/drawer.js +32 -2
  44. package/dist/tags/drawer.js.map +1 -1
  45. package/dist/tags/file-ref.d.ts +21 -0
  46. package/dist/tags/file-ref.d.ts.map +1 -0
  47. package/dist/tags/file-ref.js +88 -0
  48. package/dist/tags/file-ref.js.map +1 -0
  49. package/dist/tags/snippet.d.ts.map +1 -1
  50. package/dist/tags/snippet.js +10 -0
  51. package/dist/tags/snippet.js.map +1 -1
  52. package/dist/tags/xref.d.ts.map +1 -1
  53. package/dist/tags/xref.js +9 -0
  54. package/dist/tags/xref.js.map +1 -1
  55. package/dist/xref-preview-resolve.d.ts +35 -0
  56. package/dist/xref-preview-resolve.d.ts.map +1 -0
  57. package/dist/xref-preview-resolve.js +188 -0
  58. package/dist/xref-preview-resolve.js.map +1 -0
  59. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"drawer.js","sourceRoot":"","sources":["../../src/tags/drawer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drawer.js","sourceRoot":"","sources":["../../src/tags/drawer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ /** Sentinel `data-field` value the file-ref schema emits. The resolver
3
+ * (file-ref-resolve.ts) walks the postProcess tree, finds these, and
4
+ * binds the inline `<a>` to the GitHub URL plus (when `preview="drawer"`
5
+ * is set) a hoist sentinel for the drawer pipeline to pick up. */
6
+ export declare const FILE_REF_SENTINEL = "__file-ref-sentinel";
7
+ /**
8
+ * `file-ref` rune — path-based inline reference to a project file
9
+ * (SPEC-078). Renders as an inline `<a>` to the file's canonical GitHub
10
+ * URL (built from `SiteConfig.repoUrl` + `repoBranch`), with an optional
11
+ * `preview="drawer"` mode that hoists a drawer containing the file's
12
+ * snippet and a "View source on GitHub →" footer link.
13
+ *
14
+ * The transform emits a sentinel meta + placeholder `<a>`. The actual
15
+ * link href, the drawer body, and the hoist sentinel are all bound in
16
+ * postProcess by `resolveFileRefs` so that the rune doesn't need
17
+ * site-config access at transform time and so the file content is read
18
+ * once (not per page-with-mention).
19
+ */
20
+ export declare const fileRef: Markdoc.Schema;
21
+ //# sourceMappingURL=file-ref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-ref.d.ts","sourceRoot":"","sources":["../../src/tags/file-ref.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAIvC;;;mEAGmE;AACnE,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,OAAO,gBA+DlB,CAAC"}
@@ -0,0 +1,88 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ const { Tag } = Markdoc;
3
+ import { createContentModelSchema, createComponentRenderable } from '../lib/index.js';
4
+ /** Sentinel `data-field` value the file-ref schema emits. The resolver
5
+ * (file-ref-resolve.ts) walks the postProcess tree, finds these, and
6
+ * binds the inline `<a>` to the GitHub URL plus (when `preview="drawer"`
7
+ * is set) a hoist sentinel for the drawer pipeline to pick up. */
8
+ export const FILE_REF_SENTINEL = '__file-ref-sentinel';
9
+ /**
10
+ * `file-ref` rune — path-based inline reference to a project file
11
+ * (SPEC-078). Renders as an inline `<a>` to the file's canonical GitHub
12
+ * URL (built from `SiteConfig.repoUrl` + `repoBranch`), with an optional
13
+ * `preview="drawer"` mode that hoists a drawer containing the file's
14
+ * snippet and a "View source on GitHub →" footer link.
15
+ *
16
+ * The transform emits a sentinel meta + placeholder `<a>`. The actual
17
+ * link href, the drawer body, and the hoist sentinel are all bound in
18
+ * postProcess by `resolveFileRefs` so that the rune doesn't need
19
+ * site-config access at transform time and so the file content is read
20
+ * once (not per page-with-mention).
21
+ */
22
+ export const fileRef = createContentModelSchema({
23
+ attributes: {
24
+ path: {
25
+ type: String,
26
+ required: true,
27
+ description: 'Project-root-relative file path. Same sandbox as snippet — absolute paths, traversal escapes, and out-of-root symlinks are rejected.',
28
+ },
29
+ lines: {
30
+ type: String,
31
+ required: false,
32
+ description: 'Line range. `"42-58"` (range), `"42"` (single line). Drives both the GitHub anchor (#L42-L58) and the drawer-body snippet slice when `preview="drawer"`.',
33
+ },
34
+ label: {
35
+ type: String,
36
+ required: false,
37
+ description: 'Display text for the inline link. Defaults to the filename (e.g. `token-contract.ts`). Pass an explicit label when the file-ref refers to a symbol within the file rather than the file itself.',
38
+ },
39
+ preview: {
40
+ type: String,
41
+ required: false,
42
+ matches: ['drawer'],
43
+ description: 'Preview target. `"drawer"` hoists a drawer with the file\'s snippet + a GitHub footer link, leaving an inline link at the call site that opens it. Absent → no preview, just the inline link.',
44
+ },
45
+ },
46
+ selfClosing: true,
47
+ contentModel: { type: 'sequence', fields: [] },
48
+ transform(_resolved, attrs) {
49
+ const path = String(attrs.path ?? '');
50
+ const lines = attrs.lines !== undefined ? String(attrs.lines) : '';
51
+ const label = attrs.label !== undefined ? String(attrs.label) : '';
52
+ const preview = attrs.preview !== undefined ? String(attrs.preview) : '';
53
+ // Default label: the basename of the path. Authors typically want
54
+ // to refer to a symbol inside the file (e.g. "ThemeTokensConfig")
55
+ // and pass an explicit label; this default is the conservative
56
+ // fallback when no label is given.
57
+ const fallbackLabel = defaultLabel(path);
58
+ const meta = (field, content) => new Tag('meta', { 'data-field': field, content });
59
+ const metas = [
60
+ meta('file-ref-path', path),
61
+ meta('file-ref-lines', lines),
62
+ meta('file-ref-label', label),
63
+ meta('file-ref-preview', preview),
64
+ meta(FILE_REF_SENTINEL, 'true'),
65
+ ];
66
+ // Placeholder anchor with the fallback label — resolver replaces
67
+ // the href and (when label is empty) keeps the fallback text.
68
+ const placeholder = new Tag('a', {}, [label || fallbackLabel]);
69
+ return createComponentRenderable({
70
+ rune: 'file-ref',
71
+ // Span keeps the rune inline-safe in prose. The resolver later
72
+ // replaces the span's children with the bound anchor + (with
73
+ // preview) a sibling hoist sentinel.
74
+ tag: 'span',
75
+ properties: {},
76
+ refs: { link: placeholder },
77
+ children: [...metas, placeholder],
78
+ });
79
+ },
80
+ });
81
+ function defaultLabel(path) {
82
+ if (!path)
83
+ return '';
84
+ const trimmed = path.endsWith('/') ? path.slice(0, -1) : path;
85
+ const slash = trimmed.lastIndexOf('/');
86
+ return slash >= 0 ? trimmed.slice(slash + 1) : trimmed;
87
+ }
88
+ //# sourceMappingURL=file-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-ref.js","sourceRoot":"","sources":["../../src/tags/file-ref.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"snippet.d.ts","sourceRoot":"","sources":["../../src/tags/snippet.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,mCA+BlB,CAAC"}
1
+ {"version":3,"file":"snippet.d.ts","sourceRoot":"","sources":["../../src/tags/snippet.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,mCAyClB,CAAC"}
@@ -33,6 +33,16 @@ export const snippet = createContentModelSchema({
33
33
  required: false,
34
34
  description: 'Syntax-highlighting language hint. Overrides the extension-based inference.',
35
35
  },
36
+ linenumbers: {
37
+ type: Boolean,
38
+ required: false,
39
+ description: 'Show line numbers in the gutter. Starting number derives from the `lines` range start (e.g. lines="74-125" → first line is 74), so numbers reflect the file\'s real offsets. WORK-304.',
40
+ },
41
+ highlight: {
42
+ type: String,
43
+ required: false,
44
+ description: 'Range(s) to emphasize without cropping — Shiki-style format: "74-78", "74-78,82,90-92". Indices are file coordinates (same frame as `lines=`). Use this when you want full context visible but want to draw the eye to specific lines. WORK-304.',
45
+ },
36
46
  },
37
47
  contentModel: { type: 'sequence', fields: [] },
38
48
  transform(_resolved, _attrs) {
@@ -1 +1 @@
1
- {"version":3,"file":"snippet.js","sourceRoot":"","sources":["../../src/tags/snippet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,wBAAwB,CAAC;IAC/C,UAAU,EAAE;QACX,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,yFAAyF;SACtG;QACD,KAAK,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,6GAA6G;SAC1H;QACD,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,6EAA6E;SAC1F;KACD;IACD,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;IAC9C,SAAS,CAAC,SAAS,EAAE,MAAM;QAC1B,iEAAiE;QACjE,oEAAoE;QACpE,+DAA+D;QAC/D,qEAAqE;QACrE,mDAAmD;QACnD,MAAM,IAAI,KAAK,CACd,wFAAwF;YACxF,4FAA4F;YAC5F,+EAA+E,CAC/E,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
1
+ {"version":3,"file":"snippet.js","sourceRoot":"","sources":["../../src/tags/snippet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,wBAAwB,CAAC;IAC/C,UAAU,EAAE;QACX,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,yFAAyF;SACtG;QACD,KAAK,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,6GAA6G;SAC1H;QACD,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,6EAA6E;SAC1F;QACD,WAAW,EAAE;YACZ,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,wLAAwL;SACrM;QACD,SAAS,EAAE;YACV,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,kPAAkP;SAC/P;KACD;IACD,YAAY,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;IAC9C,SAAS,CAAC,SAAS,EAAE,MAAM;QAC1B,iEAAiE;QACjE,oEAAoE;QACpE,+DAA+D;QAC/D,qEAAqE;QACrE,mDAAmD;QACnD,MAAM,IAAI,KAAK,CACd,wFAAwF;YACxF,4FAA4F;YAC5F,+EAA+E,CAC/E,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"xref.d.ts","sourceRoot":"","sources":["../../src/tags/xref.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG7D,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,IAAI,EAAE,MAoClB,CAAC"}
1
+ {"version":3,"file":"xref.d.ts","sourceRoot":"","sources":["../../src/tags/xref.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG7D,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,IAAI,EAAE,MA4ClB,CAAC"}
package/dist/tags/xref.js CHANGED
@@ -34,11 +34,18 @@ export const xref = {
34
34
  required: false,
35
35
  description: 'Entity type hint for disambiguation',
36
36
  },
37
+ preview: {
38
+ type: String,
39
+ required: false,
40
+ matches: ['drawer'],
41
+ description: 'Preview target. `"drawer"` hoists a drawer containing the entity\'s expanded content + a link to its resolved page URL in the chrome footer, leaving an inline link at the call site that opens it. Absent → today\'s behaviour (just the inline link). SPEC-078.',
42
+ },
37
43
  },
38
44
  transform(node, config) {
39
45
  const id = node.attributes.primary;
40
46
  const label = node.attributes.label;
41
47
  const type = node.attributes.type;
48
+ const preview = node.attributes.preview;
42
49
  const attrs = {
43
50
  'data-rune': XREF_RUNE_MARKER,
44
51
  'data-xref-id': id,
@@ -47,6 +54,8 @@ export const xref = {
47
54
  attrs['data-xref-label'] = label;
48
55
  if (type)
49
56
  attrs['data-xref-type'] = type;
57
+ if (preview)
58
+ attrs['data-xref-preview'] = preview;
50
59
  // Placeholder text: custom label or the raw reference string
51
60
  return new Tag('span', attrs, [label || id]);
52
61
  },
@@ -1 +1 @@
1
- {"version":3,"file":"xref.js","sourceRoot":"","sources":["../../src/tags/xref.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AAExB,yFAAyF;AACzF,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,IAAI,GAAW;IAC3B,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE;QACX,OAAO,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,8BAA8B;SAC3C;QACD,KAAK,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,6CAA6C;SAC1D;QACD,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,qCAAqC;SAClD;KACD;IACD,SAAS,CAAC,IAAU,EAAE,MAAc;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAiB,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAA2B,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAA0B,CAAC;QAExD,MAAM,KAAK,GAA2B;YACrC,WAAW,EAAE,gBAAgB;YAC7B,cAAc,EAAE,EAAE;SAClB,CAAC;QAEF,IAAI,KAAK;YAAE,KAAK,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC;QAC5C,IAAI,IAAI;YAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;QAEzC,6DAA6D;QAC7D,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;CACD,CAAC"}
1
+ {"version":3,"file":"xref.js","sourceRoot":"","sources":["../../src/tags/xref.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AAExB,yFAAyF;AACzF,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,IAAI,GAAW;IAC3B,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE;QACX,OAAO,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,8BAA8B;SAC3C;QACD,KAAK,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,6CAA6C;SAC1D;QACD,IAAI,EAAE;YACL,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,qCAAqC;SAClD;QACD,OAAO,EAAE;YACR,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,CAAC,QAAQ,CAAC;YACnB,WAAW,EAAE,mQAAmQ;SAChR;KACD;IACD,SAAS,CAAC,IAAU,EAAE,MAAc;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,OAAiB,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAA2B,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAA0B,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAA6B,CAAC;QAE9D,MAAM,KAAK,GAA2B;YACrC,WAAW,EAAE,gBAAgB;YAC7B,cAAc,EAAE,EAAE;SAClB,CAAC;QAEF,IAAI,KAAK;YAAE,KAAK,CAAC,iBAAiB,CAAC,GAAG,KAAK,CAAC;QAC5C,IAAI,IAAI;YAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;QACzC,IAAI,OAAO;YAAE,KAAK,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC;QAElD,6DAA6D;QAC7D,OAAO,IAAI,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;CACD,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * xref `preview="drawer"` resolver (SPEC-078, WORK-302).
3
+ *
4
+ * Runs BEFORE the drawer hoist pass. Walks the page renderable, finds
5
+ * xref placeholders carrying `data-xref-preview="drawer"`, and rewrites
6
+ * each as an inline `<a href="#drawer-{entityId}">` (with aria attrs)
7
+ * accompanied by a `hoist-drawer` sentinel that the drawer pipeline
8
+ * (WORK-300) picks up to render the actual drawer at the page root.
9
+ *
10
+ * Non-preview xref placeholders pass through unchanged — the existing
11
+ * `resolveXrefs` pass (later in the pipeline) handles those.
12
+ *
13
+ * Also registers a hoist builder for the `xref` source. The builder
14
+ * looks up the entity by id and emits a drawer whose body is an
15
+ * `expand-pending` placeholder for the entity — the `resolveExpands`
16
+ * pass that runs *after* the hoist substitutes the placeholder with
17
+ * the entity's actual content, so the drawer body ends up identical
18
+ * to a manual `{% drawer %}{% expand "X" /%}{% /drawer %}`.
19
+ */
20
+ import type { EntityRegistry, PipelineContext } from '@refrakt-md/types';
21
+ /**
22
+ * Walk a page's renderable. For each xref placeholder with
23
+ * `data-xref-preview="drawer"`:
24
+ *
25
+ * - Replace the placeholder span with `<a href="#drawer-{id}">` carrying
26
+ * `aria-controls`, `aria-expanded="false"`, `data-target-type="drawer"`.
27
+ * - Emit a sibling `<meta data-field="hoist-drawer">` sentinel with
28
+ * `data-source="xref"` + the entity id + the authored label, for the
29
+ * drawer pipeline to consume.
30
+ *
31
+ * Non-preview xref placeholders are left for `resolveXrefs` to handle in
32
+ * its own pass.
33
+ */
34
+ export declare function resolveXrefPreviews(renderable: unknown, pageUrl: string, registry: Readonly<EntityRegistry> | undefined, ctx: PipelineContext): unknown;
35
+ //# sourceMappingURL=xref-preview-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xref-preview-resolve.d.ts","sourceRoot":"","sources":["../src/xref-preview-resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAsB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAgB7F;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,SAAS,EAC9C,GAAG,EAAE,eAAe,GAClB,OAAO,CAoCT"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * xref `preview="drawer"` resolver (SPEC-078, WORK-302).
3
+ *
4
+ * Runs BEFORE the drawer hoist pass. Walks the page renderable, finds
5
+ * xref placeholders carrying `data-xref-preview="drawer"`, and rewrites
6
+ * each as an inline `<a href="#drawer-{entityId}">` (with aria attrs)
7
+ * accompanied by a `hoist-drawer` sentinel that the drawer pipeline
8
+ * (WORK-300) picks up to render the actual drawer at the page root.
9
+ *
10
+ * Non-preview xref placeholders pass through unchanged — the existing
11
+ * `resolveXrefs` pass (later in the pipeline) handles those.
12
+ *
13
+ * Also registers a hoist builder for the `xref` source. The builder
14
+ * looks up the entity by id and emits a drawer whose body is an
15
+ * `expand-pending` placeholder for the entity — the `resolveExpands`
16
+ * pass that runs *after* the hoist substitutes the placeholder with
17
+ * the entity's actual content, so the drawer body ends up identical
18
+ * to a manual `{% drawer %}{% expand "X" /%}{% /drawer %}`.
19
+ */
20
+ import Markdoc from '@markdoc/markdoc';
21
+ import { HOIST_DRAWER_SENTINEL, registerHoistBuilder, } from './drawer-pipeline.js';
22
+ import { XREF_RUNE_MARKER } from './tags/xref.js';
23
+ import { EXPAND_PLACEHOLDER_MARKER } from './tags/expand.js';
24
+ const { Tag } = Markdoc;
25
+ function isTag(node) {
26
+ return Tag.isTag(node);
27
+ }
28
+ /**
29
+ * Walk a page's renderable. For each xref placeholder with
30
+ * `data-xref-preview="drawer"`:
31
+ *
32
+ * - Replace the placeholder span with `<a href="#drawer-{id}">` carrying
33
+ * `aria-controls`, `aria-expanded="false"`, `data-target-type="drawer"`.
34
+ * - Emit a sibling `<meta data-field="hoist-drawer">` sentinel with
35
+ * `data-source="xref"` + the entity id + the authored label, for the
36
+ * drawer pipeline to consume.
37
+ *
38
+ * Non-preview xref placeholders are left for `resolveXrefs` to handle in
39
+ * its own pass.
40
+ */
41
+ export function resolveXrefPreviews(renderable, pageUrl, registry, ctx) {
42
+ const walk = (node) => {
43
+ if (Array.isArray(node)) {
44
+ let mutated = false;
45
+ const out = [];
46
+ for (const c of node) {
47
+ const w = walk(c);
48
+ if (w !== c)
49
+ mutated = true;
50
+ if (Array.isArray(w))
51
+ out.push(...w);
52
+ else
53
+ out.push(w);
54
+ }
55
+ return mutated ? out : node;
56
+ }
57
+ if (!isTag(node))
58
+ return node;
59
+ const tag = node;
60
+ if (tag.attributes?.['data-rune'] === XREF_RUNE_MARKER
61
+ && tag.attributes?.['data-xref-preview'] === 'drawer') {
62
+ return resolveOne(tag, registry, ctx, pageUrl);
63
+ }
64
+ if (!tag.children || tag.children.length === 0)
65
+ return tag;
66
+ let mutated = false;
67
+ const next = [];
68
+ for (const c of tag.children) {
69
+ const w = walk(c);
70
+ if (w !== c)
71
+ mutated = true;
72
+ if (Array.isArray(w))
73
+ next.push(...w);
74
+ else
75
+ next.push(w);
76
+ }
77
+ if (!mutated)
78
+ return tag;
79
+ return new Tag(tag.name, tag.attributes, next);
80
+ };
81
+ return walk(renderable);
82
+ }
83
+ function resolveOne(placeholder, registry, ctx, pageUrl) {
84
+ const attrs = placeholder.attributes;
85
+ const id = String(attrs['data-xref-id'] ?? '');
86
+ const authoredLabel = attrs['data-xref-label'];
87
+ if (!id) {
88
+ ctx.warn(`xref preview placeholder on ${pageUrl} has no entity id`, pageUrl);
89
+ return [placeholder];
90
+ }
91
+ // Try to resolve the entity title for the inline link label when the
92
+ // author didn't supply an explicit `label=`. Fall back to the id.
93
+ const entity = registry ? findEntity(registry, id) : undefined;
94
+ const label = authoredLabel
95
+ || (entity ? entityDisplayLabel(entity) : id);
96
+ const entityTitle = entity ? entityDisplayLabel(entity) : id;
97
+ const slug = id;
98
+ const anchor = new Tag('a', {
99
+ class: 'rf-xref',
100
+ href: `#drawer-${slug}`,
101
+ 'aria-controls': `drawer-${slug}`,
102
+ 'aria-expanded': 'false',
103
+ 'data-target-type': 'drawer',
104
+ 'data-xref-id': id,
105
+ }, [label]);
106
+ const sentinel = new Tag('meta', {
107
+ 'data-field': HOIST_DRAWER_SENTINEL,
108
+ 'data-source': 'xref',
109
+ 'data-target-id': slug,
110
+ 'data-title': entityTitle,
111
+ 'data-entity-id': id,
112
+ });
113
+ return [anchor, sentinel];
114
+ }
115
+ function findEntity(registry, id) {
116
+ const types = registry.getTypes?.() ?? [];
117
+ for (const type of types) {
118
+ const e = registry.getById(type, id);
119
+ if (e)
120
+ return e;
121
+ }
122
+ return undefined;
123
+ }
124
+ function entityDisplayLabel(entity) {
125
+ const data = entity.data;
126
+ return String(data.title ?? data.name ?? entity.id);
127
+ }
128
+ // ─────────────────────────────────────────────────────────────────────
129
+ // Hoist builder for the `xref` source — looks up the entity, builds a
130
+ // drawer with an expand-pending body that `resolveExpands` resolves
131
+ // downstream, and a chrome footer linking to the entity's page URL.
132
+ // ─────────────────────────────────────────────────────────────────────
133
+ function buildXrefHoist(payload, context) {
134
+ const entityId = payload['entity-id'] || payload['target-id'];
135
+ const targetId = payload['target-id'];
136
+ const title = payload.title || entityId;
137
+ if (!entityId || !targetId) {
138
+ context.ctx.warn(`xref hoist payload missing required entity-id or target-id`, context.pageUrl);
139
+ return null;
140
+ }
141
+ const entity = context.registry ? findEntity(context.registry, entityId) : undefined;
142
+ // Header — title + close button (same shape author-declared drawers use).
143
+ const titleHeading = new Tag('h3', { 'data-name': 'title', class: 'rf-drawer__title' }, [title]);
144
+ const closeButton = new Tag('button', {
145
+ type: 'button',
146
+ 'aria-label': 'Close',
147
+ hidden: true,
148
+ 'data-name': 'close',
149
+ class: 'rf-drawer__close',
150
+ }, ['×']);
151
+ const header = new Tag('header', {
152
+ 'data-name': 'header',
153
+ class: 'rf-drawer__header',
154
+ }, [titleHeading, closeButton]);
155
+ // Body — an expand-pending placeholder. `resolveExpands` runs after
156
+ // `hoistPreviewDrawers` in the pipeline and substitutes this with the
157
+ // entity's actual content, identical to a hand-authored
158
+ // `{% drawer %}{% expand "X" /%}{% /drawer %}` composition.
159
+ const expandPlaceholder = new Tag('div', {
160
+ 'data-rune': EXPAND_PLACEHOLDER_MARKER,
161
+ 'data-expand-id': entityId,
162
+ }, []);
163
+ const bodyChildren = [expandPlaceholder];
164
+ const body = new Tag('div', { 'data-name': 'body', class: 'rf-drawer__body' }, bodyChildren);
165
+ // Footer — link to the entity's page URL (when one resolves). Hides
166
+ // silently for entities without a sourceUrl (heading entities,
167
+ // drawer-target entities).
168
+ const footerHref = entity?.sourceUrl ?? '';
169
+ const footer = footerHref
170
+ ? new Tag('footer', { 'data-name': 'footer', class: 'rf-drawer__footer' }, [
171
+ new Tag('a', { href: footerHref }, [`View full page →`]),
172
+ ])
173
+ : null;
174
+ const drawerChildren = [header, body];
175
+ if (footer)
176
+ drawerChildren.push(footer);
177
+ return new Tag('section', {
178
+ id: `drawer-${targetId}`,
179
+ class: 'rf-drawer',
180
+ 'data-rune': 'drawer',
181
+ 'data-drawer-id': targetId,
182
+ 'data-side': 'right',
183
+ 'data-size': 'md',
184
+ }, drawerChildren);
185
+ }
186
+ // Register at module load.
187
+ registerHoistBuilder('xref', buildXrefHoist);
188
+ //# sourceMappingURL=xref-preview-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xref-preview-resolve.js","sourceRoot":"","sources":["../src/xref-preview-resolve.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/runes",
3
3
  "description": "Semantic Markdoc runes for refrakt.md",
4
- "version": "0.16.0",
4
+ "version": "0.17.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -29,8 +29,8 @@
29
29
  "build": "tsc"
30
30
  },
31
31
  "dependencies": {
32
- "@refrakt-md/types": "0.16.0",
33
- "@refrakt-md/transform": "0.16.0",
32
+ "@refrakt-md/types": "0.17.0",
33
+ "@refrakt-md/transform": "0.17.0",
34
34
  "@markdoc/markdoc": "0.4.0",
35
35
  "reflect-metadata": "^0.2.0",
36
36
  "fast-xml-parser": "4.5.1",