@wizzlethorpe/vaults 0.6.1 → 0.7.1

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 (104) hide show
  1. package/README.md +135 -17
  2. package/dist/build.js +501 -190
  3. package/dist/build.js.map +1 -1
  4. package/dist/commands/build.js +4 -4
  5. package/dist/commands/build.js.map +1 -1
  6. package/dist/commands/init.js +13 -10
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/password.js +3 -1
  9. package/dist/commands/password.js.map +1 -1
  10. package/dist/commands/patreon.js +30 -20
  11. package/dist/commands/patreon.js.map +1 -1
  12. package/dist/commands/preview.js +10 -8
  13. package/dist/commands/preview.js.map +1 -1
  14. package/dist/commands/push.js +11 -9
  15. package/dist/commands/push.js.map +1 -1
  16. package/dist/commands/role.js +5 -0
  17. package/dist/commands/role.js.map +1 -1
  18. package/dist/config.js +30 -15
  19. package/dist/config.js.map +1 -1
  20. package/dist/escape.js +29 -0
  21. package/dist/escape.js.map +1 -0
  22. package/dist/favicon.js +3 -36
  23. package/dist/favicon.js.map +1 -1
  24. package/dist/foundry-importer.js +61 -0
  25. package/dist/foundry-importer.js.map +1 -0
  26. package/dist/images.js +0 -30
  27. package/dist/images.js.map +1 -1
  28. package/dist/index.js +37 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/migrate/0.6-legacy-auth-settings.js +96 -0
  31. package/dist/migrate/0.6-legacy-auth-settings.js.map +1 -0
  32. package/dist/migrate/0.7-vaults-dir.js +74 -0
  33. package/dist/migrate/0.7-vaults-dir.js.map +1 -0
  34. package/dist/migrate/registry.js +6 -0
  35. package/dist/migrate/registry.js.map +1 -0
  36. package/dist/migrate/run.js +38 -0
  37. package/dist/migrate/run.js.map +1 -0
  38. package/dist/migrate/types.js +8 -0
  39. package/dist/migrate/types.js.map +1 -0
  40. package/dist/paths.js +66 -0
  41. package/dist/paths.js.map +1 -0
  42. package/dist/render/auth-template.js +23 -141
  43. package/dist/render/auth-template.js.map +1 -1
  44. package/dist/render/bases.js +56 -44
  45. package/dist/render/bases.js.map +1 -1
  46. package/dist/render/callouts.js +29 -10
  47. package/dist/render/callouts.js.map +1 -1
  48. package/dist/render/embed.js +124 -26
  49. package/dist/render/embed.js.map +1 -1
  50. package/dist/render/extensions.js +68 -0
  51. package/dist/render/extensions.js.map +1 -0
  52. package/dist/render/external-links.js +32 -0
  53. package/dist/render/external-links.js.map +1 -0
  54. package/dist/render/footer.js +37 -0
  55. package/dist/render/footer.js.map +1 -0
  56. package/dist/render/frontmatter.js +17 -0
  57. package/dist/render/frontmatter.js.map +1 -0
  58. package/dist/render/handlers/assets.js +123 -0
  59. package/dist/render/handlers/assets.js.map +1 -0
  60. package/dist/render/handlers/builtin/battlemap.js +199 -0
  61. package/dist/render/handlers/builtin/battlemap.js.map +1 -0
  62. package/dist/render/handlers/builtin/dice.js +78 -0
  63. package/dist/render/handlers/builtin/dice.js.map +1 -0
  64. package/dist/render/handlers/builtin/fm-code.js +50 -0
  65. package/dist/render/handlers/builtin/fm-code.js.map +1 -0
  66. package/dist/render/handlers/builtin/fm.js +83 -0
  67. package/dist/render/handlers/builtin/fm.js.map +1 -0
  68. package/dist/render/handlers/builtin/index.js +13 -0
  69. package/dist/render/handlers/builtin/index.js.map +1 -0
  70. package/dist/render/handlers/builtin/inline-format.js +26 -0
  71. package/dist/render/handlers/builtin/inline-format.js.map +1 -0
  72. package/dist/render/handlers/builtin/statblock.js +491 -0
  73. package/dist/render/handlers/builtin/statblock.js.map +1 -0
  74. package/dist/render/handlers/dispatch.js +182 -0
  75. package/dist/render/handlers/dispatch.js.map +1 -0
  76. package/dist/render/handlers/loader.js +90 -0
  77. package/dist/render/handlers/loader.js.map +1 -0
  78. package/dist/render/handlers/types.js +60 -0
  79. package/dist/render/handlers/types.js.map +1 -0
  80. package/dist/render/image-srcs.js +42 -0
  81. package/dist/render/image-srcs.js.map +1 -0
  82. package/dist/render/layout.js +62 -9
  83. package/dist/render/layout.js.map +1 -1
  84. package/dist/render/pipeline.js +38 -9
  85. package/dist/render/pipeline.js.map +1 -1
  86. package/dist/render/preview.js +53 -18
  87. package/dist/render/preview.js.map +1 -1
  88. package/dist/render/slug.js +5 -0
  89. package/dist/render/slug.js.map +1 -1
  90. package/dist/render/styles.js +124 -15
  91. package/dist/render/styles.js.map +1 -1
  92. package/dist/render/wikilink.js +15 -4
  93. package/dist/render/wikilink.js.map +1 -1
  94. package/dist/scan.js +1 -1
  95. package/dist/scan.js.map +1 -1
  96. package/dist/settings.js +25 -4
  97. package/dist/settings.js.map +1 -1
  98. package/dist/version.js +36 -0
  99. package/dist/version.js.map +1 -0
  100. package/package.json +12 -12
  101. package/dist/api.js +0 -42
  102. package/dist/api.js.map +0 -1
  103. package/dist/render/mcp-template.js +0 -239
  104. package/dist/render/mcp-template.js.map +0 -1
