@jjlmoya/utils-forensic-science 1.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 (316) hide show
  1. package/package.json +69 -0
  2. package/scripts/crystal-lattice-catalog-translations.mjs +459 -0
  3. package/scripts/postinstall.mjs +27 -0
  4. package/scripts/sync-crystal-lattice-i18n.mjs +50 -0
  5. package/src/category/i18n/de.ts +55 -0
  6. package/src/category/i18n/en.ts +55 -0
  7. package/src/category/i18n/es.ts +55 -0
  8. package/src/category/i18n/fr.ts +55 -0
  9. package/src/category/i18n/id.ts +55 -0
  10. package/src/category/i18n/it.ts +55 -0
  11. package/src/category/i18n/ja.ts +56 -0
  12. package/src/category/i18n/ko.ts +56 -0
  13. package/src/category/i18n/nl.ts +55 -0
  14. package/src/category/i18n/pl.ts +55 -0
  15. package/src/category/i18n/pt.ts +55 -0
  16. package/src/category/i18n/ru.ts +55 -0
  17. package/src/category/i18n/sv.ts +55 -0
  18. package/src/category/i18n/tr.ts +55 -0
  19. package/src/category/i18n/zh.ts +56 -0
  20. package/src/category/index.ts +48 -0
  21. package/src/category/seo.astro +15 -0
  22. package/src/components/PreviewNavSidebar.astro +116 -0
  23. package/src/components/PreviewToolbar.astro +143 -0
  24. package/src/data.ts +10 -0
  25. package/src/entries.ts +48 -0
  26. package/src/env.d.ts +5 -0
  27. package/src/index.ts +29 -0
  28. package/src/layouts/PreviewLayout.astro +117 -0
  29. package/src/pages/[locale]/[slug].astro +162 -0
  30. package/src/pages/[locale].astro +261 -0
  31. package/src/pages/index.astro +3 -0
  32. package/src/tests/diacritics_density.test.ts +140 -0
  33. package/src/tests/faq_count.test.ts +19 -0
  34. package/src/tests/i18n_coverage.test.ts +36 -0
  35. package/src/tests/inverted_punctuation.test.ts +84 -0
  36. package/src/tests/locale_completeness.test.ts +24 -0
  37. package/src/tests/mocks/astro_mock.js +2 -0
  38. package/src/tests/no_en_dash.test.ts +70 -0
  39. package/src/tests/no_h1_in_components.test.ts +48 -0
  40. package/src/tests/schemas_fulfillment.test.ts +23 -0
  41. package/src/tests/script_density.test.ts +94 -0
  42. package/src/tests/seo_length.test.ts +46 -0
  43. package/src/tests/shared-test-helpers.ts +56 -0
  44. package/src/tests/slug_language_code_format.test.ts +23 -0
  45. package/src/tests/slug_uniqueness.test.ts +81 -0
  46. package/src/tests/title_quality.test.ts +55 -0
  47. package/src/tests/tool_exports.test.ts +34 -0
  48. package/src/tests/tool_validation.test.ts +16 -0
  49. package/src/tests/widmark.test.ts +28 -0
  50. package/src/tool/forensic-age-estimator/bibliography.astro +14 -0
  51. package/src/tool/forensic-age-estimator/bibliography.ts +16 -0
  52. package/src/tool/forensic-age-estimator/component.astro +321 -0
  53. package/src/tool/forensic-age-estimator/dental-skeletal-third-molar-age-estimator.css +634 -0
  54. package/src/tool/forensic-age-estimator/entry.ts +32 -0
  55. package/src/tool/forensic-age-estimator/i18n/de.ts +245 -0
  56. package/src/tool/forensic-age-estimator/i18n/en.ts +245 -0
  57. package/src/tool/forensic-age-estimator/i18n/es.ts +245 -0
  58. package/src/tool/forensic-age-estimator/i18n/fr.ts +245 -0
  59. package/src/tool/forensic-age-estimator/i18n/id.ts +245 -0
  60. package/src/tool/forensic-age-estimator/i18n/it.ts +245 -0
  61. package/src/tool/forensic-age-estimator/i18n/ja.ts +245 -0
  62. package/src/tool/forensic-age-estimator/i18n/ko.ts +245 -0
  63. package/src/tool/forensic-age-estimator/i18n/nl.ts +245 -0
  64. package/src/tool/forensic-age-estimator/i18n/pl.ts +245 -0
  65. package/src/tool/forensic-age-estimator/i18n/pt.ts +245 -0
  66. package/src/tool/forensic-age-estimator/i18n/ru.ts +245 -0
  67. package/src/tool/forensic-age-estimator/i18n/sv.ts +245 -0
  68. package/src/tool/forensic-age-estimator/i18n/tr.ts +245 -0
  69. package/src/tool/forensic-age-estimator/i18n/zh.ts +246 -0
  70. package/src/tool/forensic-age-estimator/index.ts +11 -0
  71. package/src/tool/forensic-age-estimator/logic.ts +81 -0
  72. package/src/tool/forensic-age-estimator/seo.astro +15 -0
  73. package/src/tool/forensic-blood-test-simulator/bibliography.astro +6 -0
  74. package/src/tool/forensic-blood-test-simulator/bibliography.ts +12 -0
  75. package/src/tool/forensic-blood-test-simulator/component.astro +168 -0
  76. package/src/tool/forensic-blood-test-simulator/dom-utils.ts +40 -0
  77. package/src/tool/forensic-blood-test-simulator/entry.ts +32 -0
  78. package/src/tool/forensic-blood-test-simulator/forensic-presumptive-blood-testing-luminol-kastle-meyer-simulator.css +532 -0
  79. package/src/tool/forensic-blood-test-simulator/helpers.ts +16 -0
  80. package/src/tool/forensic-blood-test-simulator/i18n/de.ts +185 -0
  81. package/src/tool/forensic-blood-test-simulator/i18n/en.ts +185 -0
  82. package/src/tool/forensic-blood-test-simulator/i18n/es.ts +185 -0
  83. package/src/tool/forensic-blood-test-simulator/i18n/fr.ts +220 -0
  84. package/src/tool/forensic-blood-test-simulator/i18n/id.ts +220 -0
  85. package/src/tool/forensic-blood-test-simulator/i18n/it.ts +220 -0
  86. package/src/tool/forensic-blood-test-simulator/i18n/ja.ts +220 -0
  87. package/src/tool/forensic-blood-test-simulator/i18n/ko.ts +220 -0
  88. package/src/tool/forensic-blood-test-simulator/i18n/nl.ts +220 -0
  89. package/src/tool/forensic-blood-test-simulator/i18n/pl.ts +220 -0
  90. package/src/tool/forensic-blood-test-simulator/i18n/pt.ts +220 -0
  91. package/src/tool/forensic-blood-test-simulator/i18n/ru.ts +220 -0
  92. package/src/tool/forensic-blood-test-simulator/i18n/sv.ts +220 -0
  93. package/src/tool/forensic-blood-test-simulator/i18n/tr.ts +220 -0
  94. package/src/tool/forensic-blood-test-simulator/i18n/zh.ts +220 -0
  95. package/src/tool/forensic-blood-test-simulator/index.ts +11 -0
  96. package/src/tool/forensic-blood-test-simulator/logic.ts +174 -0
  97. package/src/tool/forensic-blood-test-simulator/script.ts +192 -0
  98. package/src/tool/forensic-blood-test-simulator/seo.astro +15 -0
  99. package/src/tool/forensic-fiber-comparison-microscope/bibliography.astro +6 -0
  100. package/src/tool/forensic-fiber-comparison-microscope/bibliography.ts +16 -0
  101. package/src/tool/forensic-fiber-comparison-microscope/component.astro +146 -0
  102. package/src/tool/forensic-fiber-comparison-microscope/entry.ts +32 -0
  103. package/src/tool/forensic-fiber-comparison-microscope/forensic-fiber-comparison-microscope.css +629 -0
  104. package/src/tool/forensic-fiber-comparison-microscope/i18n/de.ts +250 -0
  105. package/src/tool/forensic-fiber-comparison-microscope/i18n/en.ts +246 -0
  106. package/src/tool/forensic-fiber-comparison-microscope/i18n/es.ts +246 -0
  107. package/src/tool/forensic-fiber-comparison-microscope/i18n/fr.ts +246 -0
  108. package/src/tool/forensic-fiber-comparison-microscope/i18n/id.ts +250 -0
  109. package/src/tool/forensic-fiber-comparison-microscope/i18n/it.ts +246 -0
  110. package/src/tool/forensic-fiber-comparison-microscope/i18n/ja.ts +250 -0
  111. package/src/tool/forensic-fiber-comparison-microscope/i18n/ko.ts +246 -0
  112. package/src/tool/forensic-fiber-comparison-microscope/i18n/nl.ts +246 -0
  113. package/src/tool/forensic-fiber-comparison-microscope/i18n/pl.ts +250 -0
  114. package/src/tool/forensic-fiber-comparison-microscope/i18n/pt.ts +250 -0
  115. package/src/tool/forensic-fiber-comparison-microscope/i18n/ru.ts +250 -0
  116. package/src/tool/forensic-fiber-comparison-microscope/i18n/sv.ts +250 -0
  117. package/src/tool/forensic-fiber-comparison-microscope/i18n/tr.ts +246 -0
  118. package/src/tool/forensic-fiber-comparison-microscope/i18n/zh.ts +250 -0
  119. package/src/tool/forensic-fiber-comparison-microscope/index.ts +11 -0
  120. package/src/tool/forensic-fiber-comparison-microscope/logic.ts +244 -0
  121. package/src/tool/forensic-fiber-comparison-microscope/render.ts +265 -0
  122. package/src/tool/forensic-fiber-comparison-microscope/seo.astro +15 -0
  123. package/src/tool/forensic-fiber-comparison-microscope/view.ts +267 -0
  124. package/src/tool/forensic-glass-becke-line-simulator/bibliography.astro +6 -0
  125. package/src/tool/forensic-glass-becke-line-simulator/bibliography.ts +16 -0
  126. package/src/tool/forensic-glass-becke-line-simulator/component.astro +81 -0
  127. package/src/tool/forensic-glass-becke-line-simulator/entry.ts +32 -0
  128. package/src/tool/forensic-glass-becke-line-simulator/forensic-glass-becke-line-simulator.css +392 -0
  129. package/src/tool/forensic-glass-becke-line-simulator/i18n/de.ts +231 -0
  130. package/src/tool/forensic-glass-becke-line-simulator/i18n/en.ts +231 -0
  131. package/src/tool/forensic-glass-becke-line-simulator/i18n/es.ts +231 -0
  132. package/src/tool/forensic-glass-becke-line-simulator/i18n/fr.ts +231 -0
  133. package/src/tool/forensic-glass-becke-line-simulator/i18n/id.ts +231 -0
  134. package/src/tool/forensic-glass-becke-line-simulator/i18n/it.ts +231 -0
  135. package/src/tool/forensic-glass-becke-line-simulator/i18n/ja.ts +231 -0
  136. package/src/tool/forensic-glass-becke-line-simulator/i18n/ko.ts +231 -0
  137. package/src/tool/forensic-glass-becke-line-simulator/i18n/nl.ts +231 -0
  138. package/src/tool/forensic-glass-becke-line-simulator/i18n/pl.ts +231 -0
  139. package/src/tool/forensic-glass-becke-line-simulator/i18n/pt.ts +231 -0
  140. package/src/tool/forensic-glass-becke-line-simulator/i18n/ru.ts +231 -0
  141. package/src/tool/forensic-glass-becke-line-simulator/i18n/sv.ts +231 -0
  142. package/src/tool/forensic-glass-becke-line-simulator/i18n/tr.ts +231 -0
  143. package/src/tool/forensic-glass-becke-line-simulator/i18n/zh.ts +231 -0
  144. package/src/tool/forensic-glass-becke-line-simulator/index.ts +11 -0
  145. package/src/tool/forensic-glass-becke-line-simulator/logic.ts +100 -0
  146. package/src/tool/forensic-glass-becke-line-simulator/seo.astro +15 -0
  147. package/src/tool/forensic-glass-becke-line-simulator/view.ts +281 -0
  148. package/src/tool/forensic-image-authenticity-analyzer/bibliography.astro +9 -0
  149. package/src/tool/forensic-image-authenticity-analyzer/bibliography.ts +7 -0
  150. package/src/tool/forensic-image-authenticity-analyzer/component.astro +250 -0
  151. package/src/tool/forensic-image-authenticity-analyzer/entry.ts +29 -0
  152. package/src/tool/forensic-image-authenticity-analyzer/forensic-image-metadata-authenticity-analyzer.css +679 -0
  153. package/src/tool/forensic-image-authenticity-analyzer/i18n/de.ts +105 -0
  154. package/src/tool/forensic-image-authenticity-analyzer/i18n/en.ts +105 -0
  155. package/src/tool/forensic-image-authenticity-analyzer/i18n/es.ts +105 -0
  156. package/src/tool/forensic-image-authenticity-analyzer/i18n/fr.ts +105 -0
  157. package/src/tool/forensic-image-authenticity-analyzer/i18n/id.ts +76 -0
  158. package/src/tool/forensic-image-authenticity-analyzer/i18n/it.ts +105 -0
  159. package/src/tool/forensic-image-authenticity-analyzer/i18n/ja.ts +72 -0
  160. package/src/tool/forensic-image-authenticity-analyzer/i18n/ko.ts +72 -0
  161. package/src/tool/forensic-image-authenticity-analyzer/i18n/nl.ts +75 -0
  162. package/src/tool/forensic-image-authenticity-analyzer/i18n/pl.ts +75 -0
  163. package/src/tool/forensic-image-authenticity-analyzer/i18n/pt.ts +105 -0
  164. package/src/tool/forensic-image-authenticity-analyzer/i18n/ru.ts +75 -0
  165. package/src/tool/forensic-image-authenticity-analyzer/i18n/sv.ts +76 -0
  166. package/src/tool/forensic-image-authenticity-analyzer/i18n/tr.ts +76 -0
  167. package/src/tool/forensic-image-authenticity-analyzer/i18n/zh.ts +71 -0
  168. package/src/tool/forensic-image-authenticity-analyzer/index.ts +11 -0
  169. package/src/tool/forensic-image-authenticity-analyzer/logic.ts +283 -0
  170. package/src/tool/forensic-image-authenticity-analyzer/seo.astro +10 -0
  171. package/src/tool/forensic-microcrystal-drug-simulator/bibliography.astro +6 -0
  172. package/src/tool/forensic-microcrystal-drug-simulator/bibliography.ts +12 -0
  173. package/src/tool/forensic-microcrystal-drug-simulator/component.astro +240 -0
  174. package/src/tool/forensic-microcrystal-drug-simulator/entry.ts +32 -0
  175. package/src/tool/forensic-microcrystal-drug-simulator/forensic-microcrystal-drug-simulator.css +430 -0
  176. package/src/tool/forensic-microcrystal-drug-simulator/i18n/de.ts +244 -0
  177. package/src/tool/forensic-microcrystal-drug-simulator/i18n/en.ts +244 -0
  178. package/src/tool/forensic-microcrystal-drug-simulator/i18n/es.ts +244 -0
  179. package/src/tool/forensic-microcrystal-drug-simulator/i18n/fr.ts +244 -0
  180. package/src/tool/forensic-microcrystal-drug-simulator/i18n/id.ts +244 -0
  181. package/src/tool/forensic-microcrystal-drug-simulator/i18n/it.ts +244 -0
  182. package/src/tool/forensic-microcrystal-drug-simulator/i18n/ja.ts +244 -0
  183. package/src/tool/forensic-microcrystal-drug-simulator/i18n/ko.ts +244 -0
  184. package/src/tool/forensic-microcrystal-drug-simulator/i18n/nl.ts +244 -0
  185. package/src/tool/forensic-microcrystal-drug-simulator/i18n/pl.ts +244 -0
  186. package/src/tool/forensic-microcrystal-drug-simulator/i18n/pt.ts +244 -0
  187. package/src/tool/forensic-microcrystal-drug-simulator/i18n/ru.ts +244 -0
  188. package/src/tool/forensic-microcrystal-drug-simulator/i18n/sv.ts +244 -0
  189. package/src/tool/forensic-microcrystal-drug-simulator/i18n/tr.ts +244 -0
  190. package/src/tool/forensic-microcrystal-drug-simulator/i18n/zh.ts +244 -0
  191. package/src/tool/forensic-microcrystal-drug-simulator/index.ts +11 -0
  192. package/src/tool/forensic-microcrystal-drug-simulator/logic.ts +189 -0
  193. package/src/tool/forensic-microcrystal-drug-simulator/seo.astro +15 -0
  194. package/src/tool/forensic-sex-determinator/bibliography.astro +14 -0
  195. package/src/tool/forensic-sex-determinator/bibliography.ts +12 -0
  196. package/src/tool/forensic-sex-determinator/component.astro +463 -0
  197. package/src/tool/forensic-sex-determinator/entry.ts +32 -0
  198. package/src/tool/forensic-sex-determinator/forensic-sex-determinator.css +413 -0
  199. package/src/tool/forensic-sex-determinator/i18n/de.ts +211 -0
  200. package/src/tool/forensic-sex-determinator/i18n/en.ts +211 -0
  201. package/src/tool/forensic-sex-determinator/i18n/es.ts +211 -0
  202. package/src/tool/forensic-sex-determinator/i18n/fr.ts +211 -0
  203. package/src/tool/forensic-sex-determinator/i18n/id.ts +211 -0
  204. package/src/tool/forensic-sex-determinator/i18n/it.ts +211 -0
  205. package/src/tool/forensic-sex-determinator/i18n/ja.ts +211 -0
  206. package/src/tool/forensic-sex-determinator/i18n/ko.ts +211 -0
  207. package/src/tool/forensic-sex-determinator/i18n/nl.ts +211 -0
  208. package/src/tool/forensic-sex-determinator/i18n/pl.ts +211 -0
  209. package/src/tool/forensic-sex-determinator/i18n/pt.ts +211 -0
  210. package/src/tool/forensic-sex-determinator/i18n/ru.ts +211 -0
  211. package/src/tool/forensic-sex-determinator/i18n/sv.ts +211 -0
  212. package/src/tool/forensic-sex-determinator/i18n/tr.ts +211 -0
  213. package/src/tool/forensic-sex-determinator/i18n/zh.ts +211 -0
  214. package/src/tool/forensic-sex-determinator/index.ts +11 -0
  215. package/src/tool/forensic-sex-determinator/logic.ts +89 -0
  216. package/src/tool/forensic-sex-determinator/seo.astro +15 -0
  217. package/src/tool/forensic-stature-estimator/bibliography.astro +14 -0
  218. package/src/tool/forensic-stature-estimator/bibliography.ts +12 -0
  219. package/src/tool/forensic-stature-estimator/component.astro +49 -0
  220. package/src/tool/forensic-stature-estimator/components/EstimationPanel.astro +65 -0
  221. package/src/tool/forensic-stature-estimator/components/OsteometricBoard.astro +39 -0
  222. package/src/tool/forensic-stature-estimator/components/OsteometricSelector.astro +109 -0
  223. package/src/tool/forensic-stature-estimator/dom-utils.ts +71 -0
  224. package/src/tool/forensic-stature-estimator/entry.ts +32 -0
  225. package/src/tool/forensic-stature-estimator/forensic-stature-estimator.css +689 -0
  226. package/src/tool/forensic-stature-estimator/helpers.ts +51 -0
  227. package/src/tool/forensic-stature-estimator/i18n/de.ts +196 -0
  228. package/src/tool/forensic-stature-estimator/i18n/en.ts +196 -0
  229. package/src/tool/forensic-stature-estimator/i18n/es.ts +196 -0
  230. package/src/tool/forensic-stature-estimator/i18n/fr.ts +196 -0
  231. package/src/tool/forensic-stature-estimator/i18n/id.ts +196 -0
  232. package/src/tool/forensic-stature-estimator/i18n/it.ts +196 -0
  233. package/src/tool/forensic-stature-estimator/i18n/ja.ts +196 -0
  234. package/src/tool/forensic-stature-estimator/i18n/ko.ts +196 -0
  235. package/src/tool/forensic-stature-estimator/i18n/nl.ts +196 -0
  236. package/src/tool/forensic-stature-estimator/i18n/pl.ts +196 -0
  237. package/src/tool/forensic-stature-estimator/i18n/pt.ts +196 -0
  238. package/src/tool/forensic-stature-estimator/i18n/ru.ts +196 -0
  239. package/src/tool/forensic-stature-estimator/i18n/sv.ts +196 -0
  240. package/src/tool/forensic-stature-estimator/i18n/tr.ts +196 -0
  241. package/src/tool/forensic-stature-estimator/i18n/zh.ts +196 -0
  242. package/src/tool/forensic-stature-estimator/index.ts +11 -0
  243. package/src/tool/forensic-stature-estimator/logic.ts +119 -0
  244. package/src/tool/forensic-stature-estimator/script.ts +288 -0
  245. package/src/tool/forensic-stature-estimator/seo.astro +15 -0
  246. package/src/tool/forensic-tlc-ink-simulator/bibliography.astro +6 -0
  247. package/src/tool/forensic-tlc-ink-simulator/bibliography.ts +16 -0
  248. package/src/tool/forensic-tlc-ink-simulator/component.astro +245 -0
  249. package/src/tool/forensic-tlc-ink-simulator/entry.ts +32 -0
  250. package/src/tool/forensic-tlc-ink-simulator/forensic-tlc-ink-simulator.css +462 -0
  251. package/src/tool/forensic-tlc-ink-simulator/i18n/de.ts +243 -0
  252. package/src/tool/forensic-tlc-ink-simulator/i18n/en.ts +243 -0
  253. package/src/tool/forensic-tlc-ink-simulator/i18n/es.ts +243 -0
  254. package/src/tool/forensic-tlc-ink-simulator/i18n/fr.ts +243 -0
  255. package/src/tool/forensic-tlc-ink-simulator/i18n/id.ts +243 -0
  256. package/src/tool/forensic-tlc-ink-simulator/i18n/it.ts +243 -0
  257. package/src/tool/forensic-tlc-ink-simulator/i18n/ja.ts +235 -0
  258. package/src/tool/forensic-tlc-ink-simulator/i18n/ko.ts +235 -0
  259. package/src/tool/forensic-tlc-ink-simulator/i18n/nl.ts +243 -0
  260. package/src/tool/forensic-tlc-ink-simulator/i18n/pl.ts +243 -0
  261. package/src/tool/forensic-tlc-ink-simulator/i18n/pt.ts +243 -0
  262. package/src/tool/forensic-tlc-ink-simulator/i18n/ru.ts +243 -0
  263. package/src/tool/forensic-tlc-ink-simulator/i18n/sv.ts +243 -0
  264. package/src/tool/forensic-tlc-ink-simulator/i18n/tr.ts +243 -0
  265. package/src/tool/forensic-tlc-ink-simulator/i18n/zh.ts +235 -0
  266. package/src/tool/forensic-tlc-ink-simulator/index.ts +11 -0
  267. package/src/tool/forensic-tlc-ink-simulator/logic.ts +152 -0
  268. package/src/tool/forensic-tlc-ink-simulator/seo.astro +15 -0
  269. package/src/tool/gsr-dispersion-calculator/bibliography.astro +6 -0
  270. package/src/tool/gsr-dispersion-calculator/bibliography.ts +16 -0
  271. package/src/tool/gsr-dispersion-calculator/component.astro +294 -0
  272. package/src/tool/gsr-dispersion-calculator/entry.ts +32 -0
  273. package/src/tool/gsr-dispersion-calculator/gsr-dispersion-calculator.css +305 -0
  274. package/src/tool/gsr-dispersion-calculator/i18n/de.ts +272 -0
  275. package/src/tool/gsr-dispersion-calculator/i18n/en.ts +272 -0
  276. package/src/tool/gsr-dispersion-calculator/i18n/es.ts +272 -0
  277. package/src/tool/gsr-dispersion-calculator/i18n/fr.ts +272 -0
  278. package/src/tool/gsr-dispersion-calculator/i18n/id.ts +272 -0
  279. package/src/tool/gsr-dispersion-calculator/i18n/it.ts +272 -0
  280. package/src/tool/gsr-dispersion-calculator/i18n/ja.ts +272 -0
  281. package/src/tool/gsr-dispersion-calculator/i18n/ko.ts +272 -0
  282. package/src/tool/gsr-dispersion-calculator/i18n/nl.ts +272 -0
  283. package/src/tool/gsr-dispersion-calculator/i18n/pl.ts +272 -0
  284. package/src/tool/gsr-dispersion-calculator/i18n/pt.ts +272 -0
  285. package/src/tool/gsr-dispersion-calculator/i18n/ru.ts +272 -0
  286. package/src/tool/gsr-dispersion-calculator/i18n/sv.ts +272 -0
  287. package/src/tool/gsr-dispersion-calculator/i18n/tr.ts +272 -0
  288. package/src/tool/gsr-dispersion-calculator/i18n/zh.ts +272 -0
  289. package/src/tool/gsr-dispersion-calculator/index.ts +11 -0
  290. package/src/tool/gsr-dispersion-calculator/logic.ts +148 -0
  291. package/src/tool/gsr-dispersion-calculator/seo.astro +15 -0
  292. package/src/tool/widmark-alcohol-simulator/bibliography.astro +14 -0
  293. package/src/tool/widmark-alcohol-simulator/bibliography.ts +12 -0
  294. package/src/tool/widmark-alcohol-simulator/component.astro +453 -0
  295. package/src/tool/widmark-alcohol-simulator/entry.ts +32 -0
  296. package/src/tool/widmark-alcohol-simulator/i18n/de.ts +193 -0
  297. package/src/tool/widmark-alcohol-simulator/i18n/en.ts +206 -0
  298. package/src/tool/widmark-alcohol-simulator/i18n/es.ts +193 -0
  299. package/src/tool/widmark-alcohol-simulator/i18n/fr.ts +193 -0
  300. package/src/tool/widmark-alcohol-simulator/i18n/id.ts +193 -0
  301. package/src/tool/widmark-alcohol-simulator/i18n/it.ts +193 -0
  302. package/src/tool/widmark-alcohol-simulator/i18n/ja.ts +193 -0
  303. package/src/tool/widmark-alcohol-simulator/i18n/ko.ts +193 -0
  304. package/src/tool/widmark-alcohol-simulator/i18n/nl.ts +193 -0
  305. package/src/tool/widmark-alcohol-simulator/i18n/pl.ts +193 -0
  306. package/src/tool/widmark-alcohol-simulator/i18n/pt.ts +193 -0
  307. package/src/tool/widmark-alcohol-simulator/i18n/ru.ts +193 -0
  308. package/src/tool/widmark-alcohol-simulator/i18n/sv.ts +193 -0
  309. package/src/tool/widmark-alcohol-simulator/i18n/tr.ts +193 -0
  310. package/src/tool/widmark-alcohol-simulator/i18n/zh.ts +193 -0
  311. package/src/tool/widmark-alcohol-simulator/index.ts +11 -0
  312. package/src/tool/widmark-alcohol-simulator/logic.ts +97 -0
  313. package/src/tool/widmark-alcohol-simulator/seo.astro +15 -0
  314. package/src/tool/widmark-alcohol-simulator/widmark-alcohol-simulator.css +386 -0
  315. package/src/tools.ts +27 -0
  316. package/src/types.ts +70 -0
