@jjlmoya/utils-tools 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +63 -0
- package/src/category/i18n/en.ts +172 -0
- package/src/category/i18n/es.ts +172 -0
- package/src/category/i18n/fr.ts +172 -0
- package/src/category/index.ts +23 -0
- package/src/category/seo.astro +15 -0
- package/src/components/PreviewNavSidebar.astro +116 -0
- package/src/components/PreviewToolbar.astro +143 -0
- package/src/data.ts +11 -0
- package/src/env.d.ts +5 -0
- package/src/index.ts +90 -0
- package/src/layouts/PreviewLayout.astro +117 -0
- package/src/pages/[locale]/[slug].astro +146 -0
- package/src/pages/[locale].astro +251 -0
- package/src/pages/index.astro +4 -0
- package/src/tests/faq_count.test.ts +19 -0
- package/src/tests/locale_completeness.test.ts +42 -0
- package/src/tests/mocks/astro_mock.js +2 -0
- package/src/tests/no_h1_in_components.test.ts +48 -0
- package/src/tests/schemas_fulfillment.test.ts +23 -0
- package/src/tests/seo_length.test.ts +23 -0
- package/src/tests/title_quality.test.ts +56 -0
- package/src/tests/tool_validation.test.ts +17 -0
- package/src/tool/date-diff-calculator/bibliography.astro +14 -0
- package/src/tool/date-diff-calculator/component.astro +370 -0
- package/src/tool/date-diff-calculator/i18n/en.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/es.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/fr.ts +132 -0
- package/src/tool/date-diff-calculator/index.ts +22 -0
- package/src/tool/date-diff-calculator/seo.astro +14 -0
- package/src/tool/date-diff-calculator/ui.ts +17 -0
- package/src/tool/drive-direct-link/bibliography.astro +14 -0
- package/src/tool/drive-direct-link/component.astro +280 -0
- package/src/tool/drive-direct-link/i18n/en.ts +118 -0
- package/src/tool/drive-direct-link/i18n/es.ts +118 -0
- package/src/tool/drive-direct-link/i18n/fr.ts +118 -0
- package/src/tool/drive-direct-link/index.ts +22 -0
- package/src/tool/drive-direct-link/seo.astro +14 -0
- package/src/tool/drive-direct-link/ui.ts +10 -0
- package/src/tool/email-list-cleaner/bibliography.astro +14 -0
- package/src/tool/email-list-cleaner/component.astro +375 -0
- package/src/tool/email-list-cleaner/i18n/en.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/es.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/fr.ts +140 -0
- package/src/tool/email-list-cleaner/index.ts +22 -0
- package/src/tool/email-list-cleaner/seo.astro +14 -0
- package/src/tool/email-list-cleaner/ui.ts +15 -0
- package/src/tool/env-badge-spain/bibliography.astro +14 -0
- package/src/tool/env-badge-spain/component.astro +303 -0
- package/src/tool/env-badge-spain/components/BadgeForm.astro +243 -0
- package/src/tool/env-badge-spain/components/BadgeResult.astro +151 -0
- package/src/tool/env-badge-spain/i18n/en.ts +153 -0
- package/src/tool/env-badge-spain/i18n/es.ts +153 -0
- package/src/tool/env-badge-spain/i18n/fr.ts +153 -0
- package/src/tool/env-badge-spain/index.ts +22 -0
- package/src/tool/env-badge-spain/seo.astro +14 -0
- package/src/tool/env-badge-spain/ui.ts +53 -0
- package/src/tool/morse-beacon/bibliography.astro +14 -0
- package/src/tool/morse-beacon/component.astro +534 -0
- package/src/tool/morse-beacon/i18n/en.ts +157 -0
- package/src/tool/morse-beacon/i18n/es.ts +157 -0
- package/src/tool/morse-beacon/i18n/fr.ts +157 -0
- package/src/tool/morse-beacon/index.ts +22 -0
- package/src/tool/morse-beacon/logic/MorseEngine.ts +124 -0
- package/src/tool/morse-beacon/seo.astro +14 -0
- package/src/tool/morse-beacon/ui.ts +18 -0
- package/src/tool/password-generator/bibliography.astro +14 -0
- package/src/tool/password-generator/component.astro +259 -0
- package/src/tool/password-generator/components/Config.astro +227 -0
- package/src/tool/password-generator/components/Display.astro +147 -0
- package/src/tool/password-generator/components/Strength.astro +70 -0
- package/src/tool/password-generator/i18n/en.ts +166 -0
- package/src/tool/password-generator/i18n/es.ts +166 -0
- package/src/tool/password-generator/i18n/fr.ts +166 -0
- package/src/tool/password-generator/index.ts +22 -0
- package/src/tool/password-generator/seo.astro +14 -0
- package/src/tool/password-generator/ui.ts +16 -0
- package/src/tool/routes/bibliography.astro +14 -0
- package/src/tool/routes/component.astro +543 -0
- package/src/tool/routes/i18n/en.ts +157 -0
- package/src/tool/routes/i18n/es.ts +157 -0
- package/src/tool/routes/i18n/fr.ts +157 -0
- package/src/tool/routes/index.ts +22 -0
- package/src/tool/routes/logic/GeocodingService.ts +60 -0
- package/src/tool/routes/logic/RouteManager.ts +192 -0
- package/src/tool/routes/logic/RouteService.ts +66 -0
- package/src/tool/routes/seo.astro +14 -0
- package/src/tool/routes/ui.ts +16 -0
- package/src/tool/rule-of-three/bibliography.astro +14 -0
- package/src/tool/rule-of-three/component.astro +369 -0
- package/src/tool/rule-of-three/i18n/en.ts +171 -0
- package/src/tool/rule-of-three/i18n/es.ts +171 -0
- package/src/tool/rule-of-three/i18n/fr.ts +171 -0
- package/src/tool/rule-of-three/index.ts +22 -0
- package/src/tool/rule-of-three/seo.astro +14 -0
- package/src/tool/rule-of-three/ui.ts +13 -0
- package/src/tool/seo-content-optimizer/bibliography.astro +14 -0
- package/src/tool/seo-content-optimizer/component.astro +552 -0
- package/src/tool/seo-content-optimizer/i18n/en.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/es.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/fr.ts +136 -0
- package/src/tool/seo-content-optimizer/index.ts +22 -0
- package/src/tool/seo-content-optimizer/seo.astro +14 -0
- package/src/tool/seo-content-optimizer/ui.ts +29 -0
- package/src/tool/speed-reader/bibliography.astro +14 -0
- package/src/tool/speed-reader/component.astro +586 -0
- package/src/tool/speed-reader/i18n/en.ts +152 -0
- package/src/tool/speed-reader/i18n/es.ts +152 -0
- package/src/tool/speed-reader/i18n/fr.ts +152 -0
- package/src/tool/speed-reader/index.ts +22 -0
- package/src/tool/speed-reader/logic/RSVPEngine.ts +106 -0
- package/src/tool/speed-reader/seo.astro +14 -0
- package/src/tool/speed-reader/ui.ts +14 -0
- package/src/tool/text-pixel-calculator/bibliography.astro +14 -0
- package/src/tool/text-pixel-calculator/component.astro +315 -0
- package/src/tool/text-pixel-calculator/components/Editor.astro +240 -0
- package/src/tool/text-pixel-calculator/components/Preview.astro +155 -0
- package/src/tool/text-pixel-calculator/components/Stats.astro +87 -0
- package/src/tool/text-pixel-calculator/i18n/en.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/es.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/fr.ts +133 -0
- package/src/tool/text-pixel-calculator/index.ts +22 -0
- package/src/tool/text-pixel-calculator/seo.astro +14 -0
- package/src/tool/text-pixel-calculator/ui.ts +15 -0
- package/src/tool/whatsapp-link/bibliography.astro +14 -0
- package/src/tool/whatsapp-link/component.astro +455 -0
- package/src/tool/whatsapp-link/i18n/en.ts +128 -0
- package/src/tool/whatsapp-link/i18n/es.ts +128 -0
- package/src/tool/whatsapp-link/i18n/fr.ts +128 -0
- package/src/tool/whatsapp-link/index.ts +22 -0
- package/src/tool/whatsapp-link/seo.astro +14 -0
- package/src/tool/whatsapp-link/ui.ts +15 -0
- package/src/tools.ts +15 -0
- package/src/types.ts +72 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { RuleOfThreeUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: '¿Qué es la regla de tres simple directa?',
|
|
8
|
+
answer: "Es un método matemático para resolver problemas de proporcionalidad entre tres valores conocidos y uno desconocido. Se llama 'directa' porque cuando una magnitud aumenta, la otra también lo hace en la misma proporción.",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: '¿Cuándo debo usar la regla de tres inversa?',
|
|
12
|
+
answer: 'Se utiliza cuando las magnitudes son inversamente proporcionales (si una aumenta, la otra disminuye). Por ejemplo: si 2 pintores tardan 5 horas, 4 pintores tardarán menos tiempo. Nuestra calculadora actual se centra en la proporcionalidad directa.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: '¿Es precisa para cálculos profesionales?',
|
|
16
|
+
answer: 'Sí. Nuestra calculadora utiliza precisión de punto flotante de alta fidelidad, ideal para ajustes de dosificación, escalas de diseño gráfico, presupuestos comerciales y conversiones de recetas de cocina.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: '¿Cómo se calcula manualmente?',
|
|
20
|
+
answer: 'La fórmula es: (Valor B * Valor C) / Valor A = X. Es decir, multiplicas los valores en diagonal y divides el resultado por el valor que queda solo.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Identificar la relación base',
|
|
27
|
+
text: 'Introduce los dos valores conocidos que forman la proporción inicial (ej. 100km equivalen a 8 litros).',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Introducir el tercer dato',
|
|
31
|
+
text: 'Escribe el nuevo valor del que quieres conocer su equivalente (ej. si voy a recorrer 250km...).',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Obtener el resultado',
|
|
35
|
+
text: 'El sistema calculará automáticamente el valor desconocido (X) en tiempo real sin necesidad de pulsar botones.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Copiar o resetear',
|
|
39
|
+
text: 'Puedes copiar el resultado directamente al portapapeles o limpiar los campos para realizar un nuevo cálculo.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: 'Cómo usar la calculadora de regla de tres',
|
|
57
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: 'Calculadora de Regla de Tres Simple',
|
|
64
|
+
applicationCategory: 'UtilitiesApplication',
|
|
65
|
+
operatingSystem: 'Web',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
67
|
+
description: 'Resuelve proporciones matemáticas al instante. La herramienta definitiva para calcular cantidades, recetas, descuentos y conversiones.',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const ui: RuleOfThreeUI = {
|
|
71
|
+
labelA: 'Si tengo...',
|
|
72
|
+
labelB: 'Equivale a...',
|
|
73
|
+
labelC: 'Y ahora tengo...',
|
|
74
|
+
labelX: 'Resultado (X)',
|
|
75
|
+
hintA: 'Cantidad inicial',
|
|
76
|
+
hintB: 'Valor conocido',
|
|
77
|
+
hintC: 'Nueva cantidad',
|
|
78
|
+
hintX: 'Valor calculado',
|
|
79
|
+
separatorIsTo: 'Es a',
|
|
80
|
+
separatorWillBe: 'Será a',
|
|
81
|
+
copyTitle: 'Copiar resultado',
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const content: ToolLocaleContent<RuleOfThreeUI> = {
|
|
85
|
+
slug: 'regla-de-tres',
|
|
86
|
+
title: 'Calculadora de Regla de Tres Simple',
|
|
87
|
+
description: 'Resuelve proporciones matemáticas al instante. La herramienta definitiva para calcular cantidades, recetas, descuentos y conversiones.',
|
|
88
|
+
ui,
|
|
89
|
+
faqTitle: 'Preguntas Frecuentes',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
howTo: howToData,
|
|
92
|
+
bibliographyTitle: 'Referencias',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{ name: 'Proporción (matemáticas) — Wikipedia', url: 'https://es.wikipedia.org/wiki/Proporci%C3%B3n_(matem%C3%A1ticas)' },
|
|
95
|
+
{ name: 'Regla de tres — Khan Academy', url: 'https://es.khanacademy.org/math/pre-algebra/pre-algebra-ratios-rates/pre-algebra-ratios-intro/a/ratio-review' },
|
|
96
|
+
],
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: '¿Para qué sirve la regla de tres?',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: 'La regla de tres simple directa es el "navaja suiza" de las matemáticas. Sirve para resolver problemas donde tres datos son conocidos y buscamos el cuarto. Si conoces la relación entre <strong>A y B</strong>, y tienes un nuevo valor <strong>C</strong>, la calculadora obtiene <strong>X</strong> al instante.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'comparative',
|
|
110
|
+
columns: 2,
|
|
111
|
+
items: [
|
|
112
|
+
{
|
|
113
|
+
icon: 'mdi:chef-hat',
|
|
114
|
+
title: 'Cocina y Recetas',
|
|
115
|
+
description: 'Si la receta pide 500g de harina para 4 personas, ¿cuánta necesito para 7?',
|
|
116
|
+
points: ['(500 × 7) ÷ 4 = 875g'],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
icon: 'mdi:shopping',
|
|
120
|
+
title: 'Compras y Precios',
|
|
121
|
+
description: 'Si el pack de 3 latas cuesta 2.50€, ¿cuánto me costarían 10 latas?',
|
|
122
|
+
points: ['(2.50 × 10) ÷ 3 = 8.33€'],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
icon: 'mdi:car',
|
|
126
|
+
title: 'Viajes y Distancia',
|
|
127
|
+
description: 'Si tardo 45 min en hacer 60km, ¿cuánto tardaré en hacer 140km?',
|
|
128
|
+
points: ['(45 × 140) ÷ 60 = 105 min'],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
icon: 'mdi:monitor-screenshot',
|
|
132
|
+
title: 'Diseño y Pantallas',
|
|
133
|
+
description: 'Si la imagen mide 1920px de ancho y quiero reducirla a 800px manteniendo la proporción...',
|
|
134
|
+
points: ['(AltoOriginal × 800) ÷ 1920 = AltoNuevo'],
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'title',
|
|
140
|
+
text: '¿Cómo funciona la fórmula?',
|
|
141
|
+
level: 2,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
type: 'paragraph',
|
|
145
|
+
html: 'La fórmula es siempre la misma: <strong>multiplica los cruzados y divide por el que sobra</strong>.',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'code',
|
|
149
|
+
code: '(B × C) ÷ A = X',
|
|
150
|
+
ariaLabel: 'Fórmula de la regla de tres simple directa',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'paragraph',
|
|
154
|
+
html: 'En la calculadora: multiplicamos el valor <strong>B</strong> por el valor <strong>C</strong> y dividimos entre <strong>A</strong>. El resultado es <strong>X</strong>.',
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'title',
|
|
158
|
+
text: 'Usos profesionales y cotidianos',
|
|
159
|
+
level: 2,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'paragraph',
|
|
163
|
+
html: 'Más allá de las matemáticas escolares, la regla de tres está en todas partes: en farmacia para calcular dosificaciones por peso corporal, en fotografía para calcular tiempos de exposición, en finanzas para calcular variaciones porcentuales, o en imprenta para escalar medidas de formato.',
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
type: 'tip',
|
|
167
|
+
title: 'Truco de precisión',
|
|
168
|
+
html: 'El resultado se muestra con hasta 4 decimales significativos. Si trabajas con dinero o medidas exactas, recuerda redondear según el contexto: los euros a 2 decimales, los píxeles a enteros.',
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { RuleOfThreeUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: "Qu'est-ce que la règle de trois simple directe ?",
|
|
8
|
+
answer: "C'est une méthode mathématique pour résoudre des problèmes de proportionnalité entre trois valeurs connues et une inconnue. On l'appelle 'directe' parce que lorsqu'une grandeur augmente, l'autre augmente dans la même proportion.",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Quand dois-je utiliser la règle de trois inverse ?',
|
|
12
|
+
answer: "On l'utilise quand les grandeurs sont inversement proportionnelles (si l'une augmente, l'autre diminue). Par exemple : si 2 peintres mettent 5 heures, 4 peintres mettront moins de temps. Notre calculatrice actuelle se concentre sur la proportionnalité directe.",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Est-elle précise pour les calculs professionnels ?',
|
|
16
|
+
answer: "Oui. Notre calculatrice utilise une précision en virgule flottante haute fidélité, idéale pour les ajustements de dosage, les échelles de conception graphique, les budgets commerciaux et les conversions de recettes de cuisine.",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Comment se calcule-t-elle manuellement ?',
|
|
20
|
+
answer: 'La formule est : (Valeur B * Valeur C) / Valeur A = X. Autrement dit, vous multipliez les valeurs en diagonale et divisez le résultat par la valeur restante.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Identifier la relation de base',
|
|
27
|
+
text: "Saisissez les deux valeurs connues qui forment la proportion initiale (ex. 100km équivalent à 8 litres).",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Saisir la troisième valeur',
|
|
31
|
+
text: "Écrivez la nouvelle valeur dont vous souhaitez connaître l'équivalent (ex. si je vais parcourir 250km...).",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Obtenir le résultat',
|
|
35
|
+
text: "Le système calculera automatiquement la valeur inconnue (X) en temps réel sans avoir besoin d'appuyer sur des boutons.",
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Copier ou réinitialiser',
|
|
39
|
+
text: "Vous pouvez copier le résultat directement dans le presse-papiers ou vider les champs pour effectuer un nouveau calcul.",
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: 'Comment utiliser la calculatrice de règle de trois',
|
|
57
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: 'Calculatrice de règle de trois simple',
|
|
64
|
+
applicationCategory: 'UtilitiesApplication',
|
|
65
|
+
operatingSystem: 'Web',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
67
|
+
description: "Résolvez des proportions mathématiques instantanément. L'outil définitif pour calculer des quantités, des recettes, des remises et des conversions.",
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const ui: RuleOfThreeUI = {
|
|
71
|
+
labelA: "Si j'ai...",
|
|
72
|
+
labelB: 'Cela équivaut à...',
|
|
73
|
+
labelC: "Et maintenant j'ai...",
|
|
74
|
+
labelX: 'Résultat (X)',
|
|
75
|
+
hintA: 'Quantité initiale',
|
|
76
|
+
hintB: 'Valeur connue',
|
|
77
|
+
hintC: 'Nouvelle quantité',
|
|
78
|
+
hintX: 'Valeur calculée',
|
|
79
|
+
separatorIsTo: 'Est à',
|
|
80
|
+
separatorWillBe: 'Sera à',
|
|
81
|
+
copyTitle: 'Copier le résultat',
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const content: ToolLocaleContent<RuleOfThreeUI> = {
|
|
85
|
+
slug: 'regle-de-trois',
|
|
86
|
+
title: 'Calculatrice de règle de trois simple',
|
|
87
|
+
description: "Résolvez des proportions mathématiques instantanément. L'outil définitif pour calculer des quantités, des recettes, des remises et des conversions.",
|
|
88
|
+
ui,
|
|
89
|
+
faqTitle: 'Questions fréquentes',
|
|
90
|
+
faq: faqData,
|
|
91
|
+
howTo: howToData,
|
|
92
|
+
bibliographyTitle: 'Références',
|
|
93
|
+
bibliography: [
|
|
94
|
+
{ name: 'Proportionnalité (mathématiques) — Wikipédia', url: 'https://fr.wikipedia.org/wiki/Proportionnalit%C3%A9' },
|
|
95
|
+
{ name: 'Ratios et proportions — Khan Academy', url: 'https://fr.khanacademy.org/math/pre-algebra/pre-algebra-ratios-rates' },
|
|
96
|
+
],
|
|
97
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
98
|
+
seo: [
|
|
99
|
+
{
|
|
100
|
+
type: 'title',
|
|
101
|
+
text: 'À quoi sert la règle de trois ?',
|
|
102
|
+
level: 2,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'paragraph',
|
|
106
|
+
html: "La règle de trois simple directe est le « couteau suisse » des mathématiques. Elle permet de résoudre des problèmes où trois données sont connues et on cherche la quatrième. Si vous connaissez la relation entre <strong>A et B</strong>, et que vous avez une nouvelle valeur <strong>C</strong>, la calculatrice trouve <strong>X</strong> instantanément.",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
type: 'comparative',
|
|
110
|
+
columns: 2,
|
|
111
|
+
items: [
|
|
112
|
+
{
|
|
113
|
+
icon: 'mdi:chef-hat',
|
|
114
|
+
title: 'Cuisine et recettes',
|
|
115
|
+
description: 'Si la recette demande 500g de farine pour 4 personnes, combien en faut-il pour 7 ?',
|
|
116
|
+
points: ['(500 × 7) ÷ 4 = 875g'],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
icon: 'mdi:shopping',
|
|
120
|
+
title: 'Achats et prix',
|
|
121
|
+
description: 'Si un pack de 3 boîtes coûte 2,50€, combien me coûteraient 10 boîtes ?',
|
|
122
|
+
points: ['(2,50 × 10) ÷ 3 = 8,33€'],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
icon: 'mdi:car',
|
|
126
|
+
title: 'Voyages et distances',
|
|
127
|
+
description: "Si je mets 45 min pour faire 60km, combien de temps me faudra-t-il pour faire 140km ?",
|
|
128
|
+
points: ['(45 × 140) ÷ 60 = 105 min'],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
icon: 'mdi:monitor-screenshot',
|
|
132
|
+
title: 'Design et écrans',
|
|
133
|
+
description: "Si l'image mesure 1920px de large et je veux la réduire à 800px en conservant les proportions...",
|
|
134
|
+
points: ['(HauteurOriginale × 800) ÷ 1920 = NouvelleHauteur'],
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
type: 'title',
|
|
140
|
+
text: 'Comment fonctionne la formule ?',
|
|
141
|
+
level: 2,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
type: 'paragraph',
|
|
145
|
+
html: 'La formule est toujours la même : <strong>multiplier les valeurs en diagonale et diviser par celle qui reste</strong>.',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'code',
|
|
149
|
+
code: '(B × C) ÷ A = X',
|
|
150
|
+
ariaLabel: 'Formule de la règle de trois simple directe',
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'paragraph',
|
|
154
|
+
html: 'Dans la calculatrice : on multiplie la valeur <strong>B</strong> par la valeur <strong>C</strong> et on divise par <strong>A</strong>. Le résultat est <strong>X</strong>.',
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'title',
|
|
158
|
+
text: 'Utilisations professionnelles et quotidiennes',
|
|
159
|
+
level: 2,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'paragraph',
|
|
163
|
+
html: "Au-delà des mathématiques scolaires, la règle de trois est partout : en pharmacie pour calculer les dosages selon le poids corporel, en photographie pour calculer les temps d'exposition, en finance pour calculer les variations en pourcentage, ou en imprimerie pour mettre à l'échelle les dimensions.",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
type: 'tip',
|
|
167
|
+
title: 'Astuce de précision',
|
|
168
|
+
html: "Le résultat est affiché avec jusqu'à 4 décimales significatives. Si vous travaillez avec de l'argent ou des mesures exactes, pensez à arrondir selon le contexte : l'euro à 2 décimales, les pixels en entiers.",
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ToolDefinition, ToolsToolEntry } from '../../types';
|
|
2
|
+
import type { RuleOfThreeUI } from './ui';
|
|
3
|
+
import RuleOfThreeComponent from './component.astro';
|
|
4
|
+
import RuleOfThreeSEO from './seo.astro';
|
|
5
|
+
import RuleOfThreeBibliography from './bibliography.astro';
|
|
6
|
+
|
|
7
|
+
export const ruleOfThree: ToolsToolEntry<RuleOfThreeUI> = {
|
|
8
|
+
id: 'rule-of-three',
|
|
9
|
+
icons: { bg: 'mdi:calculator-variant', fg: 'mdi:equal' },
|
|
10
|
+
i18n: {
|
|
11
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
12
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
13
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const RULE_OF_THREE_TOOL: ToolDefinition = {
|
|
18
|
+
entry: ruleOfThree,
|
|
19
|
+
Component: RuleOfThreeComponent,
|
|
20
|
+
SEOComponent: RuleOfThreeSEO,
|
|
21
|
+
BibliographyComponent: RuleOfThreeBibliography,
|
|
22
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { SEORenderer } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { ruleOfThree } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await ruleOfThree.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SEORenderer content={{ locale, sections: content.seo }} />}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface RuleOfThreeUI extends Record<string, string> {
|
|
2
|
+
labelA: string;
|
|
3
|
+
labelB: string;
|
|
4
|
+
labelC: string;
|
|
5
|
+
labelX: string;
|
|
6
|
+
hintA: string;
|
|
7
|
+
hintB: string;
|
|
8
|
+
hintC: string;
|
|
9
|
+
hintX: string;
|
|
10
|
+
separatorIsTo: string;
|
|
11
|
+
separatorWillBe: string;
|
|
12
|
+
copyTitle: string;
|
|
13
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
|
|
3
|
+
import { seoContentOptimizer } from './index';
|
|
4
|
+
import type { KnownLocale } from '../../types';
|
|
5
|
+
|
|
6
|
+
interface Props {
|
|
7
|
+
locale?: KnownLocale;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { locale = 'es' } = Astro.props;
|
|
11
|
+
const content = await seoContentOptimizer.i18n[locale]?.();
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
{content && <SharedBibliography links={content.bibliography} />}
|