@jjlmoya/utils-sports 1.10.0 → 1.11.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.10.0",
3
+ "version": "1.11.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -10,7 +10,8 @@
10
10
  "./entries": "./src/entries.ts"
11
11
  },
12
12
  "files": [
13
- "src"
13
+ "src",
14
+ "scripts"
14
15
  ],
15
16
  "publishConfig": {
16
17
  "access": "public"
@@ -29,7 +30,8 @@
29
30
  "postversion": "git push && git push --tags",
30
31
  "patch": "npm version patch",
31
32
  "minor": "npm version minor",
32
- "major": "npm version major"
33
+ "major": "npm version major",
34
+ "postinstall": "node scripts/postinstall.mjs"
33
35
  },
34
36
  "lint-staged": {
35
37
  "*.{ts,tsx,astro}": [
@@ -0,0 +1,27 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const libDir = dirname(fileURLToPath(import.meta.url));
6
+ const toolsDir = join(libDir, '../src/tool');
7
+
8
+ const inNodeModules = libDir.includes('node_modules');
9
+ if (!inNodeModules) process.exit(0);
10
+
11
+ const projectRoot = join(libDir, '../../../..');
12
+ const categoryKey = JSON.parse(readFileSync(join(libDir, '../package.json'), 'utf8')).name.replace('@jjlmoya/utils-', '');
13
+ const destDir = join(projectRoot, `public/styles/lib/${categoryKey}`);
14
+
15
+ mkdirSync(destDir, { recursive: true });
16
+
17
+ const tools = readdirSync(toolsDir, { withFileTypes: true }).filter(d => d.isDirectory());
18
+ for (const tool of tools) {
19
+ const toolDir = join(toolsDir, tool.name);
20
+ let files;
21
+ try { files = readdirSync(toolDir).filter(f => f.endsWith('.css')); }
22
+ catch { continue; }
23
+ for (const file of files) {
24
+ writeFileSync(join(destDir, file), readFileSync(join(toolDir, file)));
25
+ console.log(`[@jjlmoya/utils-${categoryKey}] copied ${file}`);
26
+ }
27
+ }
@@ -164,672 +164,3 @@ const t = (ui ?? {}) as GymTrackerUI & Record<string, string>;
164
164
  initGymTracker();
165
165
  </script>
166
166
 
167
- <style>
168
- :global(.gt-root) {
169
- width: 100%;
170
- max-width: 520px;
171
- margin: 0 auto;
172
- padding: 0.5rem;
173
- box-sizing: border-box;
174
- }
175
-
176
- :global(.gt-card) {
177
- background: var(--bg-surface);
178
- border: 1px solid var(--border-base);
179
- border-radius: 20px;
180
- padding: 1.25rem;
181
- display: flex;
182
- flex-direction: column;
183
- gap: 1.25rem;
184
- box-shadow: 0 4px 6px -1px var(--shadow-base);
185
- width: 100%;
186
- box-sizing: border-box;
187
- }
188
-
189
- :global(.gt-header-row) {
190
- display: flex;
191
- gap: 0.75rem;
192
- align-items: flex-end;
193
- }
194
-
195
- :global(.gt-field) {
196
- flex: 1;
197
- display: flex;
198
- flex-direction: column;
199
- gap: 0.5rem;
200
- min-width: 0;
201
- }
202
-
203
- :global(.gt-field label) {
204
- display: flex;
205
- align-items: center;
206
- gap: 0.5rem;
207
- font-size: 0.75rem;
208
- font-weight: 800;
209
- color: var(--text-muted);
210
- text-transform: uppercase;
211
- letter-spacing: 0.05em;
212
- }
213
-
214
- :global(.gt-icon-label) {
215
- width: 16px;
216
- height: 16px;
217
- color: var(--primary);
218
- }
219
-
220
- :global(.gt-select) {
221
- width: 100%;
222
- padding: 0.6rem 2rem 0.6rem 0.75rem;
223
- background: var(--bg-page);
224
- border: 1px solid var(--border-base);
225
- border-radius: 10px;
226
- color: var(--text-base);
227
- font-size: 0.95rem;
228
- font-weight: 600;
229
- cursor: pointer;
230
- appearance: none;
231
- outline: none;
232
- text-overflow: ellipsis;
233
- }
234
-
235
- :global(.gt-select-box) {
236
- position: relative;
237
- width: 100%;
238
- }
239
-
240
- :global(.gt-select-box::after) {
241
- content: "\25BC";
242
- position: absolute;
243
- right: 0.75rem;
244
- top: 50%;
245
- transform: translateY(-50%);
246
- font-size: 0.6rem;
247
- color: var(--text-muted);
248
- pointer-events: none;
249
- }
250
-
251
- :global(.gt-btn-toggle) {
252
- background: var(--bg-page);
253
- border: 1px solid var(--border-base);
254
- border-radius: 10px;
255
- width: 2.75rem;
256
- height: 2.75rem;
257
- display: flex;
258
- align-items: center;
259
- justify-content: center;
260
- color: var(--primary);
261
- cursor: pointer;
262
- transition: all 0.2s ease;
263
- flex-shrink: 0;
264
- }
265
-
266
- :global(.gt-btn-toggle:hover) {
267
- background: var(--primary-bg);
268
- transform: scale(1.05);
269
- }
270
-
271
- :global(.gt-custom-form) {
272
- margin-top: 1rem;
273
- padding: 1rem;
274
- background: var(--bg-page);
275
- border-radius: 12px;
276
- border: 1px dashed var(--border-base);
277
- }
278
-
279
- :global(.gt-label-small) {
280
- display: block;
281
- font-size: 0.65rem;
282
- font-weight: 700;
283
- color: var(--text-muted);
284
- margin-bottom: 0.5rem;
285
- text-transform: uppercase;
286
- }
287
-
288
- :global(.gt-custom-row) {
289
- display: flex;
290
- gap: 0.5rem;
291
- }
292
-
293
- :global(.gt-input-text) {
294
- flex: 1;
295
- min-width: 0;
296
- padding: 0.5rem;
297
- background: var(--bg-surface);
298
- border: 1px solid var(--border-base);
299
- border-radius: 8px;
300
- color: var(--text-base);
301
- font-size: 0.9rem;
302
- }
303
-
304
- :global(.gt-btn-secondary) {
305
- background: var(--bg-surface);
306
- border: 1px solid var(--border-base);
307
- color: var(--text-base);
308
- padding: 0 0.75rem;
309
- border-radius: 8px;
310
- font-weight: 700;
311
- font-size: 0.75rem;
312
- cursor: pointer;
313
- }
314
-
315
- :global(.gt-btn-icon) {
316
- background: none;
317
- border: none;
318
- color: var(--text-muted);
319
- font-size: 1rem;
320
- cursor: pointer;
321
- padding: 0 0.5rem;
322
- }
323
-
324
- :global(.gt-log-section) {
325
- background: var(--primary-bg);
326
- padding: 1rem;
327
- border-radius: 14px;
328
- border: 1px solid var(--primary-soft);
329
- }
330
-
331
- :global(.gt-label-main) {
332
- display: flex;
333
- align-items: center;
334
- gap: 0.5rem;
335
- font-weight: 800;
336
- font-size: 0.8rem;
337
- color: var(--primary);
338
- margin-bottom: 0.75rem;
339
- text-transform: uppercase;
340
- }
341
-
342
- :global(.gt-log-row) {
343
- display: flex;
344
- gap: 0.75rem;
345
- }
346
-
347
- :global(.gt-input-number) {
348
- flex: 1;
349
- min-width: 0;
350
- padding: 0.75rem;
351
- background: var(--bg-surface);
352
- border: 1px solid var(--border-base);
353
- border-radius: 10px;
354
- color: var(--primary);
355
- font-size: 1.25rem;
356
- font-weight: 900;
357
- text-align: center;
358
- outline: none;
359
- }
360
-
361
- :global(.gt-btn-primary) {
362
- background: var(--primary);
363
- color: white;
364
- border: none;
365
- border-radius: 10px;
366
- padding: 0 1.5rem;
367
- font-weight: 800;
368
- font-size: 0.85rem;
369
- text-transform: uppercase;
370
- cursor: pointer;
371
- box-shadow: 0 4px 12px var(--primary-soft);
372
- }
373
-
374
- :global(.gt-timer-section) {
375
- background: var(--bg-page);
376
- border-radius: 16px;
377
- overflow: hidden;
378
- position: relative;
379
- border: 1px solid var(--border-base);
380
- }
381
-
382
- :global(.gt-timer-container) {
383
- padding: 1rem;
384
- display: flex;
385
- justify-content: space-between;
386
- align-items: center;
387
- gap: 1.5rem;
388
- }
389
-
390
- :global(.gt-timer-main) {
391
- display: flex;
392
- flex-direction: column;
393
- align-items: center;
394
- min-width: 100px;
395
- }
396
-
397
- :global(.gt-timer-text) {
398
- font-size: 2rem;
399
- font-weight: 900;
400
- color: var(--text-muted);
401
- font-variant-numeric: tabular-nums;
402
- }
403
-
404
- :global(.gt-timer-text.gt-timer-active) {
405
- color: var(--primary);
406
- text-shadow: 0 0 15px var(--primary-soft);
407
- }
408
-
409
- :global(.gt-timer-actions) {
410
- display: flex;
411
- gap: 0.75rem;
412
- margin-top: 0.5rem;
413
- }
414
-
415
- :global(.gt-btn-round) {
416
- width: 32px;
417
- height: 32px;
418
- border-radius: 50%;
419
- background: var(--bg-surface);
420
- border: 1px solid var(--border-base);
421
- display: flex;
422
- align-items: center;
423
- justify-content: center;
424
- color: var(--text-base);
425
- cursor: pointer;
426
- transition: all 0.2s ease;
427
- }
428
-
429
- :global(.gt-btn-round:hover) {
430
- background: var(--bg-page);
431
- transform: scale(1.1);
432
- }
433
-
434
- :global(.gt-timer-presets) {
435
- flex: 1;
436
- display: flex;
437
- flex-direction: column;
438
- gap: 0.5rem;
439
- }
440
-
441
- :global(.gt-presets-grid) {
442
- display: grid;
443
- grid-template-columns: repeat(3, 1fr);
444
- gap: 0.4rem;
445
- }
446
-
447
- :global(.gt-preset-btn) {
448
- background: var(--bg-surface);
449
- border: 1px solid var(--border-base);
450
- color: var(--text-base);
451
- border-radius: 6px;
452
- padding: 0.4rem;
453
- font-size: 0.75rem;
454
- font-weight: 700;
455
- cursor: pointer;
456
- }
457
-
458
- :global(.gt-custom-timer) {
459
- display: flex;
460
- gap: 0.4rem;
461
- }
462
-
463
- :global(.gt-input-timer) {
464
- flex: 1;
465
- padding: 0.3rem;
466
- border-radius: 6px;
467
- border: 1px solid var(--border-base);
468
- background: var(--bg-surface);
469
- color: var(--text-base);
470
- font-size: 0.8rem;
471
- text-align: center;
472
- min-width: 0;
473
- }
474
-
475
- :global(.gt-btn-ok) {
476
- background: var(--primary);
477
- color: white;
478
- border: none;
479
- border-radius: 6px;
480
- padding: 0 0.75rem;
481
- font-size: 0.7rem;
482
- font-weight: 800;
483
- cursor: pointer;
484
- }
485
-
486
- :global(.gt-progress-bg) {
487
- height: 4px;
488
- background: var(--border-base);
489
- width: 100%;
490
- }
491
-
492
- :global(.gt-progress-bar) {
493
- height: 100%;
494
- background: var(--primary);
495
- width: 0%;
496
- transition: width 1s linear;
497
- }
498
-
499
- :global(.gt-dashboard) {
500
- display: flex;
501
- flex-direction: column;
502
- gap: 1rem;
503
- width: 100%;
504
- }
505
-
506
- :global(.gt-chart-wrapper) {
507
- background: var(--bg-page);
508
- border-radius: 12px;
509
- padding: 0.75rem;
510
- height: 120px;
511
- position: relative;
512
- border: 1px solid var(--border-base);
513
- min-width: 0;
514
- }
515
-
516
- :global(.gt-chart-box) {
517
- width: 100%;
518
- height: 100%;
519
- }
520
-
521
- :global(.gt-svg-chart) {
522
- width: 100%;
523
- height: 100%;
524
- color: var(--primary);
525
- overflow: visible;
526
- }
527
-
528
- :global(.gt-path) {
529
- filter: drop-shadow(0 0 4px var(--primary-soft));
530
- }
531
-
532
- :global(.gt-chart-dot) {
533
- fill: var(--primary);
534
- stroke: var(--bg-page);
535
- stroke-width: 2;
536
- }
537
-
538
- :global(.gt-empty-state) {
539
- position: absolute;
540
- inset: 0;
541
- display: flex;
542
- align-items: center;
543
- justify-content: center;
544
- font-size: 0.75rem;
545
- font-weight: 600;
546
- color: var(--text-muted);
547
- text-transform: uppercase;
548
- letter-spacing: 0.1em;
549
- }
550
-
551
- :global(.gt-stats) {
552
- display: grid;
553
- grid-template-columns: 1fr 1fr;
554
- gap: 0.75rem;
555
- width: 100%;
556
- }
557
-
558
- :global(.gt-stat-item) {
559
- background: var(--bg-page);
560
- border: 1px solid var(--border-base);
561
- padding: 0.75rem;
562
- border-radius: 12px;
563
- text-align: center;
564
- min-width: 0;
565
- }
566
-
567
- :global(.gt-stat-label) {
568
- display: block;
569
- font-size: 0.6rem;
570
- font-weight: 800;
571
- color: var(--text-muted);
572
- text-transform: uppercase;
573
- margin-bottom: 0.25rem;
574
- }
575
-
576
- :global(.gt-stat-val) {
577
- font-size: 1.1rem;
578
- font-weight: 900;
579
- color: var(--text-base);
580
- }
581
-
582
- :global(.gt-history) {
583
- border-top: 1px solid var(--border-base);
584
- padding-top: 1rem;
585
- min-width: 0;
586
- }
587
-
588
- :global(.gt-history-header) {
589
- display: flex;
590
- justify-content: space-between;
591
- align-items: center;
592
- margin-bottom: 0.75rem;
593
- }
594
-
595
- :global(.gt-history-title) {
596
- display: flex;
597
- align-items: center;
598
- gap: 0.5rem;
599
- margin: 0;
600
- font-size: 0.8rem;
601
- font-weight: 800;
602
- color: var(--text-base);
603
- text-transform: uppercase;
604
- white-space: nowrap;
605
- }
606
-
607
- :global(.gt-history-actions) {
608
- display: flex;
609
- gap: 0.75rem;
610
- }
611
-
612
- :global(.gt-btn-text) {
613
- background: none;
614
- border: none;
615
- color: var(--text-muted);
616
- font-size: 0.7rem;
617
- font-weight: 700;
618
- cursor: pointer;
619
- display: flex;
620
- align-items: center;
621
- gap: 0.25rem;
622
- }
623
-
624
- :global(.gt-btn-text:hover) {
625
- color: var(--primary);
626
- }
627
-
628
- :global(.gt-export-menu) {
629
- display: flex;
630
- gap: 0.5rem;
631
- margin-bottom: 0.75rem;
632
- }
633
-
634
- :global(.gt-export-item) {
635
- background: var(--bg-page);
636
- border: 1px solid var(--border-base);
637
- color: var(--text-base);
638
- border-radius: 6px;
639
- padding: 0.4rem 0.75rem;
640
- font-size: 0.65rem;
641
- font-weight: 800;
642
- cursor: pointer;
643
- }
644
-
645
- :global(.gt-history-list) {
646
- display: flex;
647
- flex-direction: column;
648
- gap: 0.5rem;
649
- }
650
-
651
- :global(.gt-history-item) {
652
- display: flex;
653
- justify-content: space-between;
654
- align-items: center;
655
- padding: 0.6rem 0.75rem;
656
- background: var(--bg-page);
657
- border-radius: 8px;
658
- font-size: 0.8rem;
659
- font-weight: 600;
660
- animation: gt-slide-in 0.3s ease-out;
661
- }
662
-
663
- @keyframes gt-slide-in {
664
- from {
665
- opacity: 0;
666
- transform: translateY(4px);
667
- }
668
- to {
669
- opacity: 1;
670
- transform: translateY(0);
671
- }
672
- }
673
-
674
- :global(.gt-history-row) {
675
- display: flex;
676
- align-items: center;
677
- gap: 1rem;
678
- }
679
-
680
- :global(.gt-history-weight) {
681
- color: var(--primary);
682
- font-weight: 800;
683
- }
684
-
685
- :global(.gt-btn-delete-log) {
686
- background: none;
687
- border: none;
688
- color: var(--text-muted);
689
- cursor: pointer;
690
- font-size: 0.8rem;
691
- padding: 4px;
692
- display: flex;
693
- align-items: center;
694
- justify-content: center;
695
- }
696
-
697
- :global(.gt-btn-delete-log:hover) {
698
- color: #ef4444;
699
- }
700
-
701
- :global(.gt-modal) {
702
- position: fixed;
703
- inset: 0;
704
- background: rgba(0, 0, 0, 0.6);
705
- backdrop-filter: blur(4px);
706
- z-index: 100;
707
- display: flex;
708
- align-items: center;
709
- justify-content: center;
710
- padding: 1.5rem;
711
- }
712
-
713
- :global(.gt-modal-box) {
714
- background: var(--bg-surface);
715
- border: 1px solid var(--border-base);
716
- border-radius: 20px;
717
- padding: 1.5rem;
718
- max-width: 320px;
719
- width: 100%;
720
- text-align: center;
721
- }
722
-
723
- :global(.gt-modal-box h4) {
724
- margin: 0 0 0.75rem;
725
- font-size: 1.1rem;
726
- font-weight: 900;
727
- color: var(--text-base);
728
- }
729
-
730
- :global(.gt-modal-box p) {
731
- font-size: 0.85rem;
732
- color: var(--text-muted);
733
- margin: 0 0 1.5rem;
734
- line-height: 1.5;
735
- }
736
-
737
- :global(.gt-modal-btns) {
738
- display: flex;
739
- gap: 0.75rem;
740
- }
741
-
742
- :global(.gt-btn-danger) {
743
- flex: 1;
744
- background: #ef4444;
745
- color: white;
746
- border: none;
747
- border-radius: 10px;
748
- padding: 0.75rem;
749
- font-weight: 800;
750
- font-size: 0.8rem;
751
- cursor: pointer;
752
- }
753
-
754
- :global(.gt-btn-cancel) {
755
- flex: 1;
756
- background: var(--bg-page);
757
- border: 1px solid var(--border-base);
758
- color: var(--text-base);
759
- border-radius: 10px;
760
- font-weight: 800;
761
- font-size: 0.8rem;
762
- cursor: pointer;
763
- }
764
-
765
- :global(.gt-icon-xs) {
766
- width: 14px;
767
- height: 14px;
768
- }
769
-
770
- :global(.gt-icon-sm) {
771
- width: 18px;
772
- height: 18px;
773
- }
774
-
775
- :global(.gt-icon-md) {
776
- width: 22px;
777
- height: 22px;
778
- }
779
-
780
- :global(.gt-hidden) {
781
- display: none;
782
- }
783
- :global(.gt-option-highlight) {
784
- color: var(--primary);
785
- font-weight: 800;
786
- }
787
-
788
- @media (min-width: 400px) {
789
- :global(.gt-dashboard) {
790
- flex-direction: column;
791
- }
792
- :global(.gt-chart-wrapper) {
793
- height: 160px;
794
- }
795
- :global(.gt-stats) {
796
- display: grid;
797
- grid-template-columns: 1fr 1fr;
798
- width: 100%;
799
- gap: 0.75rem;
800
- }
801
- }
802
-
803
- :global(.gt-animate-in) {
804
- animation: gt-fade-up 0.5s ease-out;
805
- }
806
-
807
- @keyframes gt-fade-up {
808
- from {
809
- opacity: 0;
810
- transform: translateY(10px);
811
- }
812
- to {
813
- opacity: 1;
814
- transform: translateY(0);
815
- }
816
- }
817
-
818
- :global(.theme-dark .gt-card) {
819
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.5);
820
- }
821
-
822
- :global(.theme-dark .gt-select),
823
- :global(.theme-dark .gt-input-text),
824
- :global(.theme-dark .gt-input-number),
825
- :global(.theme-dark .gt-input-timer),
826
- :global(.theme-dark .gt-btn-toggle),
827
- :global(.theme-dark .gt-btn-round),
828
- :global(.theme-dark .gt-preset-btn),
829
- :global(.theme-dark .gt-export-item),
830
- :global(.theme-dark .gt-stat-item),
831
- :global(.theme-dark .gt-history-item) {
832
- background-color: var(--bg-page);
833
- border-color: rgba(255, 255, 255, 0.1);
834
- }
835
- </style>