@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,220 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+
3
+ const slug = 'forensik-varsayimsal-kan-testi-simulasyonu';
4
+ const title = 'Adli Varsayimsal Kan Testi Simulatoru';
5
+ const description = 'Kastle-Meyer ve Luminol reaktifleri ile varsayimsal kan testlerini simule edin. Gercek kani yalanci pozitiflerden ayirt edin.';
6
+
7
+ const howTo = [
8
+ {
9
+ "name": "Numune secin",
10
+ "text": "Standdaki test numunelerinden gercek kan veya yalanci pozitif olabilecek birini secin."
11
+ },
12
+ {
13
+ "name": "Test yontemi secin",
14
+ "text": "Renk degisimine dayali Kastle-Meyer testini veya isildamaya dayali Luminol testini secin."
15
+ },
16
+ {
17
+ "name": "Reaktifleri uygulayin",
18
+ "text": "Kastle-Meyer reaktifi ve ardından Hidrojen Peroksit damlatin veya Luminol uygulayin."
19
+ },
20
+ {
21
+ "name": "Reaksiyonu yorumlayin",
22
+ "text": "Reaksiyonu sınıflandırmak icin karanlikta renk degisimini veya mavi isildamayi izleyin."
23
+ }
24
+ ];
25
+
26
+ const faq = [
27
+ {
28
+ "key": "faq-1",
29
+ "question": "Neden varsayimsal test denir?",
30
+ "answer": "Varsayimsal testler, katalitik aktiviteye dayali on taramalardir. Hassasiyetleri cok yuksektir ancak tamamen spesifik degillerdir."
31
+ },
32
+ {
33
+ "key": "faq-2",
34
+ "question": "Kastle-Meyer testinde ne yalanci pozitiflik yapar?",
35
+ "answer": "Test, hemin peroksidaz benzeri aktivitesine dayanir. Pas kimyasal oksitleyiciler veya bitki peroksidazlari reaksiyonu katalizleyebilir."
36
+ },
37
+ {
38
+ "key": "faq-3",
39
+ "question": "Luminol reaksiyonu nasil gerceklesir?",
40
+ "answer": "Luminol, hemoglobindeki demir katalizorlugunde hidrojen peroksitle reaksiyona girer. Uyarilmis luminol temel seviyeye donerken mavi isik yayar."
41
+ },
42
+ {
43
+ "key": "faq-4",
44
+ "question": "Camasir suyu yalanci pozitiflik yapar mi?",
45
+ "answer": "Evet, sodyum hipoklorit guclu bir oksitleyicidir. Reaktifleri katalizorsuz dogrudan oksitleyerek hizla sonen bir isildama yapar."
46
+ },
47
+ {
48
+ "key": "faq-5",
49
+ "question": "Varsayimsal ve dogrulama testleri arasindaki fark nedir?",
50
+ "answer": "Varsayimsal testler lekeleri bulmak icin hizli ve ucuzdur. Dogrulama testleri insan kaninin varligini kesin olarak kanitlar."
51
+ }
52
+ ];
53
+
54
+ const bibliography = [
55
+ {
56
+ "name": "Kastle-Meyer test - Wikipedia",
57
+ "url": "https://en.wikipedia.org/wiki/Kastle%E2%80%93Meyer_test"
58
+ },
59
+ {
60
+ "name": "Grodsky, M., Wright, K. & Kirk, P. L. (1951). Simplified preliminary blood testing. An improved technique and comparative study of methods. Journal of Criminal Law and Criminology.",
61
+ "url": "https://scholarlycommons.law.northwestern.edu/jclc/vol42/iss1/10/"
62
+ }
63
+ ];
64
+
65
+ export const content: ToolLocaleContent = {
66
+ slug,
67
+ title,
68
+ description,
69
+ ui: {
70
+ "title": "Kan Testi Simulatoru",
71
+ "desc": "Kan tespiti yapmak ve yalanci pozitifleri analiz etmek icin Luminol ve Kastle-Meyer ile sanal deneyler yapin.",
72
+ "configTitle": "Laboratuvar Kontrolleri",
73
+ "sampleLabel": "Numune Secin",
74
+ "reagentLabel": "Reaktif Secin",
75
+ "lightsLabel": "Aydinlatma",
76
+ "btnLightsOff": "Isiklari Kapat",
77
+ "btnLightsOn": "Isiklari Ac",
78
+ "btnReset": "Kabi Sifirla",
79
+ "resultsTitle": "On Test Sonuclari",
80
+ "sampleBlood": "Kan Numunesi (Kontrol)",
81
+ "sampleRust": "Pas (Demir Oksit)",
82
+ "sampleBleach": "Camasir Suyu (Sodyum Hipoklorit)",
83
+ "samplePotato": "Patates (Bitki Peroksidazi)",
84
+ "sampleSaliva": "Tukuruk Numunesi",
85
+ "reagentKM": "Kastle-Meyer Reaktifi",
86
+ "reagentH2O2": "Hidrojen Peroksit (H2O2)",
87
+ "reagentLuminol": "Luminol Cozeltisi",
88
+ "resultTruePositive": "Dogru Pozitif (Kan Tespit Edildi)",
89
+ "resultFalsePositive": "Yalanci Pozitif (Kan Disi Katalizor)",
90
+ "resultNegative": "Negatif Reaksiyon",
91
+ "statusLabel": "Reaksiyon Durumu",
92
+ "reactionLabel": "Reaksiyon Aciklamasi",
93
+ "dropReagentBtn": "Damla Uygula",
94
+ "activeCompounds": "Aktif Bilesikler",
95
+ "reactionSpeed": "Reaksiyon Hizi",
96
+ "reactionDuration": "Reaksiyon Suresi",
97
+ "specimenBase": "Numune Tabani",
98
+ "kmPending": "Kastle-Meyer reaktif uygulandi. Renk degisimini katalizlemek icin Hidrojen Peroksit (H2O2) ekleyin.",
99
+ "h2o2Only": "Hidrojen peroksit uygulandi. Kastle-Meyer indikatoru olmadan gorunur reaksiyon yok.",
100
+ "noReaction": "Reaksiyon gozlenmedi. Numune berrak kalir.",
101
+ "luminolBlood": "Karanlikta hemen yogun mavi isilti gozlendi. Hemoglobindeki hem gruplari luminolu katalitik olarak oksitledi. Dogru Pozitif.",
102
+ "luminolBleach": "Hemen cok yogun mavi isilti gozlendi ve 2 saniyeden kisa surede sondu. Camasir suyu luminolu dogrudan oksitler. Yalanci Pozitif.",
103
+ "luminolRust": "Zayif, sonuk mavi isilti gozlendi. Pastaki metal iyonlari oksidasyonu zayif sekilde katalizler. Yalanci Pozitif.",
104
+ "luminolPotato": "Luminescence yok. Patates peroksidazlari bu kosullarda luminol oksidasyonunu katalizlemez. Negatif.",
105
+ "luminolNegative": "Karanlikta luminescence gozlenmedi. Bilesik luminol oksidasyonunu katalizlemez. Negatif.",
106
+ "kmBlood": "Hidrojen peroksit eklendiginde hemen parlak pembe renk gozlendi. Kan numunesindeki hem, fenolftalini fenolftaleine oksitledi. Dogru Pozitif.",
107
+ "kmBleach": "Hemen guclu pembe renk degisimi. Sodyum hipoklorit fenolftalini peroksitsiz dogrudan oksitler. Yalanci Pozitif.",
108
+ "kmRust": "Birkac saniye sonra yavas, zayif kahverengimsi pembe renk olusumu. Pas reaksiyonu cok daha yavas katalizler. Yalanci Pozitif.",
109
+ "kmPotato": "Gecikmeden sonra yavas, soluk pembe renk olusumu. Bitki peroksidazlari reaksiyonu zayif katalizler. Yalanci Pozitif.",
110
+ "kmNegative": "Renk degisimi gozlenmedi. Cozelti renksiz kalir. Negatif."
111
+ },
112
+ seo: [
113
+ {
114
+ "type": "title",
115
+ "text": "Adli Tip Varsayimsal Kan Testleri Kilavuzu",
116
+ "level": 2
117
+ },
118
+ {
119
+ "type": "paragraph",
120
+ "html": "Varsayimsal kan testleri, olay yerlerinde olası kan lekelerini tespit etmek icin kullanilan hassas tarama yontemleridir. Karmaasik DNA analizlerinden ve dogrulama testlerinden once, adli uzmanlar giysiler, silahlar ve diger yuzeylerdeki biyolojik kalintilari belirlemek icin bu hızlı yontemlere basvururlar. Bu testler, hemoglobindeki demir iceren hem grubunun peroksidaz benzeri aktivitesini hedeflediginden varsayımsaldır. Pozitif bir sonuc kan varlıgını guclu sekilde gosterir, ancak diger kimyasal reaksiyonlari dislamak icin laboratuvarda ikinci bir dogrulama testi yapılması sarttır."
121
+ },
122
+ {
123
+ "type": "title",
124
+ "text": "Kastle-Meyer Kimyasal Renk Testi Calisma Mekanizmasi ve Adimlari",
125
+ "level": 3
126
+ },
127
+ {
128
+ "type": "paragraph",
129
+ "html": "Kastle-Meyer (KM) renk testi, renksiz fenolftalinin pembe renkli fenolftaleine yukseltgenmesi esasına dayanır. Reaksiyon sırası cok onemlidir: once numuneye fenolftalin reaktifi damlatılır. Kan varsa hem grubu katalizor gorevi gorur. Ardından hidrojen peroksit damlatıldıgında, hem peroksidin parcalanmasını hızlandırır ve reaktifi hemen pembe fenolftaleine oksitleyerek parlak pembe bir renk verir. On bes saniyeden sonra olusan yavas renk degisimi, havadaki oksijenin etkisiyle olusan negatif veya sahte sonuc kabul edilir."
130
+ },
131
+ {
132
+ "type": "title",
133
+ "text": "Luminol ve Adli Kimyasal Luminesans Teknigi Detaylari",
134
+ "level": 3
135
+ },
136
+ {
137
+ "type": "paragraph",
138
+ "html": "Luminol, alkali ortamda bir oksitleyici ve metal katalizor varlıgında karanlıkta mavi-cyan isık yayan bir kimyasaldır. Olay yeri inceleme ekipleri, temizlendigi dusunulen genis alanlara luminol solusyonu puskurtur. Solusyon gozle gorulmeyen kan lekeleriyle temas ettiginde, hemoglobindeki demir oksidasyon reaksiyonunu katalizler. Bu reaksiyon sonucunda uyarılmıs aminofitalat iyonu olusur ve bu iyon temel seviyeye donerken enerji yayar. Mavi ısık emisyonu dusuk yogunlukta oldugundan, fotograflamak icin tam karanlık gerekir."
139
+ },
140
+ {
141
+ "type": "table",
142
+ "headers": [
143
+ "Test Edilen Madde",
144
+ "Kastle-Meyer Tepkisi",
145
+ "Luminol Isildama Profili",
146
+ "Adli Tip Teshisi"
147
+ ],
148
+ "rows": [
149
+ [
150
+ "Kan Kontrol Numunesi",
151
+ "H2O2 damlatıldıgında hemen parlak pembe renk.",
152
+ "Yogun ve kararlı mavi isilti (8s).",
153
+ "Dogru Pozitif. Hem grubu yuksek katalitik aktivite saglar."
154
+ ],
155
+ [
156
+ "Camasir Suyu",
157
+ "H2O2 damlatılmadan once pembe renk.",
158
+ "Yogun ancak 2s icinde kaybolan isildama.",
159
+ "Yalanci Pozitif. Guclu oksitleyici katalizorsuz dogrudan reaksiyon verir."
160
+ ],
161
+ [
162
+ "Demir Oksit (Pas)",
163
+ "Yavas ve zayıf kahverengimsi pembe renk.",
164
+ "Zayıf, sonuk mavi isildama.",
165
+ "Yalanci Pozitif. Serbest demir iyonları dusuk verimle katalizler."
166
+ ],
167
+ [
168
+ "Patates (Peroksidaz)",
169
+ "Gecikmeli ve cok hafif pembe renk.",
170
+ "Karanlıkta hicbir isildama gozlenmez.",
171
+ "Yalanci Pozitif (KM) / Negatif (LUM)."
172
+ ]
173
+ ]
174
+ },
175
+ {
176
+ "type": "title",
177
+ "text": "Kani Diger Yalanci Pozitiflerden Ayirt Etme Yontemleri ve Analiz",
178
+ "level": 3
179
+ },
180
+ {
181
+ "type": "paragraph",
182
+ "html": "Kani sahte reaksiyonlardan ayırmak, adli delillerin guvenilirligi acısından kritiktir. Sodyum hipoklorit iceren camasir suları reaktifi peroksitsiz oksitler. Uzmanlar bunu reaksiyonun hızı ve suresine bakarak ayırt ederler: camasir suyu peroksitsiz renk verir ve luminol ısısı hemen soner. Bitkisel peroksidazlar ise ısı uygulandıgında yapısı bozularak inaktif hale gelirken, kandaki hemoglobin ısıya dayanıklı oldugundan ısıtıldıktan sonra bile reaksiyon vermeye devam eder."
183
+ }
184
+ ],
185
+ faq,
186
+ bibliography,
187
+ howTo,
188
+ schemas: [
189
+ {
190
+ '@context': 'https://schema.org',
191
+ '@type': 'SoftwareApplication',
192
+ name: title,
193
+ description,
194
+ applicationCategory: 'ForensicApplication',
195
+ operatingSystem: 'Any'
196
+ },
197
+ {
198
+ '@context': 'https://schema.org',
199
+ '@type': 'FAQPage',
200
+ mainEntity: faq.map((item) => ({
201
+ '@type': 'Question',
202
+ name: item.question,
203
+ acceptedAnswer: {
204
+ '@type': 'Answer',
205
+ text: item.answer
206
+ }
207
+ }))
208
+ },
209
+ {
210
+ '@context': 'https://schema.org',
211
+ '@type': 'HowTo',
212
+ name: title,
213
+ step: howTo.map((step) => ({
214
+ '@type': 'HowToStep',
215
+ name: step.name,
216
+ text: step.text
217
+ }))
218
+ }
219
+ ]
220
+ };
@@ -0,0 +1,220 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+
3
+ const slug = 'forensic-presumptive-blood-testing-luminol-kastle-meyer-simulator';
4
+ const title = '法医推定血液测试模拟器';
5
+ const description = '使用 Kastle-Meyer 和鲁米诺试剂模拟法医推定血液测试。区分真实血液与常见假阳性物质。';
6
+
7
+ const howTo = [
8
+ {
9
+ "name": "选择检测样本",
10
+ "text": "从试管架中选择待测样本,样本包括血液或常见假阳性物质。"
11
+ },
12
+ {
13
+ "name": "选择测试方法",
14
+ "text": "决定进行 Kastle-Meyer 显色测试或鲁米诺发光测试。"
15
+ },
16
+ {
17
+ "name": "添加化学试剂",
18
+ "text": "滴加 Kastle-Meyer 试剂和过氧化氢,或直接使用鲁米诺溶液。"
19
+ },
20
+ {
21
+ "name": "解释反应结果",
22
+ "text": "在黑暗中观察颜色变化或蓝色荧光,以对反应进行分类。"
23
+ }
24
+ ];
25
+
26
+ const faq = [
27
+ {
28
+ "key": "faq-1",
29
+ "question": "为什么称其为推定测试?",
30
+ "answer": "推定测试是基于催化活性的初步筛选。虽然灵敏度极高,但特异性不足,可能会产生假阳性,必须进行确证测试。"
31
+ },
32
+ {
33
+ "key": "faq-2",
34
+ "question": "Kastle-Meyer 测试假阳性的原因是什么?",
35
+ "answer": "该测试依赖血红素的过氧化物酶样活性。任何含有化学氧化剂、金属离子(如铁锈中的铁)或植物过氧化物酶的物质都会催化显色。"
36
+ },
37
+ {
38
+ "key": "faq-3",
39
+ "question": "鲁米诺化学发光反应是如何发生的?",
40
+ "answer": "鲁米诺在血红蛋白铁催化下与过氧化氢反应。处于激发态的氨基邻苯二甲酸根离子在回到基态时释放蓝光。"
41
+ },
42
+ {
43
+ "key": "faq-4",
44
+ "question": "家用漂白剂会引起假阳性吗?",
45
+ "answer": "会。次氯酸钠是强氧化剂,无需催化剂即可直接氧化酚酞林或鲁米诺,产生快速衰减的强发光。"
46
+ },
47
+ {
48
+ "key": "faq-5",
49
+ "question": "推定测试与确证测试的区别是什么?",
50
+ "answer": "推定测试快速且高灵敏度,用于在现场定位污渍。确证测试则能绝对证实人类血液的存在。"
51
+ }
52
+ ];
53
+
54
+ const bibliography = [
55
+ {
56
+ "name": "Kastle-Meyer test - Wikipedia",
57
+ "url": "https://en.wikipedia.org/wiki/Kastle%E2%80%93Meyer_test"
58
+ },
59
+ {
60
+ "name": "Grodsky, M., Wright, K. & Kirk, P. L. (1951). Simplified preliminary blood testing. An improved technique and comparative study of methods. Journal of Criminal Law and Criminology.",
61
+ "url": "https://scholarlycommons.law.northwestern.edu/jclc/vol42/iss1/10/"
62
+ }
63
+ ];
64
+
65
+ export const content: ToolLocaleContent = {
66
+ slug,
67
+ title,
68
+ description,
69
+ ui: {
70
+ "title": "血液测试模拟器",
71
+ "desc": "使用鲁米诺和 Kastle-Meyer 试剂进行虚拟实验室实验,以检测血液并分析假阳性。",
72
+ "configTitle": "实验室控制",
73
+ "sampleLabel": "选择检体样本",
74
+ "reagentLabel": "选择化学试剂",
75
+ "lightsLabel": "照度控制",
76
+ "btnLightsOff": "关闭照明",
77
+ "btnLightsOn": "开启照明",
78
+ "btnReset": "清洗反应皿",
79
+ "resultsTitle": "推定测试结果",
80
+ "sampleBlood": "血液样本(对照组)",
81
+ "sampleRust": "铁锈(氧化铁)",
82
+ "sampleBleach": "漂白剂(次氯酸钠)",
83
+ "samplePotato": "土豆(植物过氧化物酶)",
84
+ "sampleSaliva": "唾液样本",
85
+ "reagentKM": "Kastle-Meyer 试剂",
86
+ "reagentH2O2": "过氧化氢 (H2O2)",
87
+ "reagentLuminol": "鲁米诺溶液",
88
+ "resultTruePositive": "真阳性(检测到血液)",
89
+ "resultFalsePositive": "假阳性(非血液催化剂)",
90
+ "resultNegative": "阴性反应",
91
+ "statusLabel": "反应状态",
92
+ "reactionLabel": "反应解释说明",
93
+ "dropReagentBtn": "滴加化学试剂",
94
+ "activeCompounds": "活性化合物",
95
+ "reactionSpeed": "反应速度",
96
+ "reactionDuration": "反应持续时间",
97
+ "specimenBase": "检体基质",
98
+ "kmPending": "已滴加 Kastle-Meyer 试剂。请添加过氧化氢 (H2O2) 以催化显色反应。",
99
+ "h2o2Only": "已滴加过氧化氢。在没有 Kastle-Meyer 指示剂的情况下无肉眼可见反应。",
100
+ "noReaction": "未观察到反应。样本保持澄清无色。",
101
+ "luminolBlood": "黑暗中立即观察到强烈的蓝色荧光。血红蛋白中的血红素基团催化氧化了鲁米诺。真阳性。",
102
+ "luminolBleach": "立即观察到极强烈的蓝色荧光,但在2秒内迅速衰减。漂白剂直接氧化了鲁米诺。假阳性。",
103
+ "luminolRust": "观察到微弱的蓝色荧光。铁锈中的金属离子微弱地催化了氧化反应,荧光逐渐减弱。假阳性。",
104
+ "luminolPotato": "无可见发光。在这些条件下,土豆过氧化物酶不具备催化氧化鲁米诺的结构。阴性。",
105
+ "luminolNegative": "黑暗中未观察到发光。该化合物不催化鲁米诺氧化。阴性。",
106
+ "kmBlood": "滴加过氧化氢后立即观察到鲜艳的粉红色。血液中的血红素催化氧化了酚酞林为酚酞。真阳性。",
107
+ "kmBleach": "立即出现深粉红色。次氯酸钠在没有过氧化氢的情况下直接氧化了酚酞林。假阳性。",
108
+ "kmRust": "数秒后出现缓慢、微弱的棕粉色。铁锈催化反应的速度非常慢。假阳性。",
109
+ "kmPotato": "延迟后出现缓慢、暗淡的粉红色。土豆过氧化物酶微弱地催化了反应。假阳性。",
110
+ "kmNegative": "未观察到颜色变化。溶液保持无色。阴性。"
111
+ },
112
+ seo: [
113
+ {
114
+ "type": "title",
115
+ "text": "法医推定血液测试完全指南",
116
+ "level": 2
117
+ },
118
+ {
119
+ "type": "paragraph",
120
+ "html": "推定血液测试是案发现场用于筛查潜在血迹的初步高灵敏度检测方法。在进行复杂的 DNA 鉴定以及高度特异的确证测试之前,刑事侦查人员依赖这些快速测试对衣物、凶器或可疑表面上的潜在生物检材进行快速定位与排查。由于这些测试方法主要靶向血红蛋白中铁血红素的过氧化物酶样活性,因此它们被定义为推定测试。阳性反应结果仅表明血液存在的极大可能性,若要在司法审判中提供决定性证据,必须通过实验室次级确证测试排除其他生化伪影,以确保证据的可信度和法律效力。"
121
+ },
122
+ {
123
+ "type": "title",
124
+ "text": "Kastle-Meyer 显色测试的化学原理与反应步骤",
125
+ "level": 3
126
+ },
127
+ {
128
+ "type": "paragraph",
129
+ "html": "Kastle-Meyer(KM)测试是一种催化呈色反应,利用无色的还原酚酞(又称酚酞林)被催化氧化为粉红色的酚酞来判定血液的存在。实验操作顺序有极为严苛的要求:首先将酚酞林试剂滴加在提取好的样本上。如果样本中含有血液,血红蛋白中的血红素基团会充当有机催化剂。接着滴加过氧化氢溶液,血红素迅速催化过氧化氢的分解并同时将酚酞林氧化为酚酞,产生肉眼可见的鲜艳粉红色呈色反应。如果呈色反应延迟出现或超过十五秒,通常被视为由于空气中氧气慢速氧化导致的阴性或假阳性结果。"
130
+ },
131
+ {
132
+ "type": "title",
133
+ "text": "鲁米诺化学发光在法医痕迹检验中的应用",
134
+ "level": 3
135
+ },
136
+ {
137
+ "type": "paragraph",
138
+ "html": "鲁米诺(C8H7N3O2)是一种在碱性溶液中与氧化剂和过渡金属催化剂反应时,会在黑暗环境中发射出特征性蓝色荧光的化学物质。法医现场勘查人员会对可能被清洗或清除过的犯罪现场大面积喷洒稀释的鲁米诺溶液。当试剂与肉眼难辨的微量血迹接触时,血红蛋白的铁离子将剧烈催化氧化反应,产生处于激发态的氨基邻苯二甲酸根离子。该离子在回归基态时释放蓝光能量。由于这种化学发光强度较低,因此为了进行摄影记录或肉眼识别,现场必须处于绝对黑暗的密闭状态下。"
139
+ },
140
+ {
141
+ "type": "table",
142
+ "headers": [
143
+ "检测检材基质",
144
+ "Kastle-Meyer 呈色特征",
145
+ "鲁米诺化学发光特征",
146
+ "法医学鉴定分类"
147
+ ],
148
+ "rows": [
149
+ [
150
+ "人类血液对照样",
151
+ "加入 H2O2 后瞬间呈鲜艳粉红色。",
152
+ "强烈且持久的蓝青色荧光发光(长达8秒)。",
153
+ "真阳性。血红素提供了高效的化学催化活性。"
154
+ ],
155
+ [
156
+ "家用次氯酸钠漂白剂",
157
+ "在未加入 H2O2 前即瞬间变粉红色。",
158
+ "极强但瞬时衰减的蓝色荧光发光(低于2秒)。",
159
+ "假阳性。强氧化剂无需任何催化剂即可直接反应。"
160
+ ],
161
+ [
162
+ "金属氧化铁(铁锈)",
163
+ "数秒的延迟后呈缓慢而暗淡的棕粉色。",
164
+ "微弱、暗淡且分布不均的蓝色荧光。",
165
+ "假阳性。自由铁离子催化效率极低导致慢反应。"
166
+ ],
167
+ [
168
+ "马铃薯(植物过氧化酶)",
169
+ "明显延迟后出现非常微弱的淡粉红色。",
170
+ "在暗室中无法检测到任何发光现象。",
171
+ "假阳性 (KM) / 阴性 (LUM)。"
172
+ ]
173
+ ]
174
+ },
175
+ {
176
+ "type": "title",
177
+ "text": "区分真实血液和常见假阳性物质的技术方法",
178
+ "level": 3
179
+ },
180
+ {
181
+ "type": "paragraph",
182
+ "html": "在痕迹检验中,将真实血液与日常生活中的假阳性物质相区分是一项极其关键的技能。家用洗涤剂(如漂白剂)可不依赖过氧化氢直接氧化呈色指示剂。法医专家通过反应动力学的耗时差异予以鉴别:漂白剂在未滴加过氧化氢前就会引起 KM 试剂显色,且其鲁米诺发光衰减速度极快。此外,植物过氧化物酶(例如马铃薯或洋葱中的酶)在受热时会发生蛋白质变性而完全失去催化活性,而血液中的血红蛋白具有极高的热稳定性,加热处理后仍可正常显色,这为排除植物源干扰提供了有效手段。"
183
+ }
184
+ ],
185
+ faq,
186
+ bibliography,
187
+ howTo,
188
+ schemas: [
189
+ {
190
+ '@context': 'https://schema.org',
191
+ '@type': 'SoftwareApplication',
192
+ name: title,
193
+ description,
194
+ applicationCategory: 'ForensicApplication',
195
+ operatingSystem: 'Any'
196
+ },
197
+ {
198
+ '@context': 'https://schema.org',
199
+ '@type': 'FAQPage',
200
+ mainEntity: faq.map((item) => ({
201
+ '@type': 'Question',
202
+ name: item.question,
203
+ acceptedAnswer: {
204
+ '@type': 'Answer',
205
+ text: item.answer
206
+ }
207
+ }))
208
+ },
209
+ {
210
+ '@context': 'https://schema.org',
211
+ '@type': 'HowTo',
212
+ name: title,
213
+ step: howTo.map((step) => ({
214
+ '@type': 'HowToStep',
215
+ name: step.name,
216
+ text: step.text
217
+ }))
218
+ }
219
+ ]
220
+ };
@@ -0,0 +1,11 @@
1
+ import { forensicBloodTestSimulator } from './entry';
2
+ import type { ToolDefinition } from '../../types';
3
+
4
+ export * from './entry';
5
+
6
+ export const FORENSIC_BLOOD_TEST_SIMULATOR_TOOL: ToolDefinition = {
7
+ entry: forensicBloodTestSimulator,
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };
@@ -0,0 +1,174 @@
1
+ export type SampleType = 'blood' | 'rust' | 'bleach' | 'potato' | 'saliva';
2
+ export type ReagentType = 'km' | 'h2o2' | 'luminol';
3
+
4
+ export interface ReactionState {
5
+ addedReagents: ReagentType[];
6
+ color: string;
7
+ glow: boolean;
8
+ glowColor: string;
9
+ intensity: number;
10
+ durationMs: number;
11
+ resultType: 'true-positive' | 'false-positive' | 'negative';
12
+ descriptionKey: string;
13
+ }
14
+
15
+ interface SampleReactionDef {
16
+ color: string;
17
+ glow: boolean;
18
+ glowColor: string;
19
+ intensity: number;
20
+ durationMs: number;
21
+ resultType: 'true-positive' | 'false-positive' | 'negative';
22
+ descriptionKey: string;
23
+ }
24
+
25
+ const LUMINOL_MAP: Record<SampleType, SampleReactionDef> = {
26
+ blood: {
27
+ color: 'clear',
28
+ glow: true,
29
+ glowColor: '#38bdf8',
30
+ intensity: 1.0,
31
+ durationMs: 8000,
32
+ resultType: 'true-positive',
33
+ descriptionKey: 'luminolBlood'
34
+ },
35
+ bleach: {
36
+ color: 'clear',
37
+ glow: true,
38
+ glowColor: '#7dd3fc',
39
+ intensity: 0.9,
40
+ durationMs: 2000,
41
+ resultType: 'false-positive',
42
+ descriptionKey: 'luminolBleach'
43
+ },
44
+ rust: {
45
+ color: 'clear',
46
+ glow: true,
47
+ glowColor: '#0284c7',
48
+ intensity: 0.3,
49
+ durationMs: 3000,
50
+ resultType: 'false-positive',
51
+ descriptionKey: 'luminolRust'
52
+ },
53
+ potato: {
54
+ color: 'clear',
55
+ glow: false,
56
+ glowColor: '',
57
+ intensity: 0,
58
+ durationMs: 0,
59
+ resultType: 'negative',
60
+ descriptionKey: 'luminolPotato'
61
+ },
62
+ saliva: {
63
+ color: 'clear',
64
+ glow: false,
65
+ glowColor: '',
66
+ intensity: 0,
67
+ durationMs: 0,
68
+ resultType: 'negative',
69
+ descriptionKey: 'luminolNegative'
70
+ }
71
+ };
72
+
73
+ const KM_MAP: Record<SampleType, SampleReactionDef> = {
74
+ blood: {
75
+ color: '#ec4899',
76
+ glow: false,
77
+ glowColor: '',
78
+ intensity: 1.0,
79
+ durationMs: 0,
80
+ resultType: 'true-positive',
81
+ descriptionKey: 'kmBlood'
82
+ },
83
+ bleach: {
84
+ color: '#f472b6',
85
+ glow: false,
86
+ glowColor: '',
87
+ intensity: 0.8,
88
+ durationMs: 0,
89
+ resultType: 'false-positive',
90
+ descriptionKey: 'kmBleach'
91
+ },
92
+ rust: {
93
+ color: '#b45309',
94
+ glow: false,
95
+ glowColor: '',
96
+ intensity: 0.4,
97
+ durationMs: 0,
98
+ resultType: 'false-positive',
99
+ descriptionKey: 'kmRust'
100
+ },
101
+ potato: {
102
+ color: '#fbcfe8',
103
+ glow: false,
104
+ glowColor: '',
105
+ intensity: 0.5,
106
+ durationMs: 0,
107
+ resultType: 'false-positive',
108
+ descriptionKey: 'kmPotato'
109
+ },
110
+ saliva: {
111
+ color: 'clear',
112
+ glow: false,
113
+ glowColor: '',
114
+ intensity: 0,
115
+ durationMs: 0,
116
+ resultType: 'negative',
117
+ descriptionKey: 'kmNegative'
118
+ }
119
+ };
120
+
121
+ export class ChemicalReactionEngine {
122
+ public static getReaction(sample: SampleType, reagents: ReagentType[]): ReactionState {
123
+ const hasKM = reagents.includes('km');
124
+ const hasH2O2 = reagents.includes('h2o2');
125
+ const hasLuminol = reagents.includes('luminol');
126
+
127
+ if (hasLuminol) {
128
+ return this.getLuminolReaction(sample);
129
+ }
130
+
131
+ if (hasKM && hasH2O2) {
132
+ return this.getKMReaction(sample);
133
+ }
134
+
135
+ if (hasKM) {
136
+ return this.getDefaultState('clear', 'kmPending');
137
+ }
138
+
139
+ if (hasH2O2) {
140
+ return this.getDefaultState('clear', 'h2o2Only');
141
+ }
142
+
143
+ return this.getDefaultState('clear', 'noReaction');
144
+ }
145
+
146
+ private static getLuminolReaction(sample: SampleType): ReactionState {
147
+ const def = LUMINOL_MAP[sample];
148
+ return {
149
+ addedReagents: ['luminol'],
150
+ ...def
151
+ };
152
+ }
153
+
154
+ private static getKMReaction(sample: SampleType): ReactionState {
155
+ const def = KM_MAP[sample];
156
+ return {
157
+ addedReagents: ['km', 'h2o2'],
158
+ ...def
159
+ };
160
+ }
161
+
162
+ private static getDefaultState(color: string, descKey: string): ReactionState {
163
+ return {
164
+ addedReagents: [],
165
+ color,
166
+ glow: false,
167
+ glowColor: '',
168
+ intensity: 0,
169
+ durationMs: 0,
170
+ resultType: 'negative',
171
+ descriptionKey: descKey
172
+ };
173
+ }
174
+ }