docbook 0.1.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 (271) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/CLAUDE.md +19 -0
  4. data/CODE_OF_CONDUCT.md +10 -0
  5. data/README.adoc +335 -0
  6. data/Rakefile +12 -0
  7. data/docs/.lycheeignore +33 -0
  8. data/docs/Gemfile +10 -0
  9. data/docs/INDEX.adoc +67 -0
  10. data/docs/_config.yml +186 -0
  11. data/docs/advanced/element-classes.adoc +185 -0
  12. data/docs/advanced/frontend-customization.adoc +193 -0
  13. data/docs/advanced/index.adoc +14 -0
  14. data/docs/advanced/templates.adoc +123 -0
  15. data/docs/features/element-coverage.adoc +373 -0
  16. data/docs/features/html-output/data-model.adoc +285 -0
  17. data/docs/features/html-output/directory-mode.adoc +180 -0
  18. data/docs/features/html-output/index.adoc +90 -0
  19. data/docs/features/html-output/single-file-mode.adoc +125 -0
  20. data/docs/features/index-generation.adoc +197 -0
  21. data/docs/features/index.adoc +63 -0
  22. data/docs/features/numbering.adoc +183 -0
  23. data/docs/features/toc-generation.adoc +150 -0
  24. data/docs/features/xinclude/fragid-schemes.adoc +287 -0
  25. data/docs/features/xinclude/index.adoc +119 -0
  26. data/docs/features/xinclude/text-includes.adoc +123 -0
  27. data/docs/features/xinclude/xml-includes.adoc +167 -0
  28. data/docs/getting-started/index.adoc +50 -0
  29. data/docs/getting-started/installation.adoc +113 -0
  30. data/docs/getting-started/quick-start.adoc +161 -0
  31. data/docs/guides/converting-article.adoc +188 -0
  32. data/docs/guides/converting-book.adoc +192 -0
  33. data/docs/guides/index.adoc +12 -0
  34. data/docs/guides/roundtrip-testing.adoc +129 -0
  35. data/docs/interfaces/cli/format-command.adoc +109 -0
  36. data/docs/interfaces/cli/index.adoc +73 -0
  37. data/docs/interfaces/cli/roundtrip-command.adoc +125 -0
  38. data/docs/interfaces/cli/to-html-command.adoc +178 -0
  39. data/docs/interfaces/cli/validate-command.adoc +104 -0
  40. data/docs/interfaces/index.adoc +101 -0
  41. data/docs/interfaces/ruby-api/html-output.adoc +186 -0
  42. data/docs/interfaces/ruby-api/index.adoc +111 -0
  43. data/docs/interfaces/ruby-api/parsing.adoc +202 -0
  44. data/docs/interfaces/ruby-api/xinclude.adoc +162 -0
  45. data/docs/interfaces/ruby-api/xref-resolution.adoc +156 -0
  46. data/docs/lychee.toml +42 -0
  47. data/docs/reference/cli-options.adoc +155 -0
  48. data/docs/reference/content-block-types.adoc +243 -0
  49. data/docs/reference/glossary.adoc +119 -0
  50. data/docs/reference/index.adoc +12 -0
  51. data/docs/reference/supported-elements.adoc +749 -0
  52. data/docs/understanding/architecture.adoc +145 -0
  53. data/docs/understanding/content-pipeline.adoc +102 -0
  54. data/docs/understanding/data-models.adoc +156 -0
  55. data/docs/understanding/index.adoc +34 -0
  56. data/exe/docbook +7 -0
  57. data/frontend/dist/app.css +1 -0
  58. data/frontend/dist/app.iife.js +24 -0
  59. data/frontend/package-lock.json +1445 -0
  60. data/frontend/package.json +22 -0
  61. data/frontend/src/App.vue +230 -0
  62. data/frontend/src/app.ts +8 -0
  63. data/frontend/src/components/AppSidebar.vue +116 -0
  64. data/frontend/src/components/AppendixSection.vue +39 -0
  65. data/frontend/src/components/BlockRenderer.vue +358 -0
  66. data/frontend/src/components/ChapterSection.vue +32 -0
  67. data/frontend/src/components/ContentRenderer.vue +13 -0
  68. data/frontend/src/components/EbookContainer.vue +147 -0
  69. data/frontend/src/components/EbookTopBar.vue +116 -0
  70. data/frontend/src/components/PartSection.vue +44 -0
  71. data/frontend/src/components/ReferenceEntry.vue +80 -0
  72. data/frontend/src/components/SearchModal.vue +286 -0
  73. data/frontend/src/components/SectionContent.vue +31 -0
  74. data/frontend/src/components/SettingsPanel.vue +236 -0
  75. data/frontend/src/components/TocTreeItem.vue +135 -0
  76. data/frontend/src/composables/useEbookStore.ts +191 -0
  77. data/frontend/src/composables/useSearch.ts +249 -0
  78. data/frontend/src/env.d.ts +7 -0
  79. data/frontend/src/stores/documentStore.ts +221 -0
  80. data/frontend/src/stores/uiStore.ts +98 -0
  81. data/frontend/src/styles.css +253 -0
  82. data/frontend/tsconfig.json +24 -0
  83. data/frontend/tsconfig.node.json +11 -0
  84. data/frontend/vite.config.ts +30 -0
  85. data/lib/docbook/cli.rb +123 -0
  86. data/lib/docbook/document.rb +67 -0
  87. data/lib/docbook/elements/abbrev.rb +16 -0
  88. data/lib/docbook/elements/acknowledgements.rb +22 -0
  89. data/lib/docbook/elements/address.rb +18 -0
  90. data/lib/docbook/elements/alt.rb +16 -0
  91. data/lib/docbook/elements/annotation.rb +18 -0
  92. data/lib/docbook/elements/appendix.rb +34 -0
  93. data/lib/docbook/elements/article.rb +31 -0
  94. data/lib/docbook/elements/att.rb +15 -0
  95. data/lib/docbook/elements/attribution.rb +20 -0
  96. data/lib/docbook/elements/audioobject.rb +18 -0
  97. data/lib/docbook/elements/author.rb +18 -0
  98. data/lib/docbook/elements/bibliography.rb +24 -0
  99. data/lib/docbook/elements/bibliomixed.rb +40 -0
  100. data/lib/docbook/elements/biblioref.rb +20 -0
  101. data/lib/docbook/elements/blockquote.rb +26 -0
  102. data/lib/docbook/elements/book.rb +36 -0
  103. data/lib/docbook/elements/buildtarget.rb +16 -0
  104. data/lib/docbook/elements/callout.rb +22 -0
  105. data/lib/docbook/elements/calloutlist.rb +22 -0
  106. data/lib/docbook/elements/caution.rb +30 -0
  107. data/lib/docbook/elements/chapter.rb +62 -0
  108. data/lib/docbook/elements/citation.rb +16 -0
  109. data/lib/docbook/elements/citerefentry.rb +26 -0
  110. data/lib/docbook/elements/citetitle.rb +20 -0
  111. data/lib/docbook/elements/classname.rb +16 -0
  112. data/lib/docbook/elements/code.rb +16 -0
  113. data/lib/docbook/elements/colophon.rb +22 -0
  114. data/lib/docbook/elements/computeroutput.rb +18 -0
  115. data/lib/docbook/elements/copyright.rb +17 -0
  116. data/lib/docbook/elements/danger.rb +28 -0
  117. data/lib/docbook/elements/date.rb +16 -0
  118. data/lib/docbook/elements/dedication.rb +22 -0
  119. data/lib/docbook/elements/dir.rb +16 -0
  120. data/lib/docbook/elements/emphasis.rb +18 -0
  121. data/lib/docbook/elements/entry.rb +30 -0
  122. data/lib/docbook/elements/entrytbl.rb +22 -0
  123. data/lib/docbook/elements/equation.rb +26 -0
  124. data/lib/docbook/elements/example.rb +30 -0
  125. data/lib/docbook/elements/fieldsynopsis.rb +21 -0
  126. data/lib/docbook/elements/figure.rb +28 -0
  127. data/lib/docbook/elements/filename.rb +16 -0
  128. data/lib/docbook/elements/firstname.rb +16 -0
  129. data/lib/docbook/elements/firstterm.rb +18 -0
  130. data/lib/docbook/elements/footnote.rb +22 -0
  131. data/lib/docbook/elements/footnoteref.rb +21 -0
  132. data/lib/docbook/elements/foreignphrase.rb +18 -0
  133. data/lib/docbook/elements/formalpara.rb +20 -0
  134. data/lib/docbook/elements/function.rb +16 -0
  135. data/lib/docbook/elements/glossary.rb +24 -0
  136. data/lib/docbook/elements/glossdef.rb +18 -0
  137. data/lib/docbook/elements/glossentry.rb +26 -0
  138. data/lib/docbook/elements/glosssee.rb +18 -0
  139. data/lib/docbook/elements/glossseealso.rb +18 -0
  140. data/lib/docbook/elements/glossterm.rb +18 -0
  141. data/lib/docbook/elements/holder.rb +16 -0
  142. data/lib/docbook/elements/honorific.rb +16 -0
  143. data/lib/docbook/elements/imagedata.rb +29 -0
  144. data/lib/docbook/elements/imageobject.rb +22 -0
  145. data/lib/docbook/elements/important.rb +30 -0
  146. data/lib/docbook/elements/index.rb +26 -0
  147. data/lib/docbook/elements/indexdiv.rb +22 -0
  148. data/lib/docbook/elements/indexentry.rb +22 -0
  149. data/lib/docbook/elements/indexterm.rb +34 -0
  150. data/lib/docbook/elements/info.rb +25 -0
  151. data/lib/docbook/elements/informalexample.rb +24 -0
  152. data/lib/docbook/elements/informalfigure.rb +20 -0
  153. data/lib/docbook/elements/inlinemediaobject.rb +22 -0
  154. data/lib/docbook/elements/itemizedlist.rb +21 -0
  155. data/lib/docbook/elements/legalnotice.rb +22 -0
  156. data/lib/docbook/elements/link.rb +26 -0
  157. data/lib/docbook/elements/listitem.rb +32 -0
  158. data/lib/docbook/elements/literal.rb +16 -0
  159. data/lib/docbook/elements/literallayout.rb +22 -0
  160. data/lib/docbook/elements/mediaobject.rb +26 -0
  161. data/lib/docbook/elements/msg.rb +20 -0
  162. data/lib/docbook/elements/msgexplan.rb +22 -0
  163. data/lib/docbook/elements/msgset.rb +22 -0
  164. data/lib/docbook/elements/note.rb +30 -0
  165. data/lib/docbook/elements/orderedlist.rb +23 -0
  166. data/lib/docbook/elements/orgname.rb +16 -0
  167. data/lib/docbook/elements/para.rb +61 -0
  168. data/lib/docbook/elements/paragraph_like.rb +18 -0
  169. data/lib/docbook/elements/parameter.rb +16 -0
  170. data/lib/docbook/elements/part.rb +38 -0
  171. data/lib/docbook/elements/personname.rb +22 -0
  172. data/lib/docbook/elements/phrase.rb +20 -0
  173. data/lib/docbook/elements/preface.rb +58 -0
  174. data/lib/docbook/elements/primary.rb +16 -0
  175. data/lib/docbook/elements/procedure.rb +24 -0
  176. data/lib/docbook/elements/productname.rb +18 -0
  177. data/lib/docbook/elements/productnumber.rb +16 -0
  178. data/lib/docbook/elements/programlisting.rb +28 -0
  179. data/lib/docbook/elements/property.rb +16 -0
  180. data/lib/docbook/elements/pubdate.rb +16 -0
  181. data/lib/docbook/elements/publishername.rb +16 -0
  182. data/lib/docbook/elements/quotation.rb +24 -0
  183. data/lib/docbook/elements/quote.rb +18 -0
  184. data/lib/docbook/elements/refentry.rb +32 -0
  185. data/lib/docbook/elements/refentrytitle.rb +16 -0
  186. data/lib/docbook/elements/reference.rb +26 -0
  187. data/lib/docbook/elements/refmeta.rb +29 -0
  188. data/lib/docbook/elements/refmiscinfo.rb +16 -0
  189. data/lib/docbook/elements/refname.rb +16 -0
  190. data/lib/docbook/elements/refnamediv.rb +22 -0
  191. data/lib/docbook/elements/refpurpose.rb +16 -0
  192. data/lib/docbook/elements/refsect1.rb +22 -0
  193. data/lib/docbook/elements/refsect2.rb +22 -0
  194. data/lib/docbook/elements/refsect3.rb +22 -0
  195. data/lib/docbook/elements/refsection.rb +32 -0
  196. data/lib/docbook/elements/releaseinfo.rb +16 -0
  197. data/lib/docbook/elements/remark.rb +20 -0
  198. data/lib/docbook/elements/replaceable.rb +16 -0
  199. data/lib/docbook/elements/row.rb +15 -0
  200. data/lib/docbook/elements/screen.rb +28 -0
  201. data/lib/docbook/elements/secondary.rb +16 -0
  202. data/lib/docbook/elements/sect1.rb +26 -0
  203. data/lib/docbook/elements/sect2.rb +24 -0
  204. data/lib/docbook/elements/sect3.rb +24 -0
  205. data/lib/docbook/elements/sect4.rb +24 -0
  206. data/lib/docbook/elements/sect5.rb +22 -0
  207. data/lib/docbook/elements/section.rb +66 -0
  208. data/lib/docbook/elements/see.rb +16 -0
  209. data/lib/docbook/elements/seealso.rb +18 -0
  210. data/lib/docbook/elements/set.rb +26 -0
  211. data/lib/docbook/elements/setindex.rb +24 -0
  212. data/lib/docbook/elements/sidebar.rb +22 -0
  213. data/lib/docbook/elements/simplesect.rb +32 -0
  214. data/lib/docbook/elements/step.rb +26 -0
  215. data/lib/docbook/elements/substeps.rb +18 -0
  216. data/lib/docbook/elements/subtitle.rb +16 -0
  217. data/lib/docbook/elements/surname.rb +16 -0
  218. data/lib/docbook/elements/table.rb +24 -0
  219. data/lib/docbook/elements/tag.rb +20 -0
  220. data/lib/docbook/elements/tbody.rb +15 -0
  221. data/lib/docbook/elements/term.rb +37 -0
  222. data/lib/docbook/elements/tertiary.rb +16 -0
  223. data/lib/docbook/elements/textobject.rb +18 -0
  224. data/lib/docbook/elements/tfoot.rb +15 -0
  225. data/lib/docbook/elements/tgroup.rb +21 -0
  226. data/lib/docbook/elements/thead.rb +15 -0
  227. data/lib/docbook/elements/tip.rb +30 -0
  228. data/lib/docbook/elements/title.rb +16 -0
  229. data/lib/docbook/elements/toc.rb +24 -0
  230. data/lib/docbook/elements/tocdiv.rb +22 -0
  231. data/lib/docbook/elements/tocentry.rb +20 -0
  232. data/lib/docbook/elements/topic.rb +26 -0
  233. data/lib/docbook/elements/type.rb +16 -0
  234. data/lib/docbook/elements/uri.rb +16 -0
  235. data/lib/docbook/elements/userinput.rb +18 -0
  236. data/lib/docbook/elements/variable.rb +16 -0
  237. data/lib/docbook/elements/variablelist.rb +19 -0
  238. data/lib/docbook/elements/varlistentry.rb +17 -0
  239. data/lib/docbook/elements/version.rb +16 -0
  240. data/lib/docbook/elements/videoobject.rb +18 -0
  241. data/lib/docbook/elements/warning.rb +30 -0
  242. data/lib/docbook/elements/xref.rb +18 -0
  243. data/lib/docbook/elements/year.rb +16 -0
  244. data/lib/docbook/elements.rb +204 -0
  245. data/lib/docbook/models/document_metadata.rb +30 -0
  246. data/lib/docbook/models/document_root.rb +33 -0
  247. data/lib/docbook/models/index_entry.rb +28 -0
  248. data/lib/docbook/models/reading_position.rb +22 -0
  249. data/lib/docbook/models/section_number.rb +18 -0
  250. data/lib/docbook/models/section_root.rb +29 -0
  251. data/lib/docbook/models/toc_node.rb +24 -0
  252. data/lib/docbook/models.rb +16 -0
  253. data/lib/docbook/output/data.rb +196 -0
  254. data/lib/docbook/output/html.rb +1450 -0
  255. data/lib/docbook/output/index_generator.rb +281 -0
  256. data/lib/docbook/output.rb +8 -0
  257. data/lib/docbook/services/document_builder.rb +258 -0
  258. data/lib/docbook/services/element_to_hash.rb +287 -0
  259. data/lib/docbook/services/index_generator.rb +134 -0
  260. data/lib/docbook/services/numbering_service.rb +186 -0
  261. data/lib/docbook/services/toc_generator.rb +138 -0
  262. data/lib/docbook/services.rb +14 -0
  263. data/lib/docbook/templates/document.html.liquid +20 -0
  264. data/lib/docbook/templates/partials/_head.liquid +39 -0
  265. data/lib/docbook/templates/partials/_scripts.liquid +10 -0
  266. data/lib/docbook/version.rb +5 -0
  267. data/lib/docbook/xinclude_resolver.rb +217 -0
  268. data/lib/docbook/xref_resolver.rb +78 -0
  269. data/lib/docbook.rb +17 -0
  270. data/sig/docbook.rbs +4 -0
  271. metadata +385 -0
