@jjlmoya/utils-textiles 1.9.0 → 1.12.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 (53) hide show
  1. package/package.json +7 -4
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/category/index.ts +24 -25
  4. package/src/entries.ts +37 -0
  5. package/src/tool/burnTest/component.astro +0 -380
  6. package/src/tool/burnTest/entry.ts +30 -0
  7. package/src/tool/burnTest/index.ts +2 -32
  8. package/src/tool/burnTest/textile-burn-test.css +378 -0
  9. package/src/tool/clothingSizeConverter/clothing-size-converter.css +717 -0
  10. package/src/tool/clothingSizeConverter/component.astro +0 -719
  11. package/src/tool/clothingSizeConverter/entry.ts +30 -0
  12. package/src/tool/clothingSizeConverter/index.ts +2 -32
  13. package/src/tool/fabricProjectCalculator/component.astro +0 -540
  14. package/src/tool/fabricProjectCalculator/entry.ts +30 -0
  15. package/src/tool/fabricProjectCalculator/fabric-project-calculator.css +538 -0
  16. package/src/tool/fabricProjectCalculator/index.ts +2 -32
  17. package/src/tool/fabricTruth/component.astro +0 -428
  18. package/src/tool/fabricTruth/entry.ts +30 -0
  19. package/src/tool/fabricTruth/fabric-truthfulness.css +426 -0
  20. package/src/tool/fabricTruth/index.ts +2 -32
  21. package/src/tool/fiberPrep/component.astro +0 -652
  22. package/src/tool/fiberPrep/entry.ts +30 -0
  23. package/src/tool/fiberPrep/fiber-preparation-natural-dyeing.css +650 -0
  24. package/src/tool/fiberPrep/index.ts +2 -32
  25. package/src/tool/knittingGauge/component.astro +0 -458
  26. package/src/tool/knittingGauge/entry.ts +30 -0
  27. package/src/tool/knittingGauge/index.ts +2 -32
  28. package/src/tool/knittingGauge/knitting-gauge-calculator.css +456 -0
  29. package/src/tool/laundryGuide/component.astro +0 -317
  30. package/src/tool/laundryGuide/entry.ts +25 -0
  31. package/src/tool/laundryGuide/index.ts +2 -27
  32. package/src/tool/laundryGuide/laundry-guide.css +315 -0
  33. package/src/tool/needleConverter/component.astro +0 -344
  34. package/src/tool/needleConverter/entry.ts +30 -0
  35. package/src/tool/needleConverter/index.ts +2 -32
  36. package/src/tool/needleConverter/knitting-needle-converter.css +342 -0
  37. package/src/tool/sewingPatternScaler/component.astro +0 -314
  38. package/src/tool/sewingPatternScaler/entry.ts +30 -0
  39. package/src/tool/sewingPatternScaler/index.ts +2 -32
  40. package/src/tool/sewingPatternScaler/sewing-pattern-scaler.css +313 -0
  41. package/src/tool/shoeSizeConverter/component.astro +0 -255
  42. package/src/tool/shoeSizeConverter/entry.ts +30 -0
  43. package/src/tool/shoeSizeConverter/index.ts +2 -32
  44. package/src/tool/shoeSizeConverter/shoe-size-converter.css +253 -0
  45. package/src/tool/stainChemistry/component.astro +0 -479
  46. package/src/tool/stainChemistry/entry.ts +30 -0
  47. package/src/tool/stainChemistry/index.ts +2 -32
  48. package/src/tool/stainChemistry/stain-chemical-protocol.css +477 -0
  49. package/src/tool/yarnCalculator/component.astro +0 -446
  50. package/src/tool/yarnCalculator/entry.ts +30 -0
  51. package/src/tool/yarnCalculator/index.ts +2 -32
  52. package/src/tool/yarnCalculator/yarn-calculator.css +444 -0
  53. package/src/tools.ts +1 -1
