@jjlmoya/utils-diy 1.14.0 → 1.15.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-diy",
3
- "version": "1.14.0",
3
+ "version": "1.15.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -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-unit-selector">
12
- <button class="prac-unit-btn active" data-unit="in">{t.btnUnitInches}</button>
13
- <button class="prac-unit-btn" data-unit="ft">{t.btnUnitFeet}</button>
14
- <button class="prac-unit-btn" data-unit="cm">{t.btnUnitCentimeters}</button>
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
- <i class="mdi mdi-delete"></i>
39
+ <Icon name="mdi:delete" />
35
40
  </button>
36
41
  <button id="prac-copy" class="prac-btn prac-btn-icon" title={t.btnCopyResults}>
37
- <i class="mdi mdi-content-copy"></i>
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 originalText = copyBtn.innerHTML;
232
- copyBtn.innerHTML = '<i class="mdi mdi-check"></i>';
233
- setTimeout(() => (copyBtn.innerHTML = originalText), 1500);
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
- tooltipOptional: 'Inserisci la diagonale misurata per verificare i 90 gradi',
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 devem estar no esquadro e as estruturas devem estar alinhadas. O teorema de Pitágoras fornece um método matematicamente garantido: a² + b² = c².' },
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
- if (status === 'acceptable') return `${action} the angle slightly. Diagonal is ${fixStr(absDev)} ${devDir}.`;
41
- if (status === 'warning') return `${action} the angle. Diagonal is ${fixStr(absDev)} ${devDir}.`;
42
- return `${ui.descCorrection || 'Correction'}: diagonal ${fixStr(absDev)} ${devDir} than ideal.`;
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
- ui: Record<string, string> = {}
84
+ options: { unit?: string; ui?: Record<string, string> } = {}
63
85
  ): SquaringCalculation {
64
- const baseResult: Omit<SquaringCalculation, 'status' | 'message' | 'correction'> = {
65
- sideA,
66
- sideB,
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
- baseResult.hypotenuse = hypotenuse;
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
- return { ...baseResult, measuredDiagonal, deviation, deviationPercent, status, message, correction };
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
- text-transform: uppercase;
154
- letter-spacing: 0.5px;
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 {