@jjlmoya/utils-nautical 1.2.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 (74) hide show
  1. package/package.json +75 -0
  2. package/src/category/i18n/en.ts +79 -0
  3. package/src/category/i18n/es.ts +79 -0
  4. package/src/category/i18n/fr.ts +79 -0
  5. package/src/category/index.ts +13 -0
  6. package/src/components/PreviewNavSidebar.astro +116 -0
  7. package/src/components/PreviewToolbar.astro +143 -0
  8. package/src/data.ts +12 -0
  9. package/src/env.d.ts +5 -0
  10. package/src/index.ts +22 -0
  11. package/src/layouts/PreviewLayout.astro +117 -0
  12. package/src/pages/[locale]/[slug].astro +146 -0
  13. package/src/pages/[locale].astro +249 -0
  14. package/src/pages/index.astro +4 -0
  15. package/src/tests/faq_count.test.ts +30 -0
  16. package/src/tests/mocks/astro_mock.js +2 -0
  17. package/src/tests/seo_length.test.ts +29 -0
  18. package/src/tests/tool_validation.test.ts +51 -0
  19. package/src/tool/endurance/bibliography.astro +14 -0
  20. package/src/tool/endurance/component.astro +310 -0
  21. package/src/tool/endurance/i18n/en.ts +243 -0
  22. package/src/tool/endurance/i18n/es.ts +249 -0
  23. package/src/tool/endurance/i18n/fr.ts +217 -0
  24. package/src/tool/endurance/index.ts +56 -0
  25. package/src/tool/endurance/logic.ts +36 -0
  26. package/src/tool/endurance/seo.astro +55 -0
  27. package/src/tool/endurance/style.css +333 -0
  28. package/src/tool/nauticalConverter/bibliography.astro +14 -0
  29. package/src/tool/nauticalConverter/component.astro +481 -0
  30. package/src/tool/nauticalConverter/i18n/en.ts +239 -0
  31. package/src/tool/nauticalConverter/i18n/es.ts +239 -0
  32. package/src/tool/nauticalConverter/i18n/fr.ts +239 -0
  33. package/src/tool/nauticalConverter/index.ts +57 -0
  34. package/src/tool/nauticalConverter/logic.ts +52 -0
  35. package/src/tool/nauticalConverter/seo.astro +52 -0
  36. package/src/tool/nauticalConverter/style.css +205 -0
  37. package/src/tool/sailArea/bibliography.astro +14 -0
  38. package/src/tool/sailArea/component.astro +418 -0
  39. package/src/tool/sailArea/i18n/en.ts +275 -0
  40. package/src/tool/sailArea/i18n/es.ts +275 -0
  41. package/src/tool/sailArea/i18n/fr.ts +275 -0
  42. package/src/tool/sailArea/index.ts +53 -0
  43. package/src/tool/sailArea/logic.ts +55 -0
  44. package/src/tool/sailArea/seo.astro +52 -0
  45. package/src/tool/sailArea/style.css +351 -0
  46. package/src/tool/speedConverter/bibliography.astro +14 -0
  47. package/src/tool/speedConverter/component.astro +125 -0
  48. package/src/tool/speedConverter/i18n/en.ts +271 -0
  49. package/src/tool/speedConverter/i18n/es.ts +271 -0
  50. package/src/tool/speedConverter/i18n/fr.ts +271 -0
  51. package/src/tool/speedConverter/index.ts +46 -0
  52. package/src/tool/speedConverter/logic.ts +48 -0
  53. package/src/tool/speedConverter/seo.astro +43 -0
  54. package/src/tool/speedConverter/style.css +239 -0
  55. package/src/tool/tideCalculator/bibliography.astro +14 -0
  56. package/src/tool/tideCalculator/component.astro +314 -0
  57. package/src/tool/tideCalculator/i18n/en.ts +203 -0
  58. package/src/tool/tideCalculator/i18n/es.ts +225 -0
  59. package/src/tool/tideCalculator/i18n/fr.ts +190 -0
  60. package/src/tool/tideCalculator/index.ts +50 -0
  61. package/src/tool/tideCalculator/logic.ts +73 -0
  62. package/src/tool/tideCalculator/seo.astro +61 -0
  63. package/src/tool/tideCalculator/style.css +310 -0
  64. package/src/tool/underKeel/bibliography.astro +14 -0
  65. package/src/tool/underKeel/component.astro +240 -0
  66. package/src/tool/underKeel/i18n/en.ts +193 -0
  67. package/src/tool/underKeel/i18n/es.ts +206 -0
  68. package/src/tool/underKeel/i18n/fr.ts +193 -0
  69. package/src/tool/underKeel/index.ts +49 -0
  70. package/src/tool/underKeel/logic.ts +83 -0
  71. package/src/tool/underKeel/seo.astro +46 -0
  72. package/src/tool/underKeel/style.css +312 -0
  73. package/src/tools.ts +25 -0
  74. package/src/types.ts +69 -0
