@texuli/blocks 0.0.0-stage → 0.1.0-next.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 (257) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -2
  3. package/dist/code/CodeBlockView.svelte +135 -0
  4. package/dist/code/CodeBlockView.svelte.d.ts +5 -0
  5. package/dist/code/check.d.ts +15 -0
  6. package/dist/code/check.js +14 -0
  7. package/dist/code/code.css +201 -0
  8. package/dist/code/code.css.d.ts +1 -0
  9. package/dist/code/engine-entry.d.ts +10 -0
  10. package/dist/code/engine-entry.js +10 -0
  11. package/dist/code/engine.d.ts +18 -0
  12. package/dist/code/engine.js +18 -0
  13. package/dist/code/family-engine.d.ts +23 -0
  14. package/dist/code/family-engine.js +4 -0
  15. package/dist/code/family.d.ts +7 -0
  16. package/dist/code/family.js +5 -0
  17. package/dist/code/grammars.d.ts +12 -0
  18. package/dist/code/grammars.js +83 -0
  19. package/dist/code/highlight.d.ts +15 -0
  20. package/dist/code/highlight.js +53 -0
  21. package/dist/code/index.d.ts +13 -0
  22. package/dist/code/index.js +12 -0
  23. package/dist/code/labels.d.ts +27 -0
  24. package/dist/code/labels.js +24 -0
  25. package/dist/code/languages/bash.d.ts +3 -0
  26. package/dist/code/languages/bash.js +48 -0
  27. package/dist/code/languages/css.d.ts +10 -0
  28. package/dist/code/languages/css.js +67 -0
  29. package/dist/code/languages/html.d.ts +6 -0
  30. package/dist/code/languages/html.js +35 -0
  31. package/dist/code/languages/javascript.d.ts +3 -0
  32. package/dist/code/languages/javascript.js +113 -0
  33. package/dist/code/languages/json.d.ts +3 -0
  34. package/dist/code/languages/json.js +24 -0
  35. package/dist/code/languages/python.d.ts +3 -0
  36. package/dist/code/languages/python.js +35 -0
  37. package/dist/code/languages/shared.d.ts +22 -0
  38. package/dist/code/languages/shared.js +37 -0
  39. package/dist/code/languages/sql.d.ts +3 -0
  40. package/dist/code/languages/sql.js +32 -0
  41. package/dist/code/languages/yaml.d.ts +7 -0
  42. package/dist/code/languages/yaml.js +36 -0
  43. package/dist/code/renderers.d.ts +5 -0
  44. package/dist/code/renderers.js +5 -0
  45. package/dist/code/token-styles.d.ts +25 -0
  46. package/dist/code/token-styles.js +51 -0
  47. package/dist/code/tokenize-code.d.ts +17 -0
  48. package/dist/code/tokenize-code.js +34 -0
  49. package/dist/code/tokenizer.d.ts +76 -0
  50. package/dist/code/tokenizer.js +171 -0
  51. package/dist/core/catalog/entries.d.ts +10 -0
  52. package/dist/core/catalog/entries.js +589 -0
  53. package/dist/core/catalog/index.d.ts +4 -0
  54. package/dist/core/catalog/index.js +2 -0
  55. package/dist/core/catalog/types.d.ts +36 -0
  56. package/dist/core/catalog/types.js +1 -0
  57. package/dist/core/catalog/validate.d.ts +15 -0
  58. package/dist/core/catalog/validate.js +46 -0
  59. package/dist/core/formula/evaluate.d.ts +14 -0
  60. package/dist/core/formula/evaluate.js +181 -0
  61. package/dist/core/formula/index.d.ts +8 -0
  62. package/dist/core/formula/index.js +6 -0
  63. package/dist/core/formula/parse.d.ts +19 -0
  64. package/dist/core/formula/parse.js +452 -0
  65. package/dist/core/formula/types.d.ts +76 -0
  66. package/dist/core/formula/types.js +7 -0
  67. package/dist/core/index.d.ts +14 -0
  68. package/dist/core/index.js +13 -0
  69. package/dist/core/limits.d.ts +27 -0
  70. package/dist/core/limits.js +26 -0
  71. package/dist/core/safety.d.ts +30 -0
  72. package/dist/core/safety.js +110 -0
  73. package/dist/core/schema/blocks.d.ts +138 -0
  74. package/dist/core/schema/blocks.js +181 -0
  75. package/dist/core/schema/code-family.d.ts +4 -0
  76. package/dist/core/schema/code-family.js +75 -0
  77. package/dist/core/schema/line-spec.d.ts +7 -0
  78. package/dist/core/schema/line-spec.js +19 -0
  79. package/dist/core/schema/media-family.d.ts +4 -0
  80. package/dist/core/schema/media-family.js +260 -0
  81. package/dist/core/schema/parse-family.d.ts +14 -0
  82. package/dist/core/schema/parse-family.js +37 -0
  83. package/dist/core/schema/primitives.d.ts +73 -0
  84. package/dist/core/schema/primitives.js +140 -0
  85. package/dist/core/schema/text-family.d.ts +4 -0
  86. package/dist/core/schema/text-family.js +121 -0
  87. package/dist/core/schema/vocabulary.d.ts +20 -0
  88. package/dist/core/schema/vocabulary.js +33 -0
  89. package/dist/core/text.d.ts +31 -0
  90. package/dist/core/text.js +139 -0
  91. package/dist/core/untrusted.d.ts +20 -0
  92. package/dist/core/untrusted.js +377 -0
  93. package/dist/css-modules.d.ts +1 -0
  94. package/dist/css.d.ts +1 -0
  95. package/dist/data/ChartBlockView.svelte +77 -0
  96. package/dist/data/ChartBlockView.svelte.d.ts +10 -0
  97. package/dist/data/DataBlockView.svelte +109 -0
  98. package/dist/data/DataBlockView.svelte.d.ts +5 -0
  99. package/dist/data/check.d.ts +10 -0
  100. package/dist/data/check.js +9 -0
  101. package/dist/data/engine.d.ts +18 -0
  102. package/dist/data/engine.js +10 -0
  103. package/dist/data/family.d.ts +6 -0
  104. package/dist/data/family.js +4 -0
  105. package/dist/data/index.d.ts +9 -0
  106. package/dist/data/index.js +8 -0
  107. package/dist/data/labels.d.ts +8 -0
  108. package/dist/data/labels.js +8 -0
  109. package/dist/data/renderers.d.ts +2 -0
  110. package/dist/data/renderers.js +2 -0
  111. package/dist/data/schema.d.ts +84 -0
  112. package/dist/data/schema.js +385 -0
  113. package/dist/diagram/BoardDiagram.svelte +48 -0
  114. package/dist/diagram/BoardDiagram.svelte.d.ts +8 -0
  115. package/dist/diagram/DiagramFamily.svelte +46 -0
  116. package/dist/diagram/DiagramFamily.svelte.d.ts +10 -0
  117. package/dist/diagram/FlowDiagram.svelte +108 -0
  118. package/dist/diagram/FlowDiagram.svelte.d.ts +8 -0
  119. package/dist/diagram/TerminalDiagram.svelte +38 -0
  120. package/dist/diagram/TerminalDiagram.svelte.d.ts +8 -0
  121. package/dist/diagram/TreeDiagram.svelte +149 -0
  122. package/dist/diagram/TreeDiagram.svelte.d.ts +8 -0
  123. package/dist/diagram/diagram.css +287 -0
  124. package/dist/diagram/diagram.css.d.ts +1 -0
  125. package/dist/diagram/engine.d.ts +16 -0
  126. package/dist/diagram/engine.js +14 -0
  127. package/dist/diagram/family.d.ts +7 -0
  128. package/dist/diagram/family.js +5 -0
  129. package/dist/diagram/index.d.ts +10 -0
  130. package/dist/diagram/index.js +9 -0
  131. package/dist/diagram/layout.d.ts +26 -0
  132. package/dist/diagram/layout.js +165 -0
  133. package/dist/diagram/schema.d.ts +74 -0
  134. package/dist/diagram/schema.js +358 -0
  135. package/dist/diagram/tones.d.ts +6 -0
  136. package/dist/diagram/tones.js +16 -0
  137. package/dist/embed/EmbedApp.svelte +138 -0
  138. package/dist/embed/EmbedApp.svelte.d.ts +17 -0
  139. package/dist/embed/EmbedBlockView.svelte +32 -0
  140. package/dist/embed/EmbedBlockView.svelte.d.ts +5 -0
  141. package/dist/embed/LinkPreview.svelte +48 -0
  142. package/dist/embed/LinkPreview.svelte.d.ts +10 -0
  143. package/dist/embed/engine.d.ts +30 -0
  144. package/dist/embed/engine.js +17 -0
  145. package/dist/embed/family.d.ts +7 -0
  146. package/dist/embed/family.js +5 -0
  147. package/dist/embed/index.d.ts +5 -0
  148. package/dist/embed/index.js +3 -0
  149. package/dist/embed/renderers.d.ts +3 -0
  150. package/dist/embed/renderers.js +3 -0
  151. package/dist/embed/sandbox.d.ts +86 -0
  152. package/dist/embed/sandbox.js +114 -0
  153. package/dist/embed/schema.d.ts +30 -0
  154. package/dist/embed/schema.js +217 -0
  155. package/dist/index.d.ts +16 -0
  156. package/dist/index.js +15 -0
  157. package/dist/interactive/CalculatorBlock.svelte +61 -0
  158. package/dist/interactive/CalculatorBlock.svelte.d.ts +10 -0
  159. package/dist/interactive/ChecklistBlock.svelte +44 -0
  160. package/dist/interactive/ChecklistBlock.svelte.d.ts +10 -0
  161. package/dist/interactive/InteractiveBlockView.svelte +31 -0
  162. package/dist/interactive/InteractiveBlockView.svelte.d.ts +5 -0
  163. package/dist/interactive/PollBlock.svelte +111 -0
  164. package/dist/interactive/PollBlock.svelte.d.ts +10 -0
  165. package/dist/interactive/QuizBlock.svelte +75 -0
  166. package/dist/interactive/QuizBlock.svelte.d.ts +10 -0
  167. package/dist/interactive/check.d.ts +10 -0
  168. package/dist/interactive/check.js +9 -0
  169. package/dist/interactive/engine.d.ts +19 -0
  170. package/dist/interactive/engine.js +12 -0
  171. package/dist/interactive/family.d.ts +6 -0
  172. package/dist/interactive/family.js +4 -0
  173. package/dist/interactive/index.d.ts +13 -0
  174. package/dist/interactive/index.js +13 -0
  175. package/dist/interactive/interactive.css +97 -0
  176. package/dist/interactive/interactive.css.d.ts +1 -0
  177. package/dist/interactive/labels.d.ts +16 -0
  178. package/dist/interactive/labels.js +16 -0
  179. package/dist/interactive/renderers.d.ts +9 -0
  180. package/dist/interactive/renderers.js +9 -0
  181. package/dist/interactive/schema.d.ts +76 -0
  182. package/dist/interactive/schema.js +324 -0
  183. package/dist/map/MapBlockView.svelte +465 -0
  184. package/dist/map/MapBlockView.svelte.d.ts +5 -0
  185. package/dist/map/check.d.ts +11 -0
  186. package/dist/map/check.js +6 -0
  187. package/dist/map/engine.d.ts +19 -0
  188. package/dist/map/engine.js +8 -0
  189. package/dist/map/family.d.ts +7 -0
  190. package/dist/map/family.js +5 -0
  191. package/dist/map/index.d.ts +11 -0
  192. package/dist/map/index.js +10 -0
  193. package/dist/map/labels.d.ts +27 -0
  194. package/dist/map/labels.js +21 -0
  195. package/dist/map/renderers.d.ts +2 -0
  196. package/dist/map/renderers.js +2 -0
  197. package/dist/map/schema.d.ts +41 -0
  198. package/dist/map/schema.js +176 -0
  199. package/dist/map/view-model.d.ts +55 -0
  200. package/dist/map/view-model.js +168 -0
  201. package/dist/media/MediaBlockView.svelte +258 -0
  202. package/dist/media/MediaBlockView.svelte.d.ts +5 -0
  203. package/dist/media/check.d.ts +14 -0
  204. package/dist/media/check.js +13 -0
  205. package/dist/media/engine.d.ts +18 -0
  206. package/dist/media/engine.js +10 -0
  207. package/dist/media/family.d.ts +7 -0
  208. package/dist/media/family.js +5 -0
  209. package/dist/media/index.d.ts +11 -0
  210. package/dist/media/index.js +10 -0
  211. package/dist/media/labels.d.ts +7 -0
  212. package/dist/media/labels.js +12 -0
  213. package/dist/media/renderers.d.ts +5 -0
  214. package/dist/media/renderers.js +5 -0
  215. package/dist/media/resolve.d.ts +6 -0
  216. package/dist/media/resolve.js +15 -0
  217. package/dist/structure/NestedBlocks.svelte +65 -0
  218. package/dist/structure/NestedBlocks.svelte.d.ts +11 -0
  219. package/dist/structure/SafeBody.svelte +13 -0
  220. package/dist/structure/SafeBody.svelte.d.ts +7 -0
  221. package/dist/structure/StructureFamily.svelte +157 -0
  222. package/dist/structure/StructureFamily.svelte.d.ts +5 -0
  223. package/dist/structure/check.d.ts +14 -0
  224. package/dist/structure/check.js +27 -0
  225. package/dist/structure/engine.d.ts +18 -0
  226. package/dist/structure/engine.js +18 -0
  227. package/dist/structure/family.d.ts +7 -0
  228. package/dist/structure/family.js +5 -0
  229. package/dist/structure/index.d.ts +11 -0
  230. package/dist/structure/index.js +10 -0
  231. package/dist/structure/labels.d.ts +11 -0
  232. package/dist/structure/labels.js +11 -0
  233. package/dist/structure/renderers.d.ts +5 -0
  234. package/dist/structure/renderers.js +5 -0
  235. package/dist/structure/schema.d.ts +71 -0
  236. package/dist/structure/schema.js +327 -0
  237. package/dist/structure/structure.css +182 -0
  238. package/dist/structure/structure.css.d.ts +1 -0
  239. package/dist/text/RichText.svelte +169 -0
  240. package/dist/text/RichText.svelte.d.ts +13 -0
  241. package/dist/text/TextBlockView.svelte +177 -0
  242. package/dist/text/TextBlockView.svelte.d.ts +5 -0
  243. package/dist/text/check.d.ts +14 -0
  244. package/dist/text/check.js +13 -0
  245. package/dist/text/engine.d.ts +17 -0
  246. package/dist/text/engine.js +10 -0
  247. package/dist/text/family.d.ts +7 -0
  248. package/dist/text/family.js +5 -0
  249. package/dist/text/index.d.ts +12 -0
  250. package/dist/text/index.js +11 -0
  251. package/dist/text/labels.d.ts +22 -0
  252. package/dist/text/labels.js +29 -0
  253. package/dist/text/markdown.d.ts +80 -0
  254. package/dist/text/markdown.js +361 -0
  255. package/dist/text/renderers.d.ts +6 -0
  256. package/dist/text/renderers.js +6 -0
  257. package/package.json +167 -4
