@ferax564/noma-cli 0.11.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +199 -0
  3. package/bin/noma.mjs +8 -0
  4. package/dist/ast.d.ts +111 -0
  5. package/dist/ast.js +23 -0
  6. package/dist/ast.js.map +1 -0
  7. package/dist/book.d.ts +56 -0
  8. package/dist/book.js +120 -0
  9. package/dist/book.js.map +1 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +573 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/diff.d.ts +29 -0
  14. package/dist/diff.js +77 -0
  15. package/dist/diff.js.map +1 -0
  16. package/dist/fmt.d.ts +1 -0
  17. package/dist/fmt.js +105 -0
  18. package/dist/fmt.js.map +1 -0
  19. package/dist/ids.d.ts +15 -0
  20. package/dist/ids.js +27 -0
  21. package/dist/ids.js.map +1 -0
  22. package/dist/index.d.ts +20 -0
  23. package/dist/index.js +12 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/inline.d.ts +14 -0
  26. package/dist/inline.js +83 -0
  27. package/dist/inline.js.map +1 -0
  28. package/dist/loader.d.ts +12 -0
  29. package/dist/loader.js +59 -0
  30. package/dist/loader.js.map +1 -0
  31. package/dist/parser.d.ts +7 -0
  32. package/dist/parser.js +434 -0
  33. package/dist/parser.js.map +1 -0
  34. package/dist/patch.d.ts +61 -0
  35. package/dist/patch.js +530 -0
  36. package/dist/patch.js.map +1 -0
  37. package/dist/renderer-html.d.ts +44 -0
  38. package/dist/renderer-html.js +929 -0
  39. package/dist/renderer-html.js.map +1 -0
  40. package/dist/renderer-json.d.ts +5 -0
  41. package/dist/renderer-json.js +4 -0
  42. package/dist/renderer-json.js.map +1 -0
  43. package/dist/renderer-llm.d.ts +29 -0
  44. package/dist/renderer-llm.js +275 -0
  45. package/dist/renderer-llm.js.map +1 -0
  46. package/dist/renderer-noma.d.ts +10 -0
  47. package/dist/renderer-noma.js +179 -0
  48. package/dist/renderer-noma.js.map +1 -0
  49. package/dist/renderer-site.d.ts +11 -0
  50. package/dist/renderer-site.js +175 -0
  51. package/dist/renderer-site.js.map +1 -0
  52. package/dist/validator.d.ts +24 -0
  53. package/dist/validator.js +699 -0
  54. package/dist/validator.js.map +1 -0
  55. package/dist/verify.d.ts +10 -0
  56. package/dist/verify.js +141 -0
  57. package/dist/verify.js.map +1 -0
  58. package/package.json +83 -0
  59. package/schemas/ast.schema.json +187 -0
  60. package/schemas/capability.schema.json +70 -0
  61. package/schemas/patch-op.schema.json +92 -0
  62. package/schemas/patch-transaction.schema.json +28 -0
  63. package/schemas/transcript.schema.json +95 -0
  64. package/src/ast.ts +152 -0
  65. package/src/book.ts +162 -0
  66. package/src/cli.ts +595 -0
  67. package/src/diff.ts +108 -0
  68. package/src/fmt.ts +126 -0
  69. package/src/ids.ts +42 -0
  70. package/src/index.ts +20 -0
  71. package/src/inline.ts +92 -0
  72. package/src/loader.ts +55 -0
  73. package/src/parser.ts +501 -0
  74. package/src/patch.ts +646 -0
  75. package/src/renderer-html.ts +1047 -0
  76. package/src/renderer-json.ts +9 -0
  77. package/src/renderer-llm.ts +320 -0
  78. package/src/renderer-noma.ts +220 -0
  79. package/src/renderer-site.ts +245 -0
  80. package/src/validator.ts +733 -0
  81. package/src/verify.ts +157 -0
  82. package/themes/dark.css +382 -0
  83. package/themes/default.css +537 -0
