@jjlmoya/utils-sports 1.41.0 → 1.43.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-sports",
3
- "version": "1.41.0",
3
+ "version": "1.43.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -28,7 +28,7 @@
28
28
  "check": "astro check",
29
29
  "type-check": "astro check",
30
30
  "test": "vitest run",
31
- "preversion": "npm run lint && npm run test",
31
+ "preversion": "npm run lint && npm run test && npm run build",
32
32
  "postversion": "git push && git push --tags",
33
33
  "patch": "npm version patch",
34
34
  "minor": "npm version minor",
@@ -1,224 +1,16 @@
1
1
  ---
2
- import type { RunningPacePredictorUI } from './ui';
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { runningPacePredictor } from './index';
4
+ import type { KnownLocale } from '../../types';
3
5
 
4
6
  interface Props {
5
- ui: RunningPacePredictorUI;
7
+ locale?: KnownLocale;
6
8
  }
7
9
 
8
- const { ui } = Astro.props;
9
- const { seo } = ui;
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await runningPacePredictor.i18n[locale]?.();
12
+ if (!content) return null;
10
13
  ---
11
14
 
12
- <section class="rpp-seo-container">
13
- <header class="rpp-seo-header">
14
- <h2 class="rpp-seo-h1">{seo.h1}</h2>
15
- <p class="rpp-seo-intro">{seo.intro}</p>
16
- </header>
15
+ {content.seo && content.seo.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
17
16
 
18
- <div class="rpp-stats-grid">
19
- <div class="rpp-stat-card">
20
- <span class="rpp-stat-value">{seo.stat1Value}</span>
21
- <span class="rpp-stat-label">{seo.stat1Label}</span>
22
- </div>
23
- <div class="rpp-stat-card">
24
- <span class="rpp-stat-value">{seo.stat2Value}</span>
25
- <span class="rpp-stat-label">{seo.stat2Label}</span>
26
- </div>
27
- <div class="rpp-stat-card">
28
- <span class="rpp-stat-value">{seo.stat3Value}</span>
29
- <span class="rpp-stat-label">{seo.stat3Label}</span>
30
- </div>
31
- <div class="rpp-stat-card">
32
- <span class="rpp-stat-value">{seo.stat4Value}</span>
33
- <span class="rpp-stat-label">{seo.stat4Label}</span>
34
- </div>
35
- </div>
36
-
37
- <div class="rpp-comparative-block">
38
- <h2 class="rpp-seo-h2">{seo.comparativeTitle}</h2>
39
- <div class="rpp-comparative-grid">
40
- <div class="rpp-comparative-card">
41
- <h3>{seo.comparativeItem1Title}</h3>
42
- <p>{seo.comparativeItem1Desc}</p>
43
- </div>
44
- <div class="rpp-comparative-card">
45
- <h3>{seo.comparativeItem2Title}</h3>
46
- <p>{seo.comparativeItem2Desc}</p>
47
- </div>
48
- </div>
49
- </div>
50
-
51
- <div class="rpp-table-block">
52
- <h2 class="rpp-seo-h2">{seo.tableTitle}</h2>
53
- <div class="rpp-table-wrapper">
54
- <table class="rpp-seo-table">
55
- <thead>
56
- <tr>
57
- <th>{seo.tableCol1}</th>
58
- <th>{seo.tableCol2}</th>
59
- <th>{seo.tableCol3}</th>
60
- </tr>
61
- </thead>
62
- <tbody>
63
- <tr>
64
- <td>{seo.tableRow1Col1}</td>
65
- <td>{seo.tableRow1Col2}</td>
66
- <td>{seo.tableRow1Col3}</td>
67
- </tr>
68
- <tr>
69
- <td>{seo.tableRow2Col1}</td>
70
- <td>{seo.tableRow2Col2}</td>
71
- <td>{seo.tableRow2Col3}</td>
72
- </tr>
73
- <tr>
74
- <td>{seo.tableRow3Col1}</td>
75
- <td>{seo.tableRow3Col2}</td>
76
- <td>{seo.tableRow3Col3}</td>
77
- </tr>
78
- </tbody>
79
- </table>
80
- </div>
81
- </div>
82
-
83
- <div class="rpp-tip-card">
84
- <h3 class="rpp-tip-title">{seo.tipTitle}</h3>
85
- <p class="rpp-tip-text">{seo.tipText}</p>
86
- </div>
87
-
88
- <div class="rpp-faq-block">
89
- <h2 class="rpp-seo-h2">{seo.faqTitle}</h2>
90
- <div class="rpp-faq-item">
91
- <h4>{seo.faq1Q}</h4>
92
- <p>{seo.faq1A}</p>
93
- </div>
94
- <div class="rpp-faq-item">
95
- <h4>{seo.faq2Q}</h4>
96
- <p>{seo.faq2A}</p>
97
- </div>
98
- </div>
99
-
100
- <div class="rpp-glossary-block">
101
- <h2 class="rpp-seo-h2">{seo.glossaryTitle}</h2>
102
- <dl class="rpp-glossary-list">
103
- <dt>{seo.term1Name}</dt>
104
- <dd>{seo.term1Def}</dd>
105
- <dt>{seo.term2Name}</dt>
106
- <dd>{seo.term2Def}</dd>
107
- </dl>
108
- </div>
109
- </section>
110
-
111
- <style>
112
- .rpp-seo-container {
113
- display: flex;
114
- flex-direction: column;
115
- gap: 2rem;
116
- margin-top: 3rem;
117
- }
118
- .rpp-seo-h1 {
119
- font-size: 1.75rem;
120
- font-weight: 800;
121
- color: var(--text-base, #0f172a);
122
- margin-bottom: 0.5rem;
123
- }
124
- .rpp-seo-h2 {
125
- font-size: 1.35rem;
126
- font-weight: 700;
127
- color: var(--text-base, #0f172a);
128
- margin-bottom: 1rem;
129
- }
130
- .rpp-seo-intro {
131
- font-size: 1rem;
132
- line-height: 1.6;
133
- color: var(--text-muted, #475569);
134
- }
135
- .rpp-stats-grid {
136
- display: grid;
137
- grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
138
- gap: 1rem;
139
- }
140
- .rpp-stat-card {
141
- background: var(--bg-surface, #fff);
142
- border: 1px solid var(--border-base, #e2e8f0);
143
- padding: 1.25rem;
144
- border-radius: 12px;
145
- text-align: center;
146
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);
147
- }
148
- .rpp-stat-value {
149
- display: block;
150
- font-size: 1.6rem;
151
- font-weight: 800;
152
- color: var(--color-primary, #2563eb);
153
- }
154
- .rpp-stat-label {
155
- font-size: 0.85rem;
156
- color: var(--text-muted, #64748b);
157
- font-weight: 600;
158
- }
159
- .rpp-comparative-grid {
160
- display: grid;
161
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
162
- gap: 1rem;
163
- }
164
- .rpp-comparative-card {
165
- background: var(--bg-surface, #fff);
166
- border: 1px solid var(--border-base, #e2e8f0);
167
- padding: 1.25rem;
168
- border-radius: 12px;
169
- }
170
- .rpp-comparative-card h3 {
171
- font-size: 1.05rem;
172
- font-weight: 700;
173
- margin-bottom: 0.5rem;
174
- }
175
- .rpp-table-wrapper {
176
- overflow-x: auto;
177
- }
178
- .rpp-seo-table {
179
- width: 100%;
180
- border-collapse: collapse;
181
- background: var(--bg-surface, #fff);
182
- border-radius: 10px;
183
- overflow: hidden;
184
- border: 1px solid var(--border-base, #e2e8f0);
185
- }
186
- .rpp-seo-table th,
187
- .rpp-seo-table td {
188
- padding: 0.75rem 1rem;
189
- text-align: left;
190
- border-bottom: 1px solid var(--border-base, #e2e8f0);
191
- }
192
- .rpp-seo-table th {
193
- background: var(--bg-surface-elevated, #f8fafc);
194
- font-weight: 700;
195
- }
196
- .rpp-tip-card {
197
- background: rgba(37, 99, 235, 0.05);
198
- border-left: 4px solid var(--color-primary, #2563eb);
199
- padding: 1.25rem;
200
- border-radius: 8px;
201
- }
202
- .rpp-tip-title {
203
- font-size: 1.05rem;
204
- font-weight: 700;
205
- margin-bottom: 0.35rem;
206
- color: var(--color-primary, #2563eb);
207
- }
208
- .rpp-faq-item {
209
- margin-bottom: 1rem;
210
- }
211
- .rpp-faq-item h4 {
212
- font-weight: 700;
213
- font-size: 1rem;
214
- margin-bottom: 0.25rem;
215
- }
216
- .rpp-glossary-list dt {
217
- font-weight: 700;
218
- margin-top: 0.75rem;
219
- }
220
- .rpp-glossary-list dd {
221
- margin-left: 0;
222
- color: var(--text-muted, #64748b);
223
- }
224
- </style>
@@ -1,224 +1,16 @@
1
1
  ---
2
- import type { SwimCssCalculatorUI } from './ui';
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { swimCssCalculator } from './index';
4
+ import type { KnownLocale } from '../../types';
3
5
 
4
6
  interface Props {
5
- ui: SwimCssCalculatorUI;
7
+ locale?: KnownLocale;
6
8
  }
7
9
 
8
- const { ui } = Astro.props;
9
- const { seo } = ui;
10
+ const { locale = 'es' } = Astro.props;
11
+ const content = await swimCssCalculator.i18n[locale]?.();
12
+ if (!content) return null;
10
13
  ---
11
14
 
12
- <section class="swim-css-seo-container">
13
- <header class="swim-css-seo-header">
14
- <h2 class="swim-css-seo-h1">{seo.h1}</h2>
15
- <p class="swim-css-seo-intro">{seo.intro}</p>
16
- </header>
15
+ {content.seo && content.seo.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}
17
16
 
18
- <div class="swim-css-stats-grid">
19
- <div class="swim-css-stat-card">
20
- <span class="swim-css-stat-value">{seo.stat1Value}</span>
21
- <span class="swim-css-stat-label">{seo.stat1Label}</span>
22
- </div>
23
- <div class="swim-css-stat-card">
24
- <span class="swim-css-stat-value">{seo.stat2Value}</span>
25
- <span class="swim-css-stat-label">{seo.stat2Label}</span>
26
- </div>
27
- <div class="swim-css-stat-card">
28
- <span class="swim-css-stat-value">{seo.stat3Value}</span>
29
- <span class="swim-css-stat-label">{seo.stat3Label}</span>
30
- </div>
31
- <div class="swim-css-stat-card">
32
- <span class="swim-css-stat-value">{seo.stat4Value}</span>
33
- <span class="swim-css-stat-label">{seo.stat4Label}</span>
34
- </div>
35
- </div>
36
-
37
- <div class="swim-css-comparative-block">
38
- <h2 class="swim-css-seo-h2">{seo.comparativeTitle}</h2>
39
- <div class="swim-css-comparative-grid">
40
- <div class="swim-css-comparative-card">
41
- <h3>{seo.comparativeItem1Title}</h3>
42
- <p>{seo.comparativeItem1Desc}</p>
43
- </div>
44
- <div class="swim-css-comparative-card">
45
- <h3>{seo.comparativeItem2Title}</h3>
46
- <p>{seo.comparativeItem2Desc}</p>
47
- </div>
48
- </div>
49
- </div>
50
-
51
- <div class="swim-css-table-block">
52
- <h2 class="swim-css-seo-h2">{seo.tableTitle}</h2>
53
- <div class="swim-css-table-wrapper">
54
- <table class="swim-css-seo-table">
55
- <thead>
56
- <tr>
57
- <th>{seo.tableCol1}</th>
58
- <th>{seo.tableCol2}</th>
59
- <th>{seo.tableCol3}</th>
60
- </tr>
61
- </thead>
62
- <tbody>
63
- <tr>
64
- <td>{seo.tableRow1Col1}</td>
65
- <td>{seo.tableRow1Col2}</td>
66
- <td>{seo.tableRow1Col3}</td>
67
- </tr>
68
- <tr>
69
- <td>{seo.tableRow2Col1}</td>
70
- <td>{seo.tableRow2Col2}</td>
71
- <td>{seo.tableRow2Col3}</td>
72
- </tr>
73
- <tr>
74
- <td>{seo.tableRow3Col1}</td>
75
- <td>{seo.tableRow3Col2}</td>
76
- <td>{seo.tableRow3Col3}</td>
77
- </tr>
78
- </tbody>
79
- </table>
80
- </div>
81
- </div>
82
-
83
- <div class="swim-css-tip-card">
84
- <h3 class="swim-css-tip-title">{seo.tipTitle}</h3>
85
- <p class="swim-css-tip-text">{seo.tipText}</p>
86
- </div>
87
-
88
- <div class="swim-css-faq-block">
89
- <h2 class="swim-css-seo-h2">{seo.faqTitle}</h2>
90
- <div class="swim-css-faq-item">
91
- <h4>{seo.faq1Q}</h4>
92
- <p>{seo.faq1A}</p>
93
- </div>
94
- <div class="swim-css-faq-item">
95
- <h4>{seo.faq2Q}</h4>
96
- <p>{seo.faq2A}</p>
97
- </div>
98
- </div>
99
-
100
- <div class="swim-css-glossary-block">
101
- <h2 class="swim-css-seo-h2">{seo.glossaryTitle}</h2>
102
- <dl class="swim-css-glossary-list">
103
- <dt>{seo.term1Name}</dt>
104
- <dd>{seo.term1Def}</dd>
105
- <dt>{seo.term2Name}</dt>
106
- <dd>{seo.term2Def}</dd>
107
- </dl>
108
- </div>
109
- </section>
110
-
111
- <style>
112
- .swim-css-seo-container {
113
- display: flex;
114
- flex-direction: column;
115
- gap: 2rem;
116
- margin-top: 3rem;
117
- }
118
- .swim-css-seo-h1 {
119
- font-size: 1.75rem;
120
- font-weight: 800;
121
- color: var(--text-base, #0f172a);
122
- margin-bottom: 0.5rem;
123
- }
124
- .swim-css-seo-h2 {
125
- font-size: 1.35rem;
126
- font-weight: 700;
127
- color: var(--text-base, #0f172a);
128
- margin-bottom: 1rem;
129
- }
130
- .swim-css-seo-intro {
131
- font-size: 1rem;
132
- line-height: 1.6;
133
- color: var(--text-muted, #475569);
134
- }
135
- .swim-css-stats-grid {
136
- display: grid;
137
- grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
138
- gap: 1rem;
139
- }
140
- .swim-css-stat-card {
141
- background: var(--bg-surface, #fff);
142
- border: 1px solid var(--border-base, #e2e8f0);
143
- padding: 1.25rem;
144
- border-radius: 12px;
145
- text-align: center;
146
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);
147
- }
148
- .swim-css-stat-value {
149
- display: block;
150
- font-size: 1.25rem;
151
- font-weight: 800;
152
- color: var(--color-primary, #0284c7);
153
- }
154
- .swim-css-stat-label {
155
- font-size: 0.85rem;
156
- color: var(--text-muted, #64748b);
157
- font-weight: 600;
158
- }
159
- .swim-css-comparative-grid {
160
- display: grid;
161
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
162
- gap: 1rem;
163
- }
164
- .swim-css-comparative-card {
165
- background: var(--bg-surface, #fff);
166
- border: 1px solid var(--border-base, #e2e8f0);
167
- padding: 1.25rem;
168
- border-radius: 12px;
169
- }
170
- .swim-css-comparative-card h3 {
171
- font-size: 1.05rem;
172
- font-weight: 700;
173
- margin-bottom: 0.5rem;
174
- }
175
- .swim-css-table-wrapper {
176
- overflow-x: auto;
177
- }
178
- .swim-css-seo-table {
179
- width: 100%;
180
- border-collapse: collapse;
181
- background: var(--bg-surface, #fff);
182
- border-radius: 10px;
183
- overflow: hidden;
184
- border: 1px solid var(--border-base, #e2e8f0);
185
- }
186
- .swim-css-seo-table th,
187
- .swim-css-seo-table td {
188
- padding: 0.75rem 1rem;
189
- text-align: left;
190
- border-bottom: 1px solid var(--border-base, #e2e8f0);
191
- }
192
- .swim-css-seo-table th {
193
- background: var(--bg-surface-elevated, #f8fafc);
194
- font-weight: 700;
195
- }
196
- .swim-css-tip-card {
197
- background: rgba(2, 132, 199, 0.05);
198
- border-left: 4px solid var(--color-primary, #0284c7);
199
- padding: 1.25rem;
200
- border-radius: 8px;
201
- }
202
- .swim-css-tip-title {
203
- font-size: 1.05rem;
204
- font-weight: 700;
205
- margin-bottom: 0.35rem;
206
- color: var(--color-primary, #0284c7);
207
- }
208
- .swim-css-faq-item {
209
- margin-bottom: 1rem;
210
- }
211
- .swim-css-faq-item h4 {
212
- font-weight: 700;
213
- font-size: 1rem;
214
- margin-bottom: 0.25rem;
215
- }
216
- .swim-css-glossary-list dt {
217
- font-weight: 700;
218
- margin-top: 0.75rem;
219
- }
220
- .swim-css-glossary-list dd {
221
- margin-left: 0;
222
- color: var(--text-muted, #64748b);
223
- }
224
- </style>