@@ -0,0 +1,253 @@
1
+ .shoe-converter {
2
+ max-width: 800px;
3
+ margin: 0 auto;
4
+ padding: 1rem 1rem 4rem;
5
+ }
6
+
7
+ .converter-card {
8
+ background: var(--bg-surface);
9
+ border: 1px solid var(--border-color);
10
+ border-radius: 2.5rem;
11
+ padding: 3rem;
12
+ box-shadow: 0 25px 60px rgba(0, 0, 0, 0.05);
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: 3rem;
16
+ }
17
+
18
+ .theme-dark .converter-card {
19
+ box-shadow: 0 25px 60px rgba(0, 0, 0, 0.3);
20
+ }
21
+
22
+ .gender-selector {
23
+ display: flex;
24
+ justify-content: center;
25
+ gap: 2rem;
26
+ }
27
+
28
+ .gender-btn {
29
+ width: 80px;
30
+ height: 80px;
31
+ border-radius: 2rem;
32
+ border: 2px solid transparent;
33
+ background: var(--bg-page);
34
+ cursor: pointer;
35
+ transition: all 0.3s;
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ color: var(--text-muted);
40
+ }
41
+
42
+ .gender-btn svg {
43
+ width: 2.5rem;
44
+ height: 2.5rem;
45
+ }
46
+
47
+ .gender-btn-men.active {
48
+ background: rgba(59, 130, 246, 0.08);
49
+ border-color: #3b82f6;
50
+ color: #3b82f6;
51
+ box-shadow: 0 10px 25px rgba(59, 130, 246, 0.2);
52
+ transform: translateY(-4px);
53
+ }
54
+
55
+ .gender-btn-women.active {
56
+ background: rgba(244, 63, 94, 0.08);
57
+ border-color: #f43f5e;
58
+ color: #f43f5e;
59
+ box-shadow: 0 10px 25px rgba(244, 63, 94, 0.2);
60
+ transform: translateY(-4px);
61
+ }
62
+
63
+ .size-section {
64
+ display: flex;
65
+ flex-direction: column;
66
+ gap: 1.5rem;
67
+ }
68
+
69
+ .field-group {
70
+ display: flex;
71
+ flex-direction: column;
72
+ gap: 0.5rem;
73
+ }
74
+
75
+ .field-label {
76
+ font-size: 0.75rem;
77
+ font-weight: 800;
78
+ color: var(--text-muted);
79
+ text-transform: uppercase;
80
+ letter-spacing: 0.1em;
81
+ }
82
+
83
+ .select-wrap {
84
+ position: relative;
85
+ }
86
+
87
+ .select-wrap::after {
88
+ content: '▾';
89
+ position: absolute;
90
+ right: 1.25rem;
91
+ top: 50%;
92
+ transform: translateY(-50%);
93
+ pointer-events: none;
94
+ color: var(--text-muted);
95
+ font-size: 1rem;
96
+ }
97
+
98
+ .region-select {
99
+ appearance: none;
100
+ width: 100%;
101
+ background: var(--bg-page);
102
+ border: 1.5px solid var(--border-color);
103
+ border-radius: 1rem;
104
+ padding: 0.875rem 2.75rem 0.875rem 1.25rem;
105
+ font-size: 1rem;
106
+ font-weight: 600;
107
+ color: var(--text-main);
108
+ outline: none;
109
+ cursor: pointer;
110
+ transition: border-color 0.2s;
111
+ }
112
+
113
+ .region-select:focus {
114
+ border-color: #3b82f6;
115
+ }
116
+
117
+ .size-grid-container {
118
+ display: flex;
119
+ flex-direction: column;
120
+ gap: 1.5rem;
121
+ }
122
+
123
+ .grid-header {
124
+ text-align: center;
125
+ }
126
+
127
+ .grid-header h3 {
128
+ font-size: 1.25rem;
129
+ font-weight: 800;
130
+ color: var(--text-main);
131
+ margin: 0 0 0.5rem;
132
+ }
133
+
134
+ .grid-header p {
135
+ font-size: 0.875rem;
136
+ color: var(--text-muted);
137
+ margin: 0;
138
+ }
139
+
140
+ .size-grid {
141
+ display: grid;
142
+ grid-template-columns: repeat(auto-fill, minmax(65px, 1fr));
143
+ gap: 0.75rem;
144
+ }
145
+
146
+ :global(.size-cell) {
147
+ aspect-ratio: 1;
148
+ display: flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ border-radius: 1rem;
152
+ background: var(--bg-surface);
153
+ border: 1px solid var(--border-color);
154
+ font-size: 1.125rem;
155
+ font-weight: 700;
156
+ color: var(--text-muted);
157
+ cursor: pointer;
158
+ transition: all 0.2s;
159
+ }
160
+
161
+ :global(.size-cell:hover) {
162
+ border-color: #3b82f6;
163
+ color: #3b82f6;
164
+ transform: scale(1.05);
165
+ }
166
+
167
+ :global(.size-cell.active) {
168
+ background: #3b82f6;
169
+ border-color: #3b82f6;
170
+ color: white;
171
+ box-shadow: 0 10px 20px rgba(59, 130, 246, 0.25);
172
+ }
173
+
174
+ .results-container {
175
+ display: grid;
176
+ grid-template-columns: repeat(3, 1fr);
177
+ gap: 1.5rem;
178
+ background: var(--bg-page);
179
+ padding: 2rem;
180
+ border-radius: 2rem;
181
+ border: 1px solid var(--border-color);
182
+ }
183
+
184
+ .result-card {
185
+ text-align: center;
186
+ display: flex;
187
+ flex-direction: column;
188
+ gap: 0.5rem;
189
+ }
190
+
191
+ .result-label {
192
+ font-size: 0.75rem;
193
+ font-weight: 800;
194
+ color: var(--text-muted);
195
+ text-transform: uppercase;
196
+ letter-spacing: 0.05em;
197
+ }
198
+
199
+ .result-value {
200
+ font-size: 2.5rem;
201
+ font-weight: 900;
202
+ color: var(--text-main);
203
+ line-height: 1;
204
+ }
205
+
206
+ .result-unit {
207
+ font-size: 0.875rem;
208
+ font-weight: 700;
209
+ color: #3b82f6;
210
+ margin-top: 0.25rem;
211
+ }
212
+
213
+ .result-unit.hidden {
214
+ display: none;
215
+ }
216
+
217
+ .info-banner {
218
+ display: flex;
219
+ align-items: center;
220
+ gap: 1rem;
221
+ padding: 1.25rem;
222
+ background: rgba(3, 105, 161, 0.06);
223
+ border-radius: 1.25rem;
224
+ color: #0369a1;
225
+ font-size: 0.875rem;
226
+ line-height: 1.5;
227
+ }
228
+
229
+ .theme-dark .info-banner {
230
+ background: rgba(3, 105, 161, 0.1);
231
+ color: #7dd3fc;
232
+ }
233
+
234
+ .info-banner svg {
235
+ width: 1.5rem;
236
+ height: 1.5rem;
237
+ flex-shrink: 0;
238
+ }
239
+
240
+ .info-banner p {
241
+ margin: 0;
242
+ }
243
+
244
+ @media (max-width: 640px) {
245
+ .converter-card {
246
+ padding: 1.5rem;
247
+ gap: 2rem;
248
+ }
249
+
250
+ .results-container {
251
+ grid-template-columns: 1fr;
252
+ }
253
+ }
@@ -236,482 +236,3 @@ const fibers = Object.entries(ui.fiberData)
236
236
  startInit();