@@ -0,0 +1,358 @@
1
+ <template>
2
+ <div class="content-blocks">
3
+ <template v-for="(block, index) in blocks" :key="index">
4
+ <!-- Reference Entry (dictionary-style entry) -->
5
+ <ReferenceEntry v-if="block.type === 'reference_entry'" :block="block" />
6
+ <p v-if="block.type === 'paragraph'" class="mb-3 text-gray-800 dark:text-gray-200 leading-relaxed">
7
+ <template v-if="block.children && block.children.length > 0">
8
+ <template v-for="(child, ci) in block.children" :key="ci">
9
+ <strong v-if="child.type === 'strong'" class="font-bold dark:text-white">{{ child.text }}</strong>
10
+ <em v-else-if="child.type === 'italic'" class="italic dark:text-gray-300">{{ child.text }}</em>
11
+ <em v-else-if="child.type === 'emphasis'" class="italic dark:text-gray-300">{{ child.text }}</em>
12
+ <code v-else-if="child.type === 'codetext'" class="bg-gray-100 dark:bg-gray-800 text-pink-600 dark:text-pink-400 px-1.5 py-0.5 rounded text-sm font-mono border border-gray-200 dark:border-gray-700">{{ child.text }}</code>
13
+ <a v-else-if="child.type === 'link'" :href="child.src" class="text-blue-600 dark:text-blue-400 hover:underline">{{ child.text }}</a>
14
+ <a v-else-if="child.type === 'biblioref'" :href="child.src" class="text-emerald-600 dark:text-emerald-400 hover:underline italic">{{ child.text }}</a>
15
+ <span v-else-if="child.type === 'citation'" class="text-teal-600 dark:text-teal-400 italic">{{ child.text }}</span>
16
+ <a v-else-if="child.type === 'citation_link'" :href="child.src" class="text-teal-600 dark:text-teal-400 hover:underline italic">{{ child.text }}</a>
17
+ <a v-else-if="child.type === 'xref'" :href="child.src" class="text-blue-600 dark:text-blue-400 hover:underline border-b border-dashed border-blue-400 dark:border-blue-500">{{ child.text }}</a>
18
+ <img v-else-if="child.type === 'inline_image'" :src="child.src" :alt="child.alt || ''" class="max-w-full h-auto rounded inline">
19
+ <span v-else-if="child.type === 'text'" v-html="escapeHtml(child.text || '')"></span>
20
+ </template>
21
+ </template>
22
+ <template v-else>
23
+ <span v-html="escapeHtml(block.text || '')"></span>
24
+ </template>
25
+ </p>
26
+
27
+ <!-- Code block -->
28
+ <pre v-else-if="block.type === 'code'" class="bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-4 overflow-x-auto text-sm font-mono dark:text-gray-100" :class="block.language ? 'language-' + block.language : ''"><code :class="block.language ? 'language-' + block.language : ''" v-html="highlightCode(block.text || '', block.language)"></code></pre>
29
+
30
+ <!-- Image -->
31
+ <figure v-else-if="block.type === 'image'" class="my-6 overflow-hidden rounded-lg">
32
+ <img :src="block.src" :alt="block.alt || ''" class="max-w-full h-auto rounded shadow" loading="lazy">
33
+ <figcaption v-if="block.title" class="mt-2 text-sm text-gray-600 dark:text-gray-400 text-center italic">{{ block.title }}</figcaption>
34
+ </figure>
35
+
36
+ <!-- Blockquote -->
37
+ <blockquote v-else-if="block.type === 'blockquote'" class="border-l-4 border-blue-500 pl-4 py-1 my-4 bg-gray-50 dark:bg-gray-800/50 rounded-r-lg">
38
+ <p v-for="(child, ci) in block.children" :key="ci" class="mb-3 text-gray-800 dark:text-gray-200">
39
+ <template v-if="child.type === 'paragraph'">{{ child.text }}</template>
40
+ </p>
41
+ <footer v-if="block.text" class="text-gray-500 dark:text-gray-400 text-sm mt-2">&mdash; {{ block.text }}</footer>
42
+ </blockquote>
43
+
44
+ <!-- Ordered List -->
45
+ <ol v-else-if="block.type === 'ordered_list'" class="list-decimal ml-6 mb-3 space-y-1">
46
+ <li v-for="(item, li) in block.children" :key="li" class="text-gray-800 dark:text-gray-200">
47
+ <template v-if="item.type === 'list_item'">
48
+ <template v-for="(child, ci) in item.children" :key="ci">
49
+ <p v-if="child.type === 'paragraph'" class="mb-3">
50
+ <template v-for="(para, pi) in (child.children || [])" :key="pi">
51
+ <strong v-if="para.type === 'strong'">{{ para.text }}</strong>
52
+ <em v-else-if="para.type === 'italic'" class="italic">{{ para.text }}</em>
53
+ <em v-else-if="para.type === 'emphasis'" class="italic">{{ para.text }}</em>
54
+ <code v-else-if="para.type === 'codetext'" class="bg-gray-100 dark:bg-gray-800 text-pink-600 dark:text-pink-400 px-1.5 py-0.5 rounded text-sm font-mono border border-gray-200 dark:border-gray-700">{{ para.text }}</code>
55
+ <a v-else-if="para.type === 'link'" :href="para.src" class="text-blue-600 dark:text-blue-400 hover:underline">{{ para.text }}</a>
56
+ <a v-else-if="para.type === 'xref'" :href="para.src" class="text-blue-600 dark:text-blue-400 hover:underline border-b border-dashed border-blue-400 dark:border-blue-500">{{ para.text }}</a>
57
+ <img v-else-if="para.type === 'inline_image'" :src="para.src" :alt="para.alt || ''" class="max-w-full h-auto rounded inline">
58
+ <span v-else-if="para.type === 'text'" v-html="escapeHtml(para.text || '')"></span>
59
+ </template>
60
+ </p>
61
+ </template>
62
+ </template>
63
+ </li>
64
+ </ol>
65
+
66
+ <!-- Itemized List -->
67
+ <ul v-else-if="block.type === 'itemized_list'" class="list-disc ml-6 mb-3 space-y-1">
68
+ <li v-for="(item, li) in block.children" :key="li" class="text-gray-800 dark:text-gray-200">
69
+ <template v-if="item.type === 'list_item'">
70
+ <template v-for="(child, ci) in item.children" :key="ci">
71
+ <p v-if="child.type === 'paragraph'" class="mb-3">
72
+ <template v-for="(para, pi) in (child.children || [])" :key="pi">
73
+ <strong v-if="para.type === 'strong'">{{ para.text }}</strong>
74
+ <em v-else-if="para.type === 'italic'" class="italic">{{ para.text }}</em>
75
+ <em v-else-if="para.type === 'emphasis'" class="italic">{{ para.text }}</em>
76
+ <code v-else-if="para.type === 'codetext'" class="bg-gray-100 dark:bg-gray-800 text-pink-600 dark:text-pink-400 px-1.5 py-0.5 rounded text-sm font-mono border border-gray-200 dark:border-gray-700">{{ para.text }}</code>
77
+ <a v-else-if="para.type === 'link'" :href="para.src" class="text-blue-600 dark:text-blue-400 hover:underline">{{ para.text }}</a>
78
+ <a v-else-if="para.type === 'xref'" :href="para.src" class="text-blue-600 dark:text-blue-400 hover:underline border-b border-dashed border-blue-400 dark:border-blue-500">{{ para.text }}</a>
79
+ <img v-else-if="para.type === 'inline_image'" :src="para.src" :alt="para.alt || ''" class="max-w-full h-auto rounded inline">
80
+ <span v-else-if="para.type === 'text'" v-html="escapeHtml(para.text || '')"></span>
81
+ </template>
82
+ </p>
83
+ </template>
84
+ </template>
85
+ </li>
86
+ </ul>
87
+
88
+ <!-- Definition List (glossary) -->
89
+ <dl v-else-if="block.type === 'definition_list'" class="mb-4 ml-4">
90
+ <template v-for="(item, di) in block.children" :key="di">
91
+ <template v-if="item.type === 'definition_term'">
92
+ <template v-for="(child, ci) in (item.children || [])" :key="ci">
93
+ <dt v-if="child.type === 'text'" class="font-semibold text-gray-800 dark:text-gray-200 mt-2">{{ child.text }}</dt>
94
+ <dt v-else-if="child.type === 'codetext'" class="font-mono text-pink-600 dark:text-pink-400 mt-2">{{ child.text }}</dt>
95
+ </template>
96
+ </template>
97
+ <template v-if="item.type === 'definition_description'">
98
+ <template v-for="(child, ci) in (item.children || [])" :key="ci">
99
+ <dd v-if="child.type === 'paragraph'" class="ml-4 text-gray-700 dark:text-gray-300 mb-2">
100
+ <template v-for="(para, pi) in (child.children || [])" :key="pi">
101
+ <strong v-if="para.type === 'strong'" class="font-bold">{{ para.text }}</strong>
102
+ <em v-else-if="para.type === 'italic'" class="italic">{{ para.text }}</em>
103
+ <em v-else-if="para.type === 'emphasis'" class="italic">{{ para.text }}</em>
104
+ <code v-else-if="para.type === 'codetext'" class="bg-gray-100 dark:bg-gray-800 text-pink-600 dark:text-pink-400 px-1 py-0.5 rounded text-sm font-mono">{{ para.text }}</code>
105
+ <a v-else-if="para.type === 'link'" :href="para.src" class="text-blue-600 dark:text-blue-400 hover:underline">{{ para.text }}</a>
106
+ <a v-else-if="para.type === 'biblioref'" :href="para.src" class="text-emerald-600 dark:text-emerald-400 hover:underline italic">{{ para.text }}</a>
107
+ <span v-else-if="para.type === 'citation'" class="text-teal-600 dark:text-teal-400 italic">{{ para.text }}</span>
108
+ <a v-else-if="para.type === 'citation_link'" :href="para.src" class="text-teal-600 dark:text-teal-400 hover:underline italic">{{ para.text }}</a>
109
+ <a v-else-if="para.type === 'xref'" :href="para.src" class="text-blue-600 dark:text-blue-400 hover:underline border-b border-dashed border-blue-400 dark:border-blue-500">{{ para.text }}</a>
110
+ <img v-else-if="para.type === 'inline_image'" :src="para.src" :alt="para.alt || ''" class="max-w-full h-auto rounded inline">
111
+ <span v-else-if="para.type === 'text'" v-html="escapeHtml(para.text || '')"></span>
112
+ </template>
113
+ </dd>
114
+ </template>
115
+ </template>
116
+ </template>
117
+ </dl>
118
+
119
+ <!-- Admonitions -->
120
+ <div v-else-if="block.type === 'note'" class="border-l-4 border-blue-500 rounded-r-lg p-4 my-4 bg-blue-50 dark:bg-blue-900/20">
121
+ <div class="font-bold text-blue-700 dark:text-blue-300 mb-1">{{ block.text || 'Note' }}</div>
122
+ <div v-for="(child, ci) in block.children" :key="ci">
123
+ <p v-if="child.type === 'paragraph'" class="text-blue-700 dark:text-blue-300 mb-2">
124
+ <template v-for="(para, pi) in (child.children || [])" :key="pi">
125
+ <strong v-if="para.type === 'strong'" class="font-bold">{{ para.text }}</strong>
126
+ <em v-else-if="para.type === 'italic'" class="italic">{{ para.text }}</em>
127
+ <em v-else-if="para.type === 'emphasis'" class="italic">{{ para.text }}</em>
128
+ <code v-else-if="para.type === 'codetext'" class="bg-blue-100 dark:bg-blue-800 text-pink-600 dark:text-pink-400 px-1 py-0.5 rounded text-sm font-mono">{{ para.text }}</code>
129
+ <a v-else-if="para.type === 'link'" :href="para.src" class="text-blue-600 dark:text-blue-400 hover:underline">{{ para.text }}</a>
130
+ <a v-else-if="para.type === 'xref'" :href="para.src" class="text-blue-600 dark:text-blue-400 hover:underline border-b border-dashed border-blue-400">{{ para.text }}</a>
131
+ <img v-else-if="para.type === 'inline_image'" :src="para.src" :alt="para.alt || ''" class="max-w-full h-auto rounded inline">
132
+ <span v-else-if="para.type === 'text'" v-html="escapeHtml(para.text || '')"></span>
133
+ </template>
134
+ </p>
135
+ <pre v-else-if="child.type === 'code'" class="bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-4 overflow-x-auto text-sm font-mono dark:text-gray-100" :data-language="child.language"><code>{{ child.text }}</code></pre>
136
+ </div>
137
+ </div>
138
+
139
+ <div v-else-if="block.type === 'warning'" class="border-l-4 border-yellow-500 rounded-r-lg p-4 my-4 bg-yellow-50 dark:bg-yellow-900/20">
140
+ <div class="font-bold text-yellow-700 dark:text-yellow-300 mb-1">{{ block.text || 'Warning' }}</div>
141
+ <div v-for="(child, ci) in block.children" :key="ci">
142
+ <p v-if="child.type === 'paragraph'" class="text-yellow-700 dark:text-yellow-300 mb-2">
143
+ <template v-for="(para, pi) in (child.children || [])" :key="pi">
144
+ <strong v-if="para.type === 'strong'" class="font-bold">{{ para.text }}</strong>
145
+ <em v-else-if="para.type === 'italic'" class="italic">{{ para.text }}</em>
146
+ <em v-else-if="para.type === 'emphasis'" class="italic">{{ para.text }}</em>
147
+ <code v-else-if="para.type === 'codetext'" class="bg-yellow-100 dark:bg-yellow-800 text-pink-600 dark:text-pink-400 px-1 py-0.5 rounded text-sm font-mono">{{ para.text }}</code>
148
+ <a v-else-if="para.type === 'link'" :href="para.src" class="text-yellow-600 dark:text-yellow-400 hover:underline">{{ para.text }}</a>
149
+ <a v-else-if="para.type === 'xref'" :href="para.src" class="text-yellow-600 dark:text-yellow-400 hover:underline border-b border-dashed border-yellow-400">{{ para.text }}</a>
150
+ <img v-else-if="para.type === 'inline_image'" :src="para.src" :alt="para.alt || ''" class="max-w-full h-auto rounded inline">
151
+ <span v-else-if="para.type === 'text'" v-html="escapeHtml(para.text || '')"></span>
152
+ </template>
153
+ </p>
154
+ <pre v-else-if="child.type === 'code'" class="bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-4 overflow-x-auto text-sm font-mono dark:text-gray-100" :data-language="child.language"><code>{{ child.text }}</code></pre>
155
+ </div>
156
+ </div>
157
+
158
+ <div v-else-if="block.type === 'danger'" class="border-l-4 border-red-500 rounded-r-lg p-4 my-4 bg-red-50 dark:bg-red-900/20">
159
+ <div class="font-bold text-red-700 dark:text-red-300 mb-1">{{ block.text || 'Danger' }}</div>
160
+ <div v-for="(child, ci) in block.children" :key="ci">
161
+ <p v-if="child.type === 'paragraph'" class="text-red-700 dark:text-red-300 mb-2">
162
+ <template v-for="(para, pi) in (child.children || [])" :key="pi">
163
+ <strong v-if="para.type === 'strong'" class="font-bold">{{ para.text }}</strong>
164
+ <em v-else-if="para.type === 'italic'" class="italic">{{ para.text }}</em>
165
+ <em v-else-if="para.type === 'emphasis'" class="italic">{{ para.text }}</em>
166
+ <code v-else-if="para.type === 'codetext'" class="bg-red-100 dark:bg-red-800 text-pink-600 dark:text-pink-400 px-1 py-0.5 rounded text-sm font-mono">{{ para.text }}</code>
167
+ <a v-else-if="para.type === 'link'" :href="para.src" class="text-red-600 dark:text-red-400 hover:underline">{{ para.text }}</a>
168
+ <a v-else-if="para.type === 'xref'" :href="para.src" class="text-red-600 dark:text-red-400 hover:underline border-b border-dashed border-red-400">{{ para.text }}</a>
169
+ <img v-else-if="para.type === 'inline_image'" :src="para.src" :alt="para.alt || ''" class="max-w-full h-auto rounded inline">
170
+ <span v-else-if="para.type === 'text'" v-html="escapeHtml(para.text || '')"></span>
171
+ </template>
172
+ </p>
173
+ <pre v-else-if="child.type === 'code'" class="bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-4 overflow-x-auto text-sm font-mono dark:text-gray-100" :data-language="child.language"><code>{{ child.text }}</code></pre>
174
+ </div>
175
+ </div>
176
+
177
+ <div v-else-if="block.type === 'caution'" class="border-l-4 border-orange-500 rounded-r-lg p-4 my-4 bg-orange-50 dark:bg-orange-900/20">
178
+ <div class="font-bold text-orange-700 dark:text-orange-300 mb-1">{{ block.text || 'Caution' }}</div>
179
+ <div v-for="(child, ci) in block.children" :key="ci">
180
+ <p v-if="child.type === 'paragraph'" class="text-orange-700 dark:text-orange-300 mb-2">
181
+ <template v-for="(para, pi) in (child.children || [])" :key="pi">
182
+ <strong v-if="para.type === 'strong'" class="font-bold">{{ para.text }}</strong>
183
+ <em v-else-if="para.type === 'italic'" class="italic">{{ para.text }}</em>
184
+ <em v-else-if="para.type === 'emphasis'" class="italic">{{ para.text }}</em>
185
+ <code v-else-if="para.type === 'codetext'" class="bg-orange-100 dark:bg-orange-800 text-pink-600 dark:text-pink-400 px-1 py-0.5 rounded text-sm font-mono">{{ para.text }}</code>
186
+ <a v-else-if="para.type === 'link'" :href="para.src" class="text-orange-600 dark:text-orange-400 hover:underline">{{ para.text }}</a>
187
+ <a v-else-if="para.type === 'xref'" :href="para.src" class="text-orange-600 dark:text-orange-400 hover:underline border-b border-dashed border-orange-400">{{ para.text }}</a>
188
+ <img v-else-if="para.type === 'inline_image'" :src="para.src" :alt="para.alt || ''" class="max-w-full h-auto rounded inline">
189
+ <span v-else-if="para.type === 'text'" v-html="escapeHtml(para.text || '')"></span>
190
+ </template>
191
+ </p>
192
+ <pre v-else-if="child.type === 'code'" class="bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-4 overflow-x-auto text-sm font-mono dark:text-gray-100" :data-language="child.language"><code>{{ child.text }}</code></pre>
193
+ </div>
194
+ </div>
195
+
196
+ <div v-else-if="block.type === 'important'" class="border-l-4 border-purple-500 rounded-r-lg p-4 my-4 bg-purple-50 dark:bg-purple-900/20">
197
+ <div class="font-bold text-purple-700 dark:text-purple-300 mb-1">{{ block.text || 'Important' }}</div>
198
+ <div v-for="(child, ci) in block.children" :key="ci">
199
+ <p v-if="child.type === 'paragraph'" class="text-purple-700 dark:text-purple-300 mb-2">
200
+ <template v-for="(para, pi) in (child.children || [])" :key="pi">
201
+ <strong v-if="para.type === 'strong'" class="font-bold">{{ para.text }}</strong>
202
+ <em v-else-if="para.type === 'italic'" class="italic">{{ para.text }}</em>
203
+ <em v-else-if="para.type === 'emphasis'" class="italic">{{ para.text }}</em>
204
+ <code v-else-if="para.type === 'codetext'" class="bg-purple-100 dark:bg-purple-800 text-pink-600 dark:text-pink-400 px-1 py-0.5 rounded text-sm font-mono">{{ para.text }}</code>
205
+ <a v-else-if="para.type === 'link'" :href="para.src" class="text-purple-600 dark:text-purple-400 hover:underline">{{ para.text }}</a>
206
+ <a v-else-if="para.type === 'xref'" :href="para.src" class="text-purple-600 dark:text-purple-400 hover:underline border-b border-dashed border-purple-400">{{ para.text }}</a>
207
+ <img v-else-if="para.type === 'inline_image'" :src="para.src" :alt="para.alt || ''" class="max-w-full h-auto rounded inline">
208
+ <span v-else-if="para.type === 'text'" v-html="escapeHtml(para.text || '')"></span>
209
+ </template>
210
+ </p>
211
+ <pre v-else-if="child.type === 'code'" class="bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-4 overflow-x-auto text-sm font-mono dark:text-gray-100" :data-language="child.language"><code>{{ child.text }}</code></pre>
212
+ </div>
213
+ </div>
214
+
215
+ <div v-else-if="block.type === 'tip'" class="border-l-4 border-green-500 rounded-r-lg p-4 my-4 bg-green-50 dark:bg-green-900/20">
216
+ <div class="font-bold text-green-700 dark:text-green-300 mb-1">{{ block.text || 'Tip' }}</div>
217
+ <div v-for="(child, ci) in block.children" :key="ci">
218
+ <p v-if="child.type === 'paragraph'" class="text-green-700 dark:text-green-300 mb-2">
219
+ <template v-for="(para, pi) in (child.children || [])" :key="pi">
220
+ <strong v-if="para.type === 'strong'" class="font-bold">{{ para.text }}</strong>
221
+ <em v-else-if="para.type === 'italic'" class="italic">{{ para.text }}</em>
222
+ <em v-else-if="para.type === 'emphasis'" class="italic">{{ para.text }}</em>
223
+ <code v-else-if="para.type === 'codetext'" class="bg-green-100 dark:bg-green-800 text-pink-600 dark:text-pink-400 px-1 py-0.5 rounded text-sm font-mono">{{ para.text }}</code>
224
+ <a v-else-if="para.type === 'link'" :href="para.src" class="text-green-600 dark:text-green-400 hover:underline">{{ para.text }}</a>
225
+ <a v-else-if="para.type === 'xref'" :href="para.src" class="text-green-600 dark:text-green-400 hover:underline border-b border-dashed border-green-400">{{ para.text }}</a>
226
+ <img v-else-if="para.type === 'inline_image'" :src="para.src" :alt="para.alt || ''" class="max-w-full h-auto rounded inline">
227
+ <span v-else-if="para.type === 'text'" v-html="escapeHtml(para.text || '')"></span>
228
+ </template>
229
+ </p>
230
+ <pre v-else-if="child.type === 'code'" class="bg-gray-100 dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-4 mb-4 overflow-x-auto text-sm font-mono dark:text-gray-100" :data-language="child.language"><code>{{ child.text }}</code></pre>
231
+ </div>
232
+ </div>
233
+
234
+ <!-- Bibliography entry (reference) -->
235
+ <div v-else-if="block.type === 'bibliography_entry'" class="mb-4 ml-4 pl-4 border-l-2 border-gray-300 dark:border-gray-600">
236
+ <p class="text-gray-800 dark:text-gray-200">
237
+ <template v-for="(child, ci) in (block.children || [])" :key="ci">
238
+ <span v-if="child.type === 'text'">{{ child.text }}</span>
239
+ <span v-else-if="child.type === 'biblio_abbrev'" :class="child.className">{{ child.text }}</span>
240
+ <cite v-else-if="child.type === 'biblio_citetitle'" :class="child.className">{{ child.text }}</cite>
241
+ <span v-else-if="child.type === 'biblio_author' || child.type === 'biblio_personname' || child.type === 'biblio_firstname' || child.type === 'biblio_surname'" :class="child.className">{{ child.text }}</span>
242
+ <span v-else-if="child.type === 'biblio_orgname' || child.type === 'biblio_publishername' || child.type === 'biblio_pubdate' || child.type === 'biblio_bibliosource'" :class="child.className">{{ child.text }}</span>
243
+ <a v-else-if="child.type === 'link'" :href="child.src" :class="child.className" class="text-blue-600 dark:text-blue-400 hover:underline">{{ child.text }}</a>
244
+ <a v-else-if="child.type === 'xref'" :href="child.src" class="text-blue-600 dark:text-blue-400 hover:underline border-b border-dashed border-blue-400 dark:border-blue-500">{{ child.text }}</a>
245
+ <span v-if="ci < (block.children?.length || 0) - 1" :key="'space-' + ci"> </span>
246
+ </template>
247
+ </p>
248
+ </div>
249
+
250
+ <!-- Reference entry (refentry - dictionary-style entry) -->
251
+ <!-- Handled by ReferenceEntry component above -->
252
+
253
+ <!-- Description section (from refsection content) -->
254
+ <div v-else-if="block.type === 'description_section'" class="description-section mb-4">
255
+ <BlockRenderer :blocks="block.children || []" />
256
+ </div>
257
+
258
+ <!-- Example output (informalexample - styled differently from code) -->
259
+ <div v-else-if="block.type === 'example_output'" class="reference-example bg-green-50 dark:bg-green-900/20 border-2 border-dashed border-green-500 dark:border-green-600 rounded-lg p-4 my-4">
260
+ <span class="reference-example-label text-xs font-semibold uppercase tracking-wide text-green-700 dark:text-green-400 block mb-2">Example:</span>
261
+ <BlockRenderer :blocks="block.children || []" />
262
+ </div>
263
+
264
+ <!-- Index section (whole index) -->
265
+ <div v-else-if="block.type === 'index_section'" class="mb-8">
266
+ <h2 v-if="block.text" class="text-2xl font-bold mb-6 text-gray-900 dark:text-gray-100">{{ block.text }}</h2>
267
+ <div class="index-columns">
268
+ <BlockRenderer :blocks="block.children || []" />
269
+ </div>
270
+ </div>
271
+
272
+ <!-- Index letter group -->
273
+ <div v-else-if="block.type === 'index_letter'" class="index-letter-section mb-6">
274
+ <h3 class="index-letter text-xl font-bold mb-3 text-gray-700 dark:text-gray-300 border-b border-gray-300 dark:border-gray-600 pb-1">{{ block.text }}</h3>
275
+ <ul class="index-entries space-y-1">
276
+ <BlockRenderer :blocks="block.children || []" />
277
+ </ul>
278
+ </div>
279
+
280
+ <!-- Index entry -->
281
+ <li v-else-if="block.type === 'index_entry'" class="index-entry ml-4">
282
+ <span class="text-gray-800 dark:text-gray-200">{{ block.text }}</span>
283
+ <template v-for="(child, ci) in block.children" :key="ci">
284
+ <a v-if="child.type === 'index_reference'" :href="child.src" class="index-section-link ml-2 text-blue-600 dark:text-blue-400 hover:underline text-sm">{{ child.text }}</a>
285
+ <span v-else-if="child.type === 'index_see'" class="index-see ml-2 text-gray-500 dark:text-gray-400 italic text-sm">{{ child.text }}</span>
286
+ <span v-else-if="child.type === 'index_see_also'" class="index-see-also ml-2 text-gray-500 dark:text-gray-400 italic text-sm">{{ child.text }}</span>
287
+ </template>
288
+ </li>
289
+
290
+ <!-- Nested section blocks -->
291
+ <div v-else-if="block.type === 'section'" class="mb-6">
292
+ <BlockRenderer :blocks="block.children || []" />
293
+ </div>
294
+
295
+ <!-- Heading (used for simplesect titles within content) -->
296
+ <h3 v-else-if="block.type === 'heading'" class="text-lg font-semibold text-gray-900 dark:text-gray-100 mb-2 mt-4">
297
+ {{ block.text }}
298
+ </h3>
299
+
300
+ <!-- Reference meta (refentrytitle, refmiscinfo - metadata) -->
301
+ <span v-else-if="block.type === 'reference_meta'" class="reference-meta text-xs text-gray-400 dark:text-gray-500 block mb-1">
302
+ {{ block.text }}
303
+ </span>
304
+
305
+ <!-- Reference class (refclass badge) -->
306
+ <span v-else-if="block.type === 'reference_class'" class="reference-badge inline-block px-2 py-0.5 text-xs rounded-full bg-purple-100 dark:bg-purple-900 text-purple-700 dark:text-purple-300">
307
+ {{ block.text }}
308
+ </span>
309
+
310
+ <!-- Reference badge (new type for refclass - e.g., "pi") -->
311
+ <span v-else-if="block.type === 'reference_badge'" class="reference-badge inline-block text-[0.65rem] font-semibold uppercase tracking-wide px-2 py-0.5 rounded-full bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400">
312
+ {{ block.text }}
313
+ </span>
314
+
315
+ <!-- Reference name (refname - headword) -->
316
+ <h2 v-else-if="block.type === 'reference_name'" class="reference-name text-2xl font-bold font-mono text-cyan-700 dark:text-cyan-400 mb-1">
317
+ {{ block.text }}
318
+ </h2>
319
+
320
+ <!-- Reference definition (refpurpose - definition) -->
321
+ <p v-else-if="block.type === 'reference_definition'" class="reference-definition text-base text-gray-600 dark:text-gray-400 italic mb-4">
322
+ {{ block.text }}
323
+ </p>
324
+
325
+ <!-- Fallback: render as paragraph if text exists -->
326
+ <p v-else-if="block.text" class="mb-3 text-gray-800 dark:text-gray-200" v-html="escapeHtml(block.text)"></p>
327
+ </template>
328
+ </div>
329
+ </template>
330
+
331
+ <script setup lang="ts">
332
+ import type { ContentBlock } from '../stores/documentStore'
333
+ import ReferenceEntry from './ReferenceEntry.vue'
334
+
335
+ declare const Prism: any
336
+
337
+ defineProps<{
338
+ blocks: ContentBlock[]
339
+ }>()
340
+
341
+ function escapeHtml(text: string): string {
342
+ const div = document.createElement('div')
343
+ div.textContent = text
344
+ return div.innerHTML
345
+ }
346
+
347
+ function highlightCode(text: string, language: string | null): string {
348
+ const lang = language || 'plaintext'
349
+ try {
350
+ if (Prism && Prism.languages && Prism.languages[lang]) {
351
+ return Prism.highlight(text, Prism.languages[lang], lang)
352
+ }
353
+ } catch (e) {
354
+ // Fallback to escaped HTML if Prism fails
355
+ }
356
+ return escapeHtml(text)
357
+ }
358
+ </script>
@@ -0,0 +1,32 @@
1
+ <template>
2
+ <section :id="section.id" class="mb-12 scroll-mt-20">
3
+ <h2 class="flex items-baseline gap-3 text-xl font-bold mb-5 pb-2 border-b border-gray-200 dark:border-gray-700">
4
+ <span class="text-gray-500 dark:text-gray-400 text-lg font-normal">{{ numbering }}</span>
5
+ <span>{{ section.title }}</span>
6
+ </h2>
7
+ <BlockRenderer v-if="sectionContent" :blocks="sectionContent.blocks" />
8
+ <!-- Render children if any -->
9
+ <template v-if="section.children && section.children.length > 0">
10
+ <div v-for="child in section.children" :key="child.id" class="ml-4">
11
+ <SectionContent :section="child" />
12
+ </div>
13
+ </template>
14
+ </section>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { computed } from 'vue'
19
+ import { useDocumentStore, type TocItem } from '@/stores/documentStore'
20
+ import SectionContent from '@/components/SectionContent.vue'
21
+ import BlockRenderer from '@/components/BlockRenderer.vue'
22
+
23
+ interface Props {
24
+ section: TocItem
25
+ }
26
+
27
+ const props = defineProps<Props>()
28
+ const documentStore = useDocumentStore()
29
+
30
+ const numbering = computed(() => documentStore.getNumbering(props.section.id))
31
+ const sectionContent = computed(() => documentStore.getSectionContent(props.section.id))
32
+ </script>
@@ -0,0 +1,13 @@
1
+ <template>
2
+ <main class="flex-1 min-w-0">
3
+ <div class="max-w-4xl mx-auto px-6 py-10 lg:px-8 lg:py-12">
4
+ <slot />
5
+ <footer class="mt-16 pt-8 border-t border-gray-200 dark:border-gray-700 text-center text-sm text-gray-500 dark:text-gray-400">
6
+ Generated by <a href="https://github.com/metanorma/metanorma-docbook" class="text-blue-600 dark:text-blue-400 hover:underline">Metanorma Docbook</a> gem
7
+ </footer>
8
+ </div>
9
+ </main>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ </script>
@@ -0,0 +1,147 @@
1
+ <template>
2
+ <div class="ebook-container" :class="[themeClass]">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { computed } from 'vue'
9
+ import { useEbookStore } from '@/composables/useEbookStore'
10
+
11
+ const ebookStore = useEbookStore()
12
+ const themeClass = computed(() => `theme-${ebookStore.theme}`)
13
+ </script>
14
+
15
+ <style>
16
+ /* Theme: Day */
17
+ .theme-day {
18
+ --ebook-bg: #ffffff;
19
+ --ebook-bg-secondary: #f9fafb;
20
+ --ebook-text: #1f2937;
21
+ --ebook-text-muted: #6b7280;
22
+ --ebook-accent: #0891b2;
23
+ --ebook-accent-light: #ecfeff;
24
+ --ebook-border: #e5e7eb;
25
+ --ebook-code-bg: #1f2937;
26
+ --ebook-code-text: #e5e7eb;
27
+ --ebook-example-bg: #f0fdf4;
28
+ --ebook-example-border: #22c55e;
29
+ --ebook-reference-accent: #0891b2;
30
+ --ebook-reference-bg: rgba(8, 145, 178, 0.03);
31
+ --ebook-reference-name: #0e7490;
32
+ --ebook-reference-badge-bg: #f3f4f6;
33
+ --ebook-reference-badge-text: #6b7280;
34
+ }
35
+
36
+ /* Theme: Sepia */
37
+ .theme-sepia {
38
+ --ebook-bg: #fdf6e3;
39
+ --ebook-bg-secondary: #f5efe0;
40
+ --ebook-text: #5c5347;
41
+ --ebook-text-muted: #8b7355;
42
+ --ebook-accent: #b8860b;
43
+ --ebook-accent-light: #fef9e7;
44
+ --ebook-border: #e0d5c0;
45
+ --ebook-code-bg: #3d3d3d;
46
+ --ebook-code-text: #f5f5dc;
47
+ --ebook-example-bg: #f0ead6;
48
+ --ebook-example-border: #8b7355;
49
+ --ebook-reference-accent: #b8860b;
50
+ --ebook-reference-bg: rgba(184, 134, 11, 0.05);
51
+ --ebook-reference-name: #8b6914;
52
+ --ebook-reference-badge-bg: #e8dcc8;
53
+ --ebook-reference-badge-text: #6b5d4d;
54
+ }
55
+
56
+ .theme-sepia body,
57
+ .theme-sepia {
58
+ background-color: var(--ebook-bg);
59
+ color: var(--ebook-text);
60
+ }
61
+
62
+ /* Theme: Night */
63
+ .theme-night {
64
+ --ebook-bg: #111827;
65
+ --ebook-bg-secondary: #1f2937;
66
+ --ebook-text: #e5e7eb;
67
+ --ebook-text-muted: #9ca3af;
68
+ --ebook-accent: #22d3ee;
69
+ --ebook-accent-light: rgba(34, 211, 238, 0.1);
70
+ --ebook-border: #374151;
71
+ --ebook-code-bg: #030712;
72
+ --ebook-code-text: #e5e7eb;
73
+ --ebook-example-bg: rgba(34, 197, 94, 0.1);
74
+ --ebook-example-border: #22c55e;
75
+ --ebook-reference-accent: #22d3ee;
76
+ --ebook-reference-bg: rgba(34, 211, 238, 0.05);
77
+ --ebook-reference-name: #22d3ee;
78
+ --ebook-reference-badge-bg: #374151;
79
+ --ebook-reference-badge-text: #9ca3af;
80
+ }
81
+
82
+ .theme-night body,
83
+ .theme-night {
84
+ background-color: var(--ebook-bg);
85
+ color: var(--ebook-text);
86
+ }
87
+
88
+ /* Theme: OLED */
89
+ .theme-oled {
90
+ --ebook-bg: #000000;
91
+ --ebook-bg-secondary: #0a0a0a;
92
+ --ebook-text: #ffffff;
93
+ --ebook-text-muted: #a1a1aa;
94
+ --ebook-accent: #60a5fa;
95
+ --ebook-accent-light: rgba(96, 165, 250, 0.1);
96
+ --ebook-border: #27272a;
97
+ --ebook-code-bg: #18181b;
98
+ --ebook-code-text: #fafafa;
99
+ --ebook-example-bg: rgba(34, 197, 94, 0.05);
100
+ --ebook-example-border: #22c55e;
101
+ --ebook-reference-accent: #60a5fa;
102
+ --ebook-reference-bg: rgba(96, 165, 250, 0.03);
103
+ --ebook-reference-name: #60a5fa;
104
+ --ebook-reference-badge-bg: #27272a;
105
+ --ebook-reference-badge-text: #a1a1aa;
106
+ }
107
+
108
+ .theme-oled body,
109
+ .theme-oled {
110
+ background-color: var(--ebook-bg);
111
+ color: var(--ebook-text);
112
+ }
113
+
114
+ /* Apply theme variables to body */
115
+ body {
116
+ background-color: var(--ebook-bg, #ffffff);
117
+ color: var(--ebook-text, #1f2937);
118
+ transition: background-color 0.2s ease, color 0.2s ease;
119
+ }
120
+
121
+ /* Content area styling */
122
+ .ebook-container {
123
+ font-size: var(--ebook-font-size, 18px);
124
+ font-weight: var(--ebook-font-weight, 400);
125
+ line-height: var(--ebook-line-height, 1.6);
126
+ }
127
+
128
+ .ebook-container.theme-day {
129
+ --bg: var(--ebook-bg);
130
+ --text: var(--ebook-text);
131
+ }
132
+
133
+ .ebook-container.theme-sepia {
134
+ --bg: var(--ebook-bg);
135
+ --text: var(--ebook-text);
136
+ }
137
+
138
+ .ebook-container.theme-night {
139
+ --bg: var(--ebook-bg);
140
+ --text: var(--ebook-text);
141
+ }
142
+
143
+ .ebook-container.theme-oled {
144
+ --bg: var(--ebook-bg);
145
+ --text: var(--ebook-text);
146
+ }
147
+ </style>