@jjlmoya/utils-science 1.20.0 → 1.21.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 (89) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +1 -1
  3. package/src/category/i18n/fr.ts +6 -6
  4. package/src/category/i18n/ru.ts +1 -1
  5. package/src/category/index.ts +3 -1
  6. package/src/category/seo.astro +2 -2
  7. package/src/entries.ts +5 -1
  8. package/src/index.ts +2 -0
  9. package/src/pages/[locale]/[slug].astro +5 -4
  10. package/src/tests/locale_completeness.test.ts +2 -2
  11. package/src/tests/no_en_dash.test.ts +70 -0
  12. package/src/tests/seo_length.test.ts +5 -3
  13. package/src/tests/title_quality.test.ts +1 -1
  14. package/src/tests/tool_validation.test.ts +2 -2
  15. package/src/tool/asteroid-impact/bibliography.astro +2 -2
  16. package/src/tool/asteroid-impact/component.astro +16 -9
  17. package/src/tool/asteroid-impact/i18n/fr.ts +6 -6
  18. package/src/tool/asteroid-impact/i18n/ru.ts +4 -4
  19. package/src/tool/asteroid-impact/index.ts +1 -0
  20. package/src/tool/asteroid-impact/script.ts +13 -7
  21. package/src/tool/cellular-renewal/bibliography.astro +2 -2
  22. package/src/tool/cellular-renewal/i18n/fr.ts +13 -13
  23. package/src/tool/cellular-renewal/i18n/ru.ts +17 -17
  24. package/src/tool/cellular-renewal/i18n/zh.ts +9 -9
  25. package/src/tool/cellular-renewal/index.ts +1 -0
  26. package/src/tool/colony-counter/bibliography.astro +2 -2
  27. package/src/tool/colony-counter/i18n/ru.ts +5 -5
  28. package/src/tool/colony-counter/i18n/zh.ts +2 -2
  29. package/src/tool/colony-counter/index.ts +1 -0
  30. package/src/tool/cosmic-inflation/bibliography.astro +14 -0
  31. package/src/tool/cosmic-inflation/bibliography.ts +12 -0
  32. package/src/tool/cosmic-inflation/component.astro +270 -0
  33. package/src/tool/cosmic-inflation/cosmic-inflation-calculator.css +277 -0
  34. package/src/tool/cosmic-inflation/entry.ts +26 -0
  35. package/src/tool/cosmic-inflation/i18n/de.ts +188 -0
  36. package/src/tool/cosmic-inflation/i18n/en.ts +188 -0
  37. package/src/tool/cosmic-inflation/i18n/es.ts +168 -0
  38. package/src/tool/cosmic-inflation/i18n/fr.ts +188 -0
  39. package/src/tool/cosmic-inflation/i18n/id.ts +188 -0
  40. package/src/tool/cosmic-inflation/i18n/it.ts +188 -0
  41. package/src/tool/cosmic-inflation/i18n/ja.ts +188 -0
  42. package/src/tool/cosmic-inflation/i18n/ko.ts +188 -0
  43. package/src/tool/cosmic-inflation/i18n/nl.ts +188 -0
  44. package/src/tool/cosmic-inflation/i18n/pl.ts +188 -0
  45. package/src/tool/cosmic-inflation/i18n/pt.ts +188 -0
  46. package/src/tool/cosmic-inflation/i18n/ru.ts +188 -0
  47. package/src/tool/cosmic-inflation/i18n/sv.ts +188 -0
  48. package/src/tool/cosmic-inflation/i18n/tr.ts +188 -0
  49. package/src/tool/cosmic-inflation/i18n/zh.ts +188 -0
  50. package/src/tool/cosmic-inflation/index.ts +11 -0
  51. package/src/tool/cosmic-inflation/logic/CosmicInflationEngine.ts +21 -0
  52. package/src/tool/cosmic-inflation/seo.astro +15 -0
  53. package/src/tool/microwave-detector/bibliography.astro +2 -2
  54. package/src/tool/microwave-detector/component.astro +9 -7
  55. package/src/tool/microwave-detector/i18n/fr.ts +4 -4
  56. package/src/tool/microwave-detector/i18n/ru.ts +18 -18
  57. package/src/tool/microwave-detector/i18n/zh.ts +10 -10
  58. package/src/tool/microwave-detector/index.ts +1 -0
  59. package/src/tool/microwave-detector/logic/MicrowaveEngine.ts +5 -1
  60. package/src/tool/simulation-probability/bibliography.astro +2 -2
  61. package/src/tool/simulation-probability/i18n/fr.ts +5 -5
  62. package/src/tool/simulation-probability/i18n/ru.ts +7 -7
  63. package/src/tool/simulation-probability/i18n/zh.ts +4 -4
  64. package/src/tool/simulation-probability/index.ts +1 -0
  65. package/src/tool/temperature-timeline/bibliography.astro +14 -0
  66. package/src/tool/temperature-timeline/bibliography.ts +12 -0
  67. package/src/tool/temperature-timeline/component.astro +289 -0
  68. package/src/tool/temperature-timeline/entry.ts +26 -0
  69. package/src/tool/temperature-timeline/i18n/de.ts +213 -0
  70. package/src/tool/temperature-timeline/i18n/en.ts +213 -0
  71. package/src/tool/temperature-timeline/i18n/es.ts +178 -0
  72. package/src/tool/temperature-timeline/i18n/fr.ts +213 -0
  73. package/src/tool/temperature-timeline/i18n/id.ts +213 -0
  74. package/src/tool/temperature-timeline/i18n/it.ts +213 -0
  75. package/src/tool/temperature-timeline/i18n/ja.ts +213 -0
  76. package/src/tool/temperature-timeline/i18n/ko.ts +213 -0
  77. package/src/tool/temperature-timeline/i18n/nl.ts +213 -0
  78. package/src/tool/temperature-timeline/i18n/pl.ts +213 -0
  79. package/src/tool/temperature-timeline/i18n/pt.ts +213 -0
  80. package/src/tool/temperature-timeline/i18n/ru.ts +213 -0
  81. package/src/tool/temperature-timeline/i18n/sv.ts +213 -0
  82. package/src/tool/temperature-timeline/i18n/tr.ts +213 -0
  83. package/src/tool/temperature-timeline/i18n/zh.ts +213 -0
  84. package/src/tool/temperature-timeline/index.ts +11 -0
  85. package/src/tool/temperature-timeline/logic/TemperatureTimelineEngine.ts +58 -0
  86. package/src/tool/temperature-timeline/planet-temperature-timeline.css +158 -0
  87. package/src/tool/temperature-timeline/seo.astro +15 -0
  88. package/src/tools.ts +4 -0
  89. package/src/types.ts +1 -1