@@ -0,0 +1,537 @@
1
+ :root {
2
+ --noma-bg: #fbfaf7;
3
+ --noma-fg: #1d1c1a;
4
+ --noma-muted: #6b6a66;
5
+ --noma-rule: #e7e4dc;
6
+ --noma-accent: #b9522a;
7
+ --noma-accent-soft: #f4dccd;
8
+ --noma-claim: #2c5d8f;
9
+ --noma-claim-soft: #dfeaf5;
10
+ --noma-evidence: #2f7d4a;
11
+ --noma-evidence-soft: #dff0e3;
12
+ --noma-risk: #a8362e;
13
+ --noma-risk-soft: #f7d9d4;
14
+ --noma-code-bg: #f1ede4;
15
+ --noma-card-bg: #ffffff;
16
+ --noma-shadow: 0 1px 0 rgba(0, 0, 0, 0.04), 0 8px 24px -16px rgba(20, 20, 20, 0.18);
17
+ --noma-radius: 10px;
18
+ --noma-cols: 2;
19
+ --noma-font-serif: "Iowan Old Style", "Charter", Georgia, serif;
20
+ --noma-font-sans: -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", system-ui, sans-serif;
21
+ --noma-font-mono: "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;
22
+ }
23
+
24
+ * { box-sizing: border-box; }
25
+
26
+ html, body {
27
+ margin: 0;
28
+ padding: 0;
29
+ background: var(--noma-bg);
30
+ color: var(--noma-fg);
31
+ font-family: var(--noma-font-serif);
32
+ font-size: 17px;
33
+ line-height: 1.65;
34
+ -webkit-font-smoothing: antialiased;
35
+ text-rendering: optimizeLegibility;
36
+ }
37
+
38
+ main.noma-doc {
39
+ max-width: 760px;
40
+ margin: 4rem auto;
41
+ padding: 0 1.5rem 6rem;
42
+ }
43
+
44
+ main.noma-doc > section.noma-hero ~ section,
45
+ main.noma-doc > .noma-grid {
46
+ max-width: 100%;
47
+ }
48
+
49
+ h1, h2, h3, h4, h5, h6 {
50
+ font-family: var(--noma-font-sans);
51
+ font-weight: 700;
52
+ line-height: 1.2;
53
+ letter-spacing: -0.01em;
54
+ margin: 2.5em 0 0.6em;
55
+ }
56
+ h1 { font-size: 2.4rem; margin-top: 0; letter-spacing: -0.02em; }
57
+ h2 { font-size: 1.7rem; border-bottom: 1px solid var(--noma-rule); padding-bottom: 0.3em; }
58
+ h3 { font-size: 1.25rem; }
59
+ h4 { font-size: 1.05rem; color: var(--noma-muted); text-transform: uppercase; letter-spacing: 0.06em; }
60
+
61
+ p { margin: 0 0 1.05em; }
62
+ a { color: var(--noma-accent); text-decoration: underline; text-underline-offset: 2px; text-decoration-thickness: 1px; }
63
+ a:hover { text-decoration-thickness: 2px; }
64
+
65
+ code {
66
+ font-family: var(--noma-font-mono);
67
+ font-size: 0.9em;
68
+ background: var(--noma-code-bg);
69
+ padding: 0.1em 0.35em;
70
+ border-radius: 4px;
71
+ }
72
+ pre {
73
+ background: var(--noma-code-bg);
74
+ padding: 1em 1.2em;
75
+ border-radius: var(--noma-radius);
76
+ overflow-x: auto;
77
+ font-size: 0.9rem;
78
+ line-height: 1.5;
79
+ }
80
+ pre code { background: none; padding: 0; }
81
+
82
+ blockquote {
83
+ border-left: 3px solid var(--noma-accent);
84
+ margin: 1.5em 0;
85
+ padding: 0.2em 1.2em;
86
+ color: var(--noma-muted);
87
+ font-style: italic;
88
+ }
89
+
90
+ hr { border: 0; border-top: 1px solid var(--noma-rule); margin: 3em 0; }
91
+
92
+ ul, ol { padding-left: 1.4em; }
93
+ li { margin: 0.25em 0; }
94
+
95
+ /* Callouts */
96
+ aside.noma-callout {
97
+ margin: 1.6em 0;
98
+ padding: 1em 1.2em;
99
+ border-radius: var(--noma-radius);
100
+ background: var(--noma-accent-soft);
101
+ border-left: 3px solid var(--noma-accent);
102
+ }
103
+ aside.noma-callout-warning { background: #fbe6df; border-color: var(--noma-risk); }
104
+ aside.noma-callout-tip { background: #e6f3eb; border-color: var(--noma-evidence); }
105
+ aside.noma-callout-note { background: #ecedf2; border-color: #5a6071; }
106
+
107
+ /* Research blocks */
108
+ aside.noma-research {
109
+ margin: 1.6em 0;
110
+ padding: 1em 1.2em;
111
+ border-radius: var(--noma-radius);
112
+ background: var(--noma-card-bg);
113
+ border: 1px solid var(--noma-rule);
114
+ box-shadow: var(--noma-shadow);
115
+ }
116
+ aside.noma-research .noma-research-head {
117
+ display: flex;
118
+ align-items: center;
119
+ gap: 0.8em;
120
+ margin-bottom: 0.5em;
121
+ }
122
+ aside.noma-research .noma-tag {
123
+ display: inline-block;
124
+ font-family: var(--noma-font-sans);
125
+ font-size: 0.7rem;
126
+ font-weight: 700;
127
+ letter-spacing: 0.08em;
128
+ text-transform: uppercase;
129
+ color: var(--noma-muted);
130
+ padding: 0.2em 0.6em;
131
+ border-radius: 999px;
132
+ background: var(--noma-code-bg);
133
+ }
134
+ aside.noma-claim { border-left: 3px solid var(--noma-claim); }
135
+ aside.noma-claim .noma-tag { color: var(--noma-claim); background: var(--noma-claim-soft); }
136
+ aside.noma-evidence { border-left: 3px solid var(--noma-evidence); }
137
+ aside.noma-evidence .noma-tag { color: var(--noma-evidence); background: var(--noma-evidence-soft); }
138
+ aside.noma-counterevidence { border-left: 3px solid var(--noma-risk); }
139
+ aside.noma-counterevidence .noma-tag { color: var(--noma-risk); background: var(--noma-risk-soft); }
140
+ aside.noma-risk { border-left: 3px solid var(--noma-risk); }
141
+ aside.noma-risk .noma-tag { color: var(--noma-risk); background: var(--noma-risk-soft); }
142
+ aside.noma-decision, aside.noma-adr { border-left: 3px solid var(--noma-accent); }
143
+ aside.noma-decision .noma-tag, aside.noma-adr .noma-tag { color: var(--noma-accent); background: var(--noma-accent-soft); }
144
+ aside.noma-open_question { border-left: 3px solid #8b6c1a; }
145
+ aside.noma-open_question .noma-tag { color: #8b6c1a; background: #f5ebcf; }
146
+ aside.noma-assumption { border-left: 3px solid #5a6071; }
147
+ aside.noma-assumption .noma-tag { color: #5a6071; background: #ecedf2; }
148
+
149
+ /* Variants — themable per-block emphasis without inline styling */
150
+ [data-variant="important"] { border-width: 5px !important; box-shadow: 0 0 0 1px var(--noma-accent) inset, var(--noma-shadow); }
151
+ [data-variant="subtle"] { opacity: 0.78; box-shadow: none; }
152
+ [data-variant="success"] { border-left: 3px solid var(--noma-evidence); background: var(--noma-evidence-soft); }
153
+ [data-variant="danger"] { border-left: 3px solid var(--noma-risk); background: var(--noma-risk-soft); }
154
+ [data-variant="info"] { border-left: 3px solid var(--noma-claim); background: var(--noma-claim-soft); }
155
+
156
+ /* Export buttons (artifact-side action surface) */
157
+ .noma-export-button {
158
+ display: inline-block;
159
+ background: var(--noma-fg);
160
+ color: var(--noma-bg);
161
+ border: 0;
162
+ padding: 0.55em 1.1em;
163
+ margin: 0.3em 0.4em 0.3em 0;
164
+ border-radius: 999px;
165
+ font-family: var(--noma-font-sans);
166
+ font-weight: 600;
167
+ font-size: 0.85rem;
168
+ cursor: pointer;
169
+ transition: background 120ms ease;
170
+ }
171
+ .noma-export-button:hover { background: var(--noma-accent); color: white; }
172
+ .noma-export-button[data-format="prompt"] { background: var(--noma-claim); }
173
+ .noma-export-button[data-format="markdown"] { background: var(--noma-evidence); }
174
+ .noma-export-button[data-format="json"] { background: var(--noma-muted); }
175
+
176
+ /* Controls (interactive artifact blocks) */
177
+ .noma-control {
178
+ margin: 1em 0;
179
+ padding: 0.8em 1em;
180
+ background: var(--noma-card-bg);
181
+ border: 1px solid var(--noma-rule);
182
+ border-radius: var(--noma-radius);
183
+ font-family: var(--noma-font-sans);
184
+ font-size: 0.9rem;
185
+ }
186
+ .noma-control input { margin-left: 0.6em; }
187
+
188
+ .noma-confidence {
189
+ flex: 1;
190
+ height: 6px;
191
+ border-radius: 999px;
192
+ background: var(--noma-rule);
193
+ overflow: hidden;
194
+ max-width: 140px;
195
+ }
196
+ .noma-confidence-bar {
197
+ height: 100%;
198
+ background: linear-gradient(90deg, var(--noma-accent), var(--noma-claim));
199
+ }
200
+
201
+ .noma-meta {
202
+ margin-top: 0.6em;
203
+ font-size: 0.85rem;
204
+ color: var(--noma-muted);
205
+ font-family: var(--noma-font-sans);
206
+ }
207
+ .noma-meta-key {
208
+ font-weight: 600;
209
+ color: var(--noma-fg);
210
+ }
211
+
212
+ /* Grid */
213
+ .noma-grid {
214
+ display: grid;
215
+ grid-template-columns: repeat(var(--noma-cols), minmax(0, 1fr));
216
+ gap: 1.2rem;
217
+ margin: 2em 0;
218
+ }
219
+ @media (max-width: 720px) {
220
+ .noma-grid { grid-template-columns: 1fr; }
221
+ }
222
+
223
+ /* Card */
224
+ article.noma-card {
225
+ background: var(--noma-card-bg);
226
+ border: 1px solid var(--noma-rule);
227
+ border-radius: var(--noma-radius);
228
+ padding: 1.2em 1.4em;
229
+ box-shadow: var(--noma-shadow);
230
+ }
231
+ article.noma-card .noma-card-head {
232
+ display: flex;
233
+ align-items: center;
234
+ gap: 0.6em;
235
+ margin-bottom: 0.4em;
236
+ }
237
+ article.noma-card h3 {
238
+ margin: 0;
239
+ font-size: 1.05rem;
240
+ font-family: var(--noma-font-sans);
241
+ }
242
+ article.noma-card .noma-icon {
243
+ color: var(--noma-accent);
244
+ font-size: 0.9em;
245
+ }
246
+ article.noma-card p:last-child { margin-bottom: 0; }
247
+
248
+ /* Hero */
249
+ section.noma-hero {
250
+ background: linear-gradient(180deg, var(--noma-accent-soft), transparent);
251
+ padding: 4rem 2.5rem 3rem;
252
+ border-radius: var(--noma-radius);
253
+ margin: 0 0 3rem;
254
+ text-align: center;
255
+ }
256
+ section.noma-hero h1 { font-size: 2.8rem; margin-top: 0; }
257
+
258
+ a.noma-button {
259
+ display: inline-block;
260
+ background: var(--noma-fg);
261
+ color: var(--noma-bg);
262
+ padding: 0.7em 1.4em;
263
+ border-radius: 999px;
264
+ text-decoration: none;
265
+ font-family: var(--noma-font-sans);
266
+ font-weight: 600;
267
+ font-size: 0.95rem;
268
+ margin-top: 0.5em;
269
+ }
270
+ a.noma-button:hover { background: var(--noma-accent); color: white; }
271
+
272
+ /* Plot */
273
+ figure.noma-plot {
274
+ margin: 1.8em 0;
275
+ padding: 1em 1.2em;
276
+ background: var(--noma-card-bg);
277
+ border: 1px solid var(--noma-rule);
278
+ border-radius: var(--noma-radius);
279
+ }
280
+ figure.noma-plot .noma-plot-canvas {
281
+ color: var(--noma-claim);
282
+ background: linear-gradient(180deg, transparent, var(--noma-claim-soft));
283
+ border-radius: 6px;
284
+ padding: 0.6em;
285
+ }
286
+ figure.noma-plot svg { width: 100%; height: auto; display: block; }
287
+ figure.noma-plot figcaption {
288
+ margin-top: 0.6em;
289
+ font-size: 0.85rem;
290
+ color: var(--noma-muted);
291
+ font-family: var(--noma-font-sans);
292
+ }
293
+
294
+ /* Dataset */
295
+ details.noma-dataset {
296
+ margin: 1.4em 0;
297
+ padding: 0.6em 1em;
298
+ background: var(--noma-code-bg);
299
+ border-radius: var(--noma-radius);
300
+ font-family: var(--noma-font-sans);
301
+ font-size: 0.9rem;
302
+ }
303
+ details.noma-dataset pre {
304
+ background: transparent;
305
+ padding: 0.6em 0 0;
306
+ }
307
+
308
+ /* Agent task */
309
+ .noma-agent-task {
310
+ margin: 1.4em 0;
311
+ padding: 1em 1.2em;
312
+ background: var(--noma-claim-soft);
313
+ border-left: 3px solid var(--noma-claim);
314
+ border-radius: var(--noma-radius);
315
+ }
316
+ .noma-agent-task label {
317
+ display: flex;
318
+ align-items: center;
319
+ gap: 0.6em;
320
+ font-family: var(--noma-font-sans);
321
+ font-weight: 600;
322
+ font-size: 0.9rem;
323
+ margin-bottom: 0.4em;
324
+ }
325
+
326
+ /* State change */
327
+ aside.noma-state-change {
328
+ margin: 1.4em 0;
329
+ padding: 1em 1.2em;
330
+ background: var(--noma-card-bg);
331
+ border: 1px solid var(--noma-rule);
332
+ border-left: 3px solid var(--noma-fg);
333
+ border-radius: var(--noma-radius);
334
+ font-family: var(--noma-font-sans);
335
+ }
336
+ .noma-state-change-head {
337
+ font-size: 0.85rem;
338
+ letter-spacing: 0.02em;
339
+ color: var(--noma-muted, var(--noma-fg));
340
+ margin-bottom: 0.4em;
341
+ display: flex;
342
+ align-items: center;
343
+ gap: 0.5em;
344
+ flex-wrap: wrap;
345
+ }
346
+ .noma-state-change-delta {
347
+ font-size: 1rem;
348
+ display: flex;
349
+ align-items: baseline;
350
+ gap: 0.6em;
351
+ margin: 0.3em 0 0.5em;
352
+ font-variant-numeric: tabular-nums;
353
+ }
354
+ .noma-state-from {
355
+ text-decoration: line-through;
356
+ opacity: 0.65;
357
+ }
358
+ .noma-state-to {
359
+ font-weight: 700;
360
+ }
361
+ .noma-state-arrow {
362
+ opacity: 0.55;
363
+ font-size: 0.95em;
364
+ }
365
+
366
+ /* Tables */
367
+ table.noma-table {
368
+ width: 100%;
369
+ border-collapse: collapse;
370
+ margin: 1.6em 0;
371
+ font-family: var(--noma-font-sans);
372
+ font-size: 0.92rem;
373
+ background: var(--noma-card-bg);
374
+ border: 1px solid var(--noma-rule);
375
+ border-radius: var(--noma-radius);
376
+ overflow: hidden;
377
+ box-shadow: var(--noma-shadow);
378
+ }
379
+ table.noma-table thead {
380
+ background: var(--noma-code-bg);
381
+ }
382
+ table.noma-table th {
383
+ text-align: left;
384
+ font-weight: 700;
385
+ letter-spacing: 0.02em;
386
+ padding: 0.7em 1em;
387
+ border-bottom: 1px solid var(--noma-rule);
388
+ color: var(--noma-fg);
389
+ }
390
+ table.noma-table td {
391
+ padding: 0.6em 1em;
392
+ border-bottom: 1px solid var(--noma-rule);
393
+ vertical-align: top;
394
+ }
395
+ table.noma-table tbody tr:last-child td { border-bottom: 0; }
396
+ table.noma-table tbody tr:hover { background: rgba(185, 82, 42, 0.04); }
397
+
398
+ /* Print */
399
+ @media print {
400
+ html, body { background: white; font-size: 11pt; }
401
+ main.noma-doc { margin: 0 auto; padding: 0; max-width: 100%; }
402
+ section.noma-hero { background: none; border: 1px solid var(--noma-rule); }
403
+ a { color: var(--noma-fg); }
404
+ pre, article.noma-card, figure.noma-plot, aside.noma-research, details.noma-dataset {
405
+ box-shadow: none;
406
+ page-break-inside: avoid;
407
+ }
408
+ h1, h2, h3 { page-break-after: avoid; }
409
+ }
410
+
411
+ /* v0.4 — alias anchors (offset for sticky-headed pages) */
412
+ a.noma-alias {
413
+ display: block;
414
+ position: relative;
415
+ top: -1.2em;
416
+ visibility: hidden;
417
+ height: 0;
418
+ }
419
+
420
+ /* v0.4 — multi-page site nav (rendered above main when --to site) */
421
+ nav.noma-site-nav {
422
+ max-width: 880px;
423
+ margin: 1.5rem auto 0;
424
+ padding: 0 2rem;
425
+ display: flex;
426
+ align-items: baseline;
427
+ gap: 1.5rem;
428
+ flex-wrap: wrap;
429
+ font-size: 0.85rem;
430
+ color: var(--noma-muted);
431
+ }
432
+ nav.noma-site-nav a.noma-site-home {
433
+ font-weight: 600;
434
+ color: var(--noma-fg);
435
+ text-decoration: none;
436
+ border-right: 1px solid var(--noma-rule);
437
+ padding-right: 1.25rem;
438
+ }
439
+ nav.noma-site-nav ol {
440
+ list-style: none;
441
+ padding: 0;
442
+ margin: 0;
443
+ display: flex;
444
+ gap: 1.25rem;
445
+ flex-wrap: wrap;
446
+ counter-reset: chap;
447
+ }
448
+ nav.noma-site-nav li {
449
+ counter-increment: chap;
450
+ }
451
+ nav.noma-site-nav li::before {
452
+ content: counter(chap, decimal-leading-zero) " · ";
453
+ color: var(--noma-rule);
454
+ font-variant-numeric: tabular-nums;
455
+ }
456
+ nav.noma-site-nav a {
457
+ color: var(--noma-muted);
458
+ text-decoration: none;
459
+ }
460
+ nav.noma-site-nav a:hover { color: var(--noma-accent); }
461
+ nav.noma-site-nav .noma-nav-current span {
462
+ color: var(--noma-fg);
463
+ font-weight: 500;
464
+ }
465
+
466
+ a.noma-ref.noma-xchapter::after {
467
+ content: " ↗";
468
+ font-size: 0.85em;
469
+ color: var(--noma-muted);
470
+ }
471
+
472
+ main.noma-site-index {
473
+ padding-top: 3rem;
474
+ }
475
+ header.noma-site-header h1 {
476
+ font-size: 2.4rem;
477
+ margin-bottom: 0.25rem;
478
+ }
479
+ header.noma-site-header .noma-site-author {
480
+ color: var(--noma-muted);
481
+ margin: 0 0 2rem;
482
+ }
483
+ ol.noma-site-toc {
484
+ list-style: none;
485
+ padding: 0;
486
+ margin: 2rem 0;
487
+ display: grid;
488
+ gap: 0.6rem;
489
+ counter-reset: toc;
490
+ }
491
+ ol.noma-site-toc li {
492
+ counter-increment: toc;
493
+ }
494
+ a.noma-site-chapter {
495
+ display: block;
496
+ padding: 1.1rem 1.4rem;
497
+ background: var(--noma-card-bg);
498
+ border: 1px solid var(--noma-rule);
499
+ border-radius: var(--noma-radius);
500
+ text-decoration: none;
501
+ color: inherit;
502
+ transition: border-color 120ms ease, transform 120ms ease;
503
+ }
504
+ a.noma-site-chapter:hover {
505
+ border-color: var(--noma-accent);
506
+ transform: translateY(-1px);
507
+ }
508
+ a.noma-site-chapter::before {
509
+ content: counter(toc, decimal-leading-zero);
510
+ display: block;
511
+ font-size: 0.75rem;
512
+ font-variant-numeric: tabular-nums;
513
+ color: var(--noma-muted);
514
+ margin-bottom: 0.25rem;
515
+ }
516
+ .noma-site-chapter-title {
517
+ display: block;
518
+ font-weight: 600;
519
+ font-size: 1.1rem;
520
+ }
521
+ .noma-site-chapter-summary {
522
+ display: block;
523
+ color: var(--noma-muted);
524
+ margin-top: 0.4rem;
525
+ font-size: 0.93rem;
526
+ }
527
+
528
+ /* v0.4 — math (KaTeX is loaded from CDN; we just style block layout) */
529
+ .noma-math-display {
530
+ margin: 1.4em auto;
531
+ text-align: center;
532
+ overflow-x: auto;
533
+ }
534
+ .noma-math-inline {
535
+ display: inline;
536
+ }
537
+