@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,231 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import { bibliography } from '../bibliography';
3
+
4
+ const slug = 'adli-cam-kirilma-indisi-becke-cizgisi-simulatoru';
5
+ const title = 'Adli Cam Kırılma İndisi Becke Çizgisi Simülatörü';
6
+ const description = 'Bir daldırma sıvısını ısıtarak, kırılma indislerini eşleştirerek ve parlak halonun kayboluşunu izleyerek adli cam karşılaştırması için Becke çizgisi yöntemini simüle edin.';
7
+
8
+ const howTo = [
9
+ {
10
+ name: 'Şüpheli bir cam profili seçin',
11
+ text: 'Kalsiyum-sodyum, borosilikat, kurşun kristali veya temperli pencere camı gibi yaygın bir cam referans profili seçin.',
12
+ },
13
+ {
14
+ name: 'Isıtma tablası sıcaklığını ayarlayın',
15
+ text: 'Sanal daldırma sıvısının kırılma indisini değiştirmek için sıcaklık kaydırıcısını hareket ettirin.',
16
+ },
17
+ {
18
+ name: 'Becke çizgisi hareketini gözlemleyin',
19
+ text: 'Parlak çizginin içe doğru mu, dışa doğru mu hareket ettiğini veya eşleşme noktasında neredeyse kaybolduğunu görmek için odak yönü kontrolünü kullanın.',
20
+ },
21
+ {
22
+ name: 'İndis farkını okuyun',
23
+ text: 'Halonun indis uyumuna yakın neden sönükleştiğini anlamak için sıvı RI, cam RI, delta RI ve eşleşme yüzdesini karşılaştırın.',
24
+ },
25
+ ];
26
+
27
+ const faq = [
28
+ {
29
+ question: 'Adli cam analizinde Becke çizgisi nedir?',
30
+ answer: 'Becke çizgisi, kırılma indisleri farklı olduğunda bir cam parçası ile daldırma sıvısı arasındaki sınırın yakınında görülen parlak bir halodur. Odaklama sırasındaki hareketi, hangi malzemenin daha yüksek kırılma indisine sahip olduğunu belirlemeye yardımcı olur.',
31
+ },
32
+ {
33
+ question: 'Daldırma sıvısını ısıtmak neden önemlidir?',
34
+ answer: 'Birçok daldırma sıvısının kırılma indisi, sıcaklık arttıkça azalır. Sıvı, indisi camınkiyle eşleşene kadar ısıtılarak sınırdaki kontrast kaybolur ve parça kenarını görmek zorlaşır.',
35
+ },
36
+ {
37
+ question: 'Kırılma indisi tek başına bir cam kaynağını tanımlayabilir mi?',
38
+ answer: 'Hayır. RI, sınıf karşılaştırmasını ve elemeyi destekleyebilir, ancak adli kaynak yorumlaması aynı zamanda elementel bileşimi, kalınlığı, rengi, kırılma bağlamını, kontrolleri, belirsizliği ve doğrulanmış laboratuvar prosedürlerini de dikkate alır.',
39
+ },
40
+ {
41
+ question: 'Becke çizgisinin kaybolması ne anlama gelir?',
42
+ answer: 'Bu, sıvının ve camın bu simüle edilmiş koşullar altında çok benzer kırılma indislerine sahip olduğu anlamına gelir. Gerçek mikroskopide kaybolma, kalibre edilmiş sıcaklık kontrolü ve referans malzemelerle değerlendirilir.',
43
+ },
44
+ ];
45
+
46
+ export const content: ToolLocaleContent = {
47
+ slug,
48
+ title,
49
+ description,
50
+ ui: {
51
+ viewerAria: 'Daldırma sıvısı içindeki bir cam parçasını gösteren sanal mikroskop görünümü',
52
+ units: 'Sıcaklık birim sistemi',
53
+ metric: 'Metrik',
54
+ imperial: 'İmparatorluk',
55
+ unitCelsius: 'C',
56
+ unitFahrenheit: 'F',
57
+ glassSample: 'Cam referansı',
58
+ sodaLime: 'Kalsiyum-sodyum ambalaj camı',
59
+ borosilicate: 'Borosilikat laboratuvar camı',
60
+ leadCrystal: 'Dekoratif kurşun kristal cam',
61
+ tempered: 'Temperli pencere camı',
62
+ stageTemperature: 'Tabla sıcaklığı',
63
+ focusDirection: 'Odak yönü',
64
+ focusRaised: 'Odağı kaldır',
65
+ focusLowered: 'Odağı düşür',
66
+ liquidRi: 'Sıvı RI',
67
+ glassRi: 'Cam RI',
68
+ deltaRi: 'Delta RI',
69
+ matchMeter: 'RI Eşleşmesi',
70
+ canvasHalo: 'görünür Becke halosu',
71
+ canvasFocusSeparator: ' - ',
72
+ canvasMatched: 'kenar neredeyse eşleşti',
73
+ interpMatched: 'Sınır, optik eşleşmeye yakın. Gerçek bir Becke çizgisi testinde, bu bölge halonun sönükleştiği ve parça kenarının yerini belirlemenin en zor olduğu yerdir.',
74
+ interpGlassHigher: 'Cam daha yüksek kırılma indisine sahiptir. Yükseltilmiş odakla, Becke çizgisi davranışı ışığın sınırın cam tarafına doğru yoğunlaştığını gösterir.',
75
+ interpLiquidHigher: 'Daldırma sıvısı daha yüksek kırılma indisine sahiptir. Sıcaklık, sıvı indisini cama yaklaştırana kadar halo sıvı tarafına kayar.',
76
+ disclaimer: 'Yalnızca eğitim amaçlı simülasyon. Gerçek adli cam karşılaştırması, kalibre edilmiş kırılma indisi ekipmanı, bilinen standartlar, belirsizlik raporlaması ve nitelikli yorum gerektirir.',
77
+ },
78
+ seo: [
79
+ {
80
+ type: 'title',
81
+ text: 'Adli Cam için Becke Çizgisi Kırılma İndisi Testi',
82
+ level: 2,
83
+ },
84
+ {
85
+ type: 'diagnostic',
86
+ variant: 'info',
87
+ icon: 'mdi:microscope',
88
+ badge: 'Öğretim simülatörü',
89
+ title: 'Bu cam RI simülatörü neyi gösteriyor?',
90
+ html: 'Bu simülatör, sıvı kırılma indisi cam kırılma indisine yaklaştıkça daldırma yağındaki bir cam parçasının neden daha fazla veya daha az görünür olduğunu gösterir. <strong>Becke çizgisi mikroskopisi</strong>, sıcak tabla RI eşleştirmesi ve cam karşılaştırma kanıtlarının sınırlarını öğrenen adli bilim öğrencileri için yapılmıştır.',
91
+ },
92
+ {
93
+ type: 'stats',
94
+ columns: 4,
95
+ items: [
96
+ { value: 'n cam - n sıvı', label: 'gösterilen indis kontrastı', icon: 'mdi:delta' },
97
+ { value: '15-145 C', label: 'ısıtma tablası aralığı', icon: 'mdi:thermometer' },
98
+ { value: '4', label: 'cam profilleri', icon: 'mdi:glass-fragile' },
99
+ { value: 'C / F', label: 'dönüştürülebilir sıcaklık birimleri', icon: 'mdi:swap-horizontal' },
100
+ ],
101
+ },
102
+ {
103
+ type: 'summary',
104
+ title: 'Pratik Becke çizgisi gözlem kontrol listesi',
105
+ items: [
106
+ 'Uygun bir kırılma indisi sıvısına tamamen batırılmış temiz, küçük bir cam parçası kullanın.',
107
+ 'Sınırın biraz üzerine ve altına odaklanın ve parlak çizginin hangi tarafa doğru hareket ettiğini izleyin.',
108
+ 'Tahmini eşleşme noktasına yakın sıcaklığı yavaşça artırın çünkü çizgi dar bir aralıkta solabilir.',
109
+ 'Sıcaklığı, sıvı türünü, kalibrasyon standardını, gözlemlenen eşleşme davranışını ve belirsizliği kaydedin.',
110
+ 'RI\'yi sınıf kanıtı olarak ele alın: bir uyumsuzluk eleyebilir, oysa bir eşleşme ek bağlam gerektirir.',
111
+ ],
112
+ },
113
+ {
114
+ type: 'comparative',
115
+ columns: 2,
116
+ items: [
117
+ {
118
+ title: 'RI karşılaştırmasının destekleyebilecekleri',
119
+ icon: 'mdi:check-circle-outline',
120
+ highlight: true,
121
+ description: 'Kırılma indisi, şüpheli cam parçalarının kontrollü koşullar altında bilinen referen camlarla karşılaştırılmasına yardımcı olabilir.',
122
+ points: ['Sınıf özelliği karşılaştırması', 'RI net bir şekilde farklı olduğunda eleme', 'Elementel analizden önce tarama', 'Optik sınır davranışını öğretme'],
123
+ },
124
+ {
125
+ title: 'RI\'nin tek başına kanıtlayamayacakları',
126
+ icon: 'mdi:alert-circle-outline',
127
+ description: 'Eşleşen bir RI; bir camı, şişeyi, araç camını veya olay yeri kaynağını benzersiz şekilde tanımlamaz.',
128
+ points: ['Tek başına bireysel kaynak atfı yapılamaz', 'Olay yeri bağlamı olmadan yeniden yapılandırma yapılamaz', 'Kontrollerin yerine geçmez', 'Bir tarayıcı modelinden yasal bir sonuç çıkarılamaz'],
129
+ },
130
+ ],
131
+ },
132
+ {
133
+ type: 'table',
134
+ headers: ['Kullanıcı sorusu', 'Mikroskopi kavramı', 'Detaylı yanıt'],
135
+ rows: [
136
+ ['Parlak kenar neden hareket ediyor?', 'İki kırılma indisi arasındaki sınırda kırılma.', 'Becke çizgisi, odak yükseltildiğinde daha yüksek kırılma indisine sahip malzemeye doğru hareket etme eğilimindedir.'] ,
137
+ ['Kenar neden kayboluyor?', 'İndis eşleşmesi.', 'Cam ve sıvı RI neredeyse eşit olduğunda, sınır kontrastı düşer ve halo zayıflar.'],
138
+ ['Sıvıyı neden ısıtıyoruz?', 'Termal RI katsayısı.', 'Simüle edilen sıvı RI sıcaklıkla azalır ve farklı cam türleriyle eşleşmeye olanak tanır.'] ,
139
+ ['Bir eşleşme kesin midir?', 'Sınıf kanıtı sınırlaması.', 'Bir eşleşme yalnızca tutarlılığı destekler; birçok cam nesne benzer bir RI paylaşabilir.'],
140
+ ],
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Simülasyon Modelinin Çalışma Prensibi',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Model, her bir cam profiline bir referans kırılma indisi atar ve daldırma sıvısını sıcaklığa duyarlı bir ortam olarak ele alır. Sıcak tabla ısındıkça, sıvı indisi sabit bir termal katsayı oranında azalır. Simülatör daha sonra cam RI ve sıvı RI arasındaki farkı hesaplar ve bu farkı halo parlaklığını, halo kaymasını, eşleşme yüzdesini ve yorum mesajını kontrol etmek için kullanır.',
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: 'Görsel mikroskop alanı kasıtlı olarak nitelikseldir. Her optik yolu ışın izleme yöntemiyle hesaplamaya çalışmaz. Bunun yerine, temel eğitim ilişkisini korur: güçlü RI kontrastı parlak bir sınır üretir; daha düşük kontrast sönük bir sınır üretir; ve eşleşme noktasına yakın yerlerde cam kenarı sıvıda kayboluyor gibi görünebilir.',
154
+ },
155
+ {
156
+ type: 'paragraph',
157
+ html: 'Profesyonel adli laboratuvarlarda, ısıtma tablası kalibrasyonu, kırılma indisi bilinen referans cam numuneleri kullanılarak gerçekleştirilir. Daldırma sıvısının kırılma indisi sıcaklıkla öngörülebilir bir şekilde değiştiğinden (genellikle dn/dT olarak gösterilir), Becke çizgisinin kaybolduğu kesin sıcaklık, bilim insanının cam kırılma indisini virgülden sonra dört basamağa kadar hesaplamasını sağlar. Bu simülatör, bu sıcaklığa bağlı davranışı doğrusal bir formül kullanarak modeller ve öğrencilerin ısıtma tablasını dikkatli bir şekilde kontrol ederek kesin eşleşme noktasını bulma pratiği yapmalarına olanak tanır.',
158
+ },
159
+ {
160
+ type: 'paragraph',
161
+ html: 'Cam kanıtları analiz edilirken kırılma indisi, sınıf özelliği kanıtı olarak kabul edilir. Bir olay yeri parçası ile bir şüphelinin kıyafetleri arasında eşleşen bir kırılma indisi ortak bir kaynakla tutarlı olsa da, birçok cam nesne aynı kırılma indisi değerlerini paylaştığından kaynağı benzersiz bir şekilde tanımlamaz. Bu nedenle adli tıp uzmanları, eşleşen sonuçları ihtiyatlı bir şekilde yorumlamalı, eşleşmeyi tutarlılık açısından bildirirken, yalnızca optik özelliklere dayanarak kesin bir kaynak atfının mümkün olmadığını vurgulamalıdır.',
162
+ },
163
+ {
164
+ type: 'glossary',
165
+ items: [
166
+ { term: 'Kırılma indisi', definition: 'Bir malzemenin ışığı vakuma göre ne kadar güçlü büktüğünün ölçüsü.' },
167
+ { term: 'Daldırma sıvısı', definition: 'Mikroskobik RI karşılaştırması sırasında bir parçayı çevrelemek için kullanılan, bilinen optik özelliklere sahip bir sıvı.' },
168
+ { term: 'Becke çizgisi', definition: 'İki şeffaf malzemenin kırılma indisleri farklı olduğunda sınırda görülen parlak çizgi veya halo.' },
169
+ { term: 'Eşleşme noktası', definition: 'Daldırma sıvısı ve camın neredeyse aynı kırılma indisine sahip olduğu sıcaklık bölgesi.' },
170
+ { term: 'Sınıf kanıtı', definition: 'Bir öğeyi tek bir benzersiz kaynak yerine olası kaynaklardan oluşan bir grupla ilişkilendirebilen kanıt.' },
171
+ ],
172
+ },
173
+ {
174
+ type: 'tip',
175
+ title: 'Öğrenciler için yorumlama ipucu',
176
+ html: 'Cam kanıtlarında, net bir RI uyumsuzluğu genellikle bir eşleşmeden daha güçlüdür çünkü önerilen bir kaynağı eleyebilir. Bir eşleşme yararlıdır, ancak gücü popülasyon verilerine, ölçüm hassasiyetine, elementel bileşime ve vaka bağlamına bağlıdır.',
177
+ },
178
+ {
179
+ type: 'proscons',
180
+ title: 'Becke çizgisi cam RI testinin güçlü yönleri ve sınırları',
181
+ items: [
182
+ { pro: 'Hızlı, görsel ve şeffaf malzeme karşılaştırmasını öğretmek için mükemmel.', con: 'Gözlemcinin kararı ve odaklama tekniği, çizginin belirgin hareketini etkileyebilir.' },
183
+ { pro: 'Sıcaklık eşleştirmesi, kalibre edildiğinde RI\'yi yararlı bir hassasiyetle tahmin edebilir.', con: 'Gerçek çalışmada termal kontrol, sıvı yaşlanması, kirlenme ve standartlar önemlidir.' },
184
+ { pro: 'Açıkça farklı optik özelliklere sahip cam parçalarını elemek için kullanışlıdır.', con: 'Daha geniş analitik ve bağlamsal kanıtlar olmadan bir kaynağı bireyselleştiremez.' },
185
+ ],
186
+ },
187
+ {
188
+ type: 'diagnostic',
189
+ variant: 'warning',
190
+ icon: 'mdi:scale-balance',
191
+ badge: 'Adli temkin',
192
+ title: 'Sonucu ölçülü tutun',
193
+ html: 'Tarayıcı tabanlı Becke çizgisi simülasyonu bir öğrenme aracıdır, bir laboratuvar yöntemi değildir. Resmi cam kanıtı yorumu doğrulanmış araçlara, yazılı prosedürlere, kalibrasyon kayıtlarına, belirsizlik tahminlerine, akran değerlendirmesine ve yargı yetkisine uygun raporlama diline dayanmalıdır.',
194
+ },
195
+ ],
196
+ faq,
197
+ bibliography,
198
+ howTo,
199
+ schemas: [
200
+ {
201
+ '@context': 'https://schema.org',
202
+ '@type': 'SoftwareApplication',
203
+ name: title,
204
+ description,
205
+ applicationCategory: 'ForensicApplication',
206
+ operatingSystem: 'Any',
207
+ },
208
+ {
209
+ '@context': 'https://schema.org',
210
+ '@type': 'FAQPage',
211
+ mainEntity: faq.map((item) => ({
212
+ '@type': 'Question',
213
+ name: item.question,
214
+ acceptedAnswer: {
215
+ '@type': 'Answer',
216
+ text: item.answer,
217
+ },
218
+ })),
219
+ },
220
+ {
221
+ '@context': 'https://schema.org',
222
+ '@type': 'HowTo',
223
+ name: title,
224
+ step: howTo.map((step) => ({
225
+ '@type': 'HowToStep',
226
+ name: step.name,
227
+ text: step.text,
228
+ })),
229
+ },
230
+ ],
231
+ };
@@ -0,0 +1,231 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import { bibliography } from '../bibliography';
3
+
4
+ const slug = 'forensic-glass-becke-line-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: '对比液体折射率、玻璃折射率、折射率差值(delta RI)和匹配百分比,以理解为什么在折射率趋于一致时晕圈会变暗。',
24
+ },
25
+ ];
26
+
27
+ const faq = [
28
+ {
29
+ question: '什么是法医学玻璃分析中的贝克线?',
30
+ answer: '贝克线是当玻璃碎片与浸渍液的折射率不同时,在它们边界附近看到的明亮晕圈。在调焦过程中它的移动方向有助于判断哪种材料具有更高的折射率。',
31
+ },
32
+ {
33
+ question: '为什么要加热浸渍液?',
34
+ answer: '许多浸渍液的折射率会随着温度的升高而降低。通过加热液体使其折射率与玻璃匹配,边界的对比度就会减弱,碎片边缘也将变得难以看清。',
35
+ },
36
+ {
37
+ question: '仅凭折射率能确定玻璃的来源吗?',
38
+ answer: '不能。折射率可以支持种类对比和排除,但法医学的来源解释还需要考虑元素组成、厚度、颜色、断裂背景、对照样、测量不确定度以及经过验证的实验室程序。',
39
+ },
40
+ {
41
+ question: '贝克线消失意味着什么?',
42
+ answer: '这意味着在模拟的条件下,液体和玻璃的折射率非常接近。在实际的显微镜检测中,这种消失需要通过校准的温度控制和参考标准物质来进行判断。',
43
+ },
44
+ ];
45
+
46
+ export const content: ToolLocaleContent = {
47
+ slug,
48
+ title,
49
+ description,
50
+ ui: {
51
+ viewerAria: '显示浸渍液中玻璃碎片的虚拟显微镜图像',
52
+ units: '温度单位系统',
53
+ metric: '公制',
54
+ imperial: '英制',
55
+ unitCelsius: 'C',
56
+ unitFahrenheit: 'F',
57
+ glassSample: '参考玻璃',
58
+ sodaLime: '钠钙容器玻璃',
59
+ borosilicate: '硼硅酸盐实验室玻璃',
60
+ leadCrystal: '装饰用铅晶质玻璃',
61
+ tempered: '钢化窗玻璃',
62
+ stageTemperature: '热台温度',
63
+ focusDirection: '调焦方向',
64
+ focusRaised: '调高焦距',
65
+ focusLowered: '调低焦距',
66
+ liquidRi: '液体折射率',
67
+ glassRi: '玻璃折射率',
68
+ deltaRi: '折射率差值',
69
+ matchMeter: '折射率匹配度',
70
+ canvasHalo: '可见贝克晕圈',
71
+ canvasFocusSeparator: ' - ',
72
+ canvasMatched: '边缘几乎匹配',
73
+ interpMatched: '边界已接近光学匹配。在实际的贝克线测试中,该区域正是晕圈变暗且碎片边缘最难定位的地方。',
74
+ interpGlassHigher: '玻璃具有更高的折射率。调高焦距时,贝克线的表现表明光线向边界的玻璃一侧聚集。',
75
+ interpLiquidHigher: '浸渍液具有更高的折射率。晕圈将向液体一侧偏移,直到温度变化使液体折射率更接近玻璃。',
76
+ disclaimer: '仅供教育模拟使用。实际的法医学玻璃对比需要校准的折射率测量设备、已知标准物质、不确定度报告以及有资质的人员来解释。',
77
+ },
78
+ seo: [
79
+ {
80
+ type: 'title',
81
+ text: '法医学玻璃贝克线折射率测试',
82
+ level: 2,
83
+ },
84
+ {
85
+ type: 'diagnostic',
86
+ variant: 'info',
87
+ icon: 'mdi:microscope',
88
+ badge: '教学模拟器',
89
+ title: '本玻璃折射率模拟器演示的内容',
90
+ html: '本模拟器展示了随着液体折射率趋近于玻璃折射率,浸渍油中的玻璃碎片如何变得更明显或更不明显。专为学习<strong>贝克线显微镜技术</strong>、热台折射率匹配以及玻璃对比证据局限性的法医学学生设计。',
91
+ },
92
+ {
93
+ type: 'stats',
94
+ columns: 4,
95
+ items: [
96
+ { value: 'n 玻璃 - n 液体', label: '显示的折射率对比', icon: 'mdi:delta' },
97
+ { value: '15-145 C', label: '热台温度范围', icon: 'mdi:thermometer' },
98
+ { value: '4', label: '玻璃特征档案', icon: 'mdi:glass-fragile' },
99
+ { value: 'C / F', label: '可转换的温度单位', icon: 'mdi:swap-horizontal' },
100
+ ],
101
+ },
102
+ {
103
+ type: 'summary',
104
+ title: '实用的贝克线观察清单',
105
+ items: [
106
+ '使用干净且完全浸入合适折射率液体中的微小玻璃碎片。',
107
+ '在边界稍上方和稍下方进行调焦,观察明亮线条看起来向哪一侧移动。',
108
+ '在接近估计的匹配点时缓慢升高温度,因为线条可能在极小的范围内消退。',
109
+ '记录温度、液体类型、校准标准、观察到的匹配表现以及不确定度。',
110
+ '将折射率视为种类证据:不匹配可以予以排除,而匹配则需要更多的背景信息支持。',
111
+ ],
112
+ },
113
+ {
114
+ type: 'comparative',
115
+ columns: 2,
116
+ items: [
117
+ {
118
+ title: '折射率对比可以支持的方面',
119
+ icon: 'mdi:check-circle-outline',
120
+ highlight: true,
121
+ description: '在受控条件下,折射率有助于对比待检玻璃碎片与已知参考玻璃。',
122
+ points: ['种类特征对比', '当折射率有明显差异时予以排除', '元素分析前的筛选', '教学边界光学行为'],
123
+ },
124
+ {
125
+ title: '仅凭折射率无法证明的方面',
126
+ icon: 'mdi:alert-circle-outline',
127
+ description: '匹配的折射率并不能唯一定位某块窗玻璃、瓶子、汽车车窗或案发现场来源。',
128
+ points: ['不能单独用于个体来源认定', '在没有现场背景的情况下无法重建案情', '无法替代对照样', '无法从浏览器模型中得出法律结论'],
129
+ },
130
+ ],
131
+ },
132
+ {
133
+ type: 'table',
134
+ headers: ['用户疑问', '显微镜概念', '谨慎解答'],
135
+ rows: [
136
+ ['为什么明亮边缘会移动?', '两种折射率边界的折射。', '当提高焦距时,贝克线倾向于向折射率较高的材料移动。'],
137
+ ['为什么边缘会消失?', '折射率匹配。', '当玻璃与液体的折射率几乎相等时,边界对比度降低,晕圈变弱。'],
138
+ ['为什么要加热液体?', '热折射率系数。', '模拟的液体折射率随温度升高而降低,从而可以与不同类型的玻璃进行匹配。'],
139
+ ['匹配结论是绝对的吗?', '种类证据的局限性。', '匹配仅支持一致性;许多玻璃物体可能共享相似的折射率。'],
140
+ ],
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: '模拟模型工作原理',
145
+ level: 3,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: '该模型为每个玻璃特征分配一个参考折射率,并将浸渍液视为温度敏感介质。随着热台升温,液体折射率以固定的热系数降低。然后,模拟器计算玻璃折射率与液体折射率之间的差值,并利用该差值来控制晕圈亮度、晕圈偏移、匹配百分比和解释消息。',
150
+ },
151
+ {
152
+ type: 'paragraph',
153
+ html: '显微镜的可视区域故意设计为定性的。它不尝试对每条光路进行光线追踪。相反,它保留了核心的教学关系:高折射率对比产生明亮的边界;低对比度产生微弱边界;在接近匹配点时,玻璃边缘看起来可能会在液体中消失。',
154
+ },
155
+ {
156
+ type: 'paragraph',
157
+ html: '在专业的法医学实验室中,热台的温度校准是使用已知折射率的参考玻璃样本进行的。由于浸渍液的折射率会随温度发生可预测的变化(通常表示为 dn/dT),科学家可以通过测量贝克线消失的精确温度,将玻璃折射率精确计算至小数点后四位。本模拟器利用线性公式对这种温度依赖行为进行建模,使学生能够通过仔细控制热台温度来练习寻找精确的匹配点。',
158
+ },
159
+ {
160
+ type: 'paragraph',
161
+ html: '在分析玻璃证据时,折射率被视为种类特征证据(类属证据)。虽然案发现场碎片与嫌疑人衣物上的玻璃折射率相匹配与共同来源一致,但它并不能唯一确定来源,因为许多玻璃物体的折射率值完全相同。因此,法医学专家必须保守地解释匹配结果,在报告匹配时表述为一致性,同时强调仅凭光学性质无法进行确定性的来源认定。',
162
+ },
163
+ {
164
+ type: 'glossary',
165
+ items: [
166
+ { term: '折射率', definition: '衡量材料与真空相比折射光线强弱的度量。' },
167
+ { term: '浸渍液', definition: '在显微折射率对比中,用于环绕碎片且具有已知光学性质的液体。' },
168
+ { term: '贝克线', definition: '当两种透明材料的折射率不同时,在边界处看到的明亮线条或晕圈。' },
169
+ { term: '匹配点', definition: '浸渍液与玻璃具有几乎相同折射率的温度区域。' },
170
+ { term: '种类证据', definition: '可以将物品与一组可能的来源(而非单一的独特来源)联系起来的证据。' },
171
+ ],
172
+ },
173
+ {
174
+ type: 'tip',
175
+ title: '学生理解提示',
176
+ html: '在玻璃证据中,明确的折射率不匹配通常比匹配更有说服力,因为它能排除所设想的来源。匹配虽然有用,但其说服力取决于人口统计数据、测量精度、元素组成和案情背景。',
177
+ },
178
+ {
179
+ type: 'proscons',
180
+ title: '贝克线玻璃折射率测试的优缺点',
181
+ items: [
182
+ { pro: '快速、直观,非常适合教学透明材料的对比。', con: '观察者的判断和调焦技术会影响线条的视在移动。' },
183
+ { pro: '校准后,温度匹配可以估算出具有实用精度的折射率。', con: '在实际工作中,热控制、液体老化、污染和标准非常关键。' },
184
+ { pro: '对于排除具有明显不同光学性质的玻璃碎片非常有用。', con: '如果没有更广泛的分析和背景证据,无法个体认定唯一来源。' },
185
+ ],
186
+ },
187
+ {
188
+ type: 'diagnostic',
189
+ variant: 'warning',
190
+ icon: 'mdi:scale-balance',
191
+ badge: '司法警示',
192
+ title: '保持结论的适度性',
193
+ html: '浏览器贝克线模拟是一种教学辅助工具,而不是实验室方法。正式的玻璃证据解释应依赖于经过验证的仪器、书面程序、校准记录、不确定度评估、同行评审以及符合管辖权要求的报告语言。',
194
+ },
195
+ ],
196
+ faq,
197
+ bibliography,
198
+ howTo,
199
+ schemas: [
200
+ {
201
+ '@context': 'https://schema.org',
202
+ '@type': 'SoftwareApplication',
203
+ name: title,
204
+ description,
205
+ applicationCategory: 'ForensicApplication',
206
+ operatingSystem: 'Any',
207
+ },
208
+ {
209
+ '@context': 'https://schema.org',
210
+ '@type': 'FAQPage',
211
+ mainEntity: faq.map((item) => ({
212
+ '@type': 'Question',
213
+ name: item.question,
214
+ acceptedAnswer: {
215
+ '@type': 'Answer',
216
+ text: item.answer,
217
+ },
218
+ })),
219
+ },
220
+ {
221
+ '@context': 'https://schema.org',
222
+ '@type': 'HowTo',
223
+ name: title,
224
+ step: howTo.map((step) => ({
225
+ '@type': 'HowToStep',
226
+ name: step.name,
227
+ text: step.text,
228
+ })),
229
+ },
230
+ ],
231
+ };
@@ -0,0 +1,11 @@
1
+ import { forensicGlassBeckeLineSimulator } from './entry';
2
+ import type { ToolDefinition } from '../../types';
3
+
4
+ export * from './entry';
5
+
6
+ export const FORENSIC_GLASS_BECKE_LINE_SIMULATOR_TOOL: ToolDefinition = {
7
+ entry: forensicGlassBeckeLineSimulator,
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };
@@ -0,0 +1,100 @@
1
+ export type GlassReference = 'sodaLime' | 'borosilicate' | 'leadCrystal' | 'tempered';
2
+ export type FocusDirection = 'raised' | 'lowered';
3
+
4
+ export interface GlassProfile {
5
+ id: GlassReference;
6
+ refractiveIndex: number;
7
+ dispersion: number;
8
+ }
9
+
10
+ export interface BeckeLineInput {
11
+ temperatureC: number;
12
+ glass: GlassReference;
13
+ focusDirection: FocusDirection;
14
+ }
15
+
16
+ export interface BeckeLineResult {
17
+ temperatureC: number;
18
+ temperatureF: number;
19
+ liquidIndex: number;
20
+ glassIndex: number;
21
+ delta: number;
22
+ absDelta: number;
23
+ matchQuality: number;
24
+ haloOpacity: number;
25
+ haloOffset: number;
26
+ lineDirection: 'inward' | 'outward' | 'matched';
27
+ interpretationKey: string;
28
+ }
29
+
30
+ export const GLASS_PROFILES: Record<GlassReference, GlassProfile> = {
31
+ sodaLime: {
32
+ id: 'sodaLime',
33
+ refractiveIndex: 1.517,
34
+ dispersion: 0.012,
35
+ },
36
+ borosilicate: {
37
+ id: 'borosilicate',
38
+ refractiveIndex: 1.474,
39
+ dispersion: 0.008,
40
+ },
41
+ leadCrystal: {
42
+ id: 'leadCrystal',
43
+ refractiveIndex: 1.545,
44
+ dispersion: 0.018,
45
+ },
46
+ tempered: {
47
+ id: 'tempered',
48
+ refractiveIndex: 1.522,
49
+ dispersion: 0.014,
50
+ },
51
+ };
52
+
53
+ function clamp(value: number, min: number, max: number): number {
54
+ return Math.max(min, Math.min(max, value));
55
+ }
56
+
57
+ export class RefractiveIndexCalculator {
58
+ private readonly referenceTemperatureC = 25;
59
+ private readonly referenceLiquidIndex = 1.565;
60
+ private readonly thermalCoefficient = -0.00042;
61
+
62
+ calculateLiquidIndex(temperatureC: number): number {
63
+ const index = this.referenceLiquidIndex + ((temperatureC - this.referenceTemperatureC) * this.thermalCoefficient);
64
+ return Number(index.toFixed(5));
65
+ }
66
+
67
+ simulate(input: BeckeLineInput): BeckeLineResult {
68
+ const glass = GLASS_PROFILES[input.glass] ?? GLASS_PROFILES.sodaLime;
69
+ const temperatureC = clamp(input.temperatureC, 15, 145);
70
+ const liquidIndex = this.calculateLiquidIndex(temperatureC);
71
+ const delta = Number((glass.refractiveIndex - liquidIndex).toFixed(5));
72
+ const absDelta = Math.abs(delta);
73
+ const matchQuality = Math.round(clamp(100 - (absDelta / 0.035) * 100, 0, 100));
74
+ const isMatched = absDelta < 0.0012;
75
+ const baseDirection = delta > 0 ? 'inward' : 'outward';
76
+ const lineDirection = isMatched ? 'matched' : baseDirection;
77
+ const focusMultiplier = input.focusDirection === 'raised' ? 1 : -1;
78
+ const directionMultiplier = baseDirection === 'inward' ? -1 : 1;
79
+
80
+ return {
81
+ temperatureC: Number(temperatureC.toFixed(1)),
82
+ temperatureF: Number(((temperatureC * 9 / 5) + 32).toFixed(1)),
83
+ liquidIndex,
84
+ glassIndex: glass.refractiveIndex,
85
+ delta,
86
+ absDelta: Number(absDelta.toFixed(5)),
87
+ matchQuality,
88
+ haloOpacity: Number(clamp(absDelta / 0.018, 0.05, 1).toFixed(2)),
89
+ haloOffset: Number((directionMultiplier * focusMultiplier * clamp(absDelta * 900, 0, 24)).toFixed(1)),
90
+ lineDirection,
91
+ interpretationKey: this.getInterpretationKey(isMatched, baseDirection),
92
+ };
93
+ }
94
+
95
+ private getInterpretationKey(isMatched: boolean, baseDirection: 'inward' | 'outward'): string {
96
+ if (isMatched) return 'interpMatched';
97
+ if (baseDirection === 'inward') return 'interpGlassHigher';
98
+ return 'interpLiquidHigher';
99
+ }
100
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { forensicGlassBeckeLineSimulator } 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 forensicGlassBeckeLineSimulator.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo && content.seo.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}