@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
@@ -0,0 +1,64 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ const { Tag } = Markdoc;
3
+ import { createContentModelSchema, asNodes } from '../lib/index.js';
4
+ /** Split the bar body's node list on the FIRST top-level `hr` into
5
+ * `left` / `right` halves. 1 zone → everything is left, right is empty.
6
+ * 2+ zones → left = before-hr, right = after-hr; subsequent hrs in the
7
+ * right half render as ordinary horizontal rules. Matches the body-zone
8
+ * convention `{% drawer %}` and `{% card %}` use, scaled to the two-group
9
+ * case the `bar` layout primitive renders (SPEC-080). */
10
+ function splitBarZones(nodes) {
11
+ const hrIndex = nodes.findIndex(n => n.type === 'hr');
12
+ if (hrIndex < 0)
13
+ return { left: nodes, right: [] };
14
+ return {
15
+ left: nodes.slice(0, hrIndex),
16
+ right: nodes.slice(hrIndex + 1),
17
+ };
18
+ }
19
+ /**
20
+ * Bar rune — block-level wrapper that renders the SPEC-080 `bar` layout
21
+ * primitive (a horizontal flex row) over author-written content. The body
22
+ * splits on a top-level `---` into a left group and a right group; the right
23
+ * group is tagged `data-align="end"` so the shared
24
+ * `[data-zone-layout="bar"] [data-align="end"] { margin-left: auto }` rule
25
+ * pushes it to the row's end. Position-agnostic: place it in the eyebrow
26
+ * slot for a kicker, or anywhere a labelled strip is wanted.
27
+ *
28
+ * Usage:
29
+ * {% bar %}
30
+ * ID-123
31
+ * ---
32
+ * {% badge sentiment="positive" %}done{% /badge %}
33
+ * {% /bar %}
34
+ *
35
+ * {% bar %}
36
+ * Just one side — no right group.
37
+ * {% /bar %}
38
+ */
39
+ export const bar = createContentModelSchema({
40
+ attributes: {},
41
+ contentModel: {
42
+ type: 'sequence',
43
+ fields: [
44
+ { name: 'body', match: 'any', optional: true, greedy: true },
45
+ ],
46
+ },
47
+ transform(resolved, _attrs, config) {
48
+ const zones = splitBarZones(asNodes(resolved.body));
49
+ const leftNodes = Markdoc.transform(zones.left, config);
50
+ const rightNodes = Markdoc.transform(zones.right, config);
51
+ const left = new Tag('div', {}, leftNodes);
52
+ const right = zones.right.length > 0
53
+ ? new Tag('div', { 'data-align': 'end' }, rightNodes)
54
+ : null;
55
+ const children = right ? [left, right] : [left];
56
+ // Same DOM as the engine's `bar` layout primitive so themes target
57
+ // both via `[data-zone-layout="bar"]`.
58
+ return new Tag('div', {
59
+ 'data-rune': 'bar',
60
+ 'data-zone-layout': 'bar',
61
+ }, children);
62
+ },
63
+ });
64
+ //# sourceMappingURL=bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar.js","sourceRoot":"","sources":["../../src/tags/bar.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpE;;;;;0DAK0D;AAC1D,SAAS,aAAa,CAAC,KAAa;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACtD,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnD,OAAO;QACN,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC;QAC7B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;KAC/B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,wBAAwB,CAAC;IAC3C,UAAU,EAAE,EAAE;IACd,YAAY,EAAE;QACb,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE;YACP,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;SAC5D;KACD;IACD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM;QACjC,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAyB,CAAC;QAChF,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAyB,CAAC;QAElF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACnC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,UAAU,CAAC;YACrD,CAAC,CAAC,IAAI,CAAC;QAER,MAAM,QAAQ,GAAyB,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEtE,mEAAmE;QACnE,uCAAuC;QACvC,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE;YACrB,WAAW,EAAE,KAAK;YAClB,kBAAkB,EAAE,KAAK;SACzB,EAAE,QAAQ,CAAC,CAAC;IACd,CAAC;CACD,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codegroup.d.ts","sourceRoot":"","sources":["../../src/tags/codegroup.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAqBvC,eAAO,MAAM,SAAS,gBA0EpB,CAAC"}
1
+ {"version":3,"file":"codegroup.d.ts","sourceRoot":"","sources":["../../src/tags/codegroup.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAyCvC,eAAO,MAAM,SAAS,gBA+FpB,CAAC"}
@@ -13,6 +13,27 @@ const languageNames = {
13
13
  function prettifyLanguage(lang) {
14
14
  return languageNames[lang] || lang.charAt(0).toUpperCase() + lang.slice(1);
15
15
  }
16
+ /** Extract the trailing filename from a project-root-relative path.
17
+ * Falls back to the trimmed input when no separator is present. */
18
+ function basename(path) {
19
+ if (!path)
20
+ return '';
21
+ const trimmed = path.endsWith('/') ? path.slice(0, -1) : path;
22
+ const slash = trimmed.lastIndexOf('/');
23
+ return slash >= 0 ? trimmed.slice(slash + 1) : trimmed;
24
+ }
25
+ /** Derive a tab label from a fence's `source` (+ optional `lines`) annotation:
26
+ * `theme.ts` standalone, or `theme.ts:74-125` when a range is specified.
27
+ * Returns empty string when no `source` is set so callers can fall through
28
+ * to the next step in the label-resolution chain. */
29
+ function labelFromSource(source, lines) {
30
+ if (!source)
31
+ return '';
32
+ const name = basename(source);
33
+ if (!name)
34
+ return '';
35
+ return lines ? `${name}:${lines}` : name;
36
+ }
16
37
  const overflowValues = ['scroll', 'wrap', 'hide'];
17
38
  export const codegroup = createContentModelSchema({
18
39
  attributes: {
@@ -30,7 +51,10 @@ export const codegroup = createContentModelSchema({
30
51
  const customLabels = attrs.labels?.split(',').map(l => l.trim()) ?? [];
31
52
  const properties = {};
32
53
  const children = [];
33
- if (attrs.title) {
54
+ // Emit the title meta whenever the attribute is *present* — even an
55
+ // empty string. `title=""` opts into the window chrome (stoplights)
56
+ // without a filename; an absent `title` renders no topbar at all.
57
+ if (attrs.title !== undefined) {
34
58
  const titleMeta = new Tag('meta', { content: attrs.title });
35
59
  properties.title = titleMeta;
36
60
  children.push(titleMeta);
@@ -57,7 +81,22 @@ export const codegroup = createContentModelSchema({
57
81
  const panelItems = [];
58
82
  for (const child of panels) {
59
83
  const lang = child.attributes.language || 'shell';
60
- const label = customLabels[tabItems.length] || prettifyLanguage(lang);
84
+ // Label precedence (WORK-304):
85
+ // 1. Group-level `labels=` positional override
86
+ // 2. Per-fence `label` annotation (` ```ts {% label="X" %} `)
87
+ // 3. Derived from fence `source` annotation (basename, with
88
+ // `:lines` suffix when set) — populated automatically when
89
+ // the panel is `{% snippet %}`-derived, and authorable on
90
+ // hand-written fences for the same effect
91
+ // 4. Prettified language name (today's default)
92
+ const fenceLabelAttr = typeof child.attributes.label === 'string'
93
+ ? child.attributes.label
94
+ : '';
95
+ const sourceLabel = labelFromSource(typeof child.attributes.source === 'string' ? child.attributes.source : undefined, typeof child.attributes.lines === 'string' ? child.attributes.lines : undefined);
96
+ const label = customLabels[tabItems.length]
97
+ || fenceLabelAttr
98
+ || sourceLabel
99
+ || prettifyLanguage(lang);
61
100
  const nameSpan = new Tag('span', {}, [label]);
62
101
  tabItems.push(new Tag('button', { 'data-name': 'tab', role: 'tab' }, [nameSpan]));
63
102
  const code = Markdoc.transform(child, config);
@@ -1 +1 @@
1
- {"version":3,"file":"codegroup.js","sourceRoot":"","sources":["../../src/tags/codegroup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codegroup.js","sourceRoot":"","sources":["../../src/tags/codegroup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ /**
3
+ * Deflist rune — block-level wrapper that renders the SPEC-079
4
+ * `definition-list` layout primitive over an author-written markdown
5
+ * list. Each list item starting with `**Term:**` produces a `<dt>` +
6
+ * `<dd>` pair; items without that prefix get an empty `<dt>` plus the
7
+ * full content in `<dd>` (plus a build-time warning naming the line).
8
+ *
9
+ * Composable inside any container rune; same DOM as a projected
10
+ * metadata zone using the `definition-list` layout.
11
+ *
12
+ * Usage:
13
+ * {% deflist %}
14
+ * - **Priority:** {% badge sentiment="caution" %}high{% /badge %}
15
+ * - **Complexity:** moderate
16
+ * - **Assignee:** @alice
17
+ * {% /deflist %}
18
+ */
19
+ export declare const deflist: Markdoc.Schema;
20
+ //# sourceMappingURL=deflist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deflist.d.ts","sourceRoot":"","sources":["../../src/tags/deflist.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAyFvC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,gBAmDlB,CAAC"}
@@ -0,0 +1,173 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ const { Ast, Tag } = Markdoc;
3
+ import { createContentModelSchema, asNodes } from '../lib/index.js';
4
+ /** Parse a list item's first paragraph node to look for a `**Term:**`
5
+ * prefix. Returns `{ term, rest }` where `term` is the bold-text
6
+ * content (without the trailing `:`) and `rest` is the remaining
7
+ * inline content of the paragraph + subsequent block children. If no
8
+ * bold prefix is found, returns `null` — the deflist rune falls back
9
+ * to an empty `<dt>` + the item's full content in `<dd>`. */
10
+ function extractTermPrefix(itemNode) {
11
+ const children = itemNode.children ?? [];
12
+ if (children.length === 0)
13
+ return null;
14
+ // Markdoc list items hold their content as either:
15
+ // - a tight `inline` node directly under `item` (simple one-line item)
16
+ // - a `paragraph` wrapping an `inline` node (loose / multi-block item)
17
+ // Handle both shapes — extract the inline node either way.
18
+ let inlineNode;
19
+ let restBlockChildren;
20
+ const first = children[0];
21
+ if (first?.type === 'inline') {
22
+ inlineNode = first;
23
+ restBlockChildren = children.slice(1);
24
+ }
25
+ else if (first?.type === 'paragraph') {
26
+ inlineNode = first.children?.[0];
27
+ restBlockChildren = children.slice(1);
28
+ }
29
+ else {
30
+ return null;
31
+ }
32
+ if (!inlineNode || inlineNode.type !== 'inline')
33
+ return null;
34
+ const inlineKids = inlineNode.children ?? [];
35
+ if (inlineKids.length === 0)
36
+ return null;
37
+ const head = inlineKids[0];
38
+ if (!head || head.type !== 'strong')
39
+ return null;
40
+ // Extract the bold text content; require it to end with `:`.
41
+ const strongChildren = head.children ?? [];
42
+ let strongText = '';
43
+ for (const c of strongChildren) {
44
+ if (c.type === 'text' && typeof c.attributes?.content === 'string') {
45
+ strongText += c.attributes.content;
46
+ }
47
+ }
48
+ if (!strongText.endsWith(':'))
49
+ return null;
50
+ // Remove the trailing `:` from the term — common-case "Priority:" → "Priority".
51
+ const termText = strongText.slice(0, -1);
52
+ const termNodes = [
53
+ // Build a fresh text node with the cleaned term so the dt content
54
+ // is just the term name, no trailing colon.
55
+ new Ast.Node('text', { content: termText }),
56
+ ];
57
+ // Build the rest of the inline content: drop the leading strong, and
58
+ // strip ONE leading whitespace text node if present (the space after
59
+ // `**Term:**` in markdown).
60
+ const remainingInline = inlineKids.slice(1);
61
+ const trimmed = (() => {
62
+ const first = remainingInline[0];
63
+ if (first?.type === 'text' && typeof first.attributes?.content === 'string') {
64
+ const stripped = first.attributes.content.replace(/^\s+/, '');
65
+ if (stripped === '')
66
+ return remainingInline.slice(1);
67
+ const clone = new Ast.Node('text', { content: stripped });
68
+ return [clone, ...remainingInline.slice(1)];
69
+ }
70
+ return remainingInline;
71
+ })();
72
+ const restInline = trimmed.length > 0
73
+ ? [new Ast.Node('inline', {}, trimmed)]
74
+ : [];
75
+ const restParagraph = restInline.length > 0
76
+ ? [new Ast.Node('paragraph', {}, restInline)]
77
+ : [];
78
+ return {
79
+ term: termNodes,
80
+ rest: restInline,
81
+ restBlocks: [...restParagraph, ...restBlockChildren],
82
+ };
83
+ }
84
+ /**
85
+ * Deflist rune — block-level wrapper that renders the SPEC-079
86
+ * `definition-list` layout primitive over an author-written markdown
87
+ * list. Each list item starting with `**Term:**` produces a `<dt>` +
88
+ * `<dd>` pair; items without that prefix get an empty `<dt>` plus the
89
+ * full content in `<dd>` (plus a build-time warning naming the line).
90
+ *
91
+ * Composable inside any container rune; same DOM as a projected
92
+ * metadata zone using the `definition-list` layout.
93
+ *
94
+ * Usage:
95
+ * {% deflist %}
96
+ * - **Priority:** {% badge sentiment="caution" %}high{% /badge %}
97
+ * - **Complexity:** moderate
98
+ * - **Assignee:** @alice
99
+ * {% /deflist %}
100
+ */
101
+ export const deflist = createContentModelSchema({
102
+ attributes: {},
103
+ contentModel: {
104
+ type: 'sequence',
105
+ fields: [
106
+ { name: 'list', match: 'list', optional: false },
107
+ ],
108
+ },
109
+ transform(resolved, _attrs, config) {
110
+ const listNodes = asNodes(resolved.list);
111
+ const listNode = listNodes.find(n => n.type === 'list');
112
+ if (!listNode) {
113
+ // Fallback when the content model didn't capture a list — render
114
+ // an empty dl so DOM stays valid; the content-model resolver
115
+ // already emits its own diagnostic.
116
+ return new Tag('dl', {
117
+ 'data-rune': 'deflist',
118
+ 'data-zone-layout': 'definition-list',
119
+ }, []);
120
+ }
121
+ const items = (listNode.children ?? []).filter(c => c.type === 'item');
122
+ const rows = [];
123
+ for (const item of items) {
124
+ const extracted = extractTermPrefix(item);
125
+ let dt;
126
+ let dd;
127
+ if (extracted) {
128
+ const termRendered = Markdoc.transform(extracted.term, config);
129
+ const valueRendered = Markdoc.transform(extracted.restBlocks, config);
130
+ dt = new Tag('dt', { 'data-meta-label': '' }, termRendered);
131
+ dd = new Tag('dd', {}, unwrapSingleParagraph(valueRendered));
132
+ }
133
+ else {
134
+ // Fallback: empty <dt> + full item content in <dd>. Warn once
135
+ // per process so authors find the unparsed item.
136
+ const fullRendered = Markdoc.transform(item.children ?? [], config);
137
+ dt = new Tag('dt', { 'data-meta-label': '' }, []);
138
+ dd = new Tag('dd', {}, unwrapSingleParagraph(fullRendered));
139
+ warnDeflistUnparsedItem(item);
140
+ }
141
+ rows.push(new Tag('div', { 'data-name': 'row' }, [dt, dd]));
142
+ }
143
+ return new Tag('dl', {
144
+ 'data-rune': 'deflist',
145
+ 'data-zone-layout': 'definition-list',
146
+ }, rows);
147
+ },
148
+ });
149
+ /** When the dd's content is a single `<p>` (the typical case for a
150
+ * short inline value), unwrap it so the dd renders as `<dd>value</dd>`
151
+ * instead of `<dd><p>value</p></dd>`. Multi-paragraph dd content stays
152
+ * wrapped. */
153
+ function unwrapSingleParagraph(nodes) {
154
+ if (nodes.length !== 1)
155
+ return nodes;
156
+ const only = nodes[0];
157
+ if (!Markdoc.Tag.isTag(only) || only.name !== 'p')
158
+ return nodes;
159
+ return only.children;
160
+ }
161
+ const DEFLIST_WARNED = new Set();
162
+ function warnDeflistUnparsedItem(item) {
163
+ const loc = item.location ?? null;
164
+ const key = loc ? `${loc.start?.line ?? '?'}:${loc.start?.character ?? '?'}` : 'unknown';
165
+ if (DEFLIST_WARNED.has(key))
166
+ return;
167
+ DEFLIST_WARNED.add(key);
168
+ // eslint-disable-next-line no-console
169
+ console.warn(`[refrakt] {% deflist %} item at line ${loc?.start?.line ?? '?'} lacks ` +
170
+ `a \`**Term:**\` prefix — rendered with empty <dt>. Prefix the item ` +
171
+ `with bold term text ending in \`:\` to label it.`);
172
+ }
173
+ //# sourceMappingURL=deflist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deflist.js","sourceRoot":"","sources":["../../src/tags/deflist.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/tags/diff.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAyJvC,eAAO,MAAM,IAAI,gBAoDf,CAAC"}
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/tags/diff.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AA+MvC,eAAO,MAAM,IAAI,gBAoEf,CAAC"}
package/dist/tags/diff.js CHANGED
@@ -99,29 +99,46 @@ function getUnifiedLines(hunks) {
99
99
  * before-num for an add line) takes the place of the old `+`/`-` prefix as
100
100
  * the directional cue: combined with the change-tinted number colour and
101
101
  * the line's left-edge border, the absence/presence pattern says which way
102
- * the change goes without a dedicated prefix column. */
103
- function buildUnifiedRenderable(hunks, lang) {
102
+ * the change goes without a dedicated prefix column.
103
+ *
104
+ * WORK-304 — line spans carry `data-line-status` (was `data-type`) to
105
+ * share the row primitive with code-block line highlighting and any
106
+ * future per-line state. Values: `equal | add | remove`. */
107
+ function buildUnifiedRenderable(hunks, lang, beforeOffset = 0, afterOffset = 0) {
104
108
  const lines = getUnifiedLines(hunks);
105
109
  const lineNodes = lines.map(({ hunk, beforeNum, afterNum }) => {
106
- return new Tag('span', { 'data-name': 'line', 'data-type': hunk.type }, [
107
- new Tag('span', { 'data-name': 'gutter-num', 'data-side': 'before' }, [beforeNum != null ? String(beforeNum) : '']),
108
- new Tag('span', { 'data-name': 'gutter-num', 'data-side': 'after' }, [afterNum != null ? String(afterNum) : '']),
110
+ return new Tag('span', { 'data-name': 'line', 'data-line-status': hunk.type }, [
111
+ new Tag('span', { 'data-name': 'gutter-num', 'data-side': 'before' }, [beforeNum != null ? String(beforeNum + beforeOffset) : '']),
112
+ new Tag('span', { 'data-name': 'gutter-num', 'data-side': 'after' }, [afterNum != null ? String(afterNum + afterOffset) : '']),
109
113
  new Tag('span', { 'data-name': 'line-content', ...(lang ? { 'data-language': lang } : {}) }, [hunk.text]),
110
114
  ]);
111
115
  });
112
- return [new Tag('pre', { 'data-name': 'code', 'data-copy-selector': '[data-name="line-content"]' }, lineNodes)];
116
+ return [new Tag('pre', { 'data-name': 'code', 'data-copy-selector': '[data-name="line-content"]' }, [
117
+ // WORK-304 — inner wrapper hosts the `display: grid; min-width:
118
+ // max-content` row-width sizing so the row tint (+/-/highlight)
119
+ // extends across the full horizontal scroll region. Mirrors the
120
+ // `<pre><code>` pattern the standalone codeblock uses for the
121
+ // same reason: putting the sizing on the pre itself defeats
122
+ // `overflow-x: auto`. CSS hook: `.rf-diff__rows`.
123
+ new Tag('div', { 'data-name': 'rows' }, lineNodes),
124
+ ])];
113
125
  }
114
126
  /** Build split diff renderable — side-by-side panels with one numbered
115
127
  * gutter per panel. Placeholder rows (where the matching side has the
116
128
  * add/remove) render an empty gutter + empty content; the fixed gutter
117
- * width keeps the column rigid so rows align across panels. */
118
- function buildSplitRenderable(hunks, lang) {
129
+ * width keeps the column rigid so rows align across panels.
130
+ *
131
+ * WORK-304 — same `data-line-status` rename + per-side offset support
132
+ * as the unified renderable. `beforeOffset` / `afterOffset` are the
133
+ * `lines=` start minus one, so a fence with `lines="50-100"` adds 49
134
+ * to its 1-indexed `num` to produce gutter values starting at 50. */
135
+ function buildSplitRenderable(hunks, lang, beforeOffset = 0, afterOffset = 0) {
119
136
  const { before, after } = getSplitLines(hunks);
120
- function buildPanelLines(lines, side) {
137
+ function buildPanelLines(lines, side, offset) {
121
138
  return lines.map(line => {
122
139
  const type = line ? line.hunk.type : 'empty';
123
- return new Tag('span', { 'data-name': 'line', 'data-type': type }, [
124
- new Tag('span', { 'data-name': 'gutter-num', 'data-side': side }, [line ? String(line.num) : '']),
140
+ return new Tag('span', { 'data-name': 'line', 'data-line-status': type }, [
141
+ new Tag('span', { 'data-name': 'gutter-num', 'data-side': side }, [line ? String(line.num + offset) : '']),
125
142
  new Tag('span', { 'data-name': 'line-content', ...(line && lang ? { 'data-language': lang } : {}) }, [
126
143
  line ? line.hunk.text : '',
127
144
  ]),
@@ -130,13 +147,48 @@ function buildSplitRenderable(hunks, lang) {
130
147
  }
131
148
  return [new Tag('div', { 'data-name': 'split-container' }, [
132
149
  new Tag('div', { 'data-name': 'panel' }, [
133
- new Tag('pre', { 'data-name': 'code', 'data-copy-selector': '[data-name="line-content"]' }, buildPanelLines(before, 'before')),
150
+ new Tag('pre', { 'data-name': 'code', 'data-copy-selector': '[data-name="line-content"]' }, [
151
+ new Tag('div', { 'data-name': 'rows' }, buildPanelLines(before, 'before', beforeOffset)),
152
+ ]),
134
153
  ]),
135
154
  new Tag('div', { 'data-name': 'panel' }, [
136
- new Tag('pre', { 'data-name': 'code', 'data-copy-selector': '[data-name="line-content"]' }, buildPanelLines(after, 'after')),
155
+ new Tag('pre', { 'data-name': 'code', 'data-copy-selector': '[data-name="line-content"]' }, [
156
+ new Tag('div', { 'data-name': 'rows' }, buildPanelLines(after, 'after', afterOffset)),
157
+ ]),
137
158
  ]),
138
159
  ])];
139
160
  }
161
+ /** Parse the leading integer of a `lines="N-M"` (or `"N"`) annotation and
162
+ * return `N - 1` as the gutter offset, or 0 when the annotation is
163
+ * missing / malformed. Diff uses this per side so each panel's gutter
164
+ * reflects the file's actual coordinates rather than always starting at 1. */
165
+ function gutterOffsetFromLines(linesAttr) {
166
+ if (typeof linesAttr !== 'string' || linesAttr.length === 0)
167
+ return 0;
168
+ const m = /^(\d+)/.exec(linesAttr.trim());
169
+ if (!m)
170
+ return 0;
171
+ const n = Number(m[1]);
172
+ return Number.isFinite(n) && n > 0 ? n - 1 : 0;
173
+ }
174
+ /** Build the diff header: explicit `title` attribute wins, otherwise the
175
+ * fence `source` annotations form the header. When both sides share a
176
+ * source they collapse to a single label; differing sources render as
177
+ * `before → after`. Falls back to no header when nothing is set. */
178
+ function deriveHeader(title, beforeSource, afterSource) {
179
+ if (title)
180
+ return [new Tag('div', { 'data-name': 'header' }, [title])];
181
+ if (beforeSource && afterSource) {
182
+ if (beforeSource === afterSource) {
183
+ return [new Tag('div', { 'data-name': 'header' }, [beforeSource])];
184
+ }
185
+ return [new Tag('div', { 'data-name': 'header' }, [`${beforeSource} → ${afterSource}`])];
186
+ }
187
+ const single = beforeSource || afterSource;
188
+ if (single)
189
+ return [new Tag('div', { 'data-name': 'header' }, [single])];
190
+ return [];
191
+ }
140
192
  export const diff = createContentModelSchema({
141
193
  attributes: {
142
194
  mode: { type: String, required: false, matches: modeType.slice(), description: 'Diff display style: unified, split, or inline' },
@@ -160,15 +212,30 @@ export const diff = createContentModelSchema({
160
212
  const beforeSource = fences.length > 0 ? (fences[0].attributes.content || '').replace(/\n$/, '') : '';
161
213
  const afterSource = fences.length > 1 ? (fences[1].attributes.content || '').replace(/\n$/, '') : '';
162
214
  const lang = language || (fences.length > 0 ? fences[0].attributes.language || '' : '');
215
+ // WORK-304 — per-fence annotations:
216
+ // - `source` populates the diff header (and collapses to a single
217
+ // label when both sides share it; renders `before → after`
218
+ // otherwise).
219
+ // - `lines` derives per-side gutter offsets so each panel's
220
+ // line numbers reflect the file's real coordinates.
221
+ // - `highlight` is intentionally ignored — diff's add/remove
222
+ // status IS the primary line-level signal, and emphasis on
223
+ // top would muddy the +/- channel. Silent no-op; no warning.
224
+ const beforeFenceSource = fences.length > 0 && typeof fences[0].attributes.source === 'string'
225
+ ? fences[0].attributes.source
226
+ : undefined;
227
+ const afterFenceSource = fences.length > 1 && typeof fences[1].attributes.source === 'string'
228
+ ? fences[1].attributes.source
229
+ : undefined;
230
+ const beforeOffset = fences.length > 0 ? gutterOffsetFromLines(fences[0].attributes.lines) : 0;
231
+ const afterOffset = fences.length > 1 ? gutterOffsetFromLines(fences[1].attributes.lines) : 0;
163
232
  // Compute line-level diff (highlighting deferred to highlight transform)
164
233
  const hunks = computeLineDiff(beforeSource, afterSource);
165
234
  // Build expanded renderable AST
166
235
  const expanded = mode === 'split'
167
- ? buildSplitRenderable(hunks, lang)
168
- : buildUnifiedRenderable(hunks, lang);
169
- const header = title
170
- ? [new Tag('div', { 'data-name': 'header' }, [title])]
171
- : [];
236
+ ? buildSplitRenderable(hunks, lang, beforeOffset, afterOffset)
237
+ : buildUnifiedRenderable(hunks, lang, beforeOffset, afterOffset);
238
+ const header = deriveHeader(title, beforeFenceSource, afterFenceSource);
172
239
  const renderable = createComponentRenderable({ rune: 'diff',
173
240
  tag: 'div',
174
241
  properties: {
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/tags/diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/tags/diff.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../src/tags/drawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAMvC;qFACqF;AACrF,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AAKjE,eAAO,MAAM,MAAM,gBAgHjB,CAAC"}
1
+ {"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../src/tags/drawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAMvC;qFACqF;AACrF,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AAoBjE,eAAO,MAAM,MAAM,gBAiIjB,CAAC"}
@@ -27,6 +27,21 @@ import { RenderableNodeCursor } from '../lib/renderable.js';
27
27
  export const DRAWER_TITLE_AUTO_MARKER = 'data-drawer-title-auto';
28
28
  const drawerSides = ['right', 'left', 'top', 'bottom'];
29
29
  const drawerSizes = ['sm', 'md', 'lg'];
30
+ /** Split a drawer body's node list on the **first** top-level `hr` into body
31
+ * + footer zones. 1 zone → `{ body: nodes, footer: null }`; 2+ zones →
32
+ * `{ body: before-hr, footer: after-hr }` where any subsequent hrs in the
33
+ * footer render as ordinary horizontal rules within the footer. Matches the
34
+ * body-zone convention `{% card %}` uses (positional, count-driven), scaled
35
+ * down to the two-zone case the drawer needs. */
36
+ function splitDrawerBodyZones(nodes) {
37
+ const hrIndex = nodes.findIndex(n => n.type === 'hr');
38
+ if (hrIndex < 0)
39
+ return { body: nodes, footer: null };
40
+ return {
41
+ body: nodes.slice(0, hrIndex),
42
+ footer: nodes.slice(hrIndex + 1),
43
+ };
44
+ }
30
45
  export const drawer = createContentModelSchema({
31
46
  attributes: {
32
47
  id: {
@@ -96,7 +111,16 @@ export const drawer = createContentModelSchema({
96
111
  headerChildren.push(titleTag);
97
112
  headerChildren.push(closeButton);
98
113
  const header = new Tag('header', {}, headerChildren);
99
- const body = new RenderableNodeCursor(Markdoc.transform(asNodes(resolved.body), config)).wrap('div');
114
+ // Split the body on the first top-level `hr` into body + footer zones
115
+ // (SPEC-078). 1 zone → all body; 2+ zones → body + footer. The footer
116
+ // zone shows up as `<footer data-name="footer" class="rf-drawer__footer">`
117
+ // alongside the body so the hoist mechanism for `preview="drawer"` and
118
+ // author-written standalone drawers populate the same slot.
119
+ const zones = splitDrawerBodyZones(asNodes(resolved.body));
120
+ const body = new RenderableNodeCursor(Markdoc.transform(zones.body, config)).wrap('div');
121
+ const footer = zones.footer !== null
122
+ ? new RenderableNodeCursor(Markdoc.transform(zones.footer, config)).wrap('footer')
123
+ : null;
100
124
  // Property meta tags drive engine modifier-from-meta + data-attribute
101
125
  // derivation. We always emit `side` and `size` so the engine applies
102
126
  // the BEM modifier even when the author didn't specify them (the
@@ -120,8 +144,14 @@ export const drawer = createContentModelSchema({
120
144
  ...(titleTag ? { title: titleTag } : {}),
121
145
  close: closeButton,
122
146
  body: body.tag('div'),
147
+ ...(footer ? { footer: footer.tag('footer') } : {}),
123
148
  },
124
- children: [...Object.values(properties), header, body.next()],
149
+ children: [
150
+ ...Object.values(properties),
151
+ header,
152
+ body.next(),
153
+ ...(footer ? [footer.next()] : []),
154
+ ],
125
155
  });
126
156
  // `data-drawer-id` carries the author-supplied id (before the
127
157
  // `drawer-` prefix) for register-hook consumption. The register