237
237
  </script>
238
238
 
239
- <style>
240
- .stain-chemistry-container {
241
- width: 100%;
242
- padding: 1rem;
243
- }
244
-
245
- .card-wrapper {
246
- background: var(--bg-surface);
247
- border: 1px solid var(--border-color);
248
- border-radius: 1.5rem;
249
- overflow: hidden;
250
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
251
- }
252
-
253
-
254
- .selectors-section {
255
- padding: 2rem;
256
- border-bottom: 1px solid var(--border-color);
257
- background: var(--bg-surface);
258
- }
259
-
260
- .selectors-grid {
261
- display: grid;
262
- grid-template-columns: 1fr 1fr;
263
- gap: 1.5rem;
264
- }
265
-
266
- @media (max-width: 600px) {
267
- .selectors-grid {
268
- grid-template-columns: 1fr;
269
- }
270
- }
271
-
272
- .selector-group {
273
- display: flex;
274
- flex-direction: column;
275
- gap: 0.5rem;
276
- }
277
-
278
- .selector-label {
279
- display: flex;
280
- align-items: center;
281
- gap: 0.4rem;
282
- font-size: 0.65rem;
283
- font-weight: 900;
284
- color: #6366f1;
285
- text-transform: uppercase;
286
- letter-spacing: 0.12em;
287
- }
288
-
289
- .label-icon {
290
- width: 1rem;
291
- height: 1rem;
292
- }
293
-
294
- .select-wrapper {
295
- position: relative;
296
- }
297
-
298
- .selector-input {
299
- width: 100%;
300
- height: 3.5rem;
301
- padding: 0 2.5rem 0 1rem;
302
- background: var(--bg-page);
303
- border: 2px solid var(--border-color);
304
- border-radius: 0.875rem;
305
- appearance: none;
306
- font-size: 0.9rem;
307
- font-weight: 700;
308
- color: var(--text-main);
309
- cursor: pointer;
310
- transition: border-color 0.2s;
311
- outline: none;
312
- }
313
-
314
- .selector-input:focus {
315
- border-color: #6366f1;
316
- }
317
-
318
- .select-chevron {
319
- position: absolute;
320
- right: 0.75rem;
321
- top: 50%;
322
- transform: translateY(-50%);
323
- width: 1.25rem;
324
- height: 1.25rem;
325
- color: var(--text-muted);
326
- pointer-events: none;
327
- }
328
-
329
-
330
- .protocol-display {
331
- padding: 1.5rem 2rem 2rem;
332
- background: var(--bg-page);
333
- animation: fade-in 0.4s ease;
334
- }
335
-
336
- :global(.protocol-display.hidden) {
337
- display: none;
338
- }
339
-
340
- @keyframes fade-in {
341
- from {
342
- opacity: 0;
343
- transform: translateY(6px);
344
- }
345
- to {
346
- opacity: 1;
347
- transform: translateY(0);
348
- }
349
- }
350
-
351
- .protocol-card {
352
- background: var(--bg-surface);
353
- border: 1px solid var(--border-color);
354
- border-radius: 1.25rem;
355
- overflow: hidden;
356
- }
357
-
358
- .protocol-header {
359
- display: flex;
360
- align-items: center;
361
- gap: 1rem;
362
- padding: 1.25rem 1.5rem;
363
- background: var(--bg-page);
364
- border-bottom: 1px solid var(--border-color);
365
- }
366
-
367
- .protocol-icon-wrap {
368
- width: 2.75rem;
369
- height: 2.75rem;
370
- border-radius: 0.75rem;
371
- background: #6366f1;
372
- color: #fff;
373
- display: flex;
374
- align-items: center;
375
- justify-content: center;
376
- flex-shrink: 0;
377
- box-shadow: 0 4px 12px rgba(99, 102, 241, 0.3);
378
- }
379
-
380
- .protocol-icon {
381
- width: 1.5rem;
382
- height: 1.5rem;
383
- }
384
-
385
- .protocol-meta {
386
- font-size: 0.65rem;
387
- font-weight: 900;
388
- text-transform: uppercase;
389
- letter-spacing: 0.12em;
390
- color: var(--text-muted);
391
- margin: 0 0 0.2rem;
392
- }
393
-
394
- .protocol-title {
395
- font-size: 1.35rem;
396
- font-weight: 900;
397
- color: var(--text-main);
398
- margin: 0;
399
- letter-spacing: -0.02em;
400
- }
401
-
402
- .protocol-body {
403
- padding: 1.5rem;
404
- display: flex;
405
- flex-direction: column;
406
- gap: 1rem;
407
- }
408
-
409
- .protocol-grid {
410
- display: grid;
411
- grid-template-columns: 1fr 1fr;
412
- gap: 1rem;
413
- }
414
-
415
- @media (max-width: 480px) {
416
- .protocol-grid {
417
- grid-template-columns: 1fr;
418
- }
419
- }
420
-
421
-
422
- .info-card {
423
- background: var(--bg-page);
424
- border: 1px solid var(--border-color);
425
- border-radius: 1rem;
426
- padding: 1.25rem;
427
- display: flex;
428
- flex-direction: column;
429
- align-items: center;
430
- text-align: center;
431
- gap: 0.4rem;
432
- transition: border-color 0.2s;
433
- }
434
-
435
- .info-card:hover {
436
- border-color: rgba(99, 102, 241, 0.3);
437
- }
438
-
439
- .info-card-icon-wrap {
440
- width: 3rem;
441
- height: 3rem;
442
- border-radius: 50%;
443
- display: flex;
444
- align-items: center;
445
- justify-content: center;
446
- margin-bottom: 0.5rem;
447
- }
448
-
449
- .agent-icon-wrap {
450
- background: rgba(99, 102, 241, 0.08);
451
- color: #6366f1;
452
- }
453
-
454
- .temp-icon-wrap {
455
- background: rgba(249, 115, 22, 0.08);
456
- color: #f97316;
457
- }
458
-
459
- .info-card-icon {
460
- width: 1.5rem;
461
- height: 1.5rem;
462
- }
463
-
464
- .info-card-meta {
465
- font-size: 0.6rem;
466
- font-weight: 900;
467
- text-transform: uppercase;
468
- letter-spacing: 0.18em;
469
- color: var(--text-muted);
470
- }
471
-
472
- .info-card-value {
473
- font-size: 1.15rem;
474
- font-weight: 900;
475
- color: var(--text-main);
476
- margin: 0;
477
- }
478
-
479
- .info-card-desc {
480
- font-size: 0.72rem;
481
- font-weight: 600;
482
- color: var(--text-muted);
483
- margin: 0;
484
- max-width: 14rem;
485
- line-height: 1.4;
486
- }
487
-
488
- .info-card-temp-value {
489
- font-size: 2rem;
490
- font-weight: 900;
491
- color: var(--text-main);
492
- margin: 0;
493
- letter-spacing: -0.03em;
494
- }
495
-
496
- .info-card-temp-label {
497
- font-size: 0.6rem;
498
- font-weight: 700;
499
- text-transform: uppercase;
500
- letter-spacing: 0.15em;
501
- color: var(--text-muted);
502
- }
503
-
504
-
505
- .method-card {
506
- background: #6366f1;
507
- border-radius: 1rem;
508
- padding: 1.5rem;
509
- position: relative;
510
- overflow: hidden;
511
- box-shadow: 0 8px 20px rgba(99, 102, 241, 0.2);
512
- }
513
-
514
- .method-card-overlay {
515
- position: absolute;
516
- top: 0;
517
- right: 0;
518
- padding: 1.5rem;
519
- opacity: 0.08;
520
- pointer-events: none;
521
- }
522
-
523
- .method-overlay-icon {
524
- width: 5rem;
525
- height: 5rem;
526
- color: #fff;
527
- }
528
-
529
- .method-card-content {
530
- position: relative;
531
- }
532
-
533
- .method-card-header {
534
- display: flex;
535
- align-items: center;
536
- gap: 0.75rem;
537
- margin-bottom: 1rem;
538
- }
539
-
540
- .method-icon-wrap {
541
- width: 2rem;
542
- height: 2rem;
543
- border-radius: 0.5rem;
544
- background: rgba(255, 255, 255, 0.2);
545
- display: flex;
546
- align-items: center;
547
- justify-content: center;
548
- color: #fff;
549
- }
550
-
551
- .method-icon {
552
- width: 1rem;
553
- height: 1rem;
554
- }
555
-
556
- .method-meta {
557
- font-size: 0.6rem;
558
- font-weight: 900;
559
- text-transform: uppercase;
560
- letter-spacing: 0.18em;
561
- color: rgba(255, 255, 255, 0.7);
562
- }
563
-
564
- .method-text {
565
- font-size: 1rem;
566
- font-weight: 700;
567
- color: #fff;
568
- line-height: 1.55;
569
- letter-spacing: -0.01em;
570
- }
571
-
572
-
573
- .warning-card {
574
- border-radius: 1rem;
575
- background: rgba(239, 68, 68, 0.06);
576
- border: 1px solid rgba(239, 68, 68, 0.2);
577
- padding: 1.25rem;
578
- animation: pulse-warning 4s ease infinite;
579
- }
580
-
581
- :global(.warning-card.hidden) {
582
- display: none;
583
- }
584
-
585
- @keyframes pulse-warning {
586
- 0%, 100% {
587
- opacity: 1;
588
- }
589
- 50% {
590
- opacity: 0.8;
591
- }
592
- }
593
-
594
- .warning-card-inner {
595
- display: flex;
596
- gap: 1rem;
597
- align-items: flex-start;
598
- }
599
-
600
- .warning-icon {
601
- width: 1.5rem;
602
- height: 1.5rem;
603
- color: #ef4444;
604
- flex-shrink: 0;
605
- margin-top: 0.1rem;
606
- }
607
-
608
- .warning-label {
609
- font-size: 0.6rem;
610
- font-weight: 900;
611
- text-transform: uppercase;
612
- letter-spacing: 0.15em;
613
- color: #ef4444;
614
- margin: 0 0 0.25rem;
615
- }
616
-
617
- .warning-text {
618
- font-size: 0.85rem;
619
- font-weight: 700;
620
- color: var(--text-main);
621
- margin: 0;
622
- line-height: 1.5;
623
- }
624
-
625
-
626
- .note-card {
627
- background: var(--bg-page);
628
- border: 1px solid var(--border-color);
629
- border-radius: 1rem;
630
- padding: 1.25rem;
631
- }
632
-
633
- .note-card-inner {
634
- display: flex;
635
- gap: 1rem;
636
- align-items: flex-start;
637
- }
638
-
639
- .note-badge {
640
- width: 1.5rem;
641
- height: 1.5rem;
642
- border-radius: 50%;
643
- background: var(--text-main);
644
- color: var(--bg-page);
645
- display: flex;
646
- align-items: center;
647
- justify-content: center;
648
- font-size: 0.65rem;
649
- font-weight: 900;
650
- flex-shrink: 0;
651
- margin-top: 0.1rem;
652
- }
653
-
654
- .note-label {
655
- font-size: 0.6rem;
656
- font-weight: 900;
657
- text-transform: uppercase;
658
- letter-spacing: 0.15em;
659
- color: var(--text-muted);
660
- margin: 0 0 0.25rem;
661
- }
662
-
663
- .note-text {
664
- font-size: 0.8rem;
665
- font-weight: 600;
666
- color: var(--text-muted);
667
- margin: 0;
668
- line-height: 1.5;
669
- }
670
-
671
-
672
- .empty-state {
673
- padding: 3rem 2rem;
674
- text-align: center;
675
- background: var(--bg-page);
676
- }
677
-
678
- :global(.empty-state.hidden) {
679
- display: none;
680
- }
681
-
682
- .empty-icon-wrap {
683
- width: 5rem;
684
- height: 5rem;
685
- background: var(--bg-surface);
686
- border-radius: 50%;
687
- display: flex;
688
- align-items: center;
689
- justify-content: center;
690
- margin: 0 auto 1.5rem;
691
- border: 1px solid var(--border-color);
692
- }
693
-
694
- .empty-icon {
695
- width: 2.5rem;
696
- height: 2.5rem;
697
- color: var(--border-color);
698
- }
699
-
700
- .empty-title {
701
- font-size: 1.1rem;
702
- font-weight: 900;
703
- color: var(--text-main);
704
- margin: 0 0 0.5rem;
705
- letter-spacing: -0.02em;
706
- }
707
-
708
- .empty-desc {
709
- font-size: 0.8rem;
710
- font-weight: 500;
711
- color: var(--text-muted);
712
- margin: 0;
713
- max-width: 18rem;
714
- margin-inline: auto;
715
- line-height: 1.5;
716
- }
717
- </style>