@jjlmoya/utils-motor 1.13.0 → 1.14.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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/tests/locale_completeness.test.ts +1 -1
  5. package/src/tests/mfe_assets_contract.test.ts +6 -1
  6. package/src/tests/registry_contract.test.ts +23 -0
  7. package/src/tests/tool_validation.test.ts +1 -1
  8. package/src/tool/vehicleTotalCostPerKilometreCalculator/bibliography.astro +6 -0
  9. package/src/tool/vehicleTotalCostPerKilometreCalculator/bibliography.ts +12 -0
  10. package/src/tool/vehicleTotalCostPerKilometreCalculator/component.astro +97 -0
  11. package/src/tool/vehicleTotalCostPerKilometreCalculator/controller.ts +198 -0
  12. package/src/tool/vehicleTotalCostPerKilometreCalculator/dom-views.ts +47 -0
  13. package/src/tool/vehicleTotalCostPerKilometreCalculator/entry.ts +30 -0
  14. package/src/tool/vehicleTotalCostPerKilometreCalculator/evaluator.ts +14 -0
  15. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/de.ts +30 -0
  16. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/en.ts +48 -0
  17. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/es.ts +30 -0
  18. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/factory.ts +102 -0
  19. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/fr.ts +30 -0
  20. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/id.ts +30 -0
  21. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/it.ts +30 -0
  22. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/ja.ts +30 -0
  23. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/ko.ts +30 -0
  24. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/nl.ts +30 -0
  25. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/pl.ts +30 -0
  26. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/pt.ts +30 -0
  27. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/ru.ts +30 -0
  28. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/sv.ts +30 -0
  29. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/tr.ts +30 -0
  30. package/src/tool/vehicleTotalCostPerKilometreCalculator/i18n/zh.ts +30 -0
  31. package/src/tool/vehicleTotalCostPerKilometreCalculator/index.ts +10 -0
  32. package/src/tool/vehicleTotalCostPerKilometreCalculator/logic.test.ts +63 -0
  33. package/src/tool/vehicleTotalCostPerKilometreCalculator/logic.ts +132 -0
  34. package/src/tool/vehicleTotalCostPerKilometreCalculator/seo.astro +15 -0
  35. package/src/tool/vehicleTotalCostPerKilometreCalculator/storage.ts +38 -0
  36. package/src/tool/vehicleTotalCostPerKilometreCalculator/ui.ts +54 -0
  37. package/src/tool/vehicleTotalCostPerKilometreCalculator/vehicle-total-cost-per-kilometre-calculator.css +417 -0
  38. package/src/tools.ts +4 -1
@@ -0,0 +1,417 @@
1
+ .vehicle-cost-tool {
2
+ --n-ink: #182027;
3
+ --n-muted: #64727a;
4
+ --n-paper: #fffdf7;
5
+ --n-paper-soft: #f5efe3;
6
+ --n-line: #d9d0c1;
7
+ --n-road: #31444b;
8
+ --n-road-mark: #51636a;
9
+ --n-fuel: #e28a45;
10
+ --n-fixed: #78b6a2;
11
+ --n-accent: #b6493a;
12
+ --n-result-text: #fffdf7;
13
+ --n-result-muted: #c3d1cc;
14
+ --n-result-highlight: #f6c49c;
15
+
16
+ color: var(--n-ink);
17
+ }
18
+
19
+ .vehicle-cost-tool * {
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ .vehicle-cost-surface {
24
+ display: grid;
25
+ grid-template-columns: minmax(0, 1.25fr) minmax(320px, .9fr);
26
+ overflow: hidden;
27
+ border: 1px solid var(--n-line);
28
+ border-radius: 1.25rem;
29
+ background: var(--n-paper);
30
+ }
31
+
32
+ .vehicle-cost-controls {
33
+ padding: 1.35rem;
34
+ background: var(--n-paper-soft);
35
+ }
36
+
37
+ .vehicle-cost-toolbar {
38
+ display: flex;
39
+ flex-wrap: wrap;
40
+ gap: 1rem;
41
+ justify-content: space-between;
42
+ padding-bottom: 1rem;
43
+ border-bottom: 1px solid var(--n-line);
44
+ }
45
+
46
+ .vehicle-cost-presets,
47
+ .vehicle-cost-currency-picker {
48
+ display: flex;
49
+ flex-wrap: wrap;
50
+ gap: .45rem;
51
+ align-items: center;
52
+ }
53
+
54
+ .vehicle-cost-toolbar-label {
55
+ color: var(--n-muted);
56
+ font-size: .72rem;
57
+ letter-spacing: .05em;
58
+ text-transform: uppercase;
59
+ }
60
+
61
+ .vehicle-cost-presets button,
62
+ .vehicle-cost-compare-button,
63
+ .vehicle-cost-reset {
64
+ padding: .5rem .65rem;
65
+ border: 1px solid var(--n-line);
66
+ border-radius: .55rem;
67
+ background: var(--n-paper);
68
+ color: var(--n-ink);
69
+ cursor: pointer;
70
+ font: inherit;
71
+ font-size: .78rem;
72
+ }
73
+
74
+ .vehicle-cost-currency-picker select {
75
+ min-width: 11rem;
76
+ max-width: 15rem;
77
+ padding: .5rem 2rem .5rem .65rem;
78
+ border: 1px solid var(--n-line);
79
+ border-radius: .55rem;
80
+ background: var(--n-paper);
81
+ color: var(--n-ink);
82
+ cursor: pointer;
83
+ font: inherit;
84
+ font-size: .78rem;
85
+ }
86
+
87
+ .vehicle-cost-presets button:hover,
88
+ .vehicle-cost-compare-button:hover,
89
+ .vehicle-cost-reset:hover {
90
+ border-color: var(--n-accent);
91
+ color: var(--n-accent);
92
+ }
93
+
94
+ .vehicle-cost-currency-picker select:focus,
95
+ .vehicle-cost-currency-picker select:hover {
96
+ border-color: var(--n-accent);
97
+ outline: 0;
98
+ }
99
+
100
+ .vehicle-cost-scenario {
101
+ padding-top: 1.35rem;
102
+ }
103
+
104
+ .vehicle-cost-section-heading {
105
+ display: flex;
106
+ align-items: center;
107
+ justify-content: space-between;
108
+ gap: 1rem;
109
+ margin-bottom: .9rem;
110
+ }
111
+
112
+ .vehicle-cost-section-heading h2,
113
+ .vehicle-cost-result-heading h2 {
114
+ margin: 0;
115
+ font-size: 1rem;
116
+ letter-spacing: -.02em;
117
+ }
118
+
119
+ .vehicle-cost-compare-button {
120
+ border-color: var(--n-accent);
121
+ color: var(--n-accent);
122
+ }
123
+
124
+ .vehicle-cost-fields {
125
+ display: grid;
126
+ grid-template-columns: repeat(2, minmax(0, 1fr));
127
+ gap: .8rem;
128
+ }
129
+
130
+ .vehicle-cost-field {
131
+ display: grid;
132
+ min-width: 0;
133
+ gap: .3rem;
134
+ }
135
+
136
+ .vehicle-cost-field-wide {
137
+ grid-column: span 2;
138
+ }
139
+
140
+ .vehicle-cost-field span {
141
+ font-size: .83rem;
142
+ font-weight: 700;
143
+ }
144
+
145
+ .vehicle-cost-field small {
146
+ min-height: 1.9em;
147
+ color: var(--n-muted);
148
+ font-size: .7rem;
149
+ line-height: 1.35;
150
+ }
151
+
152
+ .vehicle-cost-input-wrap {
153
+ display: flex;
154
+ align-items: center;
155
+ gap: .4rem;
156
+ border-bottom: 1px solid var(--n-line);
157
+ }
158
+
159
+ .vehicle-cost-input-wrap:focus-within {
160
+ border-color: var(--n-accent);
161
+ }
162
+
163
+ .vehicle-cost-input-wrap input {
164
+ width: 100%;
165
+ min-width: 0;
166
+ padding: .55rem .1rem;
167
+ border: 0;
168
+ outline: 0;
169
+ background: transparent;
170
+ color: var(--n-ink);
171
+ font: inherit;
172
+ font-size: 1.05rem;
173
+ }
174
+
175
+ .vehicle-cost-input-wrap b {
176
+ color: var(--n-muted);
177
+ font-size: .72rem;
178
+ font-weight: 600;
179
+ white-space: nowrap;
180
+ }
181
+
182
+ .vehicle-cost-comparison-panel {
183
+ border-top: 1px solid var(--n-line);
184
+ }
185
+
186
+ .vehicle-cost-comparison-panel[hidden] {
187
+ display: none;
188
+ }
189
+
190
+ .vehicle-cost-result {
191
+ display: flex;
192
+ min-width: 0;
193
+ flex-direction: column;
194
+ padding: 1.35rem;
195
+ background: var(--n-road);
196
+ color: var(--n-result-text);
197
+ }
198
+
199
+ .vehicle-cost-result-heading {
200
+ display: flex;
201
+ flex-wrap: wrap;
202
+ align-items: start;
203
+ justify-content: space-between;
204
+ gap: .75rem;
205
+ padding-bottom: 1rem;
206
+ border-bottom: 1px solid var(--n-result-muted);
207
+ }
208
+
209
+ .vehicle-cost-result-heading > span {
210
+ width: 100%;
211
+ color: var(--n-result-highlight);
212
+ font-size: .7rem;
213
+ font-weight: 700;
214
+ letter-spacing: .1em;
215
+ text-transform: uppercase;
216
+ }
217
+
218
+ .vehicle-cost-reset {
219
+ border-color: var(--n-result-muted);
220
+ background: transparent;
221
+ color: var(--n-result-text);
222
+ }
223
+
224
+ .vehicle-cost-error {
225
+ margin: 1rem 0 0;
226
+ padding: .75rem;
227
+ border-left: 3px solid var(--n-fuel);
228
+ background: var(--n-road-mark);
229
+ color: var(--n-result-highlight);
230
+ font-size: .83rem;
231
+ line-height: 1.45;
232
+ }
233
+
234
+ .vehicle-cost-scene {
235
+ min-height: 10rem;
236
+ padding: .8rem 0 .35rem;
237
+ }
238
+
239
+ .vehicle-cost-scene svg {
240
+ display: block;
241
+ width: 100%;
242
+ height: auto;
243
+ overflow: visible;
244
+ }
245
+
246
+ .route-label {
247
+ fill: var(--n-result-text);
248
+ font-size: 11px;
249
+ font-weight: 700;
250
+ }
251
+
252
+ .route-base {
253
+ fill: var(--n-road-mark);
254
+ }
255
+
256
+ .route-fixed {
257
+ fill: var(--n-fixed);
258
+ }
259
+
260
+ .route-fuel {
261
+ fill: var(--n-fuel);
262
+ }
263
+
264
+ .route-end {
265
+ fill: var(--n-result-text);
266
+ stroke: var(--n-fuel);
267
+ stroke-width: 3;
268
+ }
269
+
270
+ .route-path {
271
+ stroke: var(--n-result-muted);
272
+ stroke-dasharray: 3 8;
273
+ stroke-width: 2;
274
+ }
275
+
276
+ .route-path-secondary {
277
+ opacity: .35;
278
+ }
279
+
280
+ .route-meta {
281
+ fill: var(--n-result-muted);
282
+ font-size: 9px;
283
+ }
284
+
285
+ .route-total {
286
+ fill: var(--n-result-highlight);
287
+ font-size: 12px;
288
+ font-weight: 700;
289
+ }
290
+
291
+ .vehicle-cost-metrics {
292
+ display: grid;
293
+ gap: .8rem;
294
+ margin-top: auto;
295
+ }
296
+
297
+ .vehicle-cost-primary-metric {
298
+ display: grid;
299
+ grid-template-columns: auto 1fr auto;
300
+ align-items: end;
301
+ gap: .45rem;
302
+ padding-top: .9rem;
303
+ border-top: 1px solid var(--n-result-muted);
304
+ }
305
+
306
+ .vehicle-cost-primary-metric span {
307
+ grid-column: 1 / -1;
308
+ color: var(--n-result-muted);
309
+ font-size: .76rem;
310
+ }
311
+
312
+ .vehicle-cost-primary-metric strong {
313
+ font-size: clamp(2.2rem, 5vw, 3.7rem);
314
+ line-height: .95;
315
+ letter-spacing: -.08em;
316
+ }
317
+
318
+ .vehicle-cost-primary-metric > b {
319
+ padding-bottom: .25rem;
320
+ color: var(--n-result-muted);
321
+ font-size: .8rem;
322
+ }
323
+
324
+ .vehicle-cost-primary-metric em {
325
+ grid-column: 1 / -1;
326
+ width: fit-content;
327
+ margin-top: .1rem;
328
+ padding: .28rem .5rem;
329
+ border-radius: 99rem;
330
+ background: var(--n-fixed);
331
+ color: var(--n-road);
332
+ font-size: .72rem;
333
+ font-style: normal;
334
+ font-weight: 700;
335
+ }
336
+
337
+ .vehicle-cost-secondary-metrics {
338
+ display: grid;
339
+ grid-template-columns: repeat(2, minmax(0, 1fr));
340
+ border-top: 1px solid var(--n-result-muted);
341
+ }
342
+
343
+ .vehicle-cost-secondary-metrics > div {
344
+ display: grid;
345
+ gap: .25rem;
346
+ padding: .7rem .7rem .65rem 0;
347
+ border-bottom: 1px solid var(--n-result-muted);
348
+ }
349
+
350
+ .vehicle-cost-secondary-metrics > div:nth-child(even) {
351
+ padding-left: .7rem;
352
+ border-left: 1px solid var(--n-result-muted);
353
+ }
354
+
355
+ .vehicle-cost-secondary-metrics span,
356
+ .vehicle-cost-secondary-metrics small {
357
+ color: var(--n-result-muted);
358
+ font-size: .72rem;
359
+ }
360
+
361
+ .vehicle-cost-secondary-metrics strong {
362
+ font-size: 1.05rem;
363
+ }
364
+
365
+ .vehicle-cost-comparison-summary {
366
+ margin: 1rem 0 0;
367
+ color: var(--n-result-highlight);
368
+ font-size: .84rem;
369
+ line-height: 1.45;
370
+ }
371
+
372
+ @media (prefers-color-scheme: dark) {
373
+ .vehicle-cost-tool {
374
+ --n-ink: #f5f0e7;
375
+ --n-muted: #afbbb7;
376
+ --n-paper: #182126;
377
+ --n-paper-soft: #202c31;
378
+ --n-line: #3b4a4c;
379
+ --n-road: #10171a;
380
+ --n-road-mark: #2f4045;
381
+ --n-fuel: #ef9b58;
382
+ --n-fixed: #75b9a2;
383
+ --n-accent: #f09179;
384
+ --n-result-text: #f5f0e7;
385
+ --n-result-muted: #afbbb7;
386
+ --n-result-highlight: #f6c49c;
387
+ }
388
+ }
389
+
390
+ @media (max-width: 760px) {
391
+ .vehicle-cost-surface {
392
+ grid-template-columns: 1fr;
393
+ }
394
+
395
+ .vehicle-cost-result {
396
+ min-height: 30rem;
397
+ }
398
+ }
399
+
400
+ @media (max-width: 480px) {
401
+ .vehicle-cost-controls,
402
+ .vehicle-cost-result {
403
+ padding: 1rem;
404
+ }
405
+
406
+ .vehicle-cost-fields {
407
+ grid-template-columns: 1fr;
408
+ }
409
+
410
+ .vehicle-cost-field-wide {
411
+ grid-column: auto;
412
+ }
413
+
414
+ .vehicle-cost-primary-metric strong {
415
+ font-size: 2.65rem;
416
+ }
417
+ }
package/src/tools.ts CHANGED
@@ -6,9 +6,12 @@ import { REAL_FUEL_CONSUMPTION_CALCULATOR_TOOL } from './tool/realFuelConsumptio
6
6
  import { TIRE_PRESSURE_CONVERTER_TOOL } from './tool/tirePressureConverter';
7
7
  import { EV_CHARGING_TIME_COST_PLANNER_TOOL } from './tool/evChargingTimeCostPlanner';
8
8
  import { TRAILER_TONGUE_WEIGHT_CALCULATOR_TOOL } from './tool/trailerTongueWeightCalculator';
9
+ import { VEHICLE_TOTAL_COST_PER_KILOMETRE_CALCULATOR_TOOL } from './tool/vehicleTotalCostPerKilometreCalculator';
9
10
 
10
- export const ALL_TOOLS = [BRAKING_DISTANCE_CALCULATOR_TOOL, REAL_FUEL_CONSUMPTION_CALCULATOR_TOOL, CAR_MOTORCYCLE_GEAR_RATIO_CALCULATOR_TOOL, TIRE_PRESSURE_CONVERTER_TOOL, MOTORCYCLE_SKID_MARK_SPEED_ESTIMATOR_TOOL, EV_CHARGING_TIME_COST_PLANNER_TOOL, TRAILER_TONGUE_WEIGHT_CALCULATOR_TOOL];
11
+ export const ALL_TOOLS = [BRAKING_DISTANCE_CALCULATOR_TOOL, REAL_FUEL_CONSUMPTION_CALCULATOR_TOOL, CAR_MOTORCYCLE_GEAR_RATIO_CALCULATOR_TOOL, TIRE_PRESSURE_CONVERTER_TOOL, MOTORCYCLE_SKID_MARK_SPEED_ESTIMATOR_TOOL, EV_CHARGING_TIME_COST_PLANNER_TOOL, TRAILER_TONGUE_WEIGHT_CALCULATOR_TOOL, VEHICLE_TOTAL_COST_PER_KILOMETRE_CALCULATOR_TOOL];
11
12
  export { evChargingTimeCostPlanner } from './tool/evChargingTimeCostPlanner/entry';
12
13
  export type { EVChargingTimeCostPlannerLocaleContent } from './tool/evChargingTimeCostPlanner/entry';
13
14
  export { trailerTongueWeightCalculator } from './tool/trailerTongueWeightCalculator/entry';
14
15
  export type { TrailerTongueWeightCalculatorLocaleContent } from './tool/trailerTongueWeightCalculator/entry';
16
+ export { vehicleTotalCostPerKilometreCalculator } from './tool/vehicleTotalCostPerKilometreCalculator/entry';
17
+ export type { VehicleTotalCostPerKilometreCalculatorLocaleContent } from './tool/vehicleTotalCostPerKilometreCalculator/entry';