@@ -0,0 +1,333 @@
1
+ .endurance-calculator {
2
+ --n-bg: #fff;
3
+ --n-bg-muted: #f1f5f9;
4
+ --n-text: #0f172a;
5
+ --n-text-muted: #475569;
6
+ --n-text-dim: #64748b;
7
+ --n-border: #e2e8f0;
8
+ --n-shadow: rgba(0, 0, 0, 0.05);
9
+ --n-primary: #3b82f6;
10
+ --n-primary-on: #fff;
11
+ --n-accent: #6366f1;
12
+ --n-cyan: #0891b2;
13
+ --n-success: #10b981;
14
+ --n-warning: #f59e0b;
15
+ --n-error: #f43f5e;
16
+
17
+ max-width: 1000px;
18
+ margin: 0 auto;
19
+ }
20
+
21
+ .theme-dark .endurance-calculator {
22
+ --n-bg: #0f172a;
23
+ --n-bg-muted: #1e293b;
24
+ --n-text: #f8fafc;
25
+ --n-text-muted: #94a3b8;
26
+ --n-text-dim: #64748b;
27
+ --n-border: #334155;
28
+ --n-shadow: rgba(0, 0, 0, 0.3);
29
+ --n-primary: #60a5fa;
30
+ --n-primary-on: #fff;
31
+ --n-accent: #818cf8;
32
+ --n-cyan: #22d3ee;
33
+ --n-success: #34d399;
34
+ --n-warning: #fbbf24;
35
+ --n-error: #fb7185;
36
+ }
37
+
38
+ .ec-main-container {
39
+ background: var(--n-bg);
40
+ border: 1px solid var(--n-border);
41
+ border-radius: 1.5rem;
42
+ display: grid;
43
+ grid-template-columns: 360px 1fr;
44
+ overflow: hidden;
45
+ box-shadow: 0 20px 40px var(--n-shadow);
46
+ }
47
+
48
+ .ec-sidebar-inputs {
49
+ padding: 1.5rem;
50
+ border-right: 1px solid var(--n-border);
51
+ background: var(--n-bg-muted);
52
+ display: flex;
53
+ flex-direction: column;
54
+ gap: 1.2rem;
55
+ }
56
+
57
+ .ec-compact-group {
58
+ display: flex;
59
+ flex-direction: column;
60
+ gap: 0.4rem;
61
+ }
62
+
63
+ .ec-compact-group label {
64
+ font-size: 0.7rem;
65
+ font-weight: 800;
66
+ text-transform: uppercase;
67
+ color: var(--n-text-muted);
68
+ letter-spacing: 0.06em;
69
+ }
70
+
71
+ .ec-dual-row {
72
+ display: grid;
73
+ grid-template-columns: 1fr 1fr;
74
+ gap: 0.5rem;
75
+ }
76
+
77
+ .ec-sub-label {
78
+ font-size: 0.65rem;
79
+ color: var(--n-text-muted);
80
+ font-weight: 700;
81
+ margin-bottom: 0.2rem;
82
+ display: block;
83
+ }
84
+
85
+ .ec-field-wrapper {
86
+ position: relative;
87
+ display: flex;
88
+ align-items: center;
89
+ }
90
+
91
+ .ec-field-icon {
92
+ position: absolute;
93
+ left: 8px;
94
+ font-size: 0.9rem;
95
+ color: var(--n-text-muted);
96
+ pointer-events: none;
97
+ }
98
+
99
+ .ec-compact-input,
100
+ .ec-compact-select {
101
+ width: 100%;
102
+ background: var(--n-bg);
103
+ border: 1px solid var(--n-border);
104
+ border-radius: 0.5rem;
105
+ padding: 0.6rem 2.4rem 0.6rem 2.2rem;
106
+ font-size: 0.95rem;
107
+ font-weight: 700;
108
+ color: var(--n-text);
109
+ outline: none;
110
+ transition: border-color 0.2s;
111
+ }
112
+
113
+ .ec-compact-input:focus,
114
+ .ec-compact-select:focus {
115
+ border-color: var(--n-primary);
116
+ }
117
+
118
+ .ec-compact-select {
119
+ padding-right: 0.6rem;
120
+ cursor: pointer;
121
+ }
122
+
123
+ .ec-unit-tag {
124
+ position: absolute;
125
+ right: 8px;
126
+ font-size: 0.65rem;
127
+ font-weight: 800;
128
+ color: var(--n-text-muted);
129
+ pointer-events: none;
130
+ }
131
+
132
+ .ec-dashboard-panel {
133
+ padding: 2rem;
134
+ display: flex;
135
+ flex-direction: column;
136
+ gap: 2rem;
137
+ }
138
+
139
+ .ec-hero-display {
140
+ background: var(--n-primary);
141
+ border-radius: 1rem;
142
+ padding: 2rem;
143
+ color: var(--n-primary-on);
144
+ display: flex;
145
+ flex-direction: column;
146
+ gap: 1.5rem;
147
+ }
148
+
149
+ .ec-hero-top {
150
+ display: flex;
151
+ justify-content: space-between;
152
+ align-items: flex-start;
153
+ }
154
+
155
+ .ec-display-title {
156
+ font-size: 0.65rem;
157
+ font-weight: 900;
158
+ text-transform: uppercase;
159
+ color: var(--n-cyan);
160
+ letter-spacing: 0.1em;
161
+ }
162
+
163
+ .ec-main-value-row {
164
+ display: flex;
165
+ align-items: baseline;
166
+ gap: 0.5rem;
167
+ }
168
+
169
+ .ec-main-value {
170
+ font-size: 4rem;
171
+ font-weight: 900;
172
+ color: var(--n-primary-on);
173
+ line-height: 1;
174
+ }
175
+
176
+ .ec-main-unit {
177
+ font-size: 1.2rem;
178
+ font-weight: 700;
179
+ opacity: 0.4;
180
+ color: var(--n-primary-on);
181
+ }
182
+
183
+ .ec-fuel-badge {
184
+ font-size: 1.5rem;
185
+ font-weight: 900;
186
+ color: var(--n-primary-on);
187
+ opacity: 0.7;
188
+ }
189
+
190
+ .ec-progress-track {
191
+ height: 10px;
192
+ background: rgba(255, 255, 255, 0.1);
193
+ border-radius: 5px;
194
+ position: relative;
195
+ overflow: hidden;
196
+ }
197
+
198
+ .ec-progress-fill {
199
+ height: 100%;
200
+ background: linear-gradient(90deg, var(--n-error) 0%, var(--n-cyan) 100%);
201
+ width: 0%;
202
+ transition: width 0.8s ease-out;
203
+ }
204
+
205
+ .ec-marker {
206
+ position: absolute;
207
+ top: 0;
208
+ bottom: 0;
209
+ width: 2px;
210
+ background: var(--n-primary-on);
211
+ z-index: 2;
212
+ }
213
+
214
+ .ec-stats-grid {
215
+ display: grid;
216
+ grid-template-columns: repeat(2, 1fr);
217
+ gap: 1rem;
218
+ }
219
+
220
+ .ec-stat-card {
221
+ background: var(--n-bg-muted);
222
+ border: 1px solid var(--n-border);
223
+ border-radius: 0.75rem;
224
+ padding: 1rem;
225
+ display: flex;
226
+ flex-direction: column;
227
+ gap: 0.2rem;
228
+ }
229
+
230
+ .ec-stat-label {
231
+ font-size: 0.6rem;
232
+ font-weight: 800;
233
+ text-transform: uppercase;
234
+ color: var(--n-text-muted);
235
+ letter-spacing: 0.06em;
236
+ }
237
+
238
+ .ec-stat-value {
239
+ font-size: 1.4rem;
240
+ font-weight: 900;
241
+ color: var(--n-text);
242
+ }
243
+
244
+ .ec-stat-value.danger {
245
+ color: var(--n-error);
246
+ }
247
+
248
+ .ec-stat-card.hidden {
249
+ display: none;
250
+ }
251
+
252
+ .ec-inverter-card {
253
+ padding: 1.5rem;
254
+ background: var(--n-bg-muted);
255
+ border: 1px dashed var(--n-border);
256
+ border-radius: 1rem;
257
+ display: flex;
258
+ flex-direction: column;
259
+ gap: 1rem;
260
+ }
261
+
262
+ .ec-inverter-header {
263
+ font-size: 0.75rem;
264
+ font-weight: 900;
265
+ text-transform: uppercase;
266
+ color: var(--n-cyan);
267
+ letter-spacing: 0.06em;
268
+ }
269
+
270
+ .ec-inverter-row {
271
+ display: grid;
272
+ grid-template-columns: 1fr 1fr;
273
+ gap: 1.5rem;
274
+ align-items: center;
275
+ }
276
+
277
+ .ec-inverter-label {
278
+ font-size: 0.65rem;
279
+ font-weight: 800;
280
+ text-transform: uppercase;
281
+ color: var(--n-text-muted);
282
+ margin-bottom: 0.3rem;
283
+ }
284
+
285
+ .ec-inverter-value {
286
+ font-size: 2rem;
287
+ font-weight: 900;
288
+ color: var(--n-cyan);
289
+ }
290
+
291
+ .ec-inverter-unit {
292
+ font-size: 0.85rem;
293
+ color: var(--n-text-muted);
294
+ font-weight: 700;
295
+ }
296
+
297
+ .ec-warning-bar {
298
+ background: color-mix(in srgb, var(--n-error), transparent 90%);
299
+ padding: 0.8rem 1.2rem;
300
+ border-radius: 0.5rem;
301
+ display: flex;
302
+ align-items: center;
303
+ gap: 0.6rem;
304
+ font-size: 0.75rem;
305
+ font-weight: 600;
306
+ color: var(--n-error);
307
+ }
308
+
309
+ .ec-warning-icon {
310
+ font-size: 1rem;
311
+ flex-shrink: 0;
312
+ }
313
+
314
+ @media (max-width: 800px) {
315
+ .ec-main-container {
316
+ grid-template-columns: 1fr;
317
+ }
318
+
319
+ .ec-sidebar-inputs {
320
+ border-right: none;
321
+ border-bottom: 1px solid var(--n-border);
322
+ }
323
+ }
324
+
325
+ @media (max-width: 480px) {
326
+ .ec-main-value {
327
+ font-size: 2.8rem;
328
+ }
329
+
330
+ .ec-stats-grid {
331
+ grid-template-columns: 1fr;
332
+ }
333
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import { nauticalConverter } 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 nauticalConverter.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && <SharedBibliography links={content.bibliography} title={content.ui.bibliographyTitle} />}