@jjlmoya/utils-science 1.50.0 → 1.52.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 (338) hide show
  1. package/package.json +2 -2
  2. package/src/category/i18n/es.ts +3 -4
  3. package/src/category/i18n/fr.ts +2 -2
  4. package/src/category/i18n/it.ts +2 -2
  5. package/src/category/i18n/pt.ts +2 -2
  6. package/src/category/index.ts +25 -25
  7. package/src/components/PreviewNavSidebar.astro +1 -1
  8. package/src/components/PreviewToolbar.astro +1 -1
  9. package/src/data.ts +1 -1
  10. package/src/env.d.ts +1 -1
  11. package/src/layouts/PreviewLayout.astro +1 -1
  12. package/src/pages/index.astro +1 -1
  13. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  14. package/src/tests/category_seo_quality.test.ts +76 -0
  15. package/src/tests/faq_count.test.ts +19 -19
  16. package/src/tests/i18n_coverage.test.ts +36 -36
  17. package/src/tests/mocks/astro_mock.js +1 -1
  18. package/src/tests/no_h1_in_components.test.ts +1 -1
  19. package/src/tests/script_density.test.ts +94 -94
  20. package/src/tests/seo_length.test.ts +24 -24
  21. package/src/tests/seo_parity.test.ts +5 -5
  22. package/src/tests/seo_translation_completeness.test.ts +76 -0
  23. package/src/tests/seo_wellformed_export.test.ts +65 -0
  24. package/src/tests/spanish_leakage.test.ts +175 -153
  25. package/src/tool/asteroid-impact/component.astro +251 -251
  26. package/src/tool/asteroid-impact/helpers.ts +17 -17
  27. package/src/tool/asteroid-impact/i18n/de.ts +2 -2
  28. package/src/tool/asteroid-impact/i18n/en.ts +2 -2
  29. package/src/tool/asteroid-impact/i18n/es.ts +2 -2
  30. package/src/tool/asteroid-impact/i18n/fr.ts +2 -2
  31. package/src/tool/asteroid-impact/i18n/id.ts +2 -2
  32. package/src/tool/asteroid-impact/i18n/it.ts +2 -2
  33. package/src/tool/asteroid-impact/i18n/ja.ts +2 -2
  34. package/src/tool/asteroid-impact/i18n/ko.ts +2 -2
  35. package/src/tool/asteroid-impact/i18n/nl.ts +2 -2
  36. package/src/tool/asteroid-impact/i18n/pl.ts +2 -2
  37. package/src/tool/asteroid-impact/i18n/pt.ts +2 -2
  38. package/src/tool/asteroid-impact/i18n/ru.ts +2 -2
  39. package/src/tool/asteroid-impact/i18n/sv.ts +2 -2
  40. package/src/tool/asteroid-impact/i18n/tr.ts +2 -2
  41. package/src/tool/asteroid-impact/i18n/zh.ts +2 -2
  42. package/src/tool/asteroid-impact/script.ts +262 -262
  43. package/src/tool/asteroid-impact/seo.astro +15 -15
  44. package/src/tool/asteroid-impact/ui.ts +69 -69
  45. package/src/tool/black-hole-event-horizon-simulator/i18n/de.ts +249 -241
  46. package/src/tool/black-hole-event-horizon-simulator/i18n/fr.ts +252 -247
  47. package/src/tool/black-hole-event-horizon-simulator/i18n/id.ts +259 -259
  48. package/src/tool/black-hole-event-horizon-simulator/i18n/it.ts +255 -252
  49. package/src/tool/black-hole-event-horizon-simulator/i18n/ja.ts +254 -252
  50. package/src/tool/black-hole-event-horizon-simulator/i18n/ko.ts +258 -258
  51. package/src/tool/black-hole-event-horizon-simulator/i18n/nl.ts +256 -252
  52. package/src/tool/black-hole-event-horizon-simulator/i18n/pl.ts +258 -258
  53. package/src/tool/black-hole-event-horizon-simulator/i18n/pt.ts +256 -252
  54. package/src/tool/black-hole-event-horizon-simulator/i18n/ru.ts +258 -258
  55. package/src/tool/black-hole-event-horizon-simulator/i18n/sv.ts +257 -252
  56. package/src/tool/black-hole-event-horizon-simulator/i18n/tr.ts +256 -251
  57. package/src/tool/black-hole-event-horizon-simulator/i18n/zh.ts +261 -252
  58. package/src/tool/cellular-renewal/component.astro +126 -126
  59. package/src/tool/cellular-renewal/i18n/de.ts +1 -1
  60. package/src/tool/cellular-renewal/i18n/en.ts +1 -1
  61. package/src/tool/cellular-renewal/i18n/es.ts +1 -1
  62. package/src/tool/cellular-renewal/i18n/fr.ts +1 -1
  63. package/src/tool/cellular-renewal/i18n/id.ts +1 -1
  64. package/src/tool/cellular-renewal/i18n/it.ts +1 -1
  65. package/src/tool/cellular-renewal/i18n/ja.ts +1 -1
  66. package/src/tool/cellular-renewal/i18n/ko.ts +1 -1
  67. package/src/tool/cellular-renewal/i18n/nl.ts +1 -1
  68. package/src/tool/cellular-renewal/i18n/pl.ts +1 -1
  69. package/src/tool/cellular-renewal/i18n/pt.ts +1 -1
  70. package/src/tool/cellular-renewal/i18n/ru.ts +1 -1
  71. package/src/tool/cellular-renewal/i18n/sv.ts +1 -1
  72. package/src/tool/cellular-renewal/i18n/tr.ts +1 -1
  73. package/src/tool/cellular-renewal/i18n/zh.ts +1 -1
  74. package/src/tool/cellular-renewal/seo.astro +15 -15
  75. package/src/tool/colony-counter/i18n/de.ts +1 -1
  76. package/src/tool/colony-counter/i18n/en.ts +1 -1
  77. package/src/tool/colony-counter/i18n/es.ts +1 -1
  78. package/src/tool/colony-counter/i18n/fr.ts +1 -1
  79. package/src/tool/colony-counter/i18n/id.ts +1 -1
  80. package/src/tool/colony-counter/i18n/it.ts +1 -1
  81. package/src/tool/colony-counter/i18n/ja.ts +1 -1
  82. package/src/tool/colony-counter/i18n/ko.ts +1 -1
  83. package/src/tool/colony-counter/i18n/nl.ts +1 -1
  84. package/src/tool/colony-counter/i18n/pl.ts +1 -1
  85. package/src/tool/colony-counter/i18n/pt.ts +1 -1
  86. package/src/tool/colony-counter/i18n/ru.ts +1 -1
  87. package/src/tool/colony-counter/i18n/sv.ts +1 -1
  88. package/src/tool/colony-counter/i18n/tr.ts +1 -1
  89. package/src/tool/colony-counter/i18n/zh.ts +1 -1
  90. package/src/tool/colony-counter/seo.astro +15 -15
  91. package/src/tool/conway-life-rule-lab/component.astro +1 -1
  92. package/src/tool/conway-life-rule-lab/i18n/de.ts +145 -141
  93. package/src/tool/conway-life-rule-lab/i18n/es.ts +146 -142
  94. package/src/tool/conway-life-rule-lab/i18n/fr.ts +146 -142
  95. package/src/tool/conway-life-rule-lab/i18n/id.ts +146 -145
  96. package/src/tool/conway-life-rule-lab/i18n/it.ts +146 -145
  97. package/src/tool/conway-life-rule-lab/i18n/ja.ts +146 -145
  98. package/src/tool/conway-life-rule-lab/i18n/ko.ts +146 -145
  99. package/src/tool/conway-life-rule-lab/i18n/nl.ts +147 -145
  100. package/src/tool/conway-life-rule-lab/i18n/pl.ts +147 -145
  101. package/src/tool/conway-life-rule-lab/i18n/pt.ts +147 -145
  102. package/src/tool/conway-life-rule-lab/i18n/ru.ts +147 -145
  103. package/src/tool/conway-life-rule-lab/i18n/sv.ts +147 -145
  104. package/src/tool/conway-life-rule-lab/i18n/tr.ts +147 -145
  105. package/src/tool/conway-life-rule-lab/i18n/zh.ts +147 -145
  106. package/src/tool/conway-life-rule-lab/logic/LifeLabRuntime.ts +2 -2
  107. package/src/tool/cosmic-inflation/i18n/ru.ts +105 -105
  108. package/src/tool/crystal-lattice-structure-finder/i18n/de.ts +217 -217
  109. package/src/tool/crystal-lattice-structure-finder/i18n/en.ts +1 -1
  110. package/src/tool/crystal-lattice-structure-finder/i18n/es.ts +217 -217
  111. package/src/tool/crystal-lattice-structure-finder/i18n/fr.ts +217 -217
  112. package/src/tool/crystal-lattice-structure-finder/i18n/id.ts +217 -217
  113. package/src/tool/crystal-lattice-structure-finder/i18n/it.ts +217 -217
  114. package/src/tool/crystal-lattice-structure-finder/i18n/ja.ts +217 -217
  115. package/src/tool/crystal-lattice-structure-finder/i18n/ko.ts +217 -217
  116. package/src/tool/crystal-lattice-structure-finder/i18n/nl.ts +217 -217
  117. package/src/tool/crystal-lattice-structure-finder/i18n/pl.ts +217 -217
  118. package/src/tool/crystal-lattice-structure-finder/i18n/pt.ts +217 -217
  119. package/src/tool/crystal-lattice-structure-finder/i18n/ru.ts +217 -217
  120. package/src/tool/crystal-lattice-structure-finder/i18n/sv.ts +217 -217
  121. package/src/tool/crystal-lattice-structure-finder/i18n/tr.ts +217 -217
  122. package/src/tool/crystal-lattice-structure-finder/i18n/zh.ts +217 -217
  123. package/src/tool/double-slit-decoherence/i18n/de.ts +181 -181
  124. package/src/tool/double-slit-decoherence/i18n/fr.ts +180 -180
  125. package/src/tool/double-slit-decoherence/i18n/id.ts +181 -181
  126. package/src/tool/double-slit-decoherence/i18n/it.ts +180 -180
  127. package/src/tool/double-slit-decoherence/i18n/ja.ts +181 -181
  128. package/src/tool/double-slit-decoherence/i18n/ko.ts +181 -181
  129. package/src/tool/double-slit-decoherence/i18n/nl.ts +181 -181
  130. package/src/tool/double-slit-decoherence/i18n/pl.ts +181 -181
  131. package/src/tool/double-slit-decoherence/i18n/pt.ts +178 -174
  132. package/src/tool/double-slit-decoherence/i18n/ru.ts +180 -180
  133. package/src/tool/double-slit-decoherence/i18n/sv.ts +176 -172
  134. package/src/tool/double-slit-decoherence/i18n/tr.ts +180 -180
  135. package/src/tool/double-slit-decoherence/i18n/zh.ts +181 -181
  136. package/src/tool/dyson-sphere-energy-capture/component.astro +253 -253
  137. package/src/tool/dyson-sphere-energy-capture/i18n/de.ts +194 -194
  138. package/src/tool/dyson-sphere-energy-capture/i18n/en.ts +6 -6
  139. package/src/tool/dyson-sphere-energy-capture/i18n/es.ts +6 -6
  140. package/src/tool/dyson-sphere-energy-capture/i18n/fr.ts +194 -194
  141. package/src/tool/dyson-sphere-energy-capture/i18n/id.ts +195 -195
  142. package/src/tool/dyson-sphere-energy-capture/i18n/it.ts +194 -194
  143. package/src/tool/dyson-sphere-energy-capture/i18n/ja.ts +194 -190
  144. package/src/tool/dyson-sphere-energy-capture/i18n/ko.ts +194 -193
  145. package/src/tool/dyson-sphere-energy-capture/i18n/nl.ts +197 -197
  146. package/src/tool/dyson-sphere-energy-capture/i18n/pl.ts +168 -166
  147. package/src/tool/dyson-sphere-energy-capture/i18n/pt.ts +194 -193
  148. package/src/tool/dyson-sphere-energy-capture/i18n/ru.ts +195 -193
  149. package/src/tool/dyson-sphere-energy-capture/i18n/sv.ts +195 -193
  150. package/src/tool/dyson-sphere-energy-capture/i18n/tr.ts +168 -166
  151. package/src/tool/dyson-sphere-energy-capture/i18n/zh.ts +194 -193
  152. package/src/tool/epidemic-sir-simulator/i18n/de.ts +347 -347
  153. package/src/tool/epidemic-sir-simulator/i18n/es.ts +347 -347
  154. package/src/tool/epidemic-sir-simulator/i18n/fr.ts +347 -347
  155. package/src/tool/epidemic-sir-simulator/i18n/it.ts +346 -346
  156. package/src/tool/epidemic-sir-simulator/i18n/nl.ts +347 -347
  157. package/src/tool/epidemic-sir-simulator/i18n/ru.ts +347 -347
  158. package/src/tool/epidemic-sir-simulator/i18n/sv.ts +347 -347
  159. package/src/tool/epidemic-sir-simulator/i18n/zh.ts +347 -347
  160. package/src/tool/exoplanet-biosignature-detector/i18n/de.ts +186 -186
  161. package/src/tool/exoplanet-biosignature-detector/i18n/en.ts +195 -195
  162. package/src/tool/exoplanet-biosignature-detector/i18n/es.ts +194 -194
  163. package/src/tool/exoplanet-biosignature-detector/i18n/fr.ts +183 -183
  164. package/src/tool/exoplanet-biosignature-detector/i18n/id.ts +193 -193
  165. package/src/tool/exoplanet-biosignature-detector/i18n/it.ts +194 -194
  166. package/src/tool/exoplanet-biosignature-detector/i18n/ja.ts +194 -194
  167. package/src/tool/exoplanet-biosignature-detector/i18n/ko.ts +194 -194
  168. package/src/tool/exoplanet-biosignature-detector/i18n/nl.ts +194 -194
  169. package/src/tool/exoplanet-biosignature-detector/i18n/pl.ts +144 -144
  170. package/src/tool/exoplanet-biosignature-detector/i18n/pt.ts +146 -146
  171. package/src/tool/exoplanet-biosignature-detector/i18n/ru.ts +143 -143
  172. package/src/tool/exoplanet-biosignature-detector/i18n/sv.ts +144 -144
  173. package/src/tool/exoplanet-biosignature-detector/i18n/tr.ts +145 -145
  174. package/src/tool/exoplanet-biosignature-detector/i18n/zh.ts +194 -194
  175. package/src/tool/global-albedo-snowball-simulator/component.astro +1 -1
  176. package/src/tool/global-albedo-snowball-simulator/i18n/de.ts +169 -169
  177. package/src/tool/global-albedo-snowball-simulator/i18n/fr.ts +169 -169
  178. package/src/tool/global-albedo-snowball-simulator/i18n/id.ts +169 -169
  179. package/src/tool/global-albedo-snowball-simulator/i18n/it.ts +87 -87
  180. package/src/tool/global-albedo-snowball-simulator/i18n/ja.ts +87 -87
  181. package/src/tool/global-albedo-snowball-simulator/i18n/ko.ts +169 -169
  182. package/src/tool/global-albedo-snowball-simulator/i18n/nl.ts +169 -169
  183. package/src/tool/global-albedo-snowball-simulator/i18n/pl.ts +169 -169
  184. package/src/tool/global-albedo-snowball-simulator/i18n/pt.ts +169 -169
  185. package/src/tool/global-albedo-snowball-simulator/i18n/ru.ts +165 -161
  186. package/src/tool/global-albedo-snowball-simulator/i18n/sv.ts +169 -169
  187. package/src/tool/global-albedo-snowball-simulator/i18n/tr.ts +169 -169
  188. package/src/tool/global-albedo-snowball-simulator/i18n/zh.ts +169 -169
  189. package/src/tool/lorenz-attractor/i18n/de.ts +144 -143
  190. package/src/tool/lorenz-attractor/i18n/fr.ts +144 -144
  191. package/src/tool/lorenz-attractor/i18n/id.ts +149 -149
  192. package/src/tool/lorenz-attractor/i18n/it.ts +149 -149
  193. package/src/tool/lorenz-attractor/i18n/ja.ts +149 -149
  194. package/src/tool/lorenz-attractor/i18n/ko.ts +149 -149
  195. package/src/tool/lorenz-attractor/i18n/nl.ts +149 -149
  196. package/src/tool/lorenz-attractor/i18n/pl.ts +149 -149
  197. package/src/tool/lorenz-attractor/i18n/pt.ts +142 -141
  198. package/src/tool/lorenz-attractor/i18n/ru.ts +149 -149
  199. package/src/tool/lorenz-attractor/i18n/sv.ts +149 -149
  200. package/src/tool/lorenz-attractor/i18n/tr.ts +149 -149
  201. package/src/tool/lorenz-attractor/i18n/zh.ts +149 -149
  202. package/src/tool/mandelbrot-fractal/i18n/de.ts +158 -158
  203. package/src/tool/mandelbrot-fractal/i18n/fr.ts +158 -158
  204. package/src/tool/mandelbrot-fractal/i18n/id.ts +159 -159
  205. package/src/tool/mandelbrot-fractal/i18n/it.ts +155 -151
  206. package/src/tool/mandelbrot-fractal/i18n/ja.ts +159 -159
  207. package/src/tool/mandelbrot-fractal/i18n/ko.ts +159 -159
  208. package/src/tool/mandelbrot-fractal/i18n/nl.ts +159 -159
  209. package/src/tool/mandelbrot-fractal/i18n/pl.ts +157 -153
  210. package/src/tool/mandelbrot-fractal/i18n/pt.ts +158 -158
  211. package/src/tool/mandelbrot-fractal/i18n/ru.ts +159 -159
  212. package/src/tool/mandelbrot-fractal/i18n/sv.ts +159 -150
  213. package/src/tool/mandelbrot-fractal/i18n/tr.ts +159 -159
  214. package/src/tool/mandelbrot-fractal/i18n/zh.ts +159 -159
  215. package/src/tool/microwave-detector/component.astro +238 -238
  216. package/src/tool/microwave-detector/i18n/de.ts +1 -1
  217. package/src/tool/microwave-detector/i18n/en.ts +1 -1
  218. package/src/tool/microwave-detector/i18n/es.ts +1 -1
  219. package/src/tool/microwave-detector/i18n/fr.ts +1 -1
  220. package/src/tool/microwave-detector/i18n/id.ts +1 -1
  221. package/src/tool/microwave-detector/i18n/it.ts +1 -1
  222. package/src/tool/microwave-detector/i18n/ja.ts +1 -1
  223. package/src/tool/microwave-detector/i18n/ko.ts +1 -1
  224. package/src/tool/microwave-detector/i18n/nl.ts +1 -1
  225. package/src/tool/microwave-detector/i18n/pl.ts +1 -1
  226. package/src/tool/microwave-detector/i18n/pt.ts +1 -1
  227. package/src/tool/microwave-detector/i18n/ru.ts +1 -1
  228. package/src/tool/microwave-detector/i18n/sv.ts +1 -1
  229. package/src/tool/microwave-detector/i18n/tr.ts +1 -1
  230. package/src/tool/microwave-detector/i18n/zh.ts +1 -1
  231. package/src/tool/microwave-detector/seo.astro +15 -15
  232. package/src/tool/natural-selection-drift/component.astro +135 -135
  233. package/src/tool/natural-selection-drift/i18n/de.ts +164 -160
  234. package/src/tool/natural-selection-drift/i18n/fr.ts +204 -204
  235. package/src/tool/natural-selection-drift/i18n/id.ts +156 -154
  236. package/src/tool/natural-selection-drift/i18n/it.ts +197 -193
  237. package/src/tool/natural-selection-drift/i18n/ja.ts +155 -154
  238. package/src/tool/natural-selection-drift/i18n/ko.ts +155 -154
  239. package/src/tool/natural-selection-drift/i18n/nl.ts +164 -163
  240. package/src/tool/natural-selection-drift/i18n/pl.ts +168 -166
  241. package/src/tool/natural-selection-drift/i18n/pt.ts +200 -195
  242. package/src/tool/natural-selection-drift/i18n/ru.ts +186 -184
  243. package/src/tool/natural-selection-drift/i18n/sv.ts +157 -154
  244. package/src/tool/natural-selection-drift/i18n/tr.ts +186 -184
  245. package/src/tool/natural-selection-drift/i18n/zh.ts +160 -154
  246. package/src/tool/natural-selection-drift/natural-selection-drift.css +563 -563
  247. package/src/tool/phase-diagram-critical-points/i18n/de.ts +178 -178
  248. package/src/tool/phase-diagram-critical-points/i18n/fr.ts +178 -178
  249. package/src/tool/phase-diagram-critical-points/i18n/id.ts +179 -179
  250. package/src/tool/phase-diagram-critical-points/i18n/it.ts +179 -179
  251. package/src/tool/phase-diagram-critical-points/i18n/ja.ts +179 -179
  252. package/src/tool/phase-diagram-critical-points/i18n/ko.ts +179 -179
  253. package/src/tool/phase-diagram-critical-points/i18n/nl.ts +179 -179
  254. package/src/tool/phase-diagram-critical-points/i18n/pl.ts +179 -179
  255. package/src/tool/phase-diagram-critical-points/i18n/pt.ts +179 -179
  256. package/src/tool/phase-diagram-critical-points/i18n/ru.ts +179 -179
  257. package/src/tool/phase-diagram-critical-points/i18n/sv.ts +179 -179
  258. package/src/tool/phase-diagram-critical-points/i18n/tr.ts +179 -179
  259. package/src/tool/phase-diagram-critical-points/i18n/zh.ts +179 -179
  260. package/src/tool/planet-atmosphere-survival/i18n/de.ts +255 -255
  261. package/src/tool/planet-atmosphere-survival/i18n/fr.ts +255 -255
  262. package/src/tool/planet-atmosphere-survival/i18n/id.ts +255 -255
  263. package/src/tool/planet-atmosphere-survival/i18n/it.ts +255 -255
  264. package/src/tool/planet-atmosphere-survival/i18n/ja.ts +255 -255
  265. package/src/tool/planet-atmosphere-survival/i18n/ko.ts +255 -255
  266. package/src/tool/planet-atmosphere-survival/i18n/nl.ts +255 -255
  267. package/src/tool/planet-atmosphere-survival/i18n/pl.ts +255 -255
  268. package/src/tool/planet-atmosphere-survival/i18n/pt.ts +255 -255
  269. package/src/tool/planet-atmosphere-survival/i18n/ru.ts +227 -223
  270. package/src/tool/planet-atmosphere-survival/i18n/sv.ts +255 -255
  271. package/src/tool/planet-atmosphere-survival/i18n/tr.ts +255 -255
  272. package/src/tool/planet-atmosphere-survival/i18n/zh.ts +255 -255
  273. package/src/tool/radioactive-decay/i18n/de.ts +168 -164
  274. package/src/tool/radioactive-decay/i18n/fr.ts +76 -75
  275. package/src/tool/radioactive-decay/i18n/id.ts +169 -165
  276. package/src/tool/radioactive-decay/i18n/it.ts +76 -74
  277. package/src/tool/radioactive-decay/i18n/ja.ts +168 -167
  278. package/src/tool/radioactive-decay/i18n/ko.ts +168 -167
  279. package/src/tool/radioactive-decay/i18n/nl.ts +170 -168
  280. package/src/tool/radioactive-decay/i18n/pl.ts +170 -168
  281. package/src/tool/radioactive-decay/i18n/pt.ts +169 -167
  282. package/src/tool/radioactive-decay/i18n/ru.ts +170 -168
  283. package/src/tool/radioactive-decay/i18n/sv.ts +170 -168
  284. package/src/tool/radioactive-decay/i18n/tr.ts +171 -168
  285. package/src/tool/radioactive-decay/i18n/zh.ts +171 -167
  286. package/src/tool/roche-limit-satellite-disruption/i18n/de.ts +241 -241
  287. package/src/tool/roche-limit-satellite-disruption/i18n/fr.ts +241 -241
  288. package/src/tool/roche-limit-satellite-disruption/i18n/id.ts +241 -241
  289. package/src/tool/roche-limit-satellite-disruption/i18n/it.ts +241 -241
  290. package/src/tool/roche-limit-satellite-disruption/i18n/ja.ts +241 -241
  291. package/src/tool/roche-limit-satellite-disruption/i18n/ko.ts +241 -241
  292. package/src/tool/roche-limit-satellite-disruption/i18n/nl.ts +241 -241
  293. package/src/tool/roche-limit-satellite-disruption/i18n/pl.ts +237 -229
  294. package/src/tool/roche-limit-satellite-disruption/i18n/pt.ts +241 -241
  295. package/src/tool/roche-limit-satellite-disruption/i18n/ru.ts +241 -241
  296. package/src/tool/roche-limit-satellite-disruption/i18n/sv.ts +241 -241
  297. package/src/tool/roche-limit-satellite-disruption/i18n/tr.ts +241 -241
  298. package/src/tool/roche-limit-satellite-disruption/i18n/zh.ts +241 -241
  299. package/src/tool/simulation-probability/component.astro +138 -138
  300. package/src/tool/simulation-probability/i18n/de.ts +1 -1
  301. package/src/tool/simulation-probability/i18n/en.ts +1 -1
  302. package/src/tool/simulation-probability/i18n/es.ts +1 -1
  303. package/src/tool/simulation-probability/i18n/fr.ts +1 -1
  304. package/src/tool/simulation-probability/i18n/id.ts +1 -1
  305. package/src/tool/simulation-probability/i18n/it.ts +1 -1
  306. package/src/tool/simulation-probability/i18n/ja.ts +1 -1
  307. package/src/tool/simulation-probability/i18n/ko.ts +1 -1
  308. package/src/tool/simulation-probability/i18n/nl.ts +1 -1
  309. package/src/tool/simulation-probability/i18n/pl.ts +1 -1
  310. package/src/tool/simulation-probability/i18n/pt.ts +1 -1
  311. package/src/tool/simulation-probability/i18n/ru.ts +1 -1
  312. package/src/tool/simulation-probability/i18n/sv.ts +1 -1
  313. package/src/tool/simulation-probability/i18n/tr.ts +1 -1
  314. package/src/tool/simulation-probability/i18n/zh.ts +1 -1
  315. package/src/tool/simulation-probability/seo.astro +15 -15
  316. package/src/tool/stellar-habitability-zone/i18n/ru.ts +189 -189
  317. package/src/tool/temperature-timeline/i18n/de.ts +2 -1
  318. package/src/tool/temperature-timeline/i18n/fr.ts +177 -177
  319. package/src/tool/temperature-timeline/i18n/it.ts +142 -141
  320. package/src/tool/temperature-timeline/i18n/pt.ts +3 -1
  321. package/src/tool/temperature-timeline/i18n/ru.ts +116 -114
  322. package/src/tool/three-body-problem/app.ts +4 -4
  323. package/src/tool/three-body-problem/component.astro +6 -6
  324. package/src/tool/twin-paradox-visualizer/i18n/de.ts +168 -168
  325. package/src/tool/twin-paradox-visualizer/i18n/es.ts +165 -165
  326. package/src/tool/twin-paradox-visualizer/i18n/fr.ts +168 -168
  327. package/src/tool/twin-paradox-visualizer/i18n/id.ts +168 -168
  328. package/src/tool/twin-paradox-visualizer/i18n/it.ts +168 -168
  329. package/src/tool/twin-paradox-visualizer/i18n/ja.ts +168 -168
  330. package/src/tool/twin-paradox-visualizer/i18n/ko.ts +168 -168
  331. package/src/tool/twin-paradox-visualizer/i18n/nl.ts +168 -168
  332. package/src/tool/twin-paradox-visualizer/i18n/pl.ts +168 -168
  333. package/src/tool/twin-paradox-visualizer/i18n/pt.ts +164 -160
  334. package/src/tool/twin-paradox-visualizer/i18n/ru.ts +168 -168
  335. package/src/tool/twin-paradox-visualizer/i18n/sv.ts +168 -168
  336. package/src/tool/twin-paradox-visualizer/i18n/tr.ts +168 -168
  337. package/src/tool/twin-paradox-visualizer/i18n/zh.ts +168 -168
  338. package/src/types.ts +1 -1
@@ -1,563 +1,563 @@
1
- .ns-app {
2
- --ns-bg: #f7fafc;
3
- --ns-text: #0f172a;
4
- --ns-muted: rgba(15, 23, 42, 0.62);
5
- --ns-panel: rgba(255, 255, 255, 0.34);
6
- --ns-border: rgba(255, 255, 255, 0.18);
7
- --ns-track: rgba(15, 23, 42, 0.12);
8
- --ns-thumb: #fff;
9
- --ns-accent: #16a34a;
10
-
11
- padding: 1.25rem;
12
- color: var(--ns-text);
13
- }
14
-
15
- .theme-light .ns-app {
16
- --ns-bg: #f8fbff;
17
- --ns-text: #0f172a;
18
- --ns-muted: rgba(15, 23, 42, 0.58);
19
- --ns-panel: rgba(255, 255, 255, 0.72);
20
- --ns-border: rgba(148, 163, 184, 0.22);
21
- --ns-track: rgba(15, 23, 42, 0.14);
22
- --ns-thumb: #fff;
23
- --ns-accent: #0f766e;
24
- }
25
-
26
- .theme-dark .ns-app {
27
- --ns-bg: #020617;
28
- --ns-text: #f8fafc;
29
- --ns-muted: rgba(255, 255, 255, 0.7);
30
- --ns-panel: rgba(255, 255, 255, 0.03);
31
- --ns-border: rgba(255, 255, 255, 0.08);
32
- --ns-track: rgba(255, 255, 255, 0.1);
33
- --ns-thumb: #fff;
34
- --ns-accent: #86efac;
35
- }
36
-
37
- .ns-card {
38
- position: relative;
39
- min-height: min(84vh, 920px);
40
- overflow: hidden;
41
- padding: clamp(16px, 4vw, 24px);
42
- border-radius: 32px;
43
- background:
44
- radial-gradient(circle at 50% 50%, rgba(34, 197, 94, 0.08), transparent 34%),
45
- radial-gradient(circle at 15% 10%, rgba(56, 189, 248, 0.09), transparent 24%),
46
- var(--ns-bg);
47
- border: 1px solid var(--ns-border);
48
- box-shadow: 0 30px 90px rgba(2, 6, 23, 0.18);
49
- }
50
-
51
- .theme-light .ns-card {
52
- background:
53
- radial-gradient(circle at 50% 50%, rgba(45, 212, 191, 0.16), transparent 32%),
54
- radial-gradient(circle at 15% 10%, rgba(59, 130, 246, 0.12), transparent 22%),
55
- linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(244, 248, 255, 0.94)),
56
- var(--ns-bg);
57
- box-shadow: 0 28px 80px rgba(148, 163, 184, 0.22);
58
- }
59
-
60
- .ns-canvas {
61
- position: absolute;
62
- inset: 0;
63
- width: 100%;
64
- height: 100%;
65
- display: block;
66
- z-index: 1;
67
- }
68
-
69
- .ns-canvas-badge {
70
- position: absolute;
71
- top: clamp(16px, 3vw, 24px);
72
- right: clamp(16px, 3vw, 24px);
73
- z-index: 2;
74
- padding: 0.4rem 0.7rem;
75
- border-radius: 999px;
76
- background: rgba(2, 6, 23, 0.75);
77
- border: 1px solid rgba(255, 255, 255, 0.12);
78
- color: rgba(255, 255, 255, 0.92);
79
- font-size: 11px;
80
- font-weight: 700;
81
- text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
82
- pointer-events: none;
83
- }
84
-
85
- .theme-dark .ns-canvas-badge {
86
- background: rgba(255, 255, 255, 0.08);
87
- }
88
-
89
- .theme-light .ns-canvas-badge {
90
- background: rgba(255, 255, 255, 0.88);
91
- border-color: rgba(148, 163, 184, 0.2);
92
- color: #0f172a;
93
- text-shadow: none;
94
- box-shadow: 0 10px 30px rgba(148, 163, 184, 0.16);
95
- }
96
-
97
- .ns-top-hud {
98
- position: absolute;
99
- left: max(360px, clamp(16px, 3vw, 24px));
100
- right: clamp(120px, 18vw, 220px);
101
- top: clamp(16px, 3vw, 24px);
102
- z-index: 2;
103
- display: grid;
104
- grid-template-columns: repeat(2, minmax(0, 1fr));
105
- gap: 1rem;
106
- pointer-events: none;
107
- }
108
-
109
- .ns-top-hud-item {
110
- background: transparent;
111
- border: 0;
112
- padding: 0;
113
- }
114
-
115
- .ns-top-hud-item span {
116
- display: block;
117
- color: var(--ns-muted);
118
- font-size: 11px;
119
- letter-spacing: 0.08em;
120
- text-transform: uppercase;
121
- }
122
-
123
- .ns-top-hud-item strong {
124
- display: block;
125
- margin-top: 8px;
126
- font-size: clamp(1.1rem, 1.6vw, 1.6rem);
127
- line-height: 1;
128
- color: var(--ns-text);
129
- }
130
-
131
- .ns-console {
132
- position: absolute;
133
- left: clamp(16px, 4vw, 24px);
134
- top: clamp(16px, 4vw, 24px);
135
- bottom: clamp(16px, 4vw, 24px);
136
- z-index: 2;
137
- width: min(340px, calc(100% - 2rem));
138
- display: flex;
139
- flex-direction: column;
140
- gap: 1rem;
141
- padding: clamp(16px, 2.5vw, 24px);
142
- border-radius: 24px;
143
- background: rgba(0, 0, 0, 0.02);
144
- border: 1px solid rgba(255, 255, 255, 0.08);
145
- backdrop-filter: blur(16px);
146
- }
147
-
148
- .theme-dark .ns-console {
149
- background: rgba(255, 255, 255, 0.03);
150
- }
151
-
152
- .theme-light .ns-console {
153
- background: rgba(255, 255, 255, 0.84);
154
- border-color: rgba(148, 163, 184, 0.18);
155
- box-shadow: 0 18px 50px rgba(148, 163, 184, 0.14);
156
- }
157
-
158
- .ns-console-header h3 {
159
- margin: 0.2rem 0 0;
160
- font-size: 1.15rem;
161
- line-height: 1.1;
162
- }
163
-
164
- .ns-console-kicker {
165
- display: inline-block;
166
- font-size: 0.72rem;
167
- letter-spacing: 0.18em;
168
- text-transform: uppercase;
169
- color: var(--ns-muted);
170
- }
171
-
172
- .ns-slider-row {
173
- position: relative;
174
- display: grid;
175
- gap: 0.45rem;
176
- }
177
-
178
- .ns-slider-row label {
179
- display: flex;
180
- align-items: center;
181
- justify-content: space-between;
182
- gap: 1rem;
183
- font-size: 0.9rem;
184
- font-weight: 600;
185
- color: var(--ns-muted);
186
- }
187
-
188
- .ns-slider-value {
189
- position: static;
190
- padding: 0;
191
- border-radius: 0;
192
- background: transparent;
193
- color: var(--ns-accent);
194
- font-size: 0.78rem;
195
- line-height: 1;
196
- font-variant-numeric: tabular-nums;
197
- opacity: 1;
198
- transition: none;
199
- pointer-events: none;
200
- }
201
-
202
- .theme-dark .ns-slider-value {
203
- background: transparent;
204
- color: var(--ns-accent);
205
- }
206
-
207
- .ns-slider-value.is-visible {
208
- opacity: 1;
209
- }
210
-
211
- .ns-console input[type="range"] {
212
- width: 100%;
213
- appearance: none;
214
- -webkit-appearance: none;
215
- height: 18px;
216
- background: transparent;
217
- margin: 0;
218
- }
219
-
220
- .ns-console input[type="range"]::-webkit-slider-runnable-track {
221
- height: 1px;
222
- background: var(--ns-track);
223
- border-radius: 999px;
224
- }
225
-
226
- .ns-console input[type="range"]::-moz-range-track {
227
- height: 1px;
228
- background: var(--ns-track);
229
- border-radius: 999px;
230
- }
231
-
232
- .ns-console input[type="range"]::-webkit-slider-thumb {
233
- -webkit-appearance: none;
234
- appearance: none;
235
- width: 16px;
236
- height: 16px;
237
- margin-top: -8px;
238
- border-radius: 999px;
239
- border: 0;
240
- background: var(--ns-thumb);
241
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
242
- }
243
-
244
- .ns-console input[type="range"]::-moz-range-thumb {
245
- width: 16px;
246
- height: 16px;
247
- border-radius: 999px;
248
- border: 0;
249
- background: var(--ns-thumb);
250
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
251
- }
252
-
253
- .ns-run-btn {
254
- margin-top: auto;
255
- height: 40px;
256
- display: inline-flex;
257
- align-items: center;
258
- justify-content: center;
259
- gap: 0.5rem;
260
- border: 0;
261
- border-radius: 999px;
262
- padding: 0.9rem 1rem;
263
- background: linear-gradient(135deg, rgba(22, 163, 74, 0.95), rgba(56, 189, 248, 0.92));
264
- color: #001018;
265
- font-weight: 800;
266
- box-shadow: 0 16px 30px rgba(34, 197, 94, 0.16);
267
- transition: transform 0.18s ease, box-shadow 0.18s ease, filter 0.18s ease;
268
- }
269
-
270
- .ns-run-btn:hover {
271
- transform: translateY(-1px);
272
- filter: saturate(1.06);
273
- }
274
-
275
- .ns-run-btn:active {
276
- transform: translateY(1px) scale(0.99);
277
- }
278
-
279
- .ns-hud {
280
- position: absolute;
281
- left: max(360px, clamp(16px, 3vw, 24px));
282
- right: clamp(16px, 3vw, 24px);
283
- bottom: clamp(16px, 3vw, 24px);
284
- z-index: 2;
285
- display: grid;
286
- grid-template-columns: repeat(2, minmax(0, 1fr));
287
- gap: 1rem;
288
- pointer-events: none;
289
- }
290
-
291
- .ns-hud-item {
292
- padding: 0.5rem 0;
293
- background: transparent;
294
- border: 0;
295
- }
296
-
297
- .ns-hud-item span {
298
- display: block;
299
- color: var(--ns-muted);
300
- font-size: 11px;
301
- letter-spacing: 0.08em;
302
- text-transform: uppercase;
303
- }
304
-
305
- .ns-hud-item strong {
306
- display: block;
307
- margin-top: 8px;
308
- font-size: clamp(1.4rem, 2vw, 2.5rem);
309
- line-height: 1;
310
- color: var(--ns-text);
311
- }
312
-
313
- .ns-alleles {
314
- position: absolute;
315
- right: clamp(16px, 3vw, 24px);
316
- top: clamp(72px, 8vw, 108px);
317
- z-index: 2;
318
- display: grid;
319
- grid-template-columns: minmax(180px, 226px);
320
- gap: 0.3rem;
321
- pointer-events: none;
322
- }
323
-
324
- .ns-allele-chip {
325
- --chip-accent: rgba(255, 255, 255, 0.24);
326
- --rank-scale: 0.5;
327
-
328
- display: grid;
329
- grid-template-columns: 1fr auto;
330
- align-items: center;
331
- gap: 0.35rem;
332
- padding: 0.36rem 0.5rem 0.36rem 0.78rem;
333
- border-radius: 14px;
334
- background: rgba(2, 6, 23, 0.42);
335
- border: 1px solid rgba(255, 255, 255, 0.08);
336
- backdrop-filter: blur(14px);
337
- position: relative;
338
- overflow: hidden;
339
- transition: transform 0.18s ease, opacity 0.18s ease;
340
- }
341
-
342
- .ns-allele-chip::before {
343
- content: "";
344
- position: absolute;
345
- inset: 0;
346
- width: 4px;
347
- background: var(--chip-accent);
348
- }
349
-
350
- .ns-allele-chip.allele-1 { --chip-accent: linear-gradient(180deg, #7dd3fc, #0284c7); }
351
- .ns-allele-chip.allele-2 { --chip-accent: linear-gradient(180deg, #86efac, #16a34a); }
352
- .ns-allele-chip.allele-3 { --chip-accent: linear-gradient(180deg, #f9a8d4, #db2777); }
353
- .ns-allele-chip.allele-4 { --chip-accent: linear-gradient(180deg, #fde68a, #f59e0b); }
354
- .ns-allele-chip.allele-5 { --chip-accent: linear-gradient(180deg, #c4b5fd, #7c3aed); }
355
- .ns-allele-chip.allele-6 { --chip-accent: linear-gradient(180deg, #fdba74, #ea580c); }
356
- .ns-allele-chip.allele-7 { --chip-accent: linear-gradient(180deg, #6ee7b7, #059669); }
357
- .ns-allele-chip.allele-8 { --chip-accent: linear-gradient(180deg, #fca5a5, #ef4444); }
358
-
359
- .ns-allele-chip.is-updated {
360
- animation: chipPulse 180ms ease-out;
361
- }
362
-
363
- .theme-dark .ns-allele-chip {
364
- background: rgba(255, 255, 255, 0.03);
365
- }
366
-
367
- .theme-light .ns-allele-chip {
368
- background: rgba(255, 255, 255, 0.78);
369
- border-color: rgba(148, 163, 184, 0.18);
370
- box-shadow: 0 12px 28px rgba(148, 163, 184, 0.12);
371
- }
372
-
373
- .ns-allele-chip span {
374
- font-size: 8px;
375
- letter-spacing: 0.08em;
376
- text-transform: uppercase;
377
- color: var(--ns-muted);
378
- }
379
-
380
- .ns-allele-chip strong {
381
- font-size: 0.92rem;
382
- line-height: 1;
383
- color: var(--ns-text);
384
- text-shadow: 0 0 10px rgba(255,255,255,0.04);
385
- justify-self: end;
386
- }
387
-
388
- .ns-allele-bar {
389
- grid-column: 1 / -1;
390
- height: 2px;
391
- border-radius: 999px;
392
- background: rgba(255,255,255,0.06);
393
- overflow: hidden;
394
- }
395
-
396
- .ns-allele-bar i {
397
- display: block;
398
- width: calc(var(--rank-scale) * 100%);
399
- height: 100%;
400
- border-radius: inherit;
401
- background: var(--chip-accent);
402
- box-shadow: 0 0 18px rgba(255,255,255,0.18);
403
- transition: width 180ms ease;
404
- }
405
-
406
- @keyframes chipPulse {
407
- 0% { transform: translateY(0) scale(1); }
408
- 50% { transform: translateY(-1px) scale(1.02); }
409
- 100% { transform: translateY(0) scale(1); }
410
- }
411
-
412
- @media (min-width: 900px) {
413
- .ns-console {
414
- width: 320px;
415
- }
416
- }
417
-
418
- @media (max-width: 840px) {
419
- .ns-top-hud,
420
- .ns-hud {
421
- left: clamp(16px, 3vw, 24px);
422
- right: clamp(16px, 3vw, 24px);
423
- }
424
-
425
- .ns-alleles {
426
- top: 124px;
427
- grid-template-columns: minmax(0, 1fr);
428
- }
429
- }
430
-
431
- .ns-console-trigger {
432
- display: none;
433
- }
434
-
435
- .ns-console-header-row {
436
- display: flex;
437
- align-items: center;
438
- justify-content: space-between;
439
- gap: 0.5rem;
440
- }
441
-
442
- .ns-console-close {
443
- display: none;
444
- align-items: center;
445
- justify-content: center;
446
- width: 28px;
447
- height: 28px;
448
- border-radius: 50%;
449
- border: 1px solid var(--ns-border);
450
- background: var(--ns-panel);
451
- color: var(--ns-muted);
452
- cursor: pointer;
453
- flex-shrink: 0;
454
- transition: background 0.18s ease, color 0.18s ease;
455
- }
456
-
457
- .ns-console-close:hover {
458
- background: rgba(239, 68, 68, 0.12);
459
- color: #ef4444;
460
- }
461
-
462
- @media (max-width: 640px) {
463
- .ns-console-trigger {
464
- display: inline-flex;
465
- align-items: center;
466
- gap: 0.5rem;
467
- position: absolute;
468
- left: clamp(16px, 4vw, 24px);
469
- bottom: clamp(16px, 4vw, 24px);
470
- z-index: 3;
471
- padding: 0.6rem 1rem;
472
- border-radius: 999px;
473
- border: 1px solid rgba(255, 255, 255, 0.14);
474
- background: rgba(2, 6, 23, 0.72);
475
- backdrop-filter: blur(18px);
476
- color: rgba(255, 255, 255, 0.9);
477
- font-size: 0.78rem;
478
- font-weight: 700;
479
- letter-spacing: 0.06em;
480
- text-transform: uppercase;
481
- cursor: pointer;
482
- transition: background 0.18s ease, transform 0.18s ease, opacity 0.18s ease;
483
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.28);
484
- }
485
-
486
- .theme-light .ns-console-trigger {
487
- background: rgba(255, 255, 255, 0.88);
488
- border-color: rgba(148, 163, 184, 0.22);
489
- color: #0f172a;
490
- box-shadow: 0 8px 24px rgba(148, 163, 184, 0.22);
491
- }
492
-
493
- .ns-console-trigger:hover {
494
- transform: translateY(-1px);
495
- }
496
-
497
- .ns-console-trigger[aria-expanded="true"] {
498
- opacity: 0;
499
- pointer-events: none;
500
- }
501
-
502
- .ns-console {
503
- left: 0;
504
- right: 0;
505
- top: auto;
506
- bottom: 0;
507
- width: 100%;
508
- border-radius: 24px 24px 0 0;
509
- border-bottom: none;
510
- padding: 1.25rem clamp(16px, 4vw, 24px) calc(clamp(16px, 4vw, 24px) + env(safe-area-inset-bottom, 0px));
511
- transform: translateY(110%);
512
- transition: transform 0.32s cubic-bezier(0.4, 0, 0.2, 1);
513
- background: rgba(7, 9, 13, 0.88);
514
- border-top: 1px solid rgba(255, 255, 255, 0.1);
515
- backdrop-filter: blur(24px);
516
- max-height: 80vh;
517
- overflow-y: auto;
518
- overscroll-behavior: contain;
519
- }
520
-
521
- .theme-light .ns-console {
522
- background: rgba(255, 255, 255, 0.96);
523
- border-top-color: rgba(148, 163, 184, 0.2);
524
- }
525
-
526
- .ns-console.is-open {
527
- transform: translateY(0);
528
- }
529
-
530
- .ns-console-close {
531
- display: inline-flex;
532
- }
533
-
534
- .ns-console::before {
535
- content: "";
536
- display: block;
537
- width: 40px;
538
- height: 4px;
539
- border-radius: 999px;
540
- background: rgba(255, 255, 255, 0.18);
541
- margin: 0 auto 1rem;
542
- }
543
-
544
- .theme-light .ns-console::before {
545
- background: rgba(15, 23, 42, 0.14);
546
- }
547
-
548
- .ns-alleles {
549
- top: 72px;
550
- right: clamp(12px, 3vw, 16px);
551
- grid-template-columns: minmax(140px, 180px);
552
- }
553
-
554
- .ns-allele-chip {
555
- padding: 0.28rem 0.4rem 0.28rem 0.6rem;
556
- border-radius: 10px;
557
- }
558
-
559
- .ns-hud {
560
- bottom: clamp(72px, 12vw, 96px);
561
- }
562
- }
563
-
1
+ .ns-app {
2
+ --ns-bg: #f7fafc;
3
+ --ns-text: #0f172a;
4
+ --ns-muted: rgba(15, 23, 42, 0.62);
5
+ --ns-panel: rgba(255, 255, 255, 0.34);
6
+ --ns-border: rgba(255, 255, 255, 0.18);
7
+ --ns-track: rgba(15, 23, 42, 0.12);
8
+ --ns-thumb: #fff;
9
+ --ns-accent: #16a34a;
10
+
11
+ padding: 1.25rem;
12
+ color: var(--ns-text);
13
+ }
14
+
15
+ .theme-light .ns-app {
16
+ --ns-bg: #f8fbff;
17
+ --ns-text: #0f172a;
18
+ --ns-muted: rgba(15, 23, 42, 0.58);
19
+ --ns-panel: rgba(255, 255, 255, 0.72);
20
+ --ns-border: rgba(148, 163, 184, 0.22);
21
+ --ns-track: rgba(15, 23, 42, 0.14);
22
+ --ns-thumb: #fff;
23
+ --ns-accent: #0f766e;
24
+ }
25
+
26
+ .theme-dark .ns-app {
27
+ --ns-bg: #020617;
28
+ --ns-text: #f8fafc;
29
+ --ns-muted: rgba(255, 255, 255, 0.7);
30
+ --ns-panel: rgba(255, 255, 255, 0.03);
31
+ --ns-border: rgba(255, 255, 255, 0.08);
32
+ --ns-track: rgba(255, 255, 255, 0.1);
33
+ --ns-thumb: #fff;
34
+ --ns-accent: #86efac;
35
+ }
36
+
37
+ .ns-card {
38
+ position: relative;
39
+ min-height: min(84vh, 920px);
40
+ overflow: hidden;
41
+ padding: clamp(16px, 4vw, 24px);
42
+ border-radius: 32px;
43
+ background:
44
+ radial-gradient(circle at 50% 50%, rgba(34, 197, 94, 0.08), transparent 34%),
45
+ radial-gradient(circle at 15% 10%, rgba(56, 189, 248, 0.09), transparent 24%),
46
+ var(--ns-bg);
47
+ border: 1px solid var(--ns-border);
48
+ box-shadow: 0 30px 90px rgba(2, 6, 23, 0.18);
49
+ }
50
+
51
+ .theme-light .ns-card {
52
+ background:
53
+ radial-gradient(circle at 50% 50%, rgba(45, 212, 191, 0.16), transparent 32%),
54
+ radial-gradient(circle at 15% 10%, rgba(59, 130, 246, 0.12), transparent 22%),
55
+ linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(244, 248, 255, 0.94)),
56
+ var(--ns-bg);
57
+ box-shadow: 0 28px 80px rgba(148, 163, 184, 0.22);
58
+ }
59
+
60
+ .ns-canvas {
61
+ position: absolute;
62
+ inset: 0;
63
+ width: 100%;
64
+ height: 100%;
65
+ display: block;
66
+ z-index: 1;
67
+ }
68
+
69
+ .ns-canvas-badge {
70
+ position: absolute;
71
+ top: clamp(16px, 3vw, 24px);
72
+ right: clamp(16px, 3vw, 24px);
73
+ z-index: 2;
74
+ padding: 0.4rem 0.7rem;
75
+ border-radius: 999px;
76
+ background: rgba(2, 6, 23, 0.75);
77
+ border: 1px solid rgba(255, 255, 255, 0.12);
78
+ color: rgba(255, 255, 255, 0.92);
79
+ font-size: 11px;
80
+ font-weight: 700;
81
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.35);
82
+ pointer-events: none;
83
+ }
84
+
85
+ .theme-dark .ns-canvas-badge {
86
+ background: rgba(255, 255, 255, 0.08);
87
+ }
88
+
89
+ .theme-light .ns-canvas-badge {
90
+ background: rgba(255, 255, 255, 0.88);
91
+ border-color: rgba(148, 163, 184, 0.2);
92
+ color: #0f172a;
93
+ text-shadow: none;
94
+ box-shadow: 0 10px 30px rgba(148, 163, 184, 0.16);
95
+ }
96
+
97
+ .ns-top-hud {
98
+ position: absolute;
99
+ left: max(360px, clamp(16px, 3vw, 24px));
100
+ right: clamp(120px, 18vw, 220px);
101
+ top: clamp(16px, 3vw, 24px);
102
+ z-index: 2;
103
+ display: grid;
104
+ grid-template-columns: repeat(2, minmax(0, 1fr));
105
+ gap: 1rem;
106
+ pointer-events: none;
107
+ }
108
+
109
+ .ns-top-hud-item {
110
+ background: transparent;
111
+ border: 0;
112
+ padding: 0;
113
+ }
114
+
115
+ .ns-top-hud-item span {
116
+ display: block;
117
+ color: var(--ns-muted);
118
+ font-size: 11px;
119
+ letter-spacing: 0.08em;
120
+ text-transform: uppercase;
121
+ }
122
+
123
+ .ns-top-hud-item strong {
124
+ display: block;
125
+ margin-top: 8px;
126
+ font-size: clamp(1.1rem, 1.6vw, 1.6rem);
127
+ line-height: 1;
128
+ color: var(--ns-text);
129
+ }
130
+
131
+ .ns-console {
132
+ position: absolute;
133
+ left: clamp(16px, 4vw, 24px);
134
+ top: clamp(16px, 4vw, 24px);
135
+ bottom: clamp(16px, 4vw, 24px);
136
+ z-index: 2;
137
+ width: min(340px, calc(100% - 2rem));
138
+ display: flex;
139
+ flex-direction: column;
140
+ gap: 1rem;
141
+ padding: clamp(16px, 2.5vw, 24px);
142
+ border-radius: 24px;
143
+ background: rgba(0, 0, 0, 0.02);
144
+ border: 1px solid rgba(255, 255, 255, 0.08);
145
+ backdrop-filter: blur(16px);
146
+ }
147
+
148
+ .theme-dark .ns-console {
149
+ background: rgba(255, 255, 255, 0.03);
150
+ }
151
+
152
+ .theme-light .ns-console {
153
+ background: rgba(255, 255, 255, 0.84);
154
+ border-color: rgba(148, 163, 184, 0.18);
155
+ box-shadow: 0 18px 50px rgba(148, 163, 184, 0.14);
156
+ }
157
+
158
+ .ns-console-header h3 {
159
+ margin: 0.2rem 0 0;
160
+ font-size: 1.15rem;
161
+ line-height: 1.1;
162
+ }
163
+
164
+ .ns-console-kicker {
165
+ display: inline-block;
166
+ font-size: 0.72rem;
167
+ letter-spacing: 0.18em;
168
+ text-transform: uppercase;
169
+ color: var(--ns-muted);
170
+ }
171
+
172
+ .ns-slider-row {
173
+ position: relative;
174
+ display: grid;
175
+ gap: 0.45rem;
176
+ }
177
+
178
+ .ns-slider-row label {
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: space-between;
182
+ gap: 1rem;
183
+ font-size: 0.9rem;
184
+ font-weight: 600;
185
+ color: var(--ns-muted);
186
+ }
187
+
188
+ .ns-slider-value {
189
+ position: static;
190
+ padding: 0;
191
+ border-radius: 0;
192
+ background: transparent;
193
+ color: var(--ns-accent);
194
+ font-size: 0.78rem;
195
+ line-height: 1;
196
+ font-variant-numeric: tabular-nums;
197
+ opacity: 1;
198
+ transition: none;
199
+ pointer-events: none;
200
+ }
201
+
202
+ .theme-dark .ns-slider-value {
203
+ background: transparent;
204
+ color: var(--ns-accent);
205
+ }
206
+
207
+ .ns-slider-value.is-visible {
208
+ opacity: 1;
209
+ }
210
+
211
+ .ns-console input[type="range"] {
212
+ width: 100%;
213
+ appearance: none;
214
+ -webkit-appearance: none;
215
+ height: 18px;
216
+ background: transparent;
217
+ margin: 0;
218
+ }
219
+
220
+ .ns-console input[type="range"]::-webkit-slider-runnable-track {
221
+ height: 1px;
222
+ background: var(--ns-track);
223
+ border-radius: 999px;
224
+ }
225
+
226
+ .ns-console input[type="range"]::-moz-range-track {
227
+ height: 1px;
228
+ background: var(--ns-track);
229
+ border-radius: 999px;
230
+ }
231
+
232
+ .ns-console input[type="range"]::-webkit-slider-thumb {
233
+ -webkit-appearance: none;
234
+ appearance: none;
235
+ width: 16px;
236
+ height: 16px;
237
+ margin-top: -8px;
238
+ border-radius: 999px;
239
+ border: 0;
240
+ background: var(--ns-thumb);
241
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
242
+ }
243
+
244
+ .ns-console input[type="range"]::-moz-range-thumb {
245
+ width: 16px;
246
+ height: 16px;
247
+ border-radius: 999px;
248
+ border: 0;
249
+ background: var(--ns-thumb);
250
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
251
+ }
252
+
253
+ .ns-run-btn {
254
+ margin-top: auto;
255
+ height: 40px;
256
+ display: inline-flex;
257
+ align-items: center;
258
+ justify-content: center;
259
+ gap: 0.5rem;
260
+ border: 0;
261
+ border-radius: 999px;
262
+ padding: 0.9rem 1rem;
263
+ background: linear-gradient(135deg, rgba(22, 163, 74, 0.95), rgba(56, 189, 248, 0.92));
264
+ color: #001018;
265
+ font-weight: 800;
266
+ box-shadow: 0 16px 30px rgba(34, 197, 94, 0.16);
267
+ transition: transform 0.18s ease, box-shadow 0.18s ease, filter 0.18s ease;
268
+ }
269
+
270
+ .ns-run-btn:hover {
271
+ transform: translateY(-1px);
272
+ filter: saturate(1.06);
273
+ }
274
+
275
+ .ns-run-btn:active {
276
+ transform: translateY(1px) scale(0.99);
277
+ }
278
+
279
+ .ns-hud {
280
+ position: absolute;
281
+ left: max(360px, clamp(16px, 3vw, 24px));
282
+ right: clamp(16px, 3vw, 24px);
283
+ bottom: clamp(16px, 3vw, 24px);
284
+ z-index: 2;
285
+ display: grid;
286
+ grid-template-columns: repeat(2, minmax(0, 1fr));
287
+ gap: 1rem;
288
+ pointer-events: none;
289
+ }
290
+
291
+ .ns-hud-item {
292
+ padding: 0.5rem 0;
293
+ background: transparent;
294
+ border: 0;
295
+ }
296
+
297
+ .ns-hud-item span {
298
+ display: block;
299
+ color: var(--ns-muted);
300
+ font-size: 11px;
301
+ letter-spacing: 0.08em;
302
+ text-transform: uppercase;
303
+ }
304
+
305
+ .ns-hud-item strong {
306
+ display: block;
307
+ margin-top: 8px;
308
+ font-size: clamp(1.4rem, 2vw, 2.5rem);
309
+ line-height: 1;
310
+ color: var(--ns-text);
311
+ }
312
+
313
+ .ns-alleles {
314
+ position: absolute;
315
+ right: clamp(16px, 3vw, 24px);
316
+ top: clamp(72px, 8vw, 108px);
317
+ z-index: 2;
318
+ display: grid;
319
+ grid-template-columns: minmax(180px, 226px);
320
+ gap: 0.3rem;
321
+ pointer-events: none;
322
+ }
323
+
324
+ .ns-allele-chip {
325
+ --chip-accent: rgba(255, 255, 255, 0.24);
326
+ --rank-scale: 0.5;
327
+
328
+ display: grid;
329
+ grid-template-columns: 1fr auto;
330
+ align-items: center;
331
+ gap: 0.35rem;
332
+ padding: 0.36rem 0.5rem 0.36rem 0.78rem;
333
+ border-radius: 14px;
334
+ background: rgba(2, 6, 23, 0.42);
335
+ border: 1px solid rgba(255, 255, 255, 0.08);
336
+ backdrop-filter: blur(14px);
337
+ position: relative;
338
+ overflow: hidden;
339
+ transition: transform 0.18s ease, opacity 0.18s ease;
340
+ }
341
+
342
+ .ns-allele-chip::before {
343
+ content: "";
344
+ position: absolute;
345
+ inset: 0;
346
+ width: 4px;
347
+ background: var(--chip-accent);
348
+ }
349
+
350
+ .ns-allele-chip.allele-1 { --chip-accent: linear-gradient(180deg, #7dd3fc, #0284c7); }
351
+ .ns-allele-chip.allele-2 { --chip-accent: linear-gradient(180deg, #86efac, #16a34a); }
352
+ .ns-allele-chip.allele-3 { --chip-accent: linear-gradient(180deg, #f9a8d4, #db2777); }
353
+ .ns-allele-chip.allele-4 { --chip-accent: linear-gradient(180deg, #fde68a, #f59e0b); }
354
+ .ns-allele-chip.allele-5 { --chip-accent: linear-gradient(180deg, #c4b5fd, #7c3aed); }
355
+ .ns-allele-chip.allele-6 { --chip-accent: linear-gradient(180deg, #fdba74, #ea580c); }
356
+ .ns-allele-chip.allele-7 { --chip-accent: linear-gradient(180deg, #6ee7b7, #059669); }
357
+ .ns-allele-chip.allele-8 { --chip-accent: linear-gradient(180deg, #fca5a5, #ef4444); }
358
+
359
+ .ns-allele-chip.is-updated {
360
+ animation: chipPulse 180ms ease-out;
361
+ }
362
+
363
+ .theme-dark .ns-allele-chip {
364
+ background: rgba(255, 255, 255, 0.03);
365
+ }
366
+
367
+ .theme-light .ns-allele-chip {
368
+ background: rgba(255, 255, 255, 0.78);
369
+ border-color: rgba(148, 163, 184, 0.18);
370
+ box-shadow: 0 12px 28px rgba(148, 163, 184, 0.12);
371
+ }
372
+
373
+ .ns-allele-chip span {
374
+ font-size: 8px;
375
+ letter-spacing: 0.08em;
376
+ text-transform: uppercase;
377
+ color: var(--ns-muted);
378
+ }
379
+
380
+ .ns-allele-chip strong {
381
+ font-size: 0.92rem;
382
+ line-height: 1;
383
+ color: var(--ns-text);
384
+ text-shadow: 0 0 10px rgba(255,255,255,0.04);
385
+ justify-self: end;
386
+ }
387
+
388
+ .ns-allele-bar {
389
+ grid-column: 1 / -1;
390
+ height: 2px;
391
+ border-radius: 999px;
392
+ background: rgba(255,255,255,0.06);
393
+ overflow: hidden;
394
+ }
395
+
396
+ .ns-allele-bar i {
397
+ display: block;
398
+ width: calc(var(--rank-scale) * 100%);
399
+ height: 100%;
400
+ border-radius: inherit;
401
+ background: var(--chip-accent);
402
+ box-shadow: 0 0 18px rgba(255,255,255,0.18);
403
+ transition: width 180ms ease;
404
+ }
405
+
406
+ @keyframes chipPulse {
407
+ 0% { transform: translateY(0) scale(1); }
408
+ 50% { transform: translateY(-1px) scale(1.02); }
409
+ 100% { transform: translateY(0) scale(1); }
410
+ }
411
+
412
+ @media (min-width: 900px) {
413
+ .ns-console {
414
+ width: 320px;
415
+ }
416
+ }
417
+
418
+ @media (max-width: 840px) {
419
+ .ns-top-hud,
420
+ .ns-hud {
421
+ left: clamp(16px, 3vw, 24px);
422
+ right: clamp(16px, 3vw, 24px);
423
+ }
424
+
425
+ .ns-alleles {
426
+ top: 124px;
427
+ grid-template-columns: minmax(0, 1fr);
428
+ }
429
+ }
430
+
431
+ .ns-console-trigger {
432
+ display: none;
433
+ }
434
+
435
+ .ns-console-header-row {
436
+ display: flex;
437
+ align-items: center;
438
+ justify-content: space-between;
439
+ gap: 0.5rem;
440
+ }
441
+
442
+ .ns-console-close {
443
+ display: none;
444
+ align-items: center;
445
+ justify-content: center;
446
+ width: 28px;
447
+ height: 28px;
448
+ border-radius: 50%;
449
+ border: 1px solid var(--ns-border);
450
+ background: var(--ns-panel);
451
+ color: var(--ns-muted);
452
+ cursor: pointer;
453
+ flex-shrink: 0;
454
+ transition: background 0.18s ease, color 0.18s ease;
455
+ }
456
+
457
+ .ns-console-close:hover {
458
+ background: rgba(239, 68, 68, 0.12);
459
+ color: #ef4444;
460
+ }
461
+
462
+ @media (max-width: 640px) {
463
+ .ns-console-trigger {
464
+ display: inline-flex;
465
+ align-items: center;
466
+ gap: 0.5rem;
467
+ position: absolute;
468
+ left: clamp(16px, 4vw, 24px);
469
+ bottom: clamp(16px, 4vw, 24px);
470
+ z-index: 3;
471
+ padding: 0.6rem 1rem;
472
+ border-radius: 999px;
473
+ border: 1px solid rgba(255, 255, 255, 0.14);
474
+ background: rgba(2, 6, 23, 0.72);
475
+ backdrop-filter: blur(18px);
476
+ color: rgba(255, 255, 255, 0.9);
477
+ font-size: 0.78rem;
478
+ font-weight: 700;
479
+ letter-spacing: 0.06em;
480
+ text-transform: uppercase;
481
+ cursor: pointer;
482
+ transition: background 0.18s ease, transform 0.18s ease, opacity 0.18s ease;
483
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.28);
484
+ }
485
+
486
+ .theme-light .ns-console-trigger {
487
+ background: rgba(255, 255, 255, 0.88);
488
+ border-color: rgba(148, 163, 184, 0.22);
489
+ color: #0f172a;
490
+ box-shadow: 0 8px 24px rgba(148, 163, 184, 0.22);
491
+ }
492
+
493
+ .ns-console-trigger:hover {
494
+ transform: translateY(-1px);
495
+ }
496
+
497
+ .ns-console-trigger[aria-expanded="true"] {
498
+ opacity: 0;
499
+ pointer-events: none;
500
+ }
501
+
502
+ .ns-console {
503
+ left: 0;
504
+ right: 0;
505
+ top: auto;
506
+ bottom: 0;
507
+ width: 100%;
508
+ border-radius: 24px 24px 0 0;
509
+ border-bottom: none;
510
+ padding: 1.25rem clamp(16px, 4vw, 24px) calc(clamp(16px, 4vw, 24px) + env(safe-area-inset-bottom, 0px));
511
+ transform: translateY(110%);
512
+ transition: transform 0.32s cubic-bezier(0.4, 0, 0.2, 1);
513
+ background: rgba(7, 9, 13, 0.88);
514
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
515
+ backdrop-filter: blur(24px);
516
+ max-height: 80vh;
517
+ overflow-y: auto;
518
+ overscroll-behavior: contain;
519
+ }
520
+
521
+ .theme-light .ns-console {
522
+ background: rgba(255, 255, 255, 0.96);
523
+ border-top-color: rgba(148, 163, 184, 0.2);
524
+ }
525
+
526
+ .ns-console.is-open {
527
+ transform: translateY(0);
528
+ }
529
+
530
+ .ns-console-close {
531
+ display: inline-flex;
532
+ }
533
+
534
+ .ns-console::before {
535
+ content: "";
536
+ display: block;
537
+ width: 40px;
538
+ height: 4px;
539
+ border-radius: 999px;
540
+ background: rgba(255, 255, 255, 0.18);
541
+ margin: 0 auto 1rem;
542
+ }
543
+
544
+ .theme-light .ns-console::before {
545
+ background: rgba(15, 23, 42, 0.14);
546
+ }
547
+
548
+ .ns-alleles {
549
+ top: 72px;
550
+ right: clamp(12px, 3vw, 16px);
551
+ grid-template-columns: minmax(140px, 180px);
552
+ }
553
+
554
+ .ns-allele-chip {
555
+ padding: 0.28rem 0.4rem 0.28rem 0.6rem;
556
+ border-radius: 10px;
557
+ }
558
+
559
+ .ns-hud {
560
+ bottom: clamp(72px, 12vw, 96px);
561
+ }
562
+ }
563
+