@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,629 @@
1
+ .tool-page[data-tool-slug="forensic-fiber-comparison-microscope"] :where(h1) {
2
+ max-width: 900px;
3
+ font-size: clamp(3rem, 7vw, 5.8rem);
4
+ font-weight: 650;
5
+ line-height: 0.92;
6
+ letter-spacing: 0;
7
+ }
8
+
9
+ .fiber-lab {
10
+ width: 100%;
11
+ color: #17212b;
12
+ }
13
+
14
+ .fiber-stage {
15
+ display: grid;
16
+ grid-template-columns: minmax(0, 1.36fr) minmax(280px, 0.64fr);
17
+ gap: 18px;
18
+ padding: 16px;
19
+ border: 1px solid rgba(15, 23, 42, 0.12);
20
+ border-radius: 8px;
21
+ background: linear-gradient(135deg, rgba(244, 248, 245, 0.96), rgba(235, 242, 249, 0.94) 54%, rgba(248, 239, 244, 0.94));
22
+ box-shadow: 0 18px 42px rgba(15, 23, 42, 0.1);
23
+ }
24
+
25
+ .fiber-ocular {
26
+ position: relative;
27
+ min-height: 408px;
28
+ overflow: hidden;
29
+ border-radius: 8px;
30
+ background: #10171c;
31
+ box-shadow: inset 0 0 0 12px rgba(10, 15, 20, 0.78), 0 18px 36px rgba(15, 23, 42, 0.13);
32
+ }
33
+
34
+ .fiber-ocular canvas {
35
+ display: block;
36
+ width: 100%;
37
+ height: 100%;
38
+ min-height: 408px;
39
+ }
40
+
41
+ .fiber-split {
42
+ position: absolute;
43
+ top: 10%;
44
+ bottom: 10%;
45
+ left: 50%;
46
+ width: 2px;
47
+ background: rgba(255, 255, 255, 0.36);
48
+ transform: translateX(-1px);
49
+ }
50
+
51
+ .fiber-label,
52
+ .fiber-score {
53
+ position: absolute;
54
+ border-radius: 8px;
55
+ background: rgba(10, 15, 20, 0.78);
56
+ color: #f8fafc;
57
+ font-weight: 800;
58
+ }
59
+
60
+ .fiber-label {
61
+ top: 18px;
62
+ max-width: 42%;
63
+ padding: 8px 10px;
64
+ font-size: 0.88rem;
65
+ line-height: 1.15;
66
+ }
67
+
68
+ .fiber-label-left {
69
+ left: 18px;
70
+ }
71
+
72
+ .fiber-label-right {
73
+ right: 18px;
74
+ }
75
+
76
+ .fiber-score {
77
+ right: 18px;
78
+ bottom: 18px;
79
+ display: grid;
80
+ gap: 2px;
81
+ min-width: 116px;
82
+ padding: 10px 12px;
83
+ }
84
+
85
+ .fiber-score span,
86
+ .fiber-readouts span,
87
+ .fiber-field > span,
88
+ .fiber-slider span {
89
+ font-size: 0.74rem;
90
+ font-weight: 820;
91
+ letter-spacing: 0;
92
+ text-transform: uppercase;
93
+ }
94
+
95
+ .fiber-score strong,
96
+ .fiber-slider strong,
97
+ .fiber-readouts strong {
98
+ font-variant-numeric: tabular-nums;
99
+ }
100
+
101
+ .fiber-score strong {
102
+ font-size: 1.8rem;
103
+ line-height: 1;
104
+ }
105
+
106
+ .fiber-controls {
107
+ display: flex;
108
+ flex-direction: column;
109
+ gap: 0;
110
+ }
111
+
112
+ .fiber-field,
113
+ .fiber-slider,
114
+ .fiber-readouts,
115
+ .fiber-verdict {
116
+ position: relative;
117
+ margin: 0;
118
+ padding: 15px 0;
119
+ border-top: 0.5px solid rgba(15, 23, 42, 0.14);
120
+ }
121
+
122
+ .fiber-field:first-child {
123
+ border-top: 0;
124
+ padding-top: 0;
125
+ }
126
+
127
+ .fiber-field,
128
+ .fiber-slider {
129
+ display: grid;
130
+ gap: 7px;
131
+ }
132
+
133
+ .fiber-native-select {
134
+ position: absolute;
135
+ width: 1px;
136
+ height: 1px;
137
+ opacity: 0;
138
+ pointer-events: none;
139
+ }
140
+
141
+ .fiber-choice-trigger {
142
+ display: flex;
143
+ align-items: center;
144
+ justify-content: space-between;
145
+ width: 100%;
146
+ min-height: 45px;
147
+ border: 0.5px solid rgba(15, 23, 42, 0.14);
148
+ border-radius: 8px;
149
+ padding: 0 12px 0 14px;
150
+ color: #17212b;
151
+ background: rgba(255, 255, 255, 0.42);
152
+ backdrop-filter: blur(18px);
153
+ cursor: pointer;
154
+ font-size: 0.96rem;
155
+ font-weight: 760;
156
+ line-height: 1.15;
157
+ text-align: left;
158
+ }
159
+
160
+ .fiber-builder-head {
161
+ display: grid;
162
+ gap: 3px;
163
+ min-height: 45px;
164
+ align-content: center;
165
+ border: 0.5px solid rgba(15, 23, 42, 0.1);
166
+ border-radius: 8px;
167
+ padding: 0 14px;
168
+ color: #17212b;
169
+ background: rgba(255, 255, 255, 0.28);
170
+ }
171
+
172
+ .fiber-builder-head span {
173
+ font-size: 0.96rem;
174
+ font-weight: 760;
175
+ line-height: 1.15;
176
+ }
177
+
178
+ .fiber-builder-head small,
179
+ .fiber-builder-group small {
180
+ color: #64748b;
181
+ font-size: 0.72rem;
182
+ font-weight: 760;
183
+ line-height: 1.1;
184
+ text-transform: uppercase;
185
+ }
186
+
187
+ .fiber-builder-grid {
188
+ display: grid;
189
+ gap: 10px;
190
+ padding-top: 10px;
191
+ }
192
+
193
+ .fiber-builder-group {
194
+ display: grid;
195
+ gap: 6px;
196
+ }
197
+
198
+ .fiber-pill-row {
199
+ display: flex;
200
+ flex-wrap: wrap;
201
+ gap: 6px;
202
+ }
203
+
204
+ .fiber-pill-row button {
205
+ min-height: 31px;
206
+ border: 0.5px solid rgba(15, 23, 42, 0.14);
207
+ border-radius: 999px;
208
+ padding: 0 10px;
209
+ color: #17212b;
210
+ background: rgba(255, 255, 255, 0.32);
211
+ cursor: pointer;
212
+ font-size: 0.82rem;
213
+ font-weight: 760;
214
+ line-height: 1;
215
+ transition: background-color 160ms ease, color 160ms ease, transform 160ms ease;
216
+ }
217
+
218
+ .fiber-pill-row button:hover {
219
+ transform: translateY(-1px);
220
+ }
221
+
222
+ .fiber-pill-row button[data-active="true"] {
223
+ color: #f8fafc;
224
+ background: #17212b;
225
+ }
226
+
227
+ .fiber-mini-slider {
228
+ display: grid;
229
+ grid-template-columns: 1fr auto;
230
+ gap: 6px 10px;
231
+ align-items: end;
232
+ }
233
+
234
+ .fiber-mini-slider span {
235
+ color: #64748b;
236
+ font-size: 0.72rem;
237
+ font-weight: 760;
238
+ line-height: 1.1;
239
+ text-transform: uppercase;
240
+ }
241
+
242
+ .fiber-mini-slider strong {
243
+ color: #17212b;
244
+ font-size: 0.9rem;
245
+ font-variant-numeric: tabular-nums;
246
+ }
247
+
248
+ .fiber-mini-slider input {
249
+ grid-column: 1 / -1;
250
+ width: 100%;
251
+ margin: 0;
252
+ accent-color: #1d5f84;
253
+ }
254
+
255
+ .fiber-choice-trigger:focus-visible,
256
+ .fiber-choice-menu button:focus-visible {
257
+ outline: 3px solid rgba(29, 95, 132, 0.24);
258
+ outline-offset: 2px;
259
+ }
260
+
261
+ .fiber-choice-mark {
262
+ flex: 0 0 auto;
263
+ width: 9px;
264
+ height: 9px;
265
+ margin-left: 10px;
266
+ border-right: 2px solid currentcolor;
267
+ border-bottom: 2px solid currentcolor;
268
+ opacity: 0.72;
269
+ transform: translateY(-2px) rotate(45deg);
270
+ }
271
+
272
+ .fiber-choice-menu {
273
+ position: absolute;
274
+ z-index: 12;
275
+ top: calc(100% - 8px);
276
+ right: 0;
277
+ left: 0;
278
+ display: grid;
279
+ gap: 5px;
280
+ padding: 7px;
281
+ border: 0.5px solid rgba(15, 23, 42, 0.13);
282
+ border-radius: 8px;
283
+ background: rgba(255, 255, 255, 0.62);
284
+ backdrop-filter: blur(20px);
285
+ box-shadow: 0 18px 34px rgba(15, 23, 42, 0.16);
286
+ opacity: 0;
287
+ pointer-events: none;
288
+ transform: translateY(-4px);
289
+ transition: opacity 140ms ease, transform 140ms ease;
290
+ }
291
+
292
+ .fiber-choice-menu.is-open {
293
+ opacity: 1;
294
+ pointer-events: auto;
295
+ transform: translateY(0);
296
+ }
297
+
298
+ .fiber-choice-menu button {
299
+ min-height: 38px;
300
+ border: 0;
301
+ border-radius: 6px;
302
+ padding: 0 10px;
303
+ color: #17212b;
304
+ background: transparent;
305
+ cursor: pointer;
306
+ font-size: 0.92rem;
307
+ font-weight: 720;
308
+ line-height: 1.15;
309
+ text-align: left;
310
+ }
311
+
312
+ .fiber-choice-menu button:hover,
313
+ .fiber-choice-menu button[aria-selected="true"] {
314
+ background: rgba(23, 33, 43, 0.08);
315
+ }
316
+
317
+ .fiber-slider {
318
+ grid-template-columns: 1fr auto;
319
+ align-items: end;
320
+ column-gap: 12px;
321
+ row-gap: 6px;
322
+ }
323
+
324
+ .fiber-slider strong {
325
+ color: #17212b;
326
+ font-size: 1.28rem;
327
+ line-height: 1;
328
+ }
329
+
330
+ .fiber-slider input {
331
+ grid-column: 1 / -1;
332
+ width: 100%;
333
+ margin: 0;
334
+ accent-color: #1d5f84;
335
+ }
336
+
337
+ .fiber-readouts {
338
+ display: grid;
339
+ grid-template-columns: repeat(3, 1fr);
340
+ gap: 7px;
341
+ }
342
+
343
+ .fiber-readouts div {
344
+ display: grid;
345
+ gap: 5px;
346
+ min-width: 0;
347
+ padding: 11px 0;
348
+ border-top: 0.5px solid rgba(15, 23, 42, 0.12);
349
+ color: #17212b;
350
+ }
351
+
352
+ .fiber-readouts strong {
353
+ font-size: 1.06rem;
354
+ overflow-wrap: anywhere;
355
+ }
356
+
357
+ .fiber-verdict {
358
+ color: #17212b;
359
+ overflow: hidden;
360
+ }
361
+
362
+ .fiber-verdict-head {
363
+ display: flex;
364
+ align-items: baseline;
365
+ justify-content: space-between;
366
+ gap: 10px;
367
+ margin-bottom: 9px;
368
+ }
369
+
370
+ .fiber-verdict-head span {
371
+ color: #17212b;
372
+ font-size: 0.78rem;
373
+ font-weight: 880;
374
+ letter-spacing: 0;
375
+ text-transform: uppercase;
376
+ }
377
+
378
+ .fiber-verdict-head strong {
379
+ font-size: 1.42rem;
380
+ font-variant-numeric: tabular-nums;
381
+ line-height: 1;
382
+ }
383
+
384
+ .fiber-verdict-meter {
385
+ position: relative;
386
+ height: 5px;
387
+ margin-bottom: 14px;
388
+ overflow: hidden;
389
+ border-radius: 999px;
390
+ background: rgba(15, 23, 42, 0.12);
391
+ }
392
+
393
+ .fiber-verdict-meter span {
394
+ position: absolute;
395
+ inset: 0 auto 0 0;
396
+ width: 0;
397
+ border-radius: inherit;
398
+ background: #7c3aed;
399
+ transition: width 420ms cubic-bezier(0.2, 0.8, 0.2, 1), background-color 180ms ease;
400
+ }
401
+
402
+ .fiber-verdict p {
403
+ margin: 0;
404
+ font-size: clamp(1.16rem, 1.7vw, 1.42rem);
405
+ font-weight: 680;
406
+ line-height: 1.18;
407
+ }
408
+
409
+ .fiber-verdict[data-verdict="strong"] .fiber-verdict-head span,
410
+ .fiber-verdict[data-verdict="strong"] .fiber-verdict-head strong {
411
+ color: #166534;
412
+ }
413
+
414
+ .fiber-verdict[data-verdict="strong"] .fiber-verdict-meter span {
415
+ background: #16a34a;
416
+ }
417
+
418
+ .fiber-verdict[data-verdict="partial"] .fiber-verdict-head span,
419
+ .fiber-verdict[data-verdict="partial"] .fiber-verdict-head strong {
420
+ color: #854d0e;
421
+ }
422
+
423
+ .fiber-verdict[data-verdict="partial"] .fiber-verdict-meter span {
424
+ background: #d97706;
425
+ }
426
+
427
+ .fiber-verdict[data-verdict="different"] .fiber-verdict-head span,
428
+ .fiber-verdict[data-verdict="different"] .fiber-verdict-head strong {
429
+ color: #9f1239;
430
+ }
431
+
432
+ .fiber-verdict[data-verdict="different"] .fiber-verdict-meter span {
433
+ background: #e11d48;
434
+ }
435
+
436
+ .fiber-verdict.is-updating {
437
+ animation: fiber-verdict-settle 360ms ease both;
438
+ }
439
+
440
+ .fiber-verdict.is-updating p {
441
+ animation: fiber-verdict-copy 420ms ease both;
442
+ }
443
+
444
+ .fiber-chart {
445
+ grid-column: 1 / -1;
446
+ min-height: 260px;
447
+ padding: 18px 0 4px;
448
+ border-top: 0.5px solid rgba(15, 23, 42, 0.14);
449
+ background: transparent;
450
+ }
451
+
452
+ .fiber-chart svg {
453
+ display: block;
454
+ width: 100%;
455
+ height: auto;
456
+ }
457
+
458
+ .fiber-chart path[stroke] {
459
+ animation: fiber-chart-draw 520ms ease both;
460
+ stroke-dashoffset: 0;
461
+ }
462
+
463
+ .fiber-disclaimer {
464
+ grid-column: 1 / -1;
465
+ margin: 0;
466
+ padding: 14px 0 0;
467
+ border-top: 0.5px solid rgba(15, 23, 42, 0.14);
468
+ color: #475569;
469
+ font-size: 0.9rem;
470
+ line-height: 1.55;
471
+ }
472
+
473
+ .theme-dark .fiber-lab {
474
+ color: #e5edf2;
475
+ }
476
+
477
+ .theme-dark .fiber-ocular {
478
+ box-shadow: inset 0 0 0 12px rgba(10, 15, 20, 0.82), 0 18px 38px rgba(0, 0, 0, 0.34);
479
+ }
480
+
481
+ .theme-dark .fiber-stage {
482
+ border-color: rgba(255, 255, 255, 0.12);
483
+ background: linear-gradient(135deg, rgba(17, 25, 30, 0.96), rgba(24, 38, 49, 0.94) 54%, rgba(39, 28, 40, 0.94));
484
+ box-shadow: 0 18px 40px rgba(0, 0, 0, 0.36);
485
+ }
486
+
487
+ .theme-dark .fiber-field,
488
+ .theme-dark .fiber-slider,
489
+ .theme-dark .fiber-readouts,
490
+ .theme-dark .fiber-verdict,
491
+ .theme-dark .fiber-chart,
492
+ .theme-dark .fiber-disclaimer {
493
+ border-color: rgba(255, 255, 255, 0.13);
494
+ }
495
+
496
+ .theme-dark .fiber-choice-trigger,
497
+ .theme-dark .fiber-choice-menu,
498
+ .theme-dark .fiber-builder-head {
499
+ border-color: rgba(255, 255, 255, 0.13);
500
+ color: #f8fafc;
501
+ background: rgba(15, 23, 32, 0.48);
502
+ }
503
+
504
+ .theme-dark .fiber-builder-head small,
505
+ .theme-dark .fiber-builder-group small,
506
+ .theme-dark .fiber-mini-slider span {
507
+ color: #b8c5cf;
508
+ }
509
+
510
+ .theme-dark .fiber-pill-row button {
511
+ border-color: rgba(255, 255, 255, 0.13);
512
+ color: #f8fafc;
513
+ background: rgba(15, 23, 32, 0.46);
514
+ }
515
+
516
+ .theme-dark .fiber-pill-row button[data-active="true"] {
517
+ color: #17212b;
518
+ background: #f8fafc;
519
+ }
520
+
521
+ .theme-dark .fiber-mini-slider strong {
522
+ color: #f8fafc;
523
+ }
524
+
525
+ .theme-dark .fiber-choice-menu {
526
+ background: rgba(15, 23, 32, 0.7);
527
+ box-shadow: 0 18px 34px rgba(0, 0, 0, 0.34);
528
+ }
529
+
530
+ .theme-dark .fiber-choice-menu button {
531
+ color: #f8fafc;
532
+ }
533
+
534
+ .theme-dark .fiber-choice-menu button:hover,
535
+ .theme-dark .fiber-choice-menu button[aria-selected="true"] {
536
+ background: rgba(255, 255, 255, 0.1);
537
+ }
538
+
539
+ .theme-dark .fiber-slider strong,
540
+ .theme-dark .fiber-readouts div,
541
+ .theme-dark .fiber-verdict,
542
+ .theme-dark .fiber-verdict-head span {
543
+ color: #f8fafc;
544
+ }
545
+
546
+ .theme-dark .fiber-verdict-meter {
547
+ background: rgba(255, 255, 255, 0.13);
548
+ }
549
+
550
+ .theme-dark .fiber-verdict[data-verdict="strong"] .fiber-verdict-head span,
551
+ .theme-dark .fiber-verdict[data-verdict="strong"] .fiber-verdict-head strong {
552
+ color: #86efac;
553
+ }
554
+
555
+ .theme-dark .fiber-verdict[data-verdict="partial"] .fiber-verdict-head span,
556
+ .theme-dark .fiber-verdict[data-verdict="partial"] .fiber-verdict-head strong {
557
+ color: #fbbf24;
558
+ }
559
+
560
+ .theme-dark .fiber-verdict[data-verdict="different"] .fiber-verdict-head span,
561
+ .theme-dark .fiber-verdict[data-verdict="different"] .fiber-verdict-head strong {
562
+ color: #fb7185;
563
+ }
564
+
565
+ @keyframes fiber-verdict-settle {
566
+ 0% {
567
+ transform: translateY(4px);
568
+ }
569
+ 100% {
570
+ transform: translateY(0);
571
+ }
572
+ }
573
+
574
+ @keyframes fiber-verdict-copy {
575
+ 0% {
576
+ opacity: 0;
577
+ transform: translateY(6px);
578
+ }
579
+ 100% {
580
+ opacity: 1;
581
+ transform: translateY(0);
582
+ }
583
+ }
584
+
585
+ @keyframes fiber-chart-draw {
586
+ 0% {
587
+ opacity: 0.45;
588
+ stroke-dasharray: 12 18;
589
+ }
590
+ 100% {
591
+ opacity: 1;
592
+ stroke-dasharray: none;
593
+ }
594
+ }
595
+
596
+ @media (prefers-reduced-motion: reduce) {
597
+ .fiber-verdict.is-updating,
598
+ .fiber-verdict.is-updating p,
599
+ .fiber-chart path[stroke],
600
+ .fiber-verdict-meter span {
601
+ animation: none;
602
+ transition: none;
603
+ }
604
+ }
605
+
606
+ .theme-dark .fiber-label,
607
+ .theme-dark .fiber-score {
608
+ background: rgba(0, 0, 0, 0.58);
609
+ }
610
+
611
+ .theme-dark .fiber-disclaimer {
612
+ color: #b8c5cf;
613
+ }
614
+
615
+ @media (max-width: 860px) {
616
+ .fiber-stage {
617
+ grid-template-columns: 1fr;
618
+ padding: 10px;
619
+ }
620
+
621
+ .fiber-ocular,
622
+ .fiber-ocular canvas {
623
+ min-height: 320px;
624
+ }
625
+
626
+ .fiber-readouts {
627
+ grid-template-columns: 1fr;
628
+ }
629
+ }