@@ -0,0 +1,149 @@
1
+ <script lang="ts">
2
+ import { layoutTree } from './layout.js';
3
+ import type { TreeDiagram } from './schema.js';
4
+ import { DIAGRAM_PAD, toneBorder } from './tones.js';
5
+ import './diagram.css';
6
+
7
+ /**
8
+ * Tree: file-tree is a nested list; org is layoutTree elbows + sr list alt text.
9
+ */
10
+ let { block }: { block: TreeDiagram } = $props();
11
+
12
+ const layout = $derived(layoutTree(block));
13
+ const byId = $derived(new Map(block.nodes.map((node) => [node.id, node])));
14
+ const positions = $derived(new Map(layout.positions.map((p) => [p.id, p])));
15
+ const children = $derived.by(() => {
16
+ const map = new Map<string | null, string[]>();
17
+ for (const node of block.nodes) {
18
+ map.set(node.parentId, [...(map.get(node.parentId) ?? []), node.id]);
19
+ }
20
+ return map;
21
+ });
22
+ const roots = $derived(children.get(null) ?? []);
23
+ const stageW = $derived(layout.width + DIAGRAM_PAD * 2);
24
+ const stageH = $derived(layout.height + DIAGRAM_PAD * 2);
25
+ const summary = $derived(
26
+ `${block.style === 'org' ? 'Organization chart' : 'File tree'} with ${block.nodes.length} ${
27
+ block.nodes.length === 1 ? 'item' : 'items'
28
+ }`
29
+ );
30
+
31
+ function elbow(from: string, to: string): string {
32
+ const a = positions.get(from);
33
+ const b = positions.get(to);
34
+ if (!a || !b) return '';
35
+ const mid = a.y + a.height + (b.y - a.y - a.height) / 2;
36
+ return `M ${a.x + a.width / 2} ${a.y + a.height} V ${mid} H ${b.x + b.width / 2} V ${b.y}`;
37
+ }
38
+
39
+ function nodeStyle(node: { x: number; y: number; width: number; height: number }): string {
40
+ return [
41
+ `--tx-dx:${node.x + DIAGRAM_PAD}px`,
42
+ `--tx-dy:${node.y + DIAGRAM_PAD}px`,
43
+ `--tx-dw:${node.width}px`,
44
+ `--tx-dh:${node.height}px`,
45
+ ].join(';');
46
+ }
47
+ </script>
48
+
49
+ {#snippet branch(id: string, visual: boolean)}
50
+ {@const node = byId.get(id)}
51
+ {@const kids = children.get(id) ?? []}
52
+ {#if node}
53
+ <li>
54
+ {#if visual}
55
+ <span class="tx-diagram-filetree__row">
56
+ <svg
57
+ class={`tx-diagram-filetree__icon ${kids.length > 0 ? 'tx-diagram-filetree__icon--folder' : ''}`}
58
+ viewBox="0 0 24 24"
59
+ fill="none"
60
+ stroke="currentColor"
61
+ stroke-width="2"
62
+ stroke-linecap="round"
63
+ stroke-linejoin="round"
64
+ aria-hidden="true"
65
+ focusable="false"
66
+ >
67
+ {#if kids.length > 0}
68
+ <path
69
+ d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"
70
+ />
71
+ {:else}
72
+ <path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z" />
73
+ <path d="M14 2v4a2 2 0 0 0 2 2h4M16 13H8m8 4H8m2-8H8" />
74
+ {/if}
75
+ </svg>
76
+ <span class={kids.length > 0 ? 'tx-diagram-filetree__name--folder' : ''}>{node.label}</span>
77
+ {#if kids.length > 0}
78
+ <span class="tx-diagram-sr"
79
+ >(folder, {kids.length} {kids.length === 1 ? 'item' : 'items'})</span
80
+ >
81
+ {/if}
82
+ </span>
83
+ {:else}
84
+ {node.label}
85
+ {/if}
86
+ {#if kids.length > 0}
87
+ <ul>
88
+ {#each kids as kid (kid)}
89
+ {@render branch(kid, visual)}
90
+ {/each}
91
+ </ul>
92
+ {/if}
93
+ </li>
94
+ {/if}
95
+ {/snippet}
96
+
97
+ <figure class="tx-diagram" data-tx-diagram="tree" data-style={block.style}>
98
+ {#if block.style === 'file-tree'}
99
+ <div class="tx-diagram-filetree">
100
+ <ul aria-label={summary}>
101
+ {#each roots as root (root)}
102
+ {@render branch(root, true)}
103
+ {/each}
104
+ </ul>
105
+ </div>
106
+ {:else}
107
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -- wide chart scrolls; keyboard users must reach it. -->
108
+ <div class="tx-diagram__scroll" role="region" aria-label={summary} tabindex="0">
109
+ <ul class="tx-diagram-sr">
110
+ {#each roots as root (root)}
111
+ {@render branch(root, false)}
112
+ {/each}
113
+ </ul>
114
+ <div
115
+ class="tx-diagram__stage"
116
+ aria-hidden="true"
117
+ style={`--tx-diagram-w:${stageW}px;--tx-diagram-h:${stageH}px`}
118
+ >
119
+ <svg
120
+ class="tx-diagram__svg"
121
+ width={stageW}
122
+ height={stageH}
123
+ viewBox={`${-DIAGRAM_PAD} ${-DIAGRAM_PAD} ${stageW} ${stageH}`}
124
+ focusable="false"
125
+ >
126
+ {#each layout.edges as edge (`${edge.from}-${edge.to}`)}
127
+ <path
128
+ d={elbow(edge.from, edge.to)}
129
+ fill="none"
130
+ stroke="currentColor"
131
+ stroke-width="1.5"
132
+ data-edge="parent"
133
+ />
134
+ {/each}
135
+ </svg>
136
+ {#each layout.positions as node (node.id)}
137
+ <div
138
+ class={`tx-diagram-node tx-diagram-node--org ${toneBorder(node.tone)}`}
139
+ style={nodeStyle(node)}
140
+ title={node.label}
141
+ data-node={node.id}
142
+ >
143
+ <span class="tx-diagram-node__label">{node.label}</span>
144
+ </div>
145
+ {/each}
146
+ </div>
147
+ </div>
148
+ {/if}
149
+ </figure>
@@ -0,0 +1,8 @@
1
+ /// <reference path="../css-modules.d.ts" />
2
+ import type { TreeDiagram } from './schema.js';
3
+ type $$ComponentProps = {
4
+ block: TreeDiagram;
5
+ };
6
+ declare const TreeDiagram: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type TreeDiagram = ReturnType<typeof TreeDiagram>;
8
+ export default TreeDiagram;
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Diagram family — @layer tx.components. Geometry uses CSS custom properties
3
+ * set from validated layout numbers (no free-form style strings).
4
+ */
5
+ @layer tx.components {
6
+ .tx-diagram {
7
+ display: grid;
8
+ gap: 0.5rem;
9
+ }
10
+
11
+ .tx-diagram__scroll {
12
+ overflow-x: auto;
13
+ border-radius: var(--tx-radius-lg, 0.5rem);
14
+ outline: none;
15
+ }
16
+
17
+ .tx-diagram__scroll:focus-visible {
18
+ outline: var(--tx-focus-ring-width, 2px) solid var(--tx-ring, Highlight);
19
+ outline-offset: var(--tx-focus-ring-offset, 2px);
20
+ }
21
+
22
+ .tx-diagram__stage {
23
+ position: relative;
24
+ inline-size: var(--tx-diagram-w);
25
+ block-size: var(--tx-diagram-h);
26
+ }
27
+
28
+ .tx-diagram__svg {
29
+ position: absolute;
30
+ inset: 0;
31
+ overflow: visible;
32
+ color: var(--tx-muted-foreground, GrayText);
33
+ }
34
+
35
+ .tx-diagram-node {
36
+ position: absolute;
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 0.5rem;
40
+ inset-inline-start: var(--tx-dx);
41
+ inset-block-start: var(--tx-dy);
42
+ inline-size: var(--tx-dw);
43
+ block-size: var(--tx-dh);
44
+ border-radius: var(--tx-radius-lg, 0.5rem);
45
+ border: 1px solid var(--tx-border, currentColor);
46
+ border-inline-start-width: 4px;
47
+ background-color: var(--tx-surface, Canvas);
48
+ color: var(--tx-surface-foreground, CanvasText);
49
+ padding-inline: 0.75rem;
50
+ font-size: var(--tx-font-size-sm, 0.875rem);
51
+ box-shadow: var(--tx-shadow-soft, none);
52
+ }
53
+
54
+ .tx-diagram-node--org {
55
+ justify-content: center;
56
+ text-align: center;
57
+ border-inline-start-width: 1px;
58
+ border-block-start-width: 4px;
59
+ }
60
+
61
+ .tx-diagram-node__index {
62
+ flex-shrink: 0;
63
+ font-family: var(--tx-font-mono, ui-monospace, monospace);
64
+ font-size: var(--tx-font-size-xs, 0.75rem);
65
+ color: var(--tx-muted-foreground, GrayText);
66
+ }
67
+
68
+ .tx-diagram-node__label {
69
+ display: -webkit-box;
70
+ -webkit-line-clamp: 2;
71
+ -webkit-box-orient: vertical;
72
+ overflow: hidden;
73
+ }
74
+
75
+ .tx-diagram-tone--neutral {
76
+ border-color: var(--tx-border, currentColor);
77
+ }
78
+ .tx-diagram-tone--accent {
79
+ border-color: var(--tx-primary, Highlight);
80
+ }
81
+ .tx-diagram-tone--info {
82
+ border-color: var(--tx-info, dodgerblue);
83
+ }
84
+ .tx-diagram-tone--success {
85
+ border-color: var(--tx-success, green);
86
+ }
87
+ .tx-diagram-tone--warning {
88
+ border-color: var(--tx-warning, orange);
89
+ }
90
+ .tx-diagram-tone--danger {
91
+ border-color: var(--tx-destructive, crimson);
92
+ }
93
+
94
+ .tx-diagram-board {
95
+ display: flex;
96
+ min-inline-size: max-content;
97
+ gap: 1rem;
98
+ padding: 0.25rem;
99
+ }
100
+
101
+ .tx-diagram-column {
102
+ display: grid;
103
+ inline-size: 14rem;
104
+ flex-shrink: 0;
105
+ align-content: start;
106
+ gap: 0.5rem;
107
+ border-radius: var(--tx-radius-lg, 0.5rem);
108
+ border: 1px solid var(--tx-border, currentColor);
109
+ background-color: color-mix(in srgb, var(--tx-muted, Canvas) 40%, transparent);
110
+ padding: 0.5rem;
111
+ }
112
+
113
+ .tx-diagram-column__title {
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: space-between;
117
+ margin: 0;
118
+ padding-inline: 0.25rem;
119
+ font-size: var(--tx-font-size-sm, 0.875rem);
120
+ font-weight: var(--tx-font-weight-semibold, 600);
121
+ }
122
+
123
+ .tx-diagram-column__count {
124
+ font-size: var(--tx-font-size-xs, 0.75rem);
125
+ font-weight: 400;
126
+ color: var(--tx-muted-foreground, GrayText);
127
+ }
128
+
129
+ .tx-diagram-cards {
130
+ display: grid;
131
+ gap: 0.5rem;
132
+ margin: 0;
133
+ padding: 0;
134
+ list-style: none;
135
+ }
136
+
137
+ .tx-diagram-card {
138
+ margin: 0;
139
+ border-radius: var(--tx-radius-md, 0.375rem);
140
+ border: 1px solid var(--tx-border, currentColor);
141
+ border-inline-start-width: 4px;
142
+ background-color: var(--tx-surface, Canvas);
143
+ color: var(--tx-surface-foreground, CanvasText);
144
+ padding-block: 0.5rem;
145
+ padding-inline: 0.75rem;
146
+ font-size: var(--tx-font-size-sm, 0.875rem);
147
+ list-style: none;
148
+ }
149
+
150
+ .tx-diagram-empty {
151
+ margin: 0;
152
+ padding-inline: 0.25rem;
153
+ font-size: var(--tx-font-size-xs, 0.75rem);
154
+ color: var(--tx-muted-foreground, GrayText);
155
+ }
156
+
157
+ .tx-diagram-terminal {
158
+ overflow: hidden;
159
+ border-radius: var(--tx-radius-lg, 0.5rem);
160
+ border: 1px solid var(--tx-border, currentColor);
161
+ background-color: var(--tx-surface, Canvas);
162
+ color: var(--tx-surface-foreground, CanvasText);
163
+ }
164
+
165
+ .tx-diagram-terminal__chrome {
166
+ display: flex;
167
+ align-items: center;
168
+ gap: 0.375rem;
169
+ border-block-end: 1px solid var(--tx-border, currentColor);
170
+ padding-block: 0.5rem;
171
+ padding-inline: 0.75rem;
172
+ }
173
+
174
+ .tx-diagram-terminal__dot {
175
+ inline-size: 0.625rem;
176
+ block-size: 0.625rem;
177
+ border-radius: 9999px;
178
+ background-color: color-mix(in srgb, var(--tx-muted-foreground, GrayText) 40%, transparent);
179
+ }
180
+
181
+ .tx-diagram-terminal__lines {
182
+ display: grid;
183
+ gap: 0.125rem;
184
+ margin: 0;
185
+ padding: 0.75rem;
186
+ font-family: var(--tx-font-mono, ui-monospace, monospace);
187
+ font-size: 13px;
188
+ line-height: 1.6;
189
+ list-style: none;
190
+ }
191
+
192
+ .tx-diagram-terminal__line {
193
+ white-space: pre-wrap;
194
+ overflow-wrap: anywhere;
195
+ }
196
+
197
+ .tx-diagram-terminal__line[data-kind="comment"] {
198
+ font-style: italic;
199
+ color: var(--tx-muted-foreground, GrayText);
200
+ }
201
+
202
+ .tx-diagram-terminal__prompt-mark {
203
+ user-select: none;
204
+ font-weight: 600;
205
+ color: var(--tx-primary, Highlight);
206
+ }
207
+
208
+ .tx-diagram-terminal__prompt-text {
209
+ font-weight: 600;
210
+ }
211
+
212
+ .tx-diagram-filetree {
213
+ overflow-x: auto;
214
+ border-radius: var(--tx-radius-lg, 0.5rem);
215
+ border: 1px solid var(--tx-border, currentColor);
216
+ background-color: var(--tx-surface, Canvas);
217
+ color: var(--tx-surface-foreground, CanvasText);
218
+ padding: 0.75rem;
219
+ font-family: var(--tx-font-mono, ui-monospace, monospace);
220
+ font-size: var(--tx-font-size-sm, 0.875rem);
221
+ }
222
+
223
+ .tx-diagram-filetree ul {
224
+ margin: 0;
225
+ padding: 0;
226
+ list-style: none;
227
+ }
228
+
229
+ .tx-diagram-filetree ul ul {
230
+ margin-inline-start: 0.5rem;
231
+ border-inline-start: 1px solid var(--tx-border, currentColor);
232
+ padding-inline-start: 1rem;
233
+ }
234
+
235
+ .tx-diagram-filetree__row {
236
+ display: inline-flex;
237
+ align-items: center;
238
+ gap: 0.375rem;
239
+ padding-block: 0.125rem;
240
+ }
241
+
242
+ .tx-diagram-filetree__icon {
243
+ inline-size: 1rem;
244
+ block-size: 1rem;
245
+ flex-shrink: 0;
246
+ color: var(--tx-muted-foreground, GrayText);
247
+ }
248
+
249
+ .tx-diagram-filetree__icon--folder {
250
+ color: var(--tx-primary, Highlight);
251
+ }
252
+
253
+ .tx-diagram-filetree__name--folder {
254
+ font-weight: 500;
255
+ }
256
+
257
+ .tx-diagram-fallback {
258
+ margin: 0;
259
+ border-radius: var(--tx-radius-md, 0.375rem);
260
+ border: 1px solid var(--tx-border, currentColor);
261
+ background-color: color-mix(in srgb, var(--tx-muted, Canvas) 40%, transparent);
262
+ padding: 1rem;
263
+ font-size: var(--tx-font-size-sm, 0.875rem);
264
+ color: var(--tx-muted-foreground, GrayText);
265
+ }
266
+
267
+ .tx-diagram-sr {
268
+ position: absolute;
269
+ inline-size: 1px;
270
+ block-size: 1px;
271
+ padding: 0;
272
+ margin: -1px;
273
+ overflow: hidden;
274
+ clip: rect(0, 0, 0, 0);
275
+ white-space: nowrap;
276
+ border-width: 0;
277
+ }
278
+
279
+ @media (forced-colors: active) {
280
+ .tx-diagram-node,
281
+ .tx-diagram-card,
282
+ .tx-diagram-column {
283
+ border: 1px solid ButtonText;
284
+ forced-color-adjust: none;
285
+ }
286
+ }
287
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `@texuli/blocks/diagram/engine` — Svelte-free diagram models, limits and layout math.
3
+ * No `.svelte` and no `svelte` imports. Use `@texuli/blocks/diagram` for loaders.
4
+ */
5
+ import type { FieldIssue } from '../core/schema/primitives.js';
6
+ import type { Diagram, DiagramType } from './schema.js';
7
+ export { type DiagramEdge, type DiagramLayout, type DiagramPosition, layoutBoard, layoutFlow, layoutTerminal, layoutTree, } from './layout.js';
8
+ export { type BoardCard, type BoardColumn, type BoardDiagram, DIAGRAM_BLOCK_TYPES, DIAGRAM_LIMITS, type Diagram, type DiagramParseResult, type DiagramType, diagramJsonPath, type FlowDiagram, type FlowNode, parseDiagram, type TerminalDiagram, type TerminalLine, type TreeDiagram, type TreeNode, } from './schema.js';
9
+ export { DIAGRAM_PAD, TONE_BORDER, toneBorder } from './tones.js';
10
+ export type DiagramFamilyBlock = Diagram;
11
+ export declare function isDiagramFamilyBlock(value: unknown): value is Diagram;
12
+ export declare function isDiagramFamilyType(type: string): type is DiagramType;
13
+ export interface DiagramBlockViewProps {
14
+ block: unknown;
15
+ oninvalid?: (issues: FieldIssue[]) => void;
16
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `@texuli/blocks/diagram/engine` — Svelte-free diagram models, limits and layout math.
3
+ * No `.svelte` and no `svelte` imports. Use `@texuli/blocks/diagram` for loaders.
4
+ */
5
+ import { DIAGRAM_BLOCK_TYPES, parseDiagram } from "./schema.js";
6
+ export { layoutBoard, layoutFlow, layoutTerminal, layoutTree, } from "./layout.js";
7
+ export { DIAGRAM_BLOCK_TYPES, DIAGRAM_LIMITS, diagramJsonPath, parseDiagram, } from "./schema.js";
8
+ export { DIAGRAM_PAD, TONE_BORDER, toneBorder } from "./tones.js";
9
+ export function isDiagramFamilyBlock(value) {
10
+ return parseDiagram(value).success;
11
+ }
12
+ export function isDiagramFamilyType(type) {
13
+ return DIAGRAM_BLOCK_TYPES.includes(type);
14
+ }
@@ -0,0 +1,7 @@
1
+ import type { Component } from 'svelte';
2
+ import type { DiagramBlockViewProps } from './engine.js';
3
+ export { DIAGRAM_BLOCK_TYPES, type Diagram, type DiagramBlockViewProps, type DiagramFamilyBlock, type DiagramType, isDiagramFamilyBlock, isDiagramFamilyType, } from './engine.js';
4
+ /** Lazily loads the diagram family renderer (its own chunk). */
5
+ export declare function loadDiagramFamily(): Promise<{
6
+ default: Component<DiagramBlockViewProps>;
7
+ }>;
@@ -0,0 +1,5 @@
1
+ export { DIAGRAM_BLOCK_TYPES, isDiagramFamilyBlock, isDiagramFamilyType, } from "./engine.js";
2
+ /** Lazily loads the diagram family renderer (its own chunk). */
3
+ export function loadDiagramFamily() {
4
+ return import('./DiagramFamily.svelte');
5
+ }
@@ -0,0 +1,10 @@
1
+ /// <reference path="../css-modules.d.ts" />
2
+ /**
3
+ * `@texuli/blocks/diagram` — flow, sequence/org tree, board and terminal
4
+ * diagrams from validated data. Layout math is framework-free; Svelte
5
+ * renderers load through `loadDiagramFamily()`.
6
+ */
7
+ export { DIAGRAM_BLOCK_TYPES, type DiagramBlockViewProps, type DiagramFamilyBlock, isDiagramFamilyBlock, isDiagramFamilyType, loadDiagramFamily, } from './family.js';
8
+ export { type DiagramEdge, type DiagramLayout, type DiagramPosition, layoutBoard, layoutFlow, layoutTerminal, layoutTree, } from './layout.js';
9
+ export { type BoardCard, type BoardColumn, type BoardDiagram, DIAGRAM_LIMITS, type Diagram, type DiagramParseResult, type DiagramType, diagramJsonPath, type FlowDiagram, type FlowNode, parseDiagram, type TerminalDiagram, type TerminalLine, type TreeDiagram, type TreeNode, } from './schema.js';
10
+ export { DIAGRAM_PAD, TONE_BORDER, toneBorder } from './tones.js';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `@texuli/blocks/diagram` — flow, sequence/org tree, board and terminal
3
+ * diagrams from validated data. Layout math is framework-free; Svelte
4
+ * renderers load through `loadDiagramFamily()`.
5
+ */
6
+ export { DIAGRAM_BLOCK_TYPES, isDiagramFamilyBlock, isDiagramFamilyType, loadDiagramFamily, } from "./family.js";
7
+ export { layoutBoard, layoutFlow, layoutTerminal, layoutTree, } from "./layout.js";
8
+ export { DIAGRAM_LIMITS, diagramJsonPath, parseDiagram, } from "./schema.js";
9
+ export { DIAGRAM_PAD, TONE_BORDER, toneBorder } from "./tones.js";
@@ -0,0 +1,26 @@
1
+ import type { BoardDiagram, FlowDiagram, TerminalDiagram, TreeDiagram } from './schema.js';
2
+ export interface DiagramPosition {
3
+ id: string;
4
+ x: number;
5
+ y: number;
6
+ width: number;
7
+ height: number;
8
+ label: string;
9
+ tone?: string;
10
+ kind?: 'prompt' | 'output' | 'comment';
11
+ }
12
+ export interface DiagramEdge {
13
+ from: string;
14
+ to: string;
15
+ kind: 'flow' | 'parent' | 'loop-back';
16
+ }
17
+ export interface DiagramLayout {
18
+ width: number;
19
+ height: number;
20
+ positions: DiagramPosition[];
21
+ edges: DiagramEdge[];
22
+ }
23
+ export declare function layoutFlow(diagram: FlowDiagram): DiagramLayout;
24
+ export declare function layoutTree(diagram: TreeDiagram): DiagramLayout;
25
+ export declare function layoutBoard(diagram: BoardDiagram): DiagramLayout;
26
+ export declare function layoutTerminal(diagram: TerminalDiagram): DiagramLayout;