@@ -0,0 +1,491 @@
1
+ // Built-in code-block `statblock` handler — D&D 5e creature statblocks.
2
+ //
3
+ // Schema is compatible with the Fantasy Statblocks Obsidian plugin so the
4
+ // same source renders in Obsidian (via the plugin) and on the published
5
+ // wiki (via this handler):
6
+ //
7
+ // ```statblock
8
+ // name: Goblin
9
+ // size: Small
10
+ // type: humanoid
11
+ // ac: 15
12
+ // hp: 7
13
+ // hit_dice: 2d6
14
+ // speed: 30 ft.
15
+ // stats: [8, 14, 10, 10, 8, 8]
16
+ // saves:
17
+ // - dexterity: 5
18
+ // skillsaves:
19
+ // - stealth: 6
20
+ // senses: darkvision 60 ft., passive Perception 9
21
+ // languages: Common, Goblin
22
+ // cr: "1/4"
23
+ // traits:
24
+ // - name: Nimble Escape
25
+ // desc: The goblin can take the Disengage or Hide action as a bonus action.
26
+ // actions:
27
+ // - name: Scimitar
28
+ // desc: "*Melee Weapon Attack:* +4 to hit. *Hit:* 5 (1d6 + 2) slashing damage."
29
+ // ```
30
+ //
31
+ // Coverage: name/size/type/subtype/alignment, ac (+ ac_class), hp (+ hit_dice),
32
+ // speed, six abilities (stats), saves, skillsaves, damage_*, condition_immunities,
33
+ // senses, languages, cr, traits, spells (basic spellcasting list), actions,
34
+ // reactions, legendary_actions (+ legendary_description). Inline markdown in
35
+ // `desc` fields supports **bold**, *italic*, and `code`. Other Fantasy Statblocks
36
+ // features (innate spellcasting, PF2e/13th-age custom layouts, dice-roller
37
+ // integration, JS callbacks, image fields) are not supported in v1.
38
+ import yaml from "js-yaml";
39
+ import { htmlEscape } from "../../../escape.js";
40
+ import { registerBuiltinAssets } from "../assets.js";
41
+ const ABILITY_NAMES = ["STR", "DEX", "CON", "INT", "WIS", "CHA"];
42
+ const ABILITY_SHORT = {
43
+ strength: "Str", dexterity: "Dex", constitution: "Con",
44
+ intelligence: "Int", wisdom: "Wis", charisma: "Cha",
45
+ };
46
+ function modifier(score) {
47
+ const mod = Math.floor((score - 10) / 2);
48
+ return mod >= 0 ? `+${mod}` : String(mod);
49
+ }
50
+ // Tiny inline-markdown formatter for desc fields. Pre-substituted handler
51
+ // HTML (e.g. `dice:` buttons) reaches us as sentinel tokens emitted by
52
+ // preprocessHandlers below. We html-escape and apply bold/italic/code
53
+ // first, then splice the original handler HTML back over the tokens.
54
+ // Wikilinks are still NOT processed (would require coupling to the
55
+ // broader render pipeline). Authors who need wikilinks should put them
56
+ // in a separate paragraph outside the statblock.
57
+ //
58
+ // Token format is a distinctive ASCII sentinel: htmlEscape leaves the
59
+ // underscores and digits alone, the bold/italic/code regexes can't
60
+ // match across it, and the chance a user writes this exact string in a
61
+ // desc is effectively zero.
62
+ const TOKEN_RE = /__VAULTSTATBLOCK_HANDLER_(\d+)__/g;
63
+ function makeToken(i) { return `__VAULTSTATBLOCK_HANDLER_${i}__`; }
64
+ function formatInline(s, spliceback) {
65
+ let out = htmlEscape(s);
66
+ out = out.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>");
67
+ out = out.replace(/(^|[^*])\*([^*\n]+)\*(?!\*)/g, "$1<em>$2</em>");
68
+ out = out.replace(/`([^`]+)`/g, "<code>$1</code>");
69
+ out = out.replace(TOKEN_RE, (_, idx) => spliceback[Number(idx)] ?? "");
70
+ return out;
71
+ }
72
+ /**
73
+ * Walk every string field in the monster, replace `` `prefix: …` ``
74
+ * inline-handler invocations with sentinel tokens, and remember the
75
+ * resulting HTML in `spliceback`. The synchronous formatInline pass below
76
+ * then weaves the tokens back in after escaping. Two-step so the rest of
77
+ * statblock rendering stays sync.
78
+ *
79
+ * Generic (Object.keys + typeof === "string") so future fields tokenize
80
+ * automatically — a new top-level string field doesn't need plumbing.
81
+ */
82
+ async function preprocessHandlers(m, ctx) {
83
+ const spliceback = [];
84
+ const tokenize = async (s) => {
85
+ if (!s || !s.includes("`"))
86
+ return s;
87
+ // Local regex (not module-level) so /g state doesn't leak across calls.
88
+ const re = /`([a-z][\w-]*):\s*([^`]*)`/g;
89
+ let out = "";
90
+ let last = 0;
91
+ let match;
92
+ while ((match = re.exec(s)) !== null) {
93
+ const replaced = await ctx.applyInlineHandlers(match[0]);
94
+ if (replaced === match[0])
95
+ continue; // unhandled prefix; leave in place
96
+ out += s.slice(last, match.index);
97
+ out += makeToken(spliceback.length);
98
+ spliceback.push(replaced);
99
+ last = match.index + match[0].length;
100
+ }
101
+ if (last === 0)
102
+ return s; // nothing matched
103
+ out += s.slice(last);
104
+ return out;
105
+ };
106
+ // Top-level scalar string fields (name, ac, hp, speed, cr, senses, …).
107
+ const mAny = m;
108
+ for (const k of Object.keys(mAny)) {
109
+ if (typeof mAny[k] === "string")
110
+ mAny[k] = await tokenize(mAny[k]);
111
+ }
112
+ // Per-entry name and desc inside trait/action lists. Nested traits are
113
+ // hoisted to the top level prefixed with the parent's name (v1: flat).
114
+ const list = async (xs) => {
115
+ if (!xs)
116
+ return;
117
+ // Inline-flatten one level of nested .traits[].traits before tokenizing.
118
+ for (let i = 0; i < xs.length; i++) {
119
+ const x = xs[i];
120
+ if (Array.isArray(x.traits) && x.traits.length) {
121
+ const parentName = x.name ?? "";
122
+ const flattened = x.traits.map((nested) => ({
123
+ ...nested,
124
+ name: parentName ? `${parentName}: ${nested.name ?? ""}`.trim() : (nested.name ?? ""),
125
+ }));
126
+ delete x.traits;
127
+ xs.splice(i + 1, 0, ...flattened);
128
+ }
129
+ }
130
+ for (const x of xs) {
131
+ if (typeof x.name === "string")
132
+ x.name = await tokenize(x.name);
133
+ if (typeof x.desc === "string")
134
+ x.desc = await tokenize(x.desc);
135
+ }
136
+ };
137
+ await list(m.traits);
138
+ await list(m.actions);
139
+ await list(m.bonus_actions);
140
+ await list(m.reactions);
141
+ await list(m.legendary_actions);
142
+ await list(m.mythic_actions);
143
+ await list(m.lair_actions);
144
+ await list(m.triggered_actions);
145
+ // spells: each entry is a string OR object. Tokenize string values
146
+ // (top-level entries and per-key values inside object entries) so
147
+ // dice:/fm: work inside.
148
+ if (m.spells) {
149
+ for (let i = 0; i < m.spells.length; i++) {
150
+ const s = m.spells[i];
151
+ if (typeof s === "string") {
152
+ m.spells[i] = (await tokenize(s)) ?? s;
153
+ }
154
+ else if (s && typeof s === "object") {
155
+ for (const k of Object.keys(s)) {
156
+ const v = s[k];
157
+ if (typeof v === "string")
158
+ s[k] = (await tokenize(v)) ?? v;
159
+ }
160
+ }
161
+ }
162
+ }
163
+ return spliceback;
164
+ }
165
+ function property(label, value, spliceback) {
166
+ if (value === undefined || value === "")
167
+ return "";
168
+ return `<p class="statblock-property"><strong>${label}</strong> ${formatInline(value, spliceback)}</p>`;
169
+ }
170
+ function header(m, spliceback) {
171
+ const name = m.name ?? "Unnamed";
172
+ const sub = [m.size, m.type, m.subtype && `(${m.subtype})`, m.alignment]
173
+ .filter(Boolean).join(" ");
174
+ // The image path is treated as a vault-relative reference; we emit it
175
+ // verbatim. Authors typically use a path their wiki's image cache serves
176
+ // (e.g. "portraits/foo.webp"). The sanitizer allows src/alt/class on img.
177
+ const img = m.image
178
+ ? `<img class="statblock-image" src="${htmlEscape(m.image)}" alt="${htmlEscape(name)}">`
179
+ : "";
180
+ // Rendered as a div, not an h2: the page sanitizer restricts <h2> to
181
+ // class="sr-only" only (GFM footnotes use it). The name is also not part
182
+ // of the page's article outline — pages can have multiple statblocks.
183
+ return (`<div class="statblock-header">` +
184
+ img +
185
+ `<div class="statblock-name">${formatInline(name, spliceback)}</div>` +
186
+ (sub ? `<p class="statblock-subheading">${formatInline(sub, spliceback)}</p>` : "") +
187
+ `</div>`);
188
+ }
189
+ function topProperties(m, spliceback) {
190
+ const parts = [];
191
+ if (m.ac !== undefined) {
192
+ parts.push(property("Armor Class", m.ac_class ? `${m.ac} (${m.ac_class})` : String(m.ac), spliceback));
193
+ }
194
+ if (m.hp !== undefined) {
195
+ parts.push(property("Hit Points", m.hit_dice ? `${m.hp} (${m.hit_dice})` : String(m.hp), spliceback));
196
+ }
197
+ if (m.speed !== undefined)
198
+ parts.push(property("Speed", String(m.speed), spliceback));
199
+ return parts.join("");
200
+ }
201
+ function stats(m) {
202
+ if (!m.stats || m.stats.length !== 6)
203
+ return "";
204
+ const cells = m.stats.map((score, i) => `<div class="statblock-stat">` +
205
+ `<div class="statblock-stat-name">${ABILITY_NAMES[i]}</div>` +
206
+ `<div class="statblock-stat-value">${score} (${modifier(score)})</div>` +
207
+ `</div>`).join("");
208
+ return `<div class="statblock-stats">${cells}</div>`;
209
+ }
210
+ // FS accepts saves/skillsaves either as an array of single-key objects OR a
211
+ // single multi-key object. Normalize to a flat list of [key, val] pairs.
212
+ function bonusList(entries, labelFor) {
213
+ if (!entries)
214
+ return "";
215
+ const pairs = [];
216
+ if (Array.isArray(entries)) {
217
+ for (const entry of entries) {
218
+ for (const [k, v] of Object.entries(entry)) {
219
+ if (typeof v === "number")
220
+ pairs.push([k, v]);
221
+ }
222
+ }
223
+ }
224
+ else if (typeof entries === "object") {
225
+ for (const [k, v] of Object.entries(entries)) {
226
+ if (typeof v === "number")
227
+ pairs.push([k, v]);
228
+ }
229
+ }
230
+ if (!pairs.length)
231
+ return "";
232
+ return pairs.map(([key, val]) => {
233
+ const sign = val >= 0 ? "+" : "";
234
+ return `${labelFor(key)} ${sign}${val}`;
235
+ }).join(", ");
236
+ }
237
+ function midProperties(m, spliceback) {
238
+ const saves = bonusList(m.saves, k => ABILITY_SHORT[k.toLowerCase()] ?? k);
239
+ const skills = bonusList(m.skillsaves, k => k.charAt(0).toUpperCase() + k.slice(1));
240
+ return [
241
+ property("Saving Throws", saves || undefined, spliceback),
242
+ property("Skills", skills || undefined, spliceback),
243
+ property("Damage Vulnerabilities", m.damage_vulnerabilities, spliceback),
244
+ property("Damage Resistances", m.damage_resistances, spliceback),
245
+ property("Damage Immunities", m.damage_immunities, spliceback),
246
+ property("Condition Immunities", m.condition_immunities, spliceback),
247
+ property("Senses", m.senses, spliceback),
248
+ property("Languages", m.languages, spliceback),
249
+ property("Challenge", m.cr !== undefined ? String(m.cr) : undefined, spliceback),
250
+ ].join("");
251
+ }
252
+ function trait(t, spliceback) {
253
+ return `<p class="statblock-trait">` +
254
+ `<strong><em>${formatInline(t.name ?? "", spliceback)}.</em></strong> ` +
255
+ formatInline(t.desc ?? "", spliceback) +
256
+ `</p>`;
257
+ }
258
+ // Render a single per-level line: bold label + comma-separated, auto-italicized
259
+ // spell list. Used for both string entries (split on first `:`) and object
260
+ // entries (key = label, value = spell list string).
261
+ function spellLevelLine(label, list, spliceback) {
262
+ const spellList = list.split(",")
263
+ .map(s => s.trim()).filter(Boolean)
264
+ .map(s => `<em>${formatInline(s, spliceback)}</em>`)
265
+ .join(", ");
266
+ return `<p class="statblock-spell-level">` +
267
+ `<strong>${formatInline(label, spliceback)}</strong>: ${spellList}` +
268
+ `</p>`;
269
+ }
270
+ // Render Fantasy Statblocks `spells:` — first entry is intro prose shown as
271
+ // a Spellcasting trait header; remaining entries are per-level lines.
272
+ //
273
+ // Each entry can be a string (split on `:`) OR an object whose keys are
274
+ // level labels and values are the spell list strings (FS Spell type).
275
+ // Entries without a `:` fall through as plain paragraphs.
276
+ function spellcasting(spells, spliceback) {
277
+ if (!spells?.length)
278
+ return "";
279
+ const [first, ...rest] = spells;
280
+ // Object as the first entry has no obvious "intro prose" interpretation;
281
+ // treat all entries as levels in that case (no Spellcasting header).
282
+ const introIsString = typeof first === "string";
283
+ const head = introIsString
284
+ ? `<p class="statblock-trait">` +
285
+ `<strong><em>Spellcasting.</em></strong> ` +
286
+ formatInline(first, spliceback) +
287
+ `</p>`
288
+ : "";
289
+ const levels = introIsString ? rest : spells;
290
+ const lines = levels.map(entry => {
291
+ if (typeof entry === "string") {
292
+ const colon = entry.indexOf(":");
293
+ if (colon < 0)
294
+ return `<p class="statblock-spell-level">${formatInline(entry, spliceback)}</p>`;
295
+ return spellLevelLine(entry.slice(0, colon), entry.slice(colon + 1), spliceback);
296
+ }
297
+ // Object form: render each key/value pair as its own level line.
298
+ return Object.entries(entry)
299
+ .map(([label, list]) => spellLevelLine(label, String(list ?? ""), spliceback))
300
+ .join("");
301
+ }).join("");
302
+ return head + lines;
303
+ }
304
+ function section(label, items, spliceback, intro) {
305
+ if (!items?.length)
306
+ return "";
307
+ // `label` is hard-coded ("Actions"/"Reactions"/…); escape rather than
308
+ // formatInline so a literal "*" in a future label doesn't get italicised.
309
+ return `<div class="statblock-section">` +
310
+ `<h3 class="statblock-section-heading">${htmlEscape(label)}</h3>` +
311
+ (intro ? `<p class="statblock-section-intro">${formatInline(intro, spliceback)}</p>` : "") +
312
+ items.map(t => trait(t, spliceback)).join("") +
313
+ `</div>`;
314
+ }
315
+ export const statblockHandler = {
316
+ codeBlock: "statblock",
317
+ async render(content, ctx) {
318
+ let m;
319
+ try {
320
+ m = yaml.load(content) ?? {};
321
+ }
322
+ catch (err) {
323
+ return {
324
+ html: `<div class="statblock statblock-error">` +
325
+ `<strong>statblock parse error:</strong> ` +
326
+ htmlEscape(err instanceof Error ? err.message : String(err)) +
327
+ `</div>`,
328
+ };
329
+ }
330
+ // Pre-substitute any `prefix: …` inline-handler invocations in desc
331
+ // fields with sentinel tokens; spliceback holds the resulting HTML and
332
+ // formatInline weaves it back in after escaping.
333
+ const spliceback = await preprocessHandlers(m, ctx);
334
+ const spellsHtml = spellcasting(m.spells, spliceback);
335
+ const traitsHtml = m.traits?.length || spellsHtml
336
+ ? `<div class="statblock-section">${(m.traits ?? []).map(t => trait(t, spliceback)).join("")}${spellsHtml}</div>`
337
+ : "";
338
+ const sourceText = Array.isArray(m.source) ? m.source.join(", ") : m.source;
339
+ const sourceHtml = sourceText
340
+ ? `<p class="statblock-source"><em>${formatInline(sourceText, spliceback)}</em></p>`
341
+ : "";
342
+ const noteHtml = m.note
343
+ ? `<p class="statblock-note"><em>${formatInline(m.note, spliceback)}</em></p>`
344
+ : "";
345
+ const body = [
346
+ header(m, spliceback),
347
+ `<div class="statblock-rule"></div>`,
348
+ `<div class="statblock-block">${topProperties(m, spliceback)}</div>`,
349
+ `<div class="statblock-rule"></div>`,
350
+ stats(m),
351
+ `<div class="statblock-rule"></div>`,
352
+ `<div class="statblock-block">${midProperties(m, spliceback)}</div>`,
353
+ `<div class="statblock-rule statblock-rule-tapered"></div>`,
354
+ traitsHtml,
355
+ section("Actions", m.actions, spliceback),
356
+ section("Bonus Actions", m.bonus_actions, spliceback),
357
+ section("Reactions", m.reactions, spliceback),
358
+ section("Legendary Actions", m.legendary_actions, spliceback, m.legendary_description),
359
+ section("Mythic Actions", m.mythic_actions, spliceback, m.mythic_description),
360
+ section("Lair Actions", m.lair_actions, spliceback),
361
+ section("Triggered Actions", m.triggered_actions, spliceback),
362
+ sourceHtml,
363
+ noteHtml,
364
+ ].join("");
365
+ return { html: `<div class="statblock">${body}</div>` };
366
+ },
367
+ };
368
+ // Visual style follows the standard D&D 5e statblock (parchment, scarlet
369
+ // rules, small-caps headings) but uses `.statblock-*` class names borrowed
370
+ // from the Fantasy Statblocks plugin where they overlap, so a vault user
371
+ // could supply their own theme by overriding the same selectors. CSS
372
+ // variables match Fantasy Statblocks' palette tokens for portability.
373
+ const STATBLOCK_CSS = `
374
+ .statblock {
375
+ --statblock-primary-color: #7a200d;
376
+ --statblock-rule-color: #922610;
377
+ --statblock-bg: #fdf1dc;
378
+ --statblock-heading-font: "Libre Baskerville", "Lora", Georgia, serif;
379
+ --statblock-content-font: "Noto Sans", Calibri, Helvetica, Arial, sans-serif;
380
+
381
+ background: var(--statblock-bg);
382
+ color: #000;
383
+ border: 1px solid #ddd;
384
+ box-shadow: 0 0 1.5em #ddd;
385
+ padding: 0.6rem 0.75rem;
386
+ margin: 1rem 0;
387
+ font-family: var(--statblock-content-font);
388
+ font-size: 14px;
389
+ line-height: 1.4;
390
+ }
391
+ .statblock p { margin: 0.15rem 0; }
392
+ .statblock-name {
393
+ font-family: var(--statblock-heading-font);
394
+ font-size: 1.6rem;
395
+ font-variant: small-caps;
396
+ font-weight: 700;
397
+ color: var(--statblock-primary-color);
398
+ margin: 0;
399
+ line-height: 1.1;
400
+ }
401
+ .statblock-subheading {
402
+ font-style: italic;
403
+ font-size: 0.9rem;
404
+ margin: 0.1rem 0 0;
405
+ }
406
+ .statblock-rule {
407
+ height: 5px;
408
+ background: var(--statblock-rule-color);
409
+ border: none;
410
+ margin: 0.4rem 0;
411
+ clip-path: polygon(0 0, 100% 0, 100% 30%, 0 100%);
412
+ }
413
+ .statblock-rule-tapered {
414
+ clip-path: polygon(0 0, 100% 0, 95% 100%, 5% 100%);
415
+ }
416
+ .statblock-block { margin: 0.3rem 0; }
417
+ .statblock-property {
418
+ color: var(--statblock-primary-color);
419
+ }
420
+ .statblock-property strong {
421
+ font-weight: bold;
422
+ }
423
+ .statblock-stats {
424
+ display: grid;
425
+ grid-template-columns: repeat(6, 1fr);
426
+ gap: 0.25rem;
427
+ text-align: center;
428
+ color: var(--statblock-primary-color);
429
+ margin: 0.3rem 0;
430
+ }
431
+ .statblock-stat-name {
432
+ font-weight: bold;
433
+ font-variant: small-caps;
434
+ }
435
+ .statblock-section { margin-top: 0.6rem; }
436
+ .statblock-section-heading {
437
+ font-family: var(--statblock-heading-font);
438
+ font-variant: small-caps;
439
+ font-weight: normal;
440
+ font-size: 1.3rem;
441
+ color: var(--statblock-primary-color);
442
+ border-bottom: 1px solid var(--statblock-primary-color);
443
+ margin: 0.5rem 0 0.3rem;
444
+ }
445
+ .statblock-trait {
446
+ margin: 0.3rem 0;
447
+ text-indent: -1rem;
448
+ padding-left: 1rem;
449
+ }
450
+ .statblock-trait strong em {
451
+ font-weight: bold;
452
+ font-style: italic;
453
+ }
454
+ .statblock-spell-level {
455
+ margin: 0.15rem 0 0.15rem 1rem;
456
+ text-indent: -1rem;
457
+ padding-left: 1rem;
458
+ }
459
+ .statblock-section-intro {
460
+ font-style: italic;
461
+ margin: 0.3rem 0;
462
+ }
463
+ .statblock-error {
464
+ background: #fde7e3;
465
+ color: #7a200d;
466
+ border-color: #7a200d;
467
+ }
468
+ .statblock-image {
469
+ float: right;
470
+ width: 75px;
471
+ height: 75px;
472
+ object-fit: cover;
473
+ margin: 0 0 0.4rem 0.5rem;
474
+ border: 2px solid var(--statblock-rule-color);
475
+ border-radius: 2px;
476
+ }
477
+ .statblock-source,
478
+ .statblock-note {
479
+ font-size: 0.85rem;
480
+ margin-top: 0.4rem;
481
+ color: #555;
482
+ }
483
+ `;
484
+ registerBuiltinAssets(statblockHandler, {
485
+ styles: [{ source: "builtin/statblock.css", content: STATBLOCK_CSS }],
486
+ // Styles ride into the Foundry-import bundle so synced statblocks
487
+ // render identically. Scripts intentionally omitted: dice runtime is
488
+ // replaced by Foundry's [[/r]] enricher in links.mjs.
489
+ foundry: { styles: true },
490
+ });
491
+ //# sourceMappingURL=statblock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statblock.js","sourceRoot":"","sources":["../../../../src/render/handlers/builtin/statblock.ts"],"names":[],"mappings":"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"}