@@ -0,0 +1,244 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+
4
+ const slug = 'forensic-microcrystal-drug-simulator';
5
+ const title = '毒物微结晶测试模拟器';
6
+ const description = '通过将可疑受控物质与经典法医试药相结合,并对比结晶习性、生长速度和偏光反应,模拟用于教学的微结晶毒品筛查图谱。';
7
+
8
+ const howTo = [
9
+ {
10
+ name: '选择可疑检材',
11
+ text: '选择可卡因、海洛因、苯丙胺或甲基苯丙胺,载入未知物质的教学参比图谱。',
12
+ },
13
+ {
14
+ name: '加入微结晶试剂',
15
+ text: '在氯化铂、氯化金和德拉根多夫试剂之间切换,观察试剂化学反应如何改变结晶形态。',
16
+ },
17
+ {
18
+ name: '调节偏光对比度',
19
+ text: '移动偏光控制器以增加或减少虚拟显微镜视野中的双折射对比度。',
20
+ },
21
+ {
22
+ name: '与参比结果进行比对',
23
+ text: '利用晶癖标签、匹配度评分、生长速度和解释说明,判定图谱是典型参比样、部分符合还是非特异性的。',
24
+ },
25
+ ];
26
+
27
+ const faq = [
28
+ {
29
+ key: 'faq-1',
30
+ question: '微结晶测试能作为毒品的确认方法吗?',
31
+ answer: '不能。微结晶测试属于初步筛查或比对工具。实际查获毒品的鉴定应遵循经论证的分析流程,包括适当的对照实验以及气相色谱质谱联用(GC-MS)、液相色谱质谱联用(LC-MS)或红外光谱等确认性仪器分析方法。',
32
+ },
33
+ {
34
+ key: 'faq-2',
35
+ question: '为什么不同的试剂会产生不同的结晶形状?',
36
+ answer: '因为试剂与目标化合物中的官能团反应形成盐、络合物或沉淀。溶解度、酸强度、浓度、杂质和干燥速率均会影响观察到的晶癖呈针状、罗盘放射状、棱柱状、板状还是微弱散在颗粒。',
37
+ },
38
+ {
39
+ key: 'faq-3',
40
+ question: '偏光镜检为微结晶分析带来了什么?',
41
+ answer: '偏光光路可提高对比度并显示双折射性,使结晶边缘、分枝和内部结构更容易进行比对。但这并不能消除使用已知参比物质和空白对照的必要性。',
42
+ },
43
+ {
44
+ key: 'faq-4',
45
+ question: '为什么看似阳性的结晶图谱仍可能产生误导?',
46
+ answer: '稀释剂、混合物、降解检材、试剂变质、污染以及分析人员的直觉预期,都可能产生模糊或重叠的结晶形态。因此,对初步筛查结果的解读必须十分谨慎。',
47
+ },
48
+ {
49
+ key: 'faq-5',
50
+ question: '此模拟器可以鉴定未知物质吗?',
51
+ answer: '不能。这只是一个用于结晶形态学教学的虚拟演示工具。它无法测试真实的物证、测量化学性质,亦不能出具实验室鉴定结论。',
52
+ },
53
+ ];
54
+
55
+ export const content: ToolLocaleContent = {
56
+ slug,
57
+ title,
58
+ description,
59
+ ui: {
60
+ microscope: '偏光显微镜',
61
+ canvasAria: '微结晶动态生长视野',
62
+ sample: '可疑检材',
63
+ sampleCocaine: '可卡因',
64
+ sampleHeroin: '海洛因',
65
+ sampleAmphetamine: '苯丙胺',
66
+ sampleMethamphetamine: '甲基苯丙胺',
67
+ reagent: '试剂架',
68
+ reagentPlatinum: '氯化铂',
69
+ reagentGold: '氯化金',
70
+ reagentDragendorff: '德拉根多夫',
71
+ polarization: '偏光对比度',
72
+ confidence: '匹配度',
73
+ growth: '生长速度',
74
+ birefringence: '双折射',
75
+ regrow: '重新结晶',
76
+ warningLabel: '法医警示',
77
+ warningTitle: '筛查警示',
78
+ matchReference: '典型参比',
79
+ matchPartial: '部分符合',
80
+ matchNonSpecific: '非特异性',
81
+ habitFeatheryNeedles: '羽毛状针状结晶束',
82
+ habitRosettes: '放射状罗盘形结晶',
83
+ habitBranchingPrisms: '分枝状棱柱结晶',
84
+ habitPlates: '薄板状结晶',
85
+ habitWeakScatter: '稀疏的非特异性散在颗粒',
86
+ cueCocainePlatinumChloride: '羽毛状和分枝状针状结晶束是可卡因与氯化铂反应的典型教学图谱。',
87
+ cueCocaineGoldChloride: '氯化金可形成分枝状橙褐色结晶,但该图谱的特异性不如与氯化铂的反应。',
88
+ cueCocaineDragendorff: '德拉根多夫试剂在此仅呈微弱的生物碱反应;其结晶形态仅应视作筛查参考信息。',
89
+ cueHeroinPlatinumChloride: '可能出现板状沉淀,但该反应并不是强特异性的教学比对图谱。',
90
+ cueHeroinGoldChloride: '罗盘放射状晶簇和圆形星状结晶是本模拟器中海洛因的参比晶型。',
91
+ cueHeroinDragendorff: '德拉根多夫试剂产生橙色分枝状棱柱结晶,这与生物碱筛查相符,不可作为定性确证证据。',
92
+ cueAmphetaminePlatinumChloride: '快速生长的分枝状棱柱结晶表明在所选试剂下呈现典型的兴奋剂类教学图谱。',
93
+ cueAmphetamineGoldChloride: '结晶稀疏意味着该显微镜检发现应报告为非特异性。',
94
+ cueAmphetamineDragendorff: '针状喷射结晶生长迅速,适用于苯丙胺预试验的教学比对。',
95
+ cueMethamphetaminePlatinumChloride: '可能形成偏光罗盘形结晶,但结果依然仅属于初步形态学比对。',
96
+ cueMethamphetamineGoldChloride: '可观察到薄板状晶型,不过与其他化合物存在重叠限制了其特异性。',
97
+ cueMethamphetamineDragendorff: '稠密的橙色分枝状棱柱结晶提供了本组测试中甲基苯丙胺最显著的教学比对反应。',
98
+ disclaimer: '仅供教学筛查模型演示。真实毒品鉴定需要经论证的对照标准品、试剂空白对照、保管链记录以及仪器确证分析。',
99
+ },
100
+ seo: [
101
+ {
102
+ type: 'title',
103
+ text: '法医学中的微结晶毒品测试',
104
+ level: 2,
105
+ },
106
+ {
107
+ type: 'diagnostic',
108
+ variant: 'info',
109
+ icon: 'mdi:microscope',
110
+ badge: '教学模拟器',
111
+ title: '本微结晶模拟器的用途',
112
+ html: '本工具演示了在可疑检材与化学试剂混合后,经典的法医微结晶测试如何产生易于识别的结晶习性。它帮助学生在无需将浏览器演示结果视作法律证据的前提下,对比<strong>结晶形态</strong>、生长速度和偏光镜下的双折射对比度。',
113
+ },
114
+ {
115
+ type: 'stats',
116
+ columns: 4,
117
+ items: [
118
+ { value: '4', label: '教学样本档案', icon: 'mdi:flask-outline' },
119
+ { value: '3', label: '经典试药选项', icon: 'mdi:bottle-tonic-outline' },
120
+ { value: '5', label: '模拟结晶形态', icon: 'mdi:shape-outline' },
121
+ { value: '0', label: '法定化学定性声明', icon: 'mdi:scale-balance' },
122
+ ],
123
+ },
124
+ {
125
+ type: 'title',
126
+ text: '如何解读结晶习性',
127
+ level: 3,
128
+ },
129
+ {
130
+ type: 'summary',
131
+ title: '实用的显微镜检比对清单',
132
+ items: [
133
+ '在比对未知检材前,请先用已知的对照标准品和空白试剂进行平行测试。',
134
+ '记录试剂种类、浓度、液滴大小、干燥时间、温度和显微镜放大倍率。',
135
+ '首先对比整体晶癖:针状、放射状、板状、棱柱状、分枝状或稀疏的散在颗粒。',
136
+ '将部分或稀疏的结晶视为需要进一步测试的依据,而非做出定性鉴定的凭证。',
137
+ ],
138
+ },
139
+ {
140
+ type: 'table',
141
+ headers: ['观察到的晶癖', '用户常见问题', '谨慎的解读分析'],
142
+ rows: [
143
+ ['羽毛状针状', '这看起来像可卡因与氯化铂的反应吗?', '这可以作为一个有用的教学比对,但检材中的掺杂成分和反应环境会改变结晶习惯。'],
144
+ ['放射状结晶', '放射状结晶具有定性诊断价值吗?', '当空白和阳性对照同时符合时,放射状结晶可提供有力的辅助比对依据,但单凭结晶无法确证。'],
145
+ ['分枝状棱柱', '为什么兴奋剂的预试验结晶通常生长得很快?', '某些盐类在溶剂挥发时结晶核形成迅速并随之分枝;生长速度属于支持性发现,而非确证证据。'],
146
+ ['稀疏散在颗粒', '结晶稀疏是否意味着检材中没有毒品成分?', '不是。低浓度、杂质干扰、试剂失效或制样不当都可能抑制晶体的正常生长。'],
147
+ ],
148
+ },
149
+ {
150
+ type: 'comparative',
151
+ columns: 2,
152
+ items: [
153
+ {
154
+ title: '微结晶筛查可辅助进行',
155
+ icon: 'mdi:check-circle-outline',
156
+ highlight: true,
157
+ description: '当资深分析人员结合空白和阳性标准品使用时的快速视觉形态比对。',
158
+ points: ['课堂实验演示', '掌握形态学专业术语', '初步快速分流', '不同试剂显色比对'],
159
+ },
160
+ {
161
+ title: '微结晶筛查不能替代',
162
+ icon: 'mdi:alert-circle-outline',
163
+ description: '用于出具法定证据的经论证的确证性分析手段。',
164
+ points: ['仪器分析确证', '实验室认可的分析规程', '针对特定基质的流程验证', '测量不确定度记录'],
165
+ },
166
+ ],
167
+ },
168
+ {
169
+ type: 'title',
170
+ text: '微结晶测试的科学背景',
171
+ level: 3,
172
+ },
173
+ {
174
+ type: 'paragraph',
175
+ html: '微结晶测试是法医化学家用于筛查可疑受控物质的一种经典且灵敏度极高的化学测试方法。当少量毒品样品溶于酸并与特定的重金属试剂(如氯化金或氯化铂)结合时,会发生配位络合或形成不溶性盐类沉淀。毒品分子的空间结构决定了所得晶体的生长速率、排列方向和对称性,从而产生独特的显微镜下形态或晶癖。',
176
+ },
177
+ {
178
+ type: 'paragraph',
179
+ html: '在偏光显微镜下分析这些晶癖,允许法医技术人员观察结晶的光学性质,例如双折射性(即晶体将光线分解为两束,从而产生明亮的干涉色和极高的衬度)。尽管以气相色谱质谱联用为代表的仪器方法已完全取代微结晶测试用于法定定性确证,但微结晶筛查因其检测迅速、成本低廉以及能够有效区分某些其他手段较难鉴别的手性同分异构体,在法医毒物化学中仍保留着其独特的学术与实用价值。',
180
+ },
181
+ {
182
+ type: 'paragraph',
183
+ html: '在教学活动中,模拟这些显微化学反应有助于学生理解化学试剂与物理晶体形态之间的对应关系。通过观察可卡因、海洛因和各种苯丙胺类药物对不同试药的结晶反应,学生能够直观地认识到单次阳性反应绝不能等同于法定鉴定结论。规范的毒品筛查流程要求必须平行测试已知对照标准品以及进行试剂空白对照,以验证所观察到的结晶图谱的有效性与特异性。',
184
+ },
185
+ {
186
+ type: 'glossary',
187
+ items: [
188
+ { term: '晶癖', definition: '晶体显而易见的宏观外形或生长样式,如针状、板状、棱柱状或放射状。' },
189
+ { term: '晶核形成', definition: '溶液中最初形成微小晶核的过程,更大规模的结晶构造由此生长。' },
190
+ { term: '双折射', definition: '晶体在偏振光照射下呈现高亮或彩色干涉条纹的光学效应。' },
191
+ { term: '预试验', definition: '一种提示可能存在某类物质或特定化合物的初筛测试,其本身无法定性。' },
192
+ { term: '参比标准品', definition: '在相同实验条件下进行平行测试的已知纯度物质,用于与未知检材图谱做比对。' },
193
+ ],
194
+ },
195
+ {
196
+ type: 'tip',
197
+ title: '针对真实检材的最佳实验室规范',
198
+ html: '将微结晶形态作为综合鉴定意见的一个分支依据。一个可靠的实验室流程包括测试空白、阳性对照、记录试剂配制时效、必要时的双盲核对,以及在现行法医学规程指导下的仪器确证分析。',
199
+ },
200
+ {
201
+ type: 'diagnostic',
202
+ variant: 'warning',
203
+ icon: 'mdi:alert-outline',
204
+ badge: '法医警示',
205
+ title: '美丽结晶并不等同于法律定性',
206
+ html: '本模拟器特意将直观的一致性评分与最终的法庭科学证据结论分隔开。真实的鉴定案件必须充分考虑添加剂、稀释剂、基质污染、试剂纯度、鉴定人员资质以及受控的实验室标准规程。',
207
+ },
208
+ ],
209
+ faq,
210
+ bibliography,
211
+ howTo,
212
+ schemas: [
213
+ {
214
+ '@context': 'https://schema.org',
215
+ '@type': 'SoftwareApplication',
216
+ name: title,
217
+ description,
218
+ applicationCategory: 'ForensicApplication',
219
+ operatingSystem: 'Any',
220
+ },
221
+ {
222
+ '@context': 'https://schema.org',
223
+ '@type': 'FAQPage',
224
+ mainEntity: faq.map((item) => ({
225
+ '@type': 'Question',
226
+ name: item.question,
227
+ acceptedAnswer: {
228
+ '@type': 'Answer',
229
+ text: item.answer,
230
+ },
231
+ })),
232
+ },
233
+ {
234
+ '@context': 'https://schema.org',
235
+ '@type': 'HowTo',
236
+ name: title,
237
+ step: howTo.map((step) => ({
238
+ '@type': 'HowToStep',
239
+ name: step.name,
240
+ text: step.text,
241
+ })),
242
+ },
243
+ ],
244
+ };
@@ -0,0 +1,11 @@
1
+ import { forensicMicrocrystalDrugSimulator } from './entry';
2
+ import type { ToolDefinition } from '../../types';
3
+
4
+ export * from './entry';
5
+
6
+ export const FORENSIC_MICROCRYSTAL_DRUG_SIMULATOR_TOOL: ToolDefinition = {
7
+ entry: forensicMicrocrystalDrugSimulator,
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };
@@ -0,0 +1,189 @@
1
+ export type DrugSample = 'cocaine' | 'heroin' | 'amphetamine' | 'methamphetamine';
2
+ export type CrystalReagent = 'platinumChloride' | 'goldChloride' | 'dragendorff';
3
+ export type CrystalHabit = 'featheryNeedles' | 'rosettes' | 'branchingPrisms' | 'plates' | 'weakScatter';
4
+
5
+ export interface CrystalPattern {
6
+ sample: DrugSample;
7
+ reagent: CrystalReagent;
8
+ habit: CrystalHabit;
9
+ confidence: number;
10
+ growthRate: number;
11
+ birefringence: number;
12
+ density: number;
13
+ hue: number;
14
+ cueKey: string;
15
+ }
16
+
17
+ export interface CrystalSeed {
18
+ x: number;
19
+ y: number;
20
+ angle: number;
21
+ length: number;
22
+ branch: number;
23
+ width: number;
24
+ }
25
+
26
+ export interface CrystalSimulation extends CrystalPattern {
27
+ seeds: CrystalSeed[];
28
+ matchLabel: 'reference-like' | 'partial' | 'non-specific';
29
+ }
30
+
31
+ const PATTERN_MAP: Record<DrugSample, Record<CrystalReagent, Omit<CrystalPattern, 'sample' | 'reagent'>>> = {
32
+ cocaine: {
33
+ platinumChloride: {
34
+ habit: 'featheryNeedles',
35
+ confidence: 92,
36
+ growthRate: 84,
37
+ birefringence: 78,
38
+ density: 74,
39
+ hue: 205,
40
+ cueKey: 'cueCocainePlatinumChloride',
41
+ },
42
+ goldChloride: {
43
+ habit: 'branchingPrisms',
44
+ confidence: 76,
45
+ growthRate: 68,
46
+ birefringence: 62,
47
+ density: 58,
48
+ hue: 42,
49
+ cueKey: 'cueCocaineGoldChloride',
50
+ },
51
+ dragendorff: {
52
+ habit: 'weakScatter',
53
+ confidence: 38,
54
+ growthRate: 34,
55
+ birefringence: 28,
56
+ density: 36,
57
+ hue: 28,
58
+ cueKey: 'cueCocaineDragendorff',
59
+ },
60
+ },
61
+ heroin: {
62
+ platinumChloride: {
63
+ habit: 'plates',
64
+ confidence: 54,
65
+ growthRate: 44,
66
+ birefringence: 46,
67
+ density: 45,
68
+ hue: 268,
69
+ cueKey: 'cueHeroinPlatinumChloride',
70
+ },
71
+ goldChloride: {
72
+ habit: 'rosettes',
73
+ confidence: 81,
74
+ growthRate: 62,
75
+ birefringence: 70,
76
+ density: 66,
77
+ hue: 324,
78
+ cueKey: 'cueHeroinGoldChloride',
79
+ },
80
+ dragendorff: {
81
+ habit: 'branchingPrisms',
82
+ confidence: 70,
83
+ growthRate: 56,
84
+ birefringence: 52,
85
+ density: 61,
86
+ hue: 22,
87
+ cueKey: 'cueHeroinDragendorff',
88
+ },
89
+ },
90
+ amphetamine: {
91
+ platinumChloride: {
92
+ habit: 'branchingPrisms',
93
+ confidence: 72,
94
+ growthRate: 72,
95
+ birefringence: 64,
96
+ density: 58,
97
+ hue: 184,
98
+ cueKey: 'cueAmphetaminePlatinumChloride',
99
+ },
100
+ goldChloride: {
101
+ habit: 'weakScatter',
102
+ confidence: 42,
103
+ growthRate: 38,
104
+ birefringence: 35,
105
+ density: 40,
106
+ hue: 48,
107
+ cueKey: 'cueAmphetamineGoldChloride',
108
+ },
109
+ dragendorff: {
110
+ habit: 'featheryNeedles',
111
+ confidence: 79,
112
+ growthRate: 80,
113
+ birefringence: 66,
114
+ density: 69,
115
+ hue: 18,
116
+ cueKey: 'cueAmphetamineDragendorff',
117
+ },
118
+ },
119
+ methamphetamine: {
120
+ platinumChloride: {
121
+ habit: 'rosettes',
122
+ confidence: 68,
123
+ growthRate: 58,
124
+ birefringence: 74,
125
+ density: 55,
126
+ hue: 196,
127
+ cueKey: 'cueMethamphetaminePlatinumChloride',
128
+ },
129
+ goldChloride: {
130
+ habit: 'plates',
131
+ confidence: 64,
132
+ growthRate: 48,
133
+ birefringence: 58,
134
+ density: 50,
135
+ hue: 52,
136
+ cueKey: 'cueMethamphetamineGoldChloride',
137
+ },
138
+ dragendorff: {
139
+ habit: 'branchingPrisms',
140
+ confidence: 83,
141
+ growthRate: 76,
142
+ birefringence: 68,
143
+ density: 72,
144
+ hue: 30,
145
+ cueKey: 'cueMethamphetamineDragendorff',
146
+ },
147
+ },
148
+ };
149
+
150
+ function seededRandom(seed: number): () => number {
151
+ let state = seed >>> 0;
152
+ return () => {
153
+ state = (state * 1103515245 + 12345) >>> 0;
154
+ return state / 4294967296;
155
+ };
156
+ }
157
+
158
+ function createSeeds(pattern: CrystalPattern): CrystalSeed[] {
159
+ const random = seededRandom(pattern.confidence * 997 + pattern.growthRate * 37 + pattern.hue);
160
+ const count = Math.round(18 + pattern.density * 0.56);
161
+
162
+ return Array.from({ length: count }, (_, index) => ({
163
+ x: 8 + random() * 84,
164
+ y: 8 + random() * 84,
165
+ angle: random() * Math.PI * 2 + index * 0.08,
166
+ length: 12 + random() * (18 + pattern.growthRate * 0.38),
167
+ branch: 0.25 + random() * 0.9,
168
+ width: 0.7 + random() * 2.1,
169
+ }));
170
+ }
171
+
172
+ function getMatchLabel(confidence: number): CrystalSimulation['matchLabel'] {
173
+ if (confidence >= 78) return 'reference-like';
174
+ if (confidence >= 58) return 'partial';
175
+ return 'non-specific';
176
+ }
177
+
178
+ export class CrystallographyEngine {
179
+ simulate(sample: DrugSample, reagent: CrystalReagent): CrystalSimulation {
180
+ const selected = PATTERN_MAP[sample]?.[reagent] ?? PATTERN_MAP.cocaine.platinumChloride;
181
+ const pattern = { sample, reagent, ...selected };
182
+
183
+ return {
184
+ ...pattern,
185
+ seeds: createSeeds(pattern),
186
+ matchLabel: getMatchLabel(pattern.confidence),
187
+ };
188
+ }
189
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { forensicMicrocrystalDrugSimulator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await forensicMicrocrystalDrugSimulator.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo && content.seo.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { forensicSexDeterminator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await forensicSexDeterminator.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,12 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'Phenice TW. A newly developed method for sexing the os pubis. American Journal of Physical Anthropology.',
6
+ url: 'https://pubmed.ncbi.nlm.nih.gov/5784883/',
7
+ },
8
+ {
9
+ name: 'Buikstra JE, Ubelaker DH. Standards for Data Collection from Human Skeletal Remains. Arkansas Archeological Survey.',
10
+ url: 'https://www.researchgate.net/publication/232490333_Standards_for_Data_Collection_from_Human_Skeletal_Remains',
11
+ }
12
+ ];