@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,32 @@
1
+ import type { ScienceToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export interface TlcInkSimulatorUI {
4
+ [key: string]: string;
5
+ }
6
+
7
+ export type TlcInkSimulatorLocaleContent = ToolLocaleContent<TlcInkSimulatorUI>;
8
+
9
+ export const forensicTlcInkSimulator: ScienceToolEntry<TlcInkSimulatorUI> = {
10
+ id: 'forensic-tlc-ink-simulator',
11
+ icons: {
12
+ bg: 'mdi:test-tube',
13
+ fg: 'mdi:format-color-fill',
14
+ },
15
+ i18n: {
16
+ de: () => import('./i18n/de').then((m) => m.content),
17
+ en: () => import('./i18n/en').then((m) => m.content),
18
+ es: () => import('./i18n/es').then((m) => m.content),
19
+ fr: () => import('./i18n/fr').then((m) => m.content),
20
+ id: () => import('./i18n/id').then((m) => m.content),
21
+ it: () => import('./i18n/it').then((m) => m.content),
22
+ ja: () => import('./i18n/ja').then((m) => m.content),
23
+ ko: () => import('./i18n/ko').then((m) => m.content),
24
+ nl: () => import('./i18n/nl').then((m) => m.content),
25
+ pl: () => import('./i18n/pl').then((m) => m.content),
26
+ pt: () => import('./i18n/pt').then((m) => m.content),
27
+ ru: () => import('./i18n/ru').then((m) => m.content),
28
+ sv: () => import('./i18n/sv').then((m) => m.content),
29
+ tr: () => import('./i18n/tr').then((m) => m.content),
30
+ zh: () => import('./i18n/zh').then((m) => m.content),
31
+ },
32
+ };
@@ -0,0 +1,462 @@
1
+ .tlc-shell {
2
+ --tlc-ink: #172033;
3
+ --tlc-muted: #627083;
4
+ --tlc-faint: rgba(98, 112, 131, 0.18);
5
+ --tlc-border: rgba(25, 38, 58, 0.13);
6
+ --tlc-panel: rgba(255, 255, 255, 0.76);
7
+ --tlc-paper: #fff3d4;
8
+ --tlc-paper-line: rgba(91, 67, 34, 0.1);
9
+ --tlc-glass: #dff7fb;
10
+ --tlc-solvent: rgba(66, 210, 188, 0.48);
11
+ --tlc-accent: #008f86;
12
+ --tlc-coral: #f36f56;
13
+
14
+ color: var(--tlc-ink);
15
+ }
16
+
17
+ .theme-dark .tlc-shell {
18
+ --tlc-ink: #ecf3ff;
19
+ --tlc-muted: #a8b6c8;
20
+ --tlc-faint: rgba(201, 213, 228, 0.18);
21
+ --tlc-border: rgba(226, 232, 240, 0.18);
22
+ --tlc-panel: rgba(13, 20, 33, 0.78);
23
+ --tlc-paper: #2b2418;
24
+ --tlc-paper-line: rgba(255, 230, 176, 0.1);
25
+ --tlc-glass: #113642;
26
+ --tlc-solvent: rgba(45, 212, 191, 0.32);
27
+ --tlc-accent: #57e2d2;
28
+ --tlc-coral: #ff9a82;
29
+ }
30
+
31
+ .tlc-lab {
32
+ position: relative;
33
+ display: grid;
34
+ grid-template-columns: minmax(0, 1.22fr) minmax(286px, 0.78fr);
35
+ gap: 16px;
36
+ width: 100%;
37
+ overflow: hidden;
38
+ border: 1px solid var(--tlc-border);
39
+ border-radius: 8px;
40
+ background:
41
+ linear-gradient(135deg, rgba(255, 255, 255, 0.78), rgba(225, 249, 244, 0.42) 45%, rgba(255, 233, 211, 0.34)),
42
+ radial-gradient(circle at 24% 18%, rgba(0, 143, 134, 0.14), transparent 34%);
43
+ padding: 14px;
44
+ box-shadow: 0 18px 42px rgba(21, 36, 58, 0.08);
45
+ }
46
+
47
+ .theme-dark .tlc-lab {
48
+ background:
49
+ linear-gradient(135deg, rgba(14, 22, 36, 0.96), rgba(18, 47, 54, 0.72) 58%, rgba(45, 32, 28, 0.62)),
50
+ radial-gradient(circle at 24% 18%, rgba(87, 226, 210, 0.14), transparent 34%);
51
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.3);
52
+ }
53
+
54
+ .tlc-stage {
55
+ display: grid;
56
+ gap: 12px;
57
+ min-width: 0;
58
+ }
59
+
60
+ .tlc-chamber {
61
+ position: relative;
62
+ min-height: 478px;
63
+ overflow: hidden;
64
+ border: 1px solid color-mix(in srgb, var(--tlc-accent), transparent 68%);
65
+ border-radius: 8px;
66
+ background:
67
+ linear-gradient(90deg, rgba(255, 255, 255, 0.5), transparent 18%, transparent 82%, rgba(255, 255, 255, 0.32)),
68
+ linear-gradient(180deg, color-mix(in srgb, var(--tlc-glass), white 32%), var(--tlc-glass));
69
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.38);
70
+ }
71
+
72
+ .tlc-glass-shine {
73
+ position: absolute;
74
+ inset: 16px auto 18px 18px;
75
+ width: 34%;
76
+ border-radius: 999px;
77
+ background: linear-gradient(90deg, rgba(255, 255, 255, 0.38), transparent);
78
+ filter: blur(12px);
79
+ pointer-events: none;
80
+ }
81
+
82
+ .tlc-solvent {
83
+ position: absolute;
84
+ inset: auto 18px 18px;
85
+ height: 24%;
86
+ border-radius: 0 0 8px 8px;
87
+ background:
88
+ linear-gradient(180deg, rgba(255, 255, 255, 0.34), transparent 22%),
89
+ repeating-linear-gradient(90deg, transparent 0 18px, rgba(255, 255, 255, 0.12) 18px 22px),
90
+ var(--tlc-solvent);
91
+ transition: height 180ms ease;
92
+ }
93
+
94
+ .tlc-solvent::before {
95
+ content: '';
96
+ position: absolute;
97
+ inset: -7px 0 auto;
98
+ height: 14px;
99
+ border-radius: 50%;
100
+ background: rgba(255, 255, 255, 0.34);
101
+ }
102
+
103
+ .tlc-plate {
104
+ position: absolute;
105
+ inset: 32px 74px 34px 36px;
106
+ border: 1px solid rgba(112, 84, 41, 0.24);
107
+ border-radius: 5px;
108
+ background:
109
+ repeating-linear-gradient(0deg, var(--tlc-paper-line) 0 1px, transparent 1px 32px),
110
+ linear-gradient(90deg, rgba(255, 255, 255, 0.28), transparent 38%, rgba(126, 88, 31, 0.08)),
111
+ var(--tlc-paper);
112
+ box-shadow: 0 18px 34px rgba(21, 36, 58, 0.18);
113
+ }
114
+
115
+ .tlc-plate-clip {
116
+ position: absolute;
117
+ top: -14px;
118
+ left: 50%;
119
+ width: 72px;
120
+ height: 22px;
121
+ border: 1px solid rgba(91, 67, 34, 0.22);
122
+ border-radius: 0 0 7px 7px;
123
+ background: linear-gradient(180deg, #d9c29d, #a98d64);
124
+ transform: translateX(-50%);
125
+ box-shadow: 0 8px 14px rgba(21, 36, 58, 0.18);
126
+ }
127
+
128
+ .tlc-origin,
129
+ .tlc-solvent-front {
130
+ position: absolute;
131
+ right: 0;
132
+ left: 0;
133
+ border-top: 1px dashed rgba(37, 48, 63, 0.48);
134
+ }
135
+
136
+ .theme-dark .tlc-origin,
137
+ .theme-dark .tlc-solvent-front {
138
+ border-color: rgba(226, 232, 240, 0.46);
139
+ }
140
+
141
+ .tlc-origin {
142
+ bottom: 10%;
143
+ }
144
+
145
+ .tlc-solvent-front {
146
+ bottom: 54%;
147
+ transition: bottom 180ms ease;
148
+ }
149
+
150
+ .tlc-origin span,
151
+ .tlc-solvent-front span {
152
+ position: absolute;
153
+ top: -20px;
154
+ left: 10px;
155
+ padding: 2px 7px;
156
+ border-radius: 999px;
157
+ background: color-mix(in srgb, var(--tlc-paper), white 24%);
158
+ color: var(--tlc-muted);
159
+ font-size: 0.65rem;
160
+ font-weight: 900;
161
+ letter-spacing: 0;
162
+ text-transform: uppercase;
163
+ }
164
+
165
+ .tlc-spot {
166
+ position: absolute;
167
+ bottom: calc(10% - 5px);
168
+ left: 50%;
169
+ width: 18px;
170
+ height: 10px;
171
+ border-radius: 50%;
172
+ background: #243041;
173
+ transform: translateX(-50%);
174
+ filter: blur(0.2px);
175
+ }
176
+
177
+ .tlc-lane {
178
+ position: absolute;
179
+ inset: 0 28%;
180
+ }
181
+
182
+ .tlc-band {
183
+ position: absolute;
184
+ right: 0;
185
+ left: 0;
186
+ bottom: var(--band-bottom);
187
+ height: var(--band-height);
188
+ border-radius: 999px;
189
+ background:
190
+ radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--band-color), white 26%), transparent 42%),
191
+ linear-gradient(90deg, transparent, var(--band-color) 16% 84%, transparent);
192
+ box-shadow:
193
+ 0 0 16px color-mix(in srgb, var(--band-color), transparent 48%),
194
+ 0 3px 8px rgba(15, 23, 42, 0.16);
195
+ transform: translateY(50%);
196
+ }
197
+
198
+ .tlc-ruler {
199
+ position: absolute;
200
+ top: 34px;
201
+ right: 22px;
202
+ bottom: 36px;
203
+ display: flex;
204
+ flex-direction: column;
205
+ justify-content: space-between;
206
+ width: 42px;
207
+ border-left: 2px solid color-mix(in srgb, var(--tlc-accent), transparent 34%);
208
+ color: var(--tlc-muted);
209
+ font-size: 0.72rem;
210
+ font-weight: 900;
211
+ }
212
+
213
+ .tlc-ruler::before {
214
+ content: '';
215
+ position: absolute;
216
+ inset: 0 auto 0 -2px;
217
+ width: 12px;
218
+ background: repeating-linear-gradient(0deg, var(--tlc-accent) 0 1px, transparent 1px 17px);
219
+ }
220
+
221
+ .tlc-ruler span {
222
+ padding-left: 13px;
223
+ }
224
+
225
+ .tlc-panel {
226
+ display: grid;
227
+ align-content: start;
228
+ gap: 12px;
229
+ min-width: 0;
230
+ border: 1px solid var(--tlc-border);
231
+ border-radius: 8px;
232
+ background: var(--tlc-panel);
233
+ padding: 12px;
234
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.24);
235
+ }
236
+
237
+ .tlc-unit-toggle {
238
+ display: grid;
239
+ grid-template-columns: 1fr 1fr;
240
+ gap: 6px;
241
+ padding: 4px;
242
+ border: 1px solid var(--tlc-border);
243
+ border-radius: 8px;
244
+ background: rgba(255, 255, 255, 0.42);
245
+ }
246
+
247
+ .theme-dark .tlc-unit-toggle {
248
+ background: rgba(3, 7, 18, 0.3);
249
+ }
250
+
251
+ .tlc-unit-toggle button,
252
+ .tlc-field select {
253
+ min-height: 42px;
254
+ border: 1px solid transparent;
255
+ border-radius: 6px;
256
+ background: transparent;
257
+ color: var(--tlc-ink);
258
+ font-size: inherit;
259
+ font-weight: 900;
260
+ }
261
+
262
+ .tlc-unit-toggle button[data-active='true'] {
263
+ border-color: color-mix(in srgb, var(--tlc-accent), transparent 36%);
264
+ background: color-mix(in srgb, var(--tlc-accent), white 84%);
265
+ box-shadow: 0 8px 18px rgba(0, 143, 134, 0.12);
266
+ }
267
+
268
+ .theme-dark .tlc-unit-toggle button[data-active='true'] {
269
+ background: color-mix(in srgb, var(--tlc-accent), #0f172a 78%);
270
+ }
271
+
272
+ .tlc-field,
273
+ .tlc-slider {
274
+ display: grid;
275
+ gap: 7px;
276
+ color: var(--tlc-muted);
277
+ font-size: 0.82rem;
278
+ font-weight: 900;
279
+ }
280
+
281
+ .tlc-field select {
282
+ width: 100%;
283
+ border-color: var(--tlc-border);
284
+ background: rgba(255, 255, 255, 0.68);
285
+ padding: 0 11px;
286
+ }
287
+
288
+ .theme-dark .tlc-field select {
289
+ background: rgba(3, 7, 18, 0.36);
290
+ }
291
+
292
+ .tlc-slider strong {
293
+ color: var(--tlc-ink);
294
+ font-size: 1.08rem;
295
+ }
296
+
297
+ .tlc-slider input {
298
+ width: 100%;
299
+ height: 18px;
300
+ accent-color: var(--tlc-coral);
301
+ }
302
+
303
+ .tlc-readout {
304
+ display: grid;
305
+ grid-template-columns: 1fr 1fr;
306
+ gap: 9px;
307
+ }
308
+
309
+ .tlc-readout div {
310
+ min-height: 84px;
311
+ border: 1px solid var(--tlc-border);
312
+ border-radius: 8px;
313
+ padding: 12px;
314
+ background:
315
+ linear-gradient(135deg, rgba(255, 255, 255, 0.72), rgba(255, 255, 255, 0.24)),
316
+ color-mix(in srgb, var(--tlc-accent), transparent 94%);
317
+ }
318
+
319
+ .theme-dark .tlc-readout div {
320
+ background:
321
+ linear-gradient(135deg, rgba(15, 23, 42, 0.72), rgba(15, 23, 42, 0.2)),
322
+ color-mix(in srgb, var(--tlc-accent), transparent 92%);
323
+ }
324
+
325
+ .tlc-readout span {
326
+ display: block;
327
+ color: var(--tlc-muted);
328
+ font-size: 0.68rem;
329
+ font-weight: 900;
330
+ line-height: 1.25;
331
+ text-transform: uppercase;
332
+ }
333
+
334
+ .tlc-readout strong {
335
+ display: block;
336
+ margin-top: 8px;
337
+ font-size: clamp(1.35rem, 4vw, 2rem);
338
+ line-height: 1;
339
+ }
340
+
341
+ .tlc-mini-map {
342
+ display: grid;
343
+ grid-template-columns: repeat(4, 1fr);
344
+ gap: 7px;
345
+ min-height: 88px;
346
+ align-items: end;
347
+ border: 1px solid var(--tlc-border);
348
+ border-radius: 8px;
349
+ padding: 12px;
350
+ background: linear-gradient(180deg, transparent, color-mix(in srgb, var(--tlc-accent), transparent 90%));
351
+ }
352
+
353
+ .tlc-mini-map span {
354
+ border-radius: 999px 999px 4px 4px;
355
+ background: var(--tlc-accent);
356
+ }
357
+
358
+ .tlc-mini-map span:nth-child(1) {
359
+ height: 42%;
360
+ background: #0ea5e9;
361
+ }
362
+
363
+ .tlc-mini-map span:nth-child(2) {
364
+ height: 72%;
365
+ background: #8b5cf6;
366
+ }
367
+
368
+ .tlc-mini-map span:nth-child(3) {
369
+ height: 55%;
370
+ background: var(--tlc-coral);
371
+ }
372
+
373
+ .tlc-mini-map span:nth-child(4) {
374
+ height: 86%;
375
+ background: #14b8a6;
376
+ }
377
+
378
+ .tlc-table-wrap {
379
+ overflow-x: auto;
380
+ border: 1px solid var(--tlc-border);
381
+ border-radius: 8px;
382
+ background: rgba(255, 255, 255, 0.58);
383
+ }
384
+
385
+ .theme-dark .tlc-table-wrap {
386
+ background: rgba(3, 7, 18, 0.3);
387
+ }
388
+
389
+ .tlc-table {
390
+ width: 100%;
391
+ min-width: 420px;
392
+ border-collapse: collapse;
393
+ font-size: 0.9rem;
394
+ }
395
+
396
+ .tlc-table th,
397
+ .tlc-table td {
398
+ padding: 11px 12px;
399
+ border-bottom: 1px solid var(--tlc-border);
400
+ text-align: left;
401
+ }
402
+
403
+ .tlc-table th {
404
+ color: var(--tlc-muted);
405
+ font-size: 0.7rem;
406
+ font-weight: 900;
407
+ text-transform: uppercase;
408
+ }
409
+
410
+ .tlc-table td {
411
+ font-weight: 760;
412
+ }
413
+
414
+ .tlc-chip {
415
+ display: inline-block;
416
+ width: 12px;
417
+ height: 12px;
418
+ margin-right: 8px;
419
+ border-radius: 50%;
420
+ background: var(--chip);
421
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--chip), transparent 82%);
422
+ vertical-align: -1px;
423
+ }
424
+
425
+ .tlc-disclaimer {
426
+ grid-column: 1 / -1;
427
+ margin: 0;
428
+ border-top: 1px solid var(--tlc-border);
429
+ padding-top: 10px;
430
+ color: var(--tlc-muted);
431
+ font-size: 0.84rem;
432
+ line-height: 1.45;
433
+ }
434
+
435
+ @media (max-width: 840px) {
436
+ .tlc-lab {
437
+ grid-template-columns: 1fr;
438
+ padding: 10px;
439
+ }
440
+
441
+ .tlc-panel {
442
+ order: -1;
443
+ }
444
+
445
+ .tlc-chamber {
446
+ min-height: 420px;
447
+ }
448
+ }
449
+
450
+ @media (max-width: 560px) {
451
+ .tlc-chamber {
452
+ min-height: 390px;
453
+ }
454
+
455
+ .tlc-plate {
456
+ inset: 28px 58px 30px 22px;
457
+ }
458
+
459
+ .tlc-readout {
460
+ grid-template-columns: 1fr;
461
+ }
462
+ }