@jjlmoya/utils-diy 1.14.0 → 1.16.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.
- package/package.json +1 -1
- package/src/entries.ts +3 -1
- package/src/index.ts +2 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/pythagoreanRightAngleCalculator/component.astro +16 -11
- package/src/tool/pythagoreanRightAngleCalculator/i18n/de.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/es.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/fr.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/id.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/it.ts +3 -1
- package/src/tool/pythagoreanRightAngleCalculator/i18n/ja.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/nl.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/pl.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/pt.ts +3 -1
- package/src/tool/pythagoreanRightAngleCalculator/i18n/ru.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/sv.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/tr.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/i18n/zh.ts +2 -0
- package/src/tool/pythagoreanRightAngleCalculator/logic.ts +37 -31
- package/src/tool/pythagoreanRightAngleCalculator/pythagorean-right-angle-calculator.css +13 -4
- package/src/tool/twoStrokeMixtureCalculator/bibliography.astro +6 -0
- package/src/tool/twoStrokeMixtureCalculator/bibliography.ts +12 -0
- package/src/tool/twoStrokeMixtureCalculator/component.astro +266 -0
- package/src/tool/twoStrokeMixtureCalculator/entry.ts +24 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/de.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/en.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/es.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/fr.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/id.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/it.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/ja.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/ko.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/nl.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/pl.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/pt.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/ru.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/sv.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/tr.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/i18n/zh.ts +194 -0
- package/src/tool/twoStrokeMixtureCalculator/index.ts +11 -0
- package/src/tool/twoStrokeMixtureCalculator/logic.ts +92 -0
- package/src/tool/twoStrokeMixtureCalculator/seo.astro +15 -0
- package/src/tool/twoStrokeMixtureCalculator/two-stroke-fuel-mixture-calculator.css +405 -0
- package/src/tool/twoStrokeMixtureCalculator/ui.ts +81 -0
- package/src/tools.ts +2 -1
package/package.json
CHANGED
package/src/entries.ts
CHANGED
|
@@ -16,6 +16,7 @@ export { thermalExpansionCalculator } from './tool/thermalExpansionCalculator/en
|
|
|
16
16
|
export { voltageDropCalculator } from './tool/voltageDropCalculator/entry';
|
|
17
17
|
export { workshopFractionConverter } from './tool/workshopFractionConverter/entry';
|
|
18
18
|
export { pythagoreanRightAngleCalculator } from './tool/pythagoreanRightAngleCalculator/entry';
|
|
19
|
+
export { twoStrokeMixtureCalculator } from './tool/twoStrokeMixtureCalculator/entry';
|
|
19
20
|
export { diyCategory } from './category';
|
|
20
21
|
import { balusterCalculator } from './tool/balusterCalculator/entry';
|
|
21
22
|
import { clayCalculator } from './tool/clayCalculator/entry';
|
|
@@ -32,4 +33,5 @@ import { thermalExpansionCalculator } from './tool/thermalExpansionCalculator/en
|
|
|
32
33
|
import { voltageDropCalculator } from './tool/voltageDropCalculator/entry';
|
|
33
34
|
import { workshopFractionConverter } from './tool/workshopFractionConverter/entry';
|
|
34
35
|
import { pythagoreanRightAngleCalculator } from './tool/pythagoreanRightAngleCalculator/entry';
|
|
35
|
-
|
|
36
|
+
import { twoStrokeMixtureCalculator } from './tool/twoStrokeMixtureCalculator/entry';
|
|
37
|
+
export const ALL_ENTRIES = [balusterCalculator, clayCalculator, concreteCalculator, cutOptimizer, drillCalculator, drillSharpener, epoxyCalculator, furnitureFit, mortarCalculator, passepartoutCalculator, stairCalculator, thermalExpansionCalculator, voltageDropCalculator, workshopFractionConverter, pythagoreanRightAngleCalculator, twoStrokeMixtureCalculator];
|
package/src/index.ts
CHANGED
|
@@ -46,3 +46,5 @@ export { DRILL_SHARPENER_TOOL } from './tool/drillSharpener/index';
|
|
|
46
46
|
export { WORKSHOP_FRACTION_CONVERTER_TOOL } from './tool/workshopFractionConverter/index';
|
|
47
47
|
|
|
48
48
|
export { PYTHAGOREAN_RIGHT_ANGLE_CALCULATOR_TOOL } from './tool/pythagoreanRightAngleCalculator/index';
|
|
49
|
+
|
|
50
|
+
export { TWO_STROKE_MIXTURE_CALCULATOR_TOOL } from './tool/twoStrokeMixtureCalculator/index';
|
|
@@ -4,8 +4,8 @@ import { diyCategory } from '../data';
|
|
|
4
4
|
|
|
5
5
|
describe('Tool Validation Suite', () => {
|
|
6
6
|
describe('Library Registration', () => {
|
|
7
|
-
it('should have
|
|
8
|
-
expect(ALL_TOOLS.length).toBe(
|
|
7
|
+
it('should have 16 tools in ALL_TOOLS', () => {
|
|
8
|
+
expect(ALL_TOOLS.length).toBe(16);
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
it('diyCategory should be defined', () => {
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
---
|
|
2
|
+
import { Icon } from 'astro-icon/components';
|
|
2
3
|
import type { PythagoreanRightAngleCalculatorUI } from './ui';
|
|
4
|
+
|
|
3
5
|
interface Props { ui?: PythagoreanRightAngleCalculatorUI; }
|
|
4
6
|
const { ui } = Astro.props;
|
|
5
7
|
const t = (ui ?? {}) as PythagoreanRightAngleCalculatorUI;
|
|
6
8
|
---
|
|
7
9
|
|
|
8
|
-
<div class="prac-root" data-ui={JSON.stringify(t)}>
|
|
10
|
+
<div class="prac-root" data-prac-root data-ui={JSON.stringify(t)}>
|
|
9
11
|
<div class="prac-container">
|
|
10
12
|
<aside class="prac-inputs">
|
|
11
|
-
<div class="prac-
|
|
12
|
-
<
|
|
13
|
-
<
|
|
14
|
-
|
|
13
|
+
<div class="prac-input-group">
|
|
14
|
+
<label>{t.labelUnitSelection || 'Units'}</label>
|
|
15
|
+
<div class="prac-unit-selector">
|
|
16
|
+
<button class="prac-unit-btn active" data-unit="in">{t.btnUnitInches}</button>
|
|
17
|
+
<button class="prac-unit-btn" data-unit="ft">{t.btnUnitFeet}</button>
|
|
18
|
+
<button class="prac-unit-btn" data-unit="cm">{t.btnUnitCentimeters}</button>
|
|
19
|
+
</div>
|
|
15
20
|
</div>
|
|
16
21
|
|
|
17
22
|
<div class="prac-input-group">
|
|
@@ -31,10 +36,10 @@ const t = (ui ?? {}) as PythagoreanRightAngleCalculatorUI;
|
|
|
31
36
|
|
|
32
37
|
<div class="prac-button-group">
|
|
33
38
|
<button id="prac-clear" class="prac-btn prac-btn-icon" title={t.btnClear}>
|
|
34
|
-
<
|
|
39
|
+
<Icon name="mdi:delete" />
|
|
35
40
|
</button>
|
|
36
41
|
<button id="prac-copy" class="prac-btn prac-btn-icon" title={t.btnCopyResults}>
|
|
37
|
-
<
|
|
42
|
+
<Icon name="mdi:content-copy" />
|
|
38
43
|
</button>
|
|
39
44
|
</div>
|
|
40
45
|
|
|
@@ -179,7 +184,7 @@ const t = (ui ?? {}) as PythagoreanRightAngleCalculatorUI;
|
|
|
179
184
|
const a = parseFloat(inputA.value) || 0;
|
|
180
185
|
const b = parseFloat(inputB.value) || 0;
|
|
181
186
|
const d = parseFloat(inputD.value) || null;
|
|
182
|
-
const calc = calculateSquaring(a, b, d, ui);
|
|
187
|
+
const calc = calculateSquaring(a, b, d, { unit: currentUnit, ui });
|
|
183
188
|
|
|
184
189
|
if (calc.hypotenuse > 0) {
|
|
185
190
|
resultIdeal.textContent = calc.hypotenuse.toFixed(2);
|
|
@@ -228,9 +233,9 @@ const t = (ui ?? {}) as PythagoreanRightAngleCalculatorUI;
|
|
|
228
233
|
else if (currentUnit === 'cm') unitText = ui.unitCentimeters;
|
|
229
234
|
const text = `${ui.labelIdealDiagonal || 'Ideal'}: ${resultIdeal.textContent}${unitText}, ${ui.labelDeviation || 'Deviation'}: ${resultDev.textContent}${unitText}`;
|
|
230
235
|
navigator.clipboard.writeText(text).then(() => {
|
|
231
|
-
const
|
|
232
|
-
copyBtn.innerHTML = '<
|
|
233
|
-
setTimeout(() => (copyBtn.innerHTML =
|
|
236
|
+
const originalHTML = copyBtn.innerHTML;
|
|
237
|
+
copyBtn.innerHTML = '<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"/></svg>';
|
|
238
|
+
setTimeout(() => (copyBtn.innerHTML = originalHTML), 1500);
|
|
234
239
|
});
|
|
235
240
|
});
|
|
236
241
|
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Einheit',
|
|
98
98
|
btnUnitInches: 'Zoll',
|
|
99
99
|
btnUnitFeet: 'Fuß',
|
|
100
|
+
btnUnitCentimeters: 'Zentimeter',
|
|
100
101
|
labelSideA: 'Seite A',
|
|
101
102
|
labelSideB: 'Seite B',
|
|
102
103
|
labelMeasuredDiagonal: 'Gemessene Diagonale (optional)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Schnellwahl',
|
|
111
112
|
unitInches: 'in',
|
|
112
113
|
unitFeet: 'ft',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: 'Geben Sie Ihre gemessene Diagonale ein, um den 90-Grad-Winkel zu prüfen',
|
|
114
116
|
tooltipPresets: '3-4-5-Regel in verschiedenen Maßstäben',
|
|
115
117
|
statusPerfect: 'Perfekter 90-Grad-Winkel',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Unidad',
|
|
98
98
|
btnUnitInches: 'pulgadas',
|
|
99
99
|
btnUnitFeet: 'pies',
|
|
100
|
+
btnUnitCentimeters: 'centímetros',
|
|
100
101
|
labelSideA: 'Lado A',
|
|
101
102
|
labelSideB: 'Lado B',
|
|
102
103
|
labelMeasuredDiagonal: 'Diagonal medida (opcional)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Ajustes rápidos',
|
|
111
112
|
unitInches: 'pul',
|
|
112
113
|
unitFeet: 'pie',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: 'Introduce tu diagonal medida para verificar los 90 grados',
|
|
114
116
|
tooltipPresets: 'Regla 3-4-5 en diferentes escalas',
|
|
115
117
|
statusPerfect: 'Ángulo de 90 grados perfecto',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Unité',
|
|
98
98
|
btnUnitInches: 'pouces',
|
|
99
99
|
btnUnitFeet: 'pieds',
|
|
100
|
+
btnUnitCentimeters: 'centimètres',
|
|
100
101
|
labelSideA: 'Côté A',
|
|
101
102
|
labelSideB: 'Côté B',
|
|
102
103
|
labelMeasuredDiagonal: 'Diagonale mesurée (optionnel)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Réglages rapides',
|
|
111
112
|
unitInches: 'po',
|
|
112
113
|
unitFeet: 'pi',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: 'Entrez votre diagonale mesurée pour vérifier les 90 degrés',
|
|
114
116
|
tooltipPresets: 'Règle 3-4-5 à différentes échelles',
|
|
115
117
|
statusPerfect: 'Angle de 90 degrés parfait',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Unit',
|
|
98
98
|
btnUnitInches: 'inci',
|
|
99
99
|
btnUnitFeet: 'kaki',
|
|
100
|
+
btnUnitCentimeters: 'sentimeter',
|
|
100
101
|
labelSideA: 'Sisi A',
|
|
101
102
|
labelSideB: 'Sisi B',
|
|
102
103
|
labelMeasuredDiagonal: 'Diagonal terukur (opsional)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Preset cepat',
|
|
111
112
|
unitInches: 'in',
|
|
112
113
|
unitFeet: 'ft',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: 'Masukkan diagonal terukur Anda untuk memverifikasi sudut 90 derajat',
|
|
114
116
|
tooltipPresets: 'Aturan 3-4-5 dalam berbagai skala',
|
|
115
117
|
statusPerfect: 'Sudut 90 derajat sempurna',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Unità',
|
|
98
98
|
btnUnitInches: 'pollici',
|
|
99
99
|
btnUnitFeet: 'piedi',
|
|
100
|
+
btnUnitCentimeters: 'centimetri',
|
|
100
101
|
labelSideA: 'Lato A',
|
|
101
102
|
labelSideB: 'Lato B',
|
|
102
103
|
labelMeasuredDiagonal: 'Diagonale misurata (opzionale)',
|
|
@@ -110,7 +111,8 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Regolazioni rapide',
|
|
111
112
|
unitInches: 'pol',
|
|
112
113
|
unitFeet: 'pie',
|
|
113
|
-
|
|
114
|
+
unitCentimeters: 'cm',
|
|
115
|
+
tooltipOptional: 'Inserisci la diagonale misurata per verificar i 90 gradi',
|
|
114
116
|
tooltipPresets: 'Regola 3-4-5 in diverse scale',
|
|
115
117
|
statusPerfect: 'Angolo di 90 gradi perfetto',
|
|
116
118
|
statusAcceptable: 'Scostamento accettabile',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: '単位',
|
|
98
98
|
btnUnitInches: 'インチ',
|
|
99
99
|
btnUnitFeet: 'フィート',
|
|
100
|
+
btnUnitCentimeters: 'センチメートル',
|
|
100
101
|
labelSideA: '辺 A',
|
|
101
102
|
labelSideB: '辺 B',
|
|
102
103
|
labelMeasuredDiagonal: '測定した対角線(任意)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'クイックプリセット',
|
|
111
112
|
unitInches: 'in',
|
|
112
113
|
unitFeet: 'ft',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: '測定した対角線を入力して90度を確認します',
|
|
114
116
|
tooltipPresets: '様々なスケールでの3-4-5の法則',
|
|
115
117
|
statusPerfect: '完璧な90度の角度',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Eenheid',
|
|
98
98
|
btnUnitInches: 'inches',
|
|
99
99
|
btnUnitFeet: 'feet',
|
|
100
|
+
btnUnitCentimeters: 'centimeters',
|
|
100
101
|
labelSideA: 'Zijde A',
|
|
101
102
|
labelSideB: 'Zijde B',
|
|
102
103
|
labelMeasuredDiagonal: 'Gemeten diagonaal (optioneel)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Snelkeuzes',
|
|
111
112
|
unitInches: 'in',
|
|
112
113
|
unitFeet: 'ft',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: 'Voer je gemeten diagonaal in om de 90 graden hoek te controleren',
|
|
114
116
|
tooltipPresets: '3-4-5-regel op verschillende schalen',
|
|
115
117
|
statusPerfect: 'Perfecte 90 graden hoek',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Jednostka',
|
|
98
98
|
btnUnitInches: 'cale',
|
|
99
99
|
btnUnitFeet: 'stopy',
|
|
100
|
+
btnUnitCentimeters: 'centymetry',
|
|
100
101
|
labelSideA: 'Bok A',
|
|
101
102
|
labelSideB: 'Bok B',
|
|
102
103
|
labelMeasuredDiagonal: 'Zmierzona przekątna (opcjonalnie)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Szybkie ustawienia',
|
|
111
112
|
unitInches: 'cal',
|
|
112
113
|
unitFeet: 'st',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: 'Wprowadź zmierzoną przekątną, aby sprawdzić kąt 90 stopni',
|
|
114
116
|
tooltipPresets: 'Zasada 3-4-5 w różnych skalach',
|
|
115
117
|
statusPerfect: 'Idealny kąt 90 stopni',
|
|
@@ -83,7 +83,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
83
83
|
schemas: [faqSchema, howToSchema, appSchema],
|
|
84
84
|
seo: [
|
|
85
85
|
{ type: 'title', text: 'O Teorema de Pitágoras na Prática', level: 2 },
|
|
86
|
-
{ type: 'paragraph', html: 'Um ângulo perfeito de 90 graus é fundamental para uma construção de qualidade. As paredes devem ser perpendiculares, os alicerces
|
|
86
|
+
{ type: 'paragraph', html: 'Um ângulo perfeito de 90 graus é fundamental para uma construção de qualidade. As paredes devem ser perpendiculares, os alicerces deben estar no esquadro e as estruturas deben estar alinhadas. O teorema de Pitágoras fornece um método matematicamente garantido: a² + b² = c².' },
|
|
87
87
|
{ type: 'title', text: 'Por que a regra 3-4-5 funciona', level: 3 },
|
|
88
88
|
{ type: 'paragraph', html: 'A regra 3-4-5 é o terno pitagórico mais simples. Quer meça em polegadas, pés ou qualquer outra unidade, lados de 3, 4 e 5 unidades garantem um ângulo de 90 graus. Isso foi provado matematicamente e testado na construção durante séculos.' },
|
|
89
89
|
{ type: 'title', text: 'Precisão sem ferramentas especializadas', level: 3 },
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Unidade',
|
|
98
98
|
btnUnitInches: 'polegadas',
|
|
99
99
|
btnUnitFeet: 'pés',
|
|
100
|
+
btnUnitCentimeters: 'centímetros',
|
|
100
101
|
labelSideA: 'Lado A',
|
|
101
102
|
labelSideB: 'Lado B',
|
|
102
103
|
labelMeasuredDiagonal: 'Diagonal medida (opcional)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Ajustes rápidos',
|
|
111
112
|
unitInches: 'pol',
|
|
112
113
|
unitFeet: 'pé',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: 'Insira a sua diagonal medida para verificar os 90 graus',
|
|
114
116
|
tooltipPresets: 'Regra 3-4-5 em diferentes escalas',
|
|
115
117
|
statusPerfect: 'Ângulo de 90 graus perfeito',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Единица измерения',
|
|
98
98
|
btnUnitInches: 'дюймы',
|
|
99
99
|
btnUnitFeet: 'футы',
|
|
100
|
+
btnUnitCentimeters: 'сантиметры',
|
|
100
101
|
labelSideA: 'Сторона А',
|
|
101
102
|
labelSideB: 'Сторона Б',
|
|
102
103
|
labelMeasuredDiagonal: 'Измеренная диагональ (опционально)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Быстрые настройки',
|
|
111
112
|
unitInches: 'дюйм',
|
|
112
113
|
unitFeet: 'фут',
|
|
114
|
+
unitCentimeters: 'см',
|
|
113
115
|
tooltipOptional: 'Введите измеренную диагональ для проверки угла 90 градусов',
|
|
114
116
|
tooltipPresets: 'Правило 3-4-5 в разных масштабах',
|
|
115
117
|
statusPerfect: 'Идеальный угол 90 градусов',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Enhet',
|
|
98
98
|
btnUnitInches: 'tum',
|
|
99
99
|
btnUnitFeet: 'fot',
|
|
100
|
+
btnUnitCentimeters: 'centimeter',
|
|
100
101
|
labelSideA: 'Sida A',
|
|
101
102
|
labelSideB: 'Sida B',
|
|
102
103
|
labelMeasuredDiagonal: 'Uppmätt diagonal (valfritt)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Snabbval',
|
|
111
112
|
unitInches: 'tum',
|
|
112
113
|
unitFeet: 'fot',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: 'Ange din uppmätta diagonal för att kontrollera 90-graders vinkeln',
|
|
114
116
|
tooltipPresets: '3-4-5-regeln i olika skalor',
|
|
115
117
|
statusPerfect: 'Perfekt 90-graders vinkel',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: 'Birim',
|
|
98
98
|
btnUnitInches: 'inç',
|
|
99
99
|
btnUnitFeet: 'fit',
|
|
100
|
+
btnUnitCentimeters: 'santimetre',
|
|
100
101
|
labelSideA: 'A Kenarı',
|
|
101
102
|
labelSideB: 'B Kenarı',
|
|
102
103
|
labelMeasuredDiagonal: 'Ölçülen diyagonal (isteğe bağlı)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: 'Hızlı ayarlar',
|
|
111
112
|
unitInches: 'in',
|
|
112
113
|
unitFeet: 'ft',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: '90 derecelik açıyı doğrulamak için ölçülen diyagonali girin',
|
|
114
116
|
tooltipPresets: 'Farklı ölçeklerde 3-4-5 kuralı',
|
|
115
117
|
statusPerfect: 'Mükemmel 90 derece açı',
|
|
@@ -97,6 +97,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
97
97
|
labelUnitSelection: '单位',
|
|
98
98
|
btnUnitInches: '英寸',
|
|
99
99
|
btnUnitFeet: '英尺',
|
|
100
|
+
btnUnitCentimeters: '厘米',
|
|
100
101
|
labelSideA: '边 A',
|
|
101
102
|
labelSideB: '边 B',
|
|
102
103
|
labelMeasuredDiagonal: '测量对角线(可选)',
|
|
@@ -110,6 +111,7 @@ export const content: ToolLocaleContent<PythagoreanRightAngleCalculatorUI> = {
|
|
|
110
111
|
labelPresets: '快速预设',
|
|
111
112
|
unitInches: 'in',
|
|
112
113
|
unitFeet: 'ft',
|
|
114
|
+
unitCentimeters: 'cm',
|
|
113
115
|
tooltipOptional: '输入测得的对角线以验证 90 度直角',
|
|
114
116
|
tooltipPresets: '不同比例下的 3-4-5 法则',
|
|
115
117
|
statusPerfect: '完美 90 度直角',
|
|
@@ -33,16 +33,19 @@ function getStatusMessage(status: 'perfect' | 'acceptable' | 'warning' | 'error'
|
|
|
33
33
|
return msgs[status];
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
function getCorrection(status: 'perfect' | 'acceptable' | 'warning' | 'error', params: { absDev: number; devDir: string; action: string; ui: Record<string, string> }): string {
|
|
37
|
-
if (status === 'perfect') return '';
|
|
36
|
+
function getCorrection(status: 'perfect' | 'acceptable' | 'warning' | 'error', params: { absDev: number; devDir: string; action: string; unit: string; ui: Record<string, string> }): string {
|
|
38
37
|
const fixStr = (val: number) => val.toFixed(1);
|
|
39
|
-
const { absDev, devDir, action, ui } = params;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
const { absDev, devDir, action, unit, ui } = params;
|
|
39
|
+
const corrections = {
|
|
40
|
+
perfect: '',
|
|
41
|
+
acceptable: `${action} the angle slightly. Diagonal is ${fixStr(absDev)}${unit} ${devDir}.`,
|
|
42
|
+
warning: `${action} the angle. Diagonal is ${fixStr(absDev)}${unit} ${devDir}.`,
|
|
43
|
+
error: `${ui.descCorrection || 'Correction'}: diagonal ${fixStr(absDev)}${unit} ${devDir} than ideal.`
|
|
44
|
+
};
|
|
45
|
+
return corrections[status];
|
|
43
46
|
}
|
|
44
47
|
|
|
45
|
-
function determineStatus(deviation: number, deviationPercent: number, ui: Record<string, string>): StatusResult {
|
|
48
|
+
function determineStatus(deviation: number, deviationPercent: number, unit: string, ui: Record<string, string>): StatusResult {
|
|
46
49
|
const absDev = Math.abs(deviation);
|
|
47
50
|
const devDir = deviation > 0 ? (ui.descLarger || 'larger') : (ui.descSmaller || 'smaller');
|
|
48
51
|
const action = deviation > 0 ? (ui.actionClose || 'Close') : (ui.actionOpen || 'Open');
|
|
@@ -51,41 +54,44 @@ function determineStatus(deviation: number, deviationPercent: number, ui: Record
|
|
|
51
54
|
return {
|
|
52
55
|
status,
|
|
53
56
|
message: getStatusMessage(status, ui),
|
|
54
|
-
correction: getCorrection(status, { absDev, devDir, action, ui })
|
|
57
|
+
correction: getCorrection(status, { absDev, devDir, action, unit, ui })
|
|
55
58
|
};
|
|
56
59
|
}
|
|
57
60
|
|
|
61
|
+
function createIdleResult(sideA: number, sideB: number): SquaringCalculation {
|
|
62
|
+
return { sideA, sideB, hypotenuse: 0, measuredDiagonal: null, deviation: null, deviationPercent: null, status: 'idle', message: '', correction: '' };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function createAcceptableResult(sideA: number, sideB: number, hypotenuse: number, ui: Record<string, string>): SquaringCalculation {
|
|
66
|
+
return { sideA, sideB, hypotenuse, measuredDiagonal: null, deviation: null, deviationPercent: null, status: 'acceptable', message: ui.msgIdealCalculated || 'Diagonal ideal calculated', correction: '' };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function validateInput(sideA: number, sideB: number): boolean {
|
|
70
|
+
return sideA > 0 && sideB > 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function calculateDeviation(measuredDiagonal: number, hypotenuse: number, unit: string, ui: Record<string, string>): Pick<SquaringCalculation, 'measuredDiagonal' | 'deviation' | 'deviationPercent' | 'status' | 'message' | 'correction'> {
|
|
74
|
+
const deviation = measuredDiagonal - hypotenuse;
|
|
75
|
+
const deviationPercent = (Math.abs(deviation) / hypotenuse) * 100;
|
|
76
|
+
const { status, message, correction } = determineStatus(deviation, deviationPercent, unit, ui);
|
|
77
|
+
return { measuredDiagonal, deviation, deviationPercent, status, message, correction };
|
|
78
|
+
}
|
|
79
|
+
|
|
58
80
|
export function calculateSquaring(
|
|
59
81
|
sideA: number,
|
|
60
82
|
sideB: number,
|
|
61
83
|
measuredDiagonal: number | null = null,
|
|
62
|
-
|
|
84
|
+
options: { unit?: string; ui?: Record<string, string> } = {}
|
|
63
85
|
): SquaringCalculation {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
hypotenuse: 0,
|
|
68
|
-
measuredDiagonal: null,
|
|
69
|
-
deviation: null,
|
|
70
|
-
deviationPercent: null
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
if (sideA <= 0 || sideB <= 0) {
|
|
74
|
-
return { ...baseResult, status: 'idle', message: '', correction: '' };
|
|
75
|
-
}
|
|
86
|
+
const unit = options.unit || '';
|
|
87
|
+
const ui = options.ui || {};
|
|
88
|
+
if (!validateInput(sideA, sideB)) return createIdleResult(sideA, sideB);
|
|
76
89
|
|
|
77
90
|
const hypotenuse = Math.sqrt(sideA ** 2 + sideB ** 2);
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (!measuredDiagonal || measuredDiagonal <= 0) {
|
|
81
|
-
return { ...baseResult, status: 'acceptable', message: ui.msgIdealCalculated || 'Diagonal ideal calculated', correction: '' };
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const deviation = measuredDiagonal - hypotenuse;
|
|
85
|
-
const deviationPercent = (Math.abs(deviation) / hypotenuse) * 100;
|
|
86
|
-
const { status, message, correction } = determineStatus(deviation, deviationPercent, ui);
|
|
91
|
+
if (!measuredDiagonal || measuredDiagonal <= 0) return createAcceptableResult(sideA, sideB, hypotenuse, ui);
|
|
87
92
|
|
|
88
|
-
|
|
93
|
+
const deviation = calculateDeviation(measuredDiagonal, hypotenuse, unit, ui);
|
|
94
|
+
return { sideA, sideB, hypotenuse, ...deviation };
|
|
89
95
|
}
|
|
90
96
|
|
|
91
97
|
export const PRESET_RULES = [
|
|
@@ -146,12 +146,21 @@
|
|
|
146
146
|
border-radius: 0.5rem;
|
|
147
147
|
background: var(--prac-bg);
|
|
148
148
|
color: var(--prac-neutral);
|
|
149
|
-
font-weight: 700;
|
|
150
149
|
cursor: pointer;
|
|
151
|
-
font-size: 0.9rem;
|
|
152
150
|
transition: all 200ms ease;
|
|
153
|
-
|
|
154
|
-
|
|
151
|
+
display: flex;
|
|
152
|
+
align-items: center;
|
|
153
|
+
justify-content: center;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.prac-btn-icon {
|
|
157
|
+
font-size: 1.25rem;
|
|
158
|
+
line-height: 1;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.prac-btn-icon svg {
|
|
162
|
+
width: 1.25rem;
|
|
163
|
+
height: 1.25rem;
|
|
155
164
|
}
|
|
156
165
|
|
|
157
166
|
.prac-btn:hover {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BibliographyEntry } from '../../types';
|
|
2
|
+
|
|
3
|
+
export const bibliography: BibliographyEntry[] = [
|
|
4
|
+
{
|
|
5
|
+
name: 'Two-Stroke Engine Fuel Mixture Ratios',
|
|
6
|
+
url: 'https://en.wikipedia.org/wiki/Two-stroke_engine',
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
name: 'Gasoline and Oil Mix Ratios for Small Engines',
|
|
10
|
+
url: 'https://homelivinghandbook.com/how-much-oil-should-you-mix-with-gas-for-small-engine-tools',
|
|
11
|
+
},
|
|
12
|
+
];
|