@jjlmoya/utils-chrono 1.5.0 → 1.6.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 (36) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -0
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +1 -1
  6. package/src/tests/tool_validation.test.ts +1 -1
  7. package/src/tool/service-interval-tracker/bibliography.astro +16 -0
  8. package/src/tool/service-interval-tracker/bibliography.ts +12 -0
  9. package/src/tool/service-interval-tracker/client.ts +233 -0
  10. package/src/tool/service-interval-tracker/component.astro +50 -0
  11. package/src/tool/service-interval-tracker/components/AddEditModal.astro +75 -0
  12. package/src/tool/service-interval-tracker/components/DashboardHeader.astro +14 -0
  13. package/src/tool/service-interval-tracker/components/EmptyState.astro +26 -0
  14. package/src/tool/service-interval-tracker/entry.ts +56 -0
  15. package/src/tool/service-interval-tracker/helpers.ts +82 -0
  16. package/src/tool/service-interval-tracker/i18n/de.ts +117 -0
  17. package/src/tool/service-interval-tracker/i18n/en.ts +170 -0
  18. package/src/tool/service-interval-tracker/i18n/es.ts +117 -0
  19. package/src/tool/service-interval-tracker/i18n/fr.ts +98 -0
  20. package/src/tool/service-interval-tracker/i18n/id.ts +89 -0
  21. package/src/tool/service-interval-tracker/i18n/it.ts +88 -0
  22. package/src/tool/service-interval-tracker/i18n/ja.ts +88 -0
  23. package/src/tool/service-interval-tracker/i18n/ko.ts +88 -0
  24. package/src/tool/service-interval-tracker/i18n/nl.ts +88 -0
  25. package/src/tool/service-interval-tracker/i18n/pl.ts +88 -0
  26. package/src/tool/service-interval-tracker/i18n/pt.ts +88 -0
  27. package/src/tool/service-interval-tracker/i18n/ru.ts +88 -0
  28. package/src/tool/service-interval-tracker/i18n/sv.ts +88 -0
  29. package/src/tool/service-interval-tracker/i18n/tr.ts +88 -0
  30. package/src/tool/service-interval-tracker/i18n/zh.ts +88 -0
  31. package/src/tool/service-interval-tracker/index.ts +11 -0
  32. package/src/tool/service-interval-tracker/renderer.ts +91 -0
  33. package/src/tool/service-interval-tracker/seo.astro +16 -0
  34. package/src/tool/service-interval-tracker/service-interval-tracker.css +767 -0
  35. package/src/tool/service-interval-tracker/utils.ts +58 -0
  36. package/src/tools.ts +2 -0
@@ -0,0 +1,58 @@
1
+ export interface WatchEntry {
2
+ id: string;
3
+ name: string;
4
+ movement: 'automatic' | 'manual' | 'quartz' | 'kinetic';
5
+ lastService: string | null;
6
+ intervalYears: number;
7
+ notes: string;
8
+ createdAt: string;
9
+ }
10
+
11
+ export type WatchStatus = 'healthy' | 'due' | 'overdue' | 'unknown';
12
+ export type MovementType = 'automatic' | 'manual' | 'quartz' | 'kinetic';
13
+
14
+ export function generateId(): string {
15
+ return crypto.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
16
+ }
17
+
18
+ export function getStatus(w: WatchEntry): WatchStatus {
19
+ if (!w.lastService) return 'unknown';
20
+ const last = new Date(w.lastService).getTime();
21
+ const next = last + w.intervalYears * 31536000000;
22
+ const now = Date.now();
23
+ const sixMonths = 180 * 86400000;
24
+ if (next < now) return 'overdue';
25
+ if (next - now < sixMonths) return 'due';
26
+ return 'healthy';
27
+ }
28
+
29
+ export function formatDate(iso: string): string {
30
+ return new Date(iso).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
31
+ }
32
+
33
+ export function daysFrom(iso: string): number {
34
+ return Math.round((Date.now() - new Date(iso).getTime()) / 86400000);
35
+ }
36
+
37
+ export function progressPct(w: WatchEntry): number {
38
+ if (!w.lastService) return 0;
39
+ const elapsed = Date.now() - new Date(w.lastService).getTime();
40
+ const total = w.intervalYears * 31536000000;
41
+ return Math.min(100, Math.round((elapsed / total) * 100));
42
+ }
43
+
44
+ export function nextServiceDate(w: WatchEntry): string | null {
45
+ if (!w.lastService) return null;
46
+ const d = new Date(new Date(w.lastService).getTime() + w.intervalYears * 31536000000);
47
+ return d.toISOString().split('T')[0];
48
+ }
49
+
50
+ export function movementIcon(type: MovementType): string {
51
+ const icons: Record<MovementType, string> = {
52
+ automatic: '\u2699',
53
+ manual: '\u23F0',
54
+ quartz: '\u26A1',
55
+ kinetic: '\u21BB',
56
+ };
57
+ return icons[type] || '\u2699';
58
+ }
package/src/tools.ts CHANGED
@@ -13,6 +13,7 @@ import { WATCH_SIZE_COMPARATOR_TOOL } from './tool/watch-size-comparator';
13
13
  import { LUME_COLOR_SIMULATOR_TOOL } from './tool/lume-color-simulator';
14
14
  import { MOON_PHASE_VISUALIZER_TOOL } from './tool/moon-phase-visualizer';
15
15
  import { TACHYMETER_CALCULATOR_TOOL } from './tool/tachymeter-calculator';
16
+ import { SERVICE_INTERVAL_TRACKER_TOOL } from './tool/service-interval-tracker';
16
17
 
17
18
  export const ALL_TOOLS: ToolDefinition[] = [
18
19
  WATCH_ACCURACY_TRACKER_TOOL,
@@ -28,6 +29,7 @@ export const ALL_TOOLS: ToolDefinition[] = [
28
29
  LUME_COLOR_SIMULATOR_TOOL,
29
30
  MOON_PHASE_VISUALIZER_TOOL,
30
31
  TACHYMETER_CALCULATOR_TOOL,
32
+ SERVICE_INTERVAL_TRACKER_TOOL,
31
33
  ];
32
34
 
33
35