@@ -4,7 +4,7 @@ const title = 'Калькулятор вероятности симуляции:
4
4
  const howTo = [
5
5
  {
6
6
  name: 'Настройте технологический прогресс',
7
- text: 'Оцените вероятность того, что человечество достигнет постчеловеческого уровня. 50% нейтрально; увеличивайте, если верите, что ИИ и вычисления продолжат расти экспоненциально.',
7
+ text: 'Оцените вероятность того, что человечество достигнет постчеловеческого уровня. 50% - нейтрально; увеличивайте, если верите, что ИИ и вычисления продолжат расти экспоненциально.',
8
8
  },
9
9
  {
10
10
  name: 'Установите выживаемость',
@@ -29,16 +29,16 @@ const faq = [
29
29
  answer: 'Нет. Высокие вероятности говорят о том, что это серьезная возможность, которую следует учитывать, но это не доказательство. Аргумент основан на предположениях о будущем технологий, которые могут и не реализоваться.',
30
30
  },
31
31
  {
32
- question: 'Как бы на нас повлияло знание того, что мы симуляция?',
32
+ question: 'Как бы на нас повлияло знание того, что мы - симуляция?',
33
33
  answer: 'Философски многие утверждают, что это ничего не меняет по существу. Если вы и ваши близкие симулируетесь вместе, ваши переживания, эмоции и отношения остаются реальными и ощущаемыми. Важен прожитый опыт, а не субстрат.',
34
34
  },
35
35
  {
36
36
  question: 'Есть ли научные доказательства того, что мы в симуляции?',
37
- answer: 'Убедительных доказательств нет. Некоторые физики указывают на аномалии в квантовой механике (квантование, запутанность) как на возможные «вычислительные оптимизации», но это лишь спекулятивные интерпретации.',
37
+ answer: 'Убедительных доказательств нет. Некоторые физики указывают на аномалии в квантовой механике (квантование, запутанность) как на возможные "вычислительные оптимизации", но это лишь спекулятивные интерпретации.',
38
38
  },
39
39
  {
40
- question: 'Какое значение мне следует присвоить «N» (масштабу симуляции)?',
41
- answer: 'Это зависит от ваших убеждений о будущем вычислительной техники. Низкие значения (1001000) предполагают ограниченность ресурсов. Высокие значения (миллионы) предполагают практически неограниченную вычислительную мощность. В большинстве научных дискуссий используются значения от 1000 до 1 триллиона.',
40
+ question: 'Какое значение мне следует присвоить "N" (масштабу симуляции)?',
41
+ answer: 'Это зависит от ваших убеждений о будущем вычислительной техники. Низкие значения (100-1000) предполагают ограниченность ресурсов. Высокие значения (миллионы) предполагают практически неограниченную вычислительную мощность. В большинстве научных дискуссий используются значения от 1000 до 1 триллиона.',
42
42
  },
43
43
  ];
44
44
  import { bibliography } from '../bibliography';
@@ -81,7 +81,7 @@ export const content: ToolLocaleContent = {
81
81
  },
82
82
  {
83
83
  type: 'paragraph',
84
- html: 'Идея о том, что наша реальность может быть искусственной конструкцией, чрезвычайно продвинутой компьютерной симуляцией, прошла путь от научной фантастики до серьезных философских и научных дебатов. В 2003 году философ Ник Бостром из Оксфордского университета опубликовал статью под названием <em>«Живете ли вы в компьютерной симуляции?»</em>, где предложил аргумент трилеммы, бросающий вызов нашему восприятию бытия.',
84
+ html: 'Идея о том, что наша реальность может быть искусственной конструкцией, чрезвычайно продвинутой компьютерной симуляцией, прошла путь от научной фантастики до серьезных философских и научных дебатов. В 2003 году философ Ник Бостром из Оксфордского университета опубликовал статью под названием <em>"Живете ли вы в компьютерной симуляции?"</em>, где предложил аргумент трилеммы, бросающий вызов нашему восприятию бытия.',
85
85
  },
86
86
  {
87
87
  type: 'paragraph',
@@ -139,7 +139,7 @@ export const content: ToolLocaleContent = {
139
139
  },
140
140
  {
141
141
  type: 'paragraph',
142
- html: 'От квантовой физики до космологии некоторые ученые ищут «глюки» или пределы в разрешении нашей реальности. Если у вселенной есть минимальная длина (Планковская длина) или поведение, похожее на оптимизацию кода (например, квантовая запутанность), гипотеза находит сторонников в области цифровой физики.',
142
+ html: 'От квантовой физики до космологии некоторые ученые ищут "глюки" или пределы в разрешении нашей реальности. Если у вселенной есть минимальная длина (Планковская длина) или поведение, похожее на оптимизацию кода (например, квантовая запутанность), гипотеза находит сторонников в области цифровой физики.',
143
143
  },
144
144
  {
145
145
  type: 'title',
@@ -20,10 +20,10 @@ const faq = [
20
20
  },
21
21
  {
22
22
  question: '是否有科学证据表明我们处于模拟中?',
23
- answer: '目前还没有结论性的证据。一些物理学家将量子力学中的异常现象(如量子化、纠缠)视为可能的“计算优化”,但这些都是推测性的解释。',
23
+ answer: '目前还没有结论性的证据。一些物理学家将量子力学中的异常现象(如量子化、纠缠)视为可能的"计算优化",但这些都是推测性的解释。',
24
24
  },
25
25
  {
26
- question: '我应该给“N”(模拟规模)赋予什么值?',
26
+ question: '我应该给"N"(模拟规模)赋予什么值?',
27
27
  answer: '这取决于您对计算机未来的信念。低值(100-1000)假设资源有限。高值(数百万)假设拥有几乎无限的计算能力。大多数科学讨论使用介于 1000 到 1 万亿之间的值。',
28
28
  },
29
29
  ];
@@ -84,7 +84,7 @@ export const content: ToolLocaleContent = {
84
84
  },
85
85
  {
86
86
  type: 'paragraph',
87
- html: '我们的现实可能是一个人造结构,一个极其先进的计算机模拟,这个想法已经从科幻小说变成了严肃的哲学和科学辩论。2003 年,牛津大学哲学家尼克·波斯特罗姆发表了一篇题为 <em>"你是否生活在计算机模拟中?"</em> 的文章,他在文中提出了一个挑战我们存在认知的“三解困境”论证。',
87
+ html: '我们的现实可能是一个人造结构,一个极其先进的计算机模拟,这个想法已经从科幻小说变成了严肃的哲学和科学辩论。2003 年,牛津大学哲学家尼克·波斯特罗姆发表了一篇题为 <em>"你是否生活在计算机模拟中?"</em> 的文章,他在文中提出了一个挑战我们存在认知的"三解困境"论证。',
88
88
  },
89
89
  {
90
90
  type: 'paragraph',
@@ -141,7 +141,7 @@ export const content: ToolLocaleContent = {
141
141
  },
142
142
  {
143
143
  type: 'paragraph',
144
- html: '从量子物理学到宇宙学,一些科学家正在寻找现实分辨率中的“缺陷”或限制。如果宇宙具有最小长度(普朗克长度)或看起来像代码优化(如量子纠缠)的行为,那么该假设在数字物理学领域就会获得支持者。',
144
+ html: '从量子物理学到宇宙学,一些科学家正在寻找现实分辨率中的"缺陷"或限制。如果宇宙具有最小长度(普朗克长度)或看起来像代码优化(如量子纠缠)的行为,那么该假设在数字物理学领域就会获得支持者。',
145
145
  },
146
146
  {
147
147
  type: 'title',
@@ -1,4 +1,5 @@
1
1
  import { simulationProbability } from './entry';
2
+ import type { ToolDefinition } from '../../types';
2
3
  export * from './entry';
3
4
  export const SIMULATION_PROBABILITY_TOOL: ToolDefinition = {
4
5
  entry: simulationProbability,
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { temperatureTimeline } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await temperatureTimeline.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,12 @@
1
+ import type { BibliographyEntry } from '../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'Global temperatures in the Cenozoic - Nature Geoscience',
6
+ url: 'https://www.nature.com/nature-index/topics/l4/paleoceanographic-dynamics-of-cenozoic-climate-systems',
7
+ },
8
+ {
9
+ name: 'Phanerozoic climate history and temperature trends - Science',
10
+ url: 'https://www.science.org/doi/10.1126/science.adk3705',
11
+ },
12
+ ];
@@ -0,0 +1,289 @@
1
+ ---
2
+ import './planet-temperature-timeline.css';
3
+
4
+ interface Props {
5
+ ui: Record<string, string>;
6
+ }
7
+
8
+ const { ui } = Astro.props;
9
+ ---
10
+
11
+ <div class="timeline-root" id="temperature-timeline-root" data-ui={JSON.stringify(ui)}>
12
+ <div class="timeline-canvas-container" id="timeline-canvas-area">
13
+ <canvas id="timeline-thermal-canvas"></canvas>
14
+ </div>
15
+
16
+ <div class="timeline-ruler-container" id="timeline-ruler">
17
+ <div class="timeline-ruler-track"></div>
18
+ <div class="timeline-ruler-notch" data-index="5">
19
+ <span class="timeline-notch-label">ANT</span>
20
+ <div class="timeline-notch-line"></div>
21
+ </div>
22
+ <div class="timeline-ruler-notch" data-index="4">
23
+ <span class="timeline-notch-label">CEN</span>
24
+ <div class="timeline-notch-line"></div>
25
+ </div>
26
+ <div class="timeline-ruler-notch" data-index="3">
27
+ <span class="timeline-notch-label">MES</span>
28
+ <div class="timeline-notch-line"></div>
29
+ </div>
30
+ <div class="timeline-ruler-notch" data-index="2">
31
+ <span class="timeline-notch-label">PAL</span>
32
+ <div class="timeline-notch-line"></div>
33
+ </div>
34
+ <div class="timeline-ruler-notch" data-index="1">
35
+ <span class="timeline-notch-label">PRO</span>
36
+ <div class="timeline-notch-line"></div>
37
+ </div>
38
+ <div class="timeline-ruler-notch" data-index="0">
39
+ <span class="timeline-notch-label">ARC</span>
40
+ <div class="timeline-notch-line"></div>
41
+ </div>
42
+ </div>
43
+
44
+ <div class="timeline-info-panel">
45
+ <div class="timeline-meta-header">
46
+ <span id="timeline-era-age" class="timeline-age">---</span>
47
+ <h3 id="timeline-era-title" class="timeline-era-name">---</h3>
48
+ </div>
49
+
50
+ <div class="timeline-temp">
51
+ <span id="timeline-era-temp-val">---</span><span class="timeline-temp-unit">°C</span>
52
+ </div>
53
+ </div>
54
+ </div>
55
+
56
+ <script>
57
+ import { TemperatureTimelineEngine } from './logic/TemperatureTimelineEngine';
58
+
59
+ const root = document.getElementById('temperature-timeline-root');
60
+ if (root) {
61
+ const ageEl = document.getElementById('timeline-era-age');
62
+ const titleEl = document.getElementById('timeline-era-title');
63
+ const tempValEl = document.getElementById('timeline-era-temp-val');
64
+ const canvas = document.getElementById('timeline-thermal-canvas') as HTMLCanvasElement;
65
+ const canvasArea = document.getElementById('timeline-canvas-area');
66
+ const notches = document.querySelectorAll('.timeline-ruler-notch');
67
+
68
+ const uiData = JSON.parse(root.getAttribute('data-ui') || '{}');
69
+ const engine = new TemperatureTimelineEngine();
70
+ const epochs = engine.getEpochs().map(epoch => ({
71
+ ...epoch,
72
+ name: uiData[`epoch_${epoch.id}_name`] || epoch.name,
73
+ ageRange: uiData[`epoch_${epoch.id}_age`] || epoch.ageRange,
74
+ description: uiData[`epoch_${epoch.id}_desc`] || epoch.description,
75
+ }));
76
+
77
+ let currentEraIndex = 4;
78
+ let targetRadius = 130;
79
+ let currentRadius = 130;
80
+ let targetSpeed = 0.015;
81
+ let currentSpeed = 0.015;
82
+ const targetColor = { r: 56, g: 189, b: 248 };
83
+ const currentColor = { r: 56, g: 189, b: 248 };
84
+ let isCold = false;
85
+
86
+ function getThemeConfig(temp: number, isDark: boolean) {
87
+ if (temp >= 25) {
88
+ return { color: { r: 234, g: 88, b: 12 }, radius: 160, speed: 0.04, cold: false };
89
+ } else if (temp >= 20) {
90
+ return { color: { r: 249, g: 115, b: 22 }, radius: 140, speed: 0.03, cold: false };
91
+ } else if (temp >= 15) {
92
+ return { color: { r: 217, g: 119, b: 6 }, radius: 130, speed: 0.02, cold: false };
93
+ } else if (temp >= 13) {
94
+ return { color: isDark ? { r: 56, g: 189, b: 248 } : { r: 2, g: 132, b: 199 }, radius: 110, speed: 0.01, cold: true };
95
+ }
96
+ return { color: isDark ? { r: 224, g: 242, b: 254 } : { r: 15, g: 23, b: 42 }, radius: 90, speed: 0.005, cold: true };
97
+ }
98
+
99
+ function updateNotchStates(index: number, color: { r: number; g: number; b: number }) {
100
+ notches.forEach(n => {
101
+ const notchIdx = parseInt(n.getAttribute('data-index') || '0');
102
+ const label = n.querySelector('.timeline-notch-label') as HTMLElement;
103
+ if (notchIdx === index) {
104
+ n.classList.add('active');
105
+ if (label) {
106
+ label.style.textShadow = `0 0 12px rgba(${color.r}, ${color.g}, ${color.b}, 0.8)`;
107
+ }
108
+ } else {
109
+ n.classList.remove('active');
110
+ if (label) {
111
+ label.style.textShadow = 'none';
112
+ }
113
+ }
114
+ });
115
+ }
116
+
117
+ function selectEpoch(index: number) {
118
+ if (index < 0) index = 0;
119
+ if (index >= epochs.length) index = epochs.length - 1;
120
+ currentEraIndex = index;
121
+
122
+ const epoch = epochs[index];
123
+ if (!epoch) return;
124
+
125
+ if (ageEl) ageEl.textContent = epoch.ageRange;
126
+ if (titleEl) titleEl.textContent = epoch.name;
127
+ if (tempValEl) tempValEl.textContent = epoch.avgTemp.toFixed(1);
128
+
129
+ const isDark = document.body.classList.contains('theme-dark') || document.documentElement.classList.contains('theme-dark');
130
+ const config = getThemeConfig(epoch.avgTemp, isDark);
131
+
132
+ targetColor.r = config.color.r;
133
+ targetColor.g = config.color.g;
134
+ targetColor.b = config.color.b;
135
+ targetRadius = config.radius;
136
+ targetSpeed = config.speed;
137
+ isCold = config.cold;
138
+
139
+ updateNotchStates(index, targetColor);
140
+ }
141
+
142
+ let isDragging = false;
143
+ let startY = 0;
144
+ let startEraIndex = 4;
145
+
146
+ function handleStart(y: number) {
147
+ isDragging = true;
148
+ startY = y;
149
+ startEraIndex = currentEraIndex;
150
+ }
151
+
152
+ function handleMove(y: number) {
153
+ if (!isDragging) return;
154
+ const dy = y - startY;
155
+ const height = root?.clientHeight || 600;
156
+ const deltaEra = -Math.round((dy / height) * epochs.length * 1.8);
157
+ let nextIndex = startEraIndex + deltaEra;
158
+ if (nextIndex < 0) nextIndex = 0;
159
+ if (nextIndex >= epochs.length) nextIndex = epochs.length - 1;
160
+ if (nextIndex !== currentEraIndex) {
161
+ selectEpoch(nextIndex);
162
+ }
163
+ }
164
+
165
+ canvasArea?.addEventListener('mousedown', (e: MouseEvent) => handleStart(e.clientY));
166
+ window.addEventListener('mousemove', (e: MouseEvent) => handleMove(e.clientY));
167
+ window.addEventListener('mouseup', () => { isDragging = false; });
168
+
169
+ canvasArea?.addEventListener('touchstart', (e: TouchEvent) => {
170
+ if (e.touches[0]) handleStart(e.touches[0].clientY);
171
+ });
172
+ window.addEventListener('touchmove', (e: TouchEvent) => {
173
+ if (e.touches[0]) handleMove(e.touches[0].clientY);
174
+ });
175
+ window.addEventListener('touchend', () => { isDragging = false; });
176
+
177
+ notches.forEach(notch => {
178
+ notch.addEventListener('click', () => {
179
+ const idx = parseInt(notch.getAttribute('data-index') || '0');
180
+ selectEpoch(idx);
181
+ });
182
+ });
183
+
184
+ const particles: { angle: number; speed: number; radiusOffset: number; size: number }[] = [];
185
+ for (let i = 0; i < 150; i++) {
186
+ particles.push({
187
+ angle: Math.random() * Math.PI * 2,
188
+ speed: 0.005 + Math.random() * 0.015,
189
+ radiusOffset: -40 + Math.random() * 80,
190
+ size: 1.5 + Math.random() * 2.5
191
+ });
192
+ }
193
+
194
+ let phase = 0;
195
+
196
+ function renderParticles(ctx: CanvasRenderingContext2D, cx: number, cy: number, colorString: string) {
197
+ particles.forEach(p => {
198
+ p.angle += p.speed * (currentSpeed * 50 + 0.5);
199
+
200
+ let warp = 0;
201
+ if (!isCold) {
202
+ warp = Math.sin(p.angle * 6 + phase) * 15;
203
+ }
204
+
205
+ const rad = currentRadius + p.radiusOffset + warp;
206
+ const px = cx + Math.cos(p.angle) * rad;
207
+ const py = cy + Math.sin(p.angle) * rad * 0.7;
208
+
209
+ ctx.beginPath();
210
+ ctx.fillStyle = colorString + `, ${0.15 + (1 - Math.abs(p.radiusOffset) / 80) * 0.65})`;
211
+ ctx.arc(px, py, p.size, 0, Math.PI * 2);
212
+ ctx.fill();
213
+ });
214
+ }
215
+
216
+ function renderAtmosphereCircles(ctx: CanvasRenderingContext2D, cx: number, cy: number, colorString: string) {
217
+ if (isCold) {
218
+ ctx.strokeStyle = colorString + ', 0.45)';
219
+ ctx.lineWidth = 1.5;
220
+ for (let i = 1; i < 4; i++) {
221
+ ctx.beginPath();
222
+ ctx.arc(cx, cy, currentRadius * (i / 4), 0, Math.PI * 2);
223
+ ctx.stroke();
224
+ }
225
+ } else {
226
+ ctx.strokeStyle = colorString + ', 0.25)';
227
+ ctx.lineWidth = 1;
228
+ ctx.beginPath();
229
+ ctx.arc(cx, cy, currentRadius + 30, 0, Math.PI * 2);
230
+ ctx.stroke();
231
+ }
232
+ }
233
+
234
+ function updateCurrentColor() {
235
+ currentColor.r += (targetColor.r - currentColor.r) * 0.08;
236
+ currentColor.g += (targetColor.g - currentColor.g) * 0.08;
237
+ currentColor.b += (targetColor.b - currentColor.b) * 0.08;
238
+ }
239
+
240
+ function animate() {
241
+ if (!canvas) return;
242
+ const ctx = canvas.getContext('2d');
243
+ if (!ctx) return;
244
+
245
+ const dpr = window.devicePixelRatio || 1;
246
+ canvas.width = canvas.clientWidth * dpr;
247
+ canvas.height = canvas.clientHeight * dpr;
248
+ ctx.scale(dpr, dpr);
249
+
250
+ const w = canvas.width / dpr;
251
+ const h = canvas.height / dpr;
252
+
253
+ ctx.clearRect(0, 0, w, h);
254
+
255
+ currentRadius += (targetRadius - currentRadius) * 0.08;
256
+ currentSpeed += (targetSpeed - currentSpeed) * 0.08;
257
+ updateCurrentColor();
258
+
259
+ phase += currentSpeed;
260
+
261
+ const cx = w / 2;
262
+ const cy = h / 2;
263
+
264
+ const colorString = `rgba(${Math.floor(currentColor.r)}, ${Math.floor(currentColor.g)}, ${Math.floor(currentColor.b)}`;
265
+
266
+ if (root) {
267
+ root.style.boxShadow = `0 20px 40px rgba(${currentColor.r}, ${currentColor.g}, ${currentColor.b}, 0.06)`;
268
+ }
269
+
270
+ renderParticles(ctx, cx, cy, colorString);
271
+ renderAtmosphereCircles(ctx, cx, cy, colorString);
272
+
273
+ ctx.beginPath();
274
+ ctx.strokeStyle = colorString + ', 0.8)';
275
+ ctx.lineWidth = 2.5;
276
+ ctx.arc(cx, cy, currentRadius, 0, Math.PI * 2);
277
+ ctx.stroke();
278
+
279
+ requestAnimationFrame(animate);
280
+ }
281
+
282
+ selectEpoch(4);
283
+ animate();
284
+
285
+ window.addEventListener('resize', () => {
286
+ selectEpoch(currentEraIndex);
287
+ });
288
+ }
289
+ </script>
@@ -0,0 +1,26 @@
1
+ import type { ScienceToolEntry } from '../../types';
2
+
3
+ export const temperatureTimeline: ScienceToolEntry = {
4
+ id: 'planet-temperature-timeline',
5
+ icons: {
6
+ bg: 'mdi:weather-sunny',
7
+ fg: 'mdi:clock-outline',
8
+ },
9
+ i18n: {
10
+ es: () => import('./i18n/es').then((m) => m.content),
11
+ en: () => import('./i18n/en').then((m) => m.content),
12
+ fr: () => import('./i18n/fr').then((m) => m.content),
13
+ de: () => import('./i18n/de').then((m) => m.content),
14
+ it: () => import('./i18n/it').then((m) => m.content),
15
+ pt: () => import('./i18n/pt').then((m) => m.content),
16
+ id: () => import('./i18n/id').then((m) => m.content),
17
+ ja: () => import('./i18n/ja').then((m) => m.content),
18
+ ko: () => import('./i18n/ko').then((m) => m.content),
19
+ nl: () => import('./i18n/nl').then((m) => m.content),
20
+ pl: () => import('./i18n/pl').then((m) => m.content),
21
+ ru: () => import('./i18n/ru').then((m) => m.content),
22
+ sv: () => import('./i18n/sv').then((m) => m.content),
23
+ tr: () => import('./i18n/tr').then((m) => m.content),
24
+ zh: () => import('./i18n/zh').then((m) => m.content),
25
+ },
26
+ };
@@ -0,0 +1,213 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+
4
+ const slug = 'planet-temperatur-zeitleiste';
5
+ const description = 'Erkunden Sie die durchschnittliche Temperaturgeschichte der Erde ueber geologische Epochen hinweg.';
6
+ const title = 'Durchschnittliche Temperaturzeitleiste der Erde';
7
+
8
+ const howTo = [
9
+ {
10
+ name: 'Epoche auswaehlen',
11
+ text: 'Klicken Sie auf eine Kerbe auf dem Skalenlineal.',
12
+ },
13
+ {
14
+ name: 'Temperatur pruefen',
15
+ text: 'Lesen Sie die globale Durchschnittstemperatur ab.',
16
+ },
17
+ {
18
+ name: 'Planet beobachten',
19
+ text: 'Beobachten Sie, wie die Leinwand auf den thermischen Zustand reagiert.',
20
+ },
21
+ ];
22
+
23
+ const faq = [
24
+ {
25
+ "question": "War die Erde in der Vergangenheit waermer als heute?",
26
+ "answer": "Ja, die Erde erlebte Klimata, die wesentlich waermer waren als heute. Waehrend des Mesozoikums (Zeitalter der Dinosaurier) und des fruehen Eozaens befand sich der Planet in einem Treibhauszustand ohne polare Eiskappen, und die weltweiten Durchschnittstemperaturen ueberstiegen 22 Grad, etwa 7 bis 8 Grad waermer als der heutige Durchschnitt. Die Uebergaenge zu diesen Perioden erstreckten sich jedoch ueber Jahrmillionen, was eine evolutionaere Anpassung ermoeglichte."
27
+ },
28
+ {
29
+ "question": "Was verursachte das Schneeball-Erde-Phaenomen?",
30
+ "answer": "Die Schneeball-Erde (globale Vereisung) trat vor allem im Neoproterozoikum auf (vor etwa 700 Millionen Jahren). Sie wurde durch eine extreme Verringerung der Treibhausgase infolge einer beschleunigten chemischen Verwitterung von Silikatgesteinen nach dem Auseinanderbrechen des Superkontinents Rodinia ausgeloest. Das Eis erstreckte sich vom Pol bis zum Aequator, reflektierte die Sonnenstrahlung (Albedo-Effekt) und fing den Planeten in einer globalen Kaeltschleife ein, die erst nach Millionen von Jahren vulkanischer CO2-Akkumulation durchbrochen wurde."
31
+ },
32
+ {
33
+ "question": "Wie reguliert die Erde ihre Temperatur langfristig?",
34
+ "answer": "Die Erde besitzt einen natuerlichen Thermostaten, der durch den geologischen Kohlenstoffkreislauf gesteuert wird, der wiederum massgeblich durch Plattentektonik und Silikatverwitterung reguliert wird. Wenn sich der Planet erwaermt, reagiert saurer Regen schneller mit Silikatgesteinen, entzieht der Atmosphaere CO2 und lagert es als Karbonate auf dem Meeresboden ab, was den Treibhauseffekt abschwaecht. Kuehlt sich der Planet ab, nimmt die Verwitterung ab, aber die vulkanische Aktivitaet stoesst weiterhin CO2 aus, wodurch sich der Planet allmaehlich wieder erwaermt."
35
+ },
36
+ {
37
+ "question": "Wie unterscheidet sich der Klimawandel im Anthropozean von der geologischen Vergangenheit?",
38
+ "answer": "Der grundlegende Unterschied liegt in der Geschwindigkeit des Wandels. Waehrend natuerliche Klimauebergaenge in der geologischen Vergangenheit in der Regel ueber Zehntausende oder Millionen von Jahren stattfanden (was Raum fuer biologische Wanderungen und Evolution liess), vollzieht sich die Erwaermung im Anthropozean in wenigen Jahrzehnten. Diese Rate der thermischen Schwankung ist exponentiell schneller als fast jedes andere dokumentierte Ereignis zuvor, uebertrifft die Anpassungsfaehigkeit der derzeitigen Biosphaere und verursacht ein beschleunigtes Massensterben."
39
+ },
40
+ {
41
+ "question": "Was war das Palaeozaen-Eozaen-Termalmaximum (PETM)?",
42
+ "answer": "Das PETM war ein extremes globales Erwaermungsereignis, das vor etwa 56 Millionen Jahren stattfand. Es wurde durch einen raschen und massiven Eintrag von Kohlenstoff in die Atmosphaere verursacht (moeglicherweise durch die Freisetzung von ozeanischen Methanhydraten oder Vulkanismus im Nordatlantik), wodurch sich die globalen Temperaturen in wenigen tausend Jahren um 5 bis 8 Grad erhoehten. Es gilt als das beste geologische Analogon fuer den modernen Klimawandel und fuehrte zu einer schweren Versauerung der Ozeane und zum Aussterben benthischer Organismen."
43
+ }
44
+ ];
45
+
46
+ export const content: ToolLocaleContent = {
47
+ slug,
48
+ title,
49
+ description,
50
+ ui: {
51
+ title: 'Temperaturzeitleiste der Erde',
52
+ sub: 'Erkunden Sie die geologischen Klimaepochen der Erde',
53
+ ageLabel: 'Alter:',
54
+ tempLabel: 'Durchschnittstemperatur:',
55
+ selectPrompt: 'Waehlen Sie eine geologische Periode aus.',
56
+ epoch_archean_name: 'Archaeikum',
57
+ epoch_archean_age: '4,0 bis 2,5 Milliarden Jahre vor heute',
58
+ epoch_archean_desc: 'Extrem heisse Erde mit methan- und kohlendioxidreicher Atmosphaere.',
59
+ epoch_proterozoic_name: 'Proterozoikum',
60
+ epoch_proterozoic_age: '2,5 Milliarden bis 541 Millionen Jahre vor heute',
61
+ epoch_proterozoic_desc: 'Sauerstoffanstieg verursacht Huroni-Vereisung.',
62
+ epoch_paleozoic_name: 'Palaeozoikum',
63
+ epoch_paleozoic_age: '541 bis 252 Millionen Jahre vor heute',
64
+ epoch_paleozoic_desc: 'Lebensexplosion in Ozeanen und Besiedlung des Landes.',
65
+ epoch_mesozoic_name: 'Mesozoikum',
66
+ epoch_mesozoic_age: '252 bis 66 Millionen Jahre vor heute',
67
+ epoch_mesozoic_desc: 'Zeitalter der Dinosaurier. Weltweite Treibhausbedingungen.',
68
+ epoch_cenozoic_name: 'Kaenozoikum',
69
+ epoch_cenozoic_age: '66 Millionen Jahre vor heute bis Gegenwart',
70
+ epoch_cenozoic_desc: 'Allmaehliche Abkuehlung bis zu quartaeren Eiszeiten.',
71
+ epoch_anthropocene_name: 'Anthropozean',
72
+ epoch_anthropocene_age: 'Gegenwart und Zukunft',
73
+ epoch_anthropocene_desc: 'Schnelle Erwaermung durch Treibhausgasemissionen.',
74
+ },
75
+ seo: [
76
+ {
77
+ "type": "title",
78
+ "text": "HISTORISCHE KLIMATOLOGIE: Die thermische Evolution der Erde durch geologische Epochen",
79
+ "level": 2
80
+ },
81
+ {
82
+ "type": "paragraph",
83
+ "html": "Das Klima der Erde war nie statisch. Im Laufe ihrer 4,5 Milliarden Jahre dauernden Geschichte schwankte unser Planet zwischen zwei Grundzustaenden: dem Treibhauszustand (greenhouse) und dem Eiszeitenzustand (icehouse). Das Verstaendnis dieser grossraeumigen Schwankungen ist nicht nur eine geologische Neugierde, sondern ein unverzichtbares Instrument zur Kontextualisierung der Geschwindigkeit und Schwere der anthropogenen globalen Erwaermung. Durch die Untersuchung von Sauerstoffisotopen in marinen Fossilien und in Eiskernen eingeschlossenen Luftblasen konnten Paleoklimatologen die Temperaturgeschichte der Erde praezise rekonstruieren."
84
+ },
85
+ {
86
+ "type": "title",
87
+ "text": "Temperaturaufzeichnung nach geologischer Epoche und Aera",
88
+ "level": 3
89
+ },
90
+ {
91
+ "type": "paragraph",
92
+ "html": "Die Geschichte der Erde unterteilt sich in grosse Zeitintervalle, die durch biologische und geologische Veraenderungen definiert sind. Unten ist die Liste der geschaetzten Durchschnittstemperaturen fuer jede verfuegbare Epoche aufgefuehrt:"
93
+ },
94
+ {
95
+ "type": "table",
96
+ "headers": [
97
+ "Geologische Epoche",
98
+ "Alter Aprox.",
99
+ "Durchschnittstemp.",
100
+ "Klimatologische Meilensteine und Merkmale"
101
+ ],
102
+ "rows": [
103
+ [
104
+ "<strong>Archaeikum</strong>",
105
+ "4,0 bis 2,5 Ga",
106
+ "30 °C",
107
+ "Fruehe heisse Erde. Eine schwache junge Sonne wurde durch einen extremen, methanreichen Treibhauseffekt kompensiert."
108
+ ],
109
+ [
110
+ "<strong>Proterozoikum</strong>",
111
+ "2,5 Ga bis 541 Ma",
112
+ "12 °C",
113
+ "Anstieg des freien Sauerstoffs; fuehrte zum Methankollaps und loeste globale Vereisungen aus (\"Schneeball Erde\")."
114
+ ],
115
+ [
116
+ "<strong>Palaeozoikum</strong>",
117
+ "541 bis 252 Ma",
118
+ "20 °C",
119
+ "Grosse marine Biodiversitaet und Landbesiedlung. Endete mit Vulkanausbruechen und extremer Erwaermung."
120
+ ],
121
+ [
122
+ "<strong>Mesozoikum</strong>",
123
+ "252 bis 66 Ma",
124
+ "22 °C",
125
+ "Die Warmzeit par excellence (Super-Treibhaus ohne polares Eis). Bluetezeit der Dinosaurier."
126
+ ],
127
+ [
128
+ "<strong>Kaenozoikum</strong>",
129
+ "66 Ma bis heute",
130
+ "14 °C",
131
+ "Schrittweise Abkuehlung durch kontinentale Meeresstroemungen, die zu quartaeren Eiszeitzyklen fuehrte."
132
+ ],
133
+ [
134
+ "<strong>Anthropozean</strong>",
135
+ "Gegenwart & Zukunft",
136
+ "15.2 °C",
137
+ "Drastische und anomale Erwaermung durch anthropogene Emissionen von Treibhausgasen."
138
+ ]
139
+ ]
140
+ },
141
+ {
142
+ "type": "title",
143
+ "text": "Thermische Extreme der Vergangenheit: Von der globalen Vereisung zur Hitze des Mesozoikums",
144
+ "level": 3
145
+ },
146
+ {
147
+ "type": "paragraph",
148
+ "html": "Die Geschichte unseres Planeten umfasst extreme klimatische Ereignisse. Im Proterozoikum setzte die primitive Fotosynthese in grossem Massstab Sauerstoff frei, wodurch das Methan in der Atmosphaere oxidiert wurde und der Planet in die Huroni-Vereisung stuerzte - eine der Epochen der \"Schneeball-Erde\", in der die Gletscher aequatoriale Breiten erreichten. Am entgegengesetzten Extrem, waehrend des Mesozoikums und des Palaeozans, saettigte eine intensive tektonische Vulkanaktivitaet die Atmosphaere mit CO2, was die globale Durchschnittstemperatur auf bis zu 10 Grad ueber das heutige Niveau ansteigen liess. In diesen Zeitraeumen gab es ueberhaupt kein Polareis, in arktischen Breiten wuchsen gemaessigte Waelder und Dinosaurier dominierten."
149
+ },
150
+ {
151
+ "type": "title",
152
+ "text": "Faktoren, die das globale Klima auf geologischer Skala steuern",
153
+ "level": 3
154
+ },
155
+ {
156
+ "type": "paragraph",
157
+ "html": "Das langfristige Klima der Erde ist das Ergebnis eines empfindlichen thermodynamischen Gleichgewichts, das von mehreren miteinander verknuepften natuerlichen Mechanismen gesteuert wird:"
158
+ },
159
+ {
160
+ "type": "list",
161
+ "items": [
162
+ "<strong>Milankovitch-Zyklen:</strong> Geringfuegige periodische Schwankungen der orbitalen Exzentrizitaet, Neigung und Praezession der Erde veraendern die empfangene Sonnenstrahlung.",
163
+ "<strong>Silikat-Karbonat-Kohlenstoffkreislauf:</strong> Der langfristige geochemische Thermostat. Regen entzieht der Atmosphaere CO2 und wandelt es in Silikate um, die in den Ozeanen abgelagert werden.",
164
+ "<strong>Plattentektonik:</strong> Die Kontinentaldrift veraendert die globalen Meeresstroemungen und laesst Gebirge entstehen, welche die chemische Verwitterung von CO2 beschleunigen.",
165
+ "<strong>Albedo-Rueckkopplung:</strong> Das Vorhandensein von Schnee und Eis reflektiert das Sonnenlicht und kuehlt den Planeten in Rueckkopplungsschleifen weiter ab."
166
+ ]
167
+ },
168
+ {
169
+ "type": "title",
170
+ "text": "Das Anthropozean: Eine beispiellose thermische Beschleunigung der Biosphaere",
171
+ "level": 3
172
+ },
173
+ {
174
+ "type": "paragraph",
175
+ "html": "Der Uebergang vom stabilen Holozaen zum Anthropozean markiert das Zeitalter des direkten Einflusses der Menschheit auf die Systeme unseres Planeten. Im Gegensatz zu frueheren thermischen Ereignissen, deren orbitale oder vulkanische Ursachen sich ueber Zehntausende von Jahren erstreckten, wird die heutige Erwaermung durch die massive Verbrennung fossiler Kohlenstoffreserven vorangetrieben, die sich ueber Jahrmillionen angesammelt haben. Die derzeitige Rate der Treibhausgasakkumulation und des Anstiegs der globalen Durchschnittstemperatur ist wesentlich schneller als beim Perm-Trias-Massensterben oder dem PETM und stellt eine beispiellose Herausforderung fuer die biologische Anpassungsfaehigkeit dar."
176
+ }
177
+ ],
178
+ faq,
179
+ bibliography,
180
+ howTo,
181
+ schemas: [
182
+ {
183
+ '@context': 'https://schema.org',
184
+ '@type': 'SoftwareApplication',
185
+ name: title,
186
+ description: description,
187
+ applicationCategory: 'ScientificApplication',
188
+ operatingSystem: 'Any',
189
+ },
190
+ {
191
+ '@context': 'https://schema.org',
192
+ '@type': 'FAQPage',
193
+ mainEntity: faq.map((item) => ({
194
+ '@type': 'Question',
195
+ name: item.question,
196
+ acceptedAnswer: {
197
+ '@type': 'Answer',
198
+ text: item.answer,
199
+ },
200
+ })),
201
+ },
202
+ {
203
+ '@context': 'https://schema.org',
204
+ '@type': 'HowTo',
205
+ name: title,
206
+ step: howTo.map((step) => ({
207
+ '@type': 'HowToStep',
208
+ name: step.name,
209
+ text: step.text,
210
+ })),
211
+ },
212
+ ],
213
+ };