@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
@@ -167,320 +167,3 @@ const fibers = Object.entries(textileData).map(([id, data]) => ({ id, ...data })
167
167
  startInit();
168
168
  </script>
169
169
 
170
- <style>
171
- .laundry-guide-container {
172
- width: 100%;
173
- padding: 1rem;
174
- }
175
-
176
- .guide-wrapper {
177
- display: grid;
178
- grid-template-columns: 250px 1fr;
179
- gap: 2rem;
180
- background: var(--bg-surface);
181
- border: 1px solid var(--border-color);
182
- border-radius: 1.5rem;
183
- overflow: hidden;
184
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
185
- }
186
-
187
- .fibers-sidebar {
188
- padding: 2rem;
189
- border-right: 1px solid var(--border-color);
190
- background: var(--bg-page);
191
- }
192
-
193
- .sidebar-title {
194
- font-size: 0.9rem;
195
- font-weight: 700;
196
- text-transform: uppercase;
197
- letter-spacing: 0.05em;
198
- color: var(--text-muted);
199
- margin: 0 0 1.5rem;
200
- display: flex;
201
- align-items: center;
202
- gap: 0.5rem;
203
- }
204
-
205
- .sidebar-title svg {
206
- width: 1rem;
207
- height: 1rem;
208
- }
209
-
210
- .fibers-grid {
211
- display: flex;
212
- flex-direction: column;
213
- gap: 0.75rem;
214
- }
215
-
216
- .fiber-btn {
217
- display: flex;
218
- align-items: center;
219
- gap: 0.75rem;
220
- padding: 0.75rem;
221
- background: var(--bg-surface);
222
- border: 1px solid var(--border-color);
223
- border-radius: 0.75rem;
224
- color: var(--text-main);
225
- cursor: pointer;
226
- transition: all 0.2s;
227
- }
228
-
229
- .fiber-btn:hover {
230
- border-color: #6366f1;
231
- background: rgba(99, 102, 241, 0.05);
232
- }
233
-
234
- .fiber-btn.active {
235
- background: rgba(99, 102, 241, 0.1);
236
- border-color: #6366f1;
237
- font-weight: 600;
238
- }
239
-
240
- .fiber-icon {
241
- width: 1.5rem;
242
- height: 1.5rem;
243
- color: var(--fiber-color);
244
- }
245
-
246
- .fiber-name {
247
- font-size: 0.9rem;
248
- text-align: left;
249
- flex: 1;
250
- }
251
-
252
- .guide-main {
253
- padding: 2rem;
254
- display: flex;
255
- align-items: center;
256
- justify-content: center;
257
- }
258
-
259
- .welcome-message {
260
- text-align: center;
261
- color: var(--text-muted);
262
- }
263
-
264
- .welcome-message.hidden {
265
- display: none;
266
- }
267
-
268
- .welcome-icon {
269
- width: 5rem;
270
- height: 5rem;
271
- color: var(--border-color);
272
- margin-bottom: 1rem;
273
- }
274
-
275
- .welcome-message h3 {
276
- font-size: 1.5rem;
277
- margin: 0;
278
- color: var(--text-muted);
279
- }
280
-
281
- .care-display {
282
- width: 100%;
283
- max-width: 600px;
284
- animation: fade-in 0.3s ease;
285
- }
286
-
287
- .care-display.hidden {
288
- display: none;
289
- }
290
-
291
- @keyframes fade-in {
292
- from { opacity: 0; }
293
- to { opacity: 1; }
294
- }
295
-
296
- .care-header {
297
- background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
298
- color: white;
299
- padding: 2rem;
300
- border-radius: 1rem;
301
- display: flex;
302
- align-items: center;
303
- gap: 1.5rem;
304
- margin-bottom: 2rem;
305
- }
306
-
307
- .header-icon-bg {
308
- background: rgba(255, 255, 255, 0.2);
309
- padding: 1rem;
310
- border-radius: 0.75rem;
311
- backdrop-filter: blur(10px);
312
- }
313
-
314
- .header-icon {
315
- width: 2.5rem;
316
- height: 2.5rem;
317
- color: white;
318
- }
319
-
320
- .header-text h3 {
321
- font-size: 1.75rem;
322
- margin: 0 0 0.25rem;
323
- font-weight: 900;
324
- }
325
-
326
- .header-text p {
327
- margin: 0;
328
- opacity: 0.9;
329
- font-weight: 500;
330
- }
331
-
332
- .care-grid {
333
- display: grid;
334
- grid-template-columns: repeat(3, 1fr);
335
- gap: 1rem;
336
- margin-bottom: 2rem;
337
- }
338
-
339
- .care-card {
340
- background: var(--bg-page);
341
- padding: 1.5rem;
342
- border-radius: 0.75rem;
343
- border: 1px solid var(--border-color);
344
- text-align: center;
345
- }
346
-
347
- .care-icon {
348
- width: 2rem;
349
- height: 2rem;
350
- color: #3b82f6;
351
- margin-bottom: 0.75rem;
352
- }
353
-
354
- .care-label {
355
- display: block;
356
- font-size: 0.75rem;
357
- font-weight: 700;
358
- text-transform: uppercase;
359
- letter-spacing: 0.05em;
360
- color: var(--text-muted);
361
- margin-bottom: 0.5rem;
362
- }
363
-
364
- .care-value {
365
- display: block;
366
- font-size: 1.25rem;
367
- font-weight: bold;
368
- color: var(--text-main);
369
- }
370
-
371
- .care-sections {
372
- display: grid;
373
- grid-template-columns: 1fr 1fr;
374
- gap: 1.5rem;
375
- margin-bottom: 2rem;
376
- }
377
-
378
- .care-section {
379
- background: var(--bg-page);
380
- padding: 1.5rem;
381
- border-radius: 0.75rem;
382
- border: 1px solid var(--border-color);
383
- }
384
-
385
- .care-section.sos-section {
386
- background: rgba(16, 185, 129, 0.05);
387
- border-color: rgba(16, 185, 129, 0.2);
388
- }
389
-
390
- .section-title {
391
- display: flex;
392
- align-items: center;
393
- gap: 0.5rem;
394
- font-size: 0.9rem;
395
- font-weight: 700;
396
- margin: 0 0 1rem;
397
- color: var(--text-main);
398
- }
399
-
400
- .section-title.avoid-title {
401
- color: #ef4444;
402
- }
403
-
404
- .section-title.sos-title {
405
- color: #10b981;
406
- }
407
-
408
- .section-title svg {
409
- width: 1.25rem;
410
- height: 1.25rem;
411
- }
412
-
413
- .dont-list {
414
- list-style: none;
415
- padding: 0;
416
- margin: 0;
417
- display: flex;
418
- flex-direction: column;
419
- gap: 0.75rem;
420
- }
421
-
422
- .dont-list li {
423
- display: flex;
424
- align-items: center;
425
- gap: 0.75rem;
426
- font-size: 0.9rem;
427
- color: var(--text-muted);
428
- }
429
-
430
- .dont-bullet {
431
- width: 0.5rem;
432
- height: 0.5rem;
433
- background: #ef4444;
434
- border-radius: 50%;
435
- flex-shrink: 0;
436
- }
437
-
438
- .sos-text {
439
- margin: 0;
440
- font-size: 0.95rem;
441
- color: #059669;
442
- font-weight: 500;
443
- line-height: 1.5;
444
- }
445
-
446
- .description-box {
447
- background: var(--bg-page);
448
- padding: 1.5rem;
449
- border-radius: 0.75rem;
450
- border: 1px solid var(--border-color);
451
- }
452
-
453
- .description-box p {
454
- margin: 0;
455
- color: var(--text-muted);
456
- line-height: 1.6;
457
- }
458
-
459
- @media (max-width: 768px) {
460
- .guide-wrapper {
461
- grid-template-columns: 1fr;
462
- }
463
-
464
- .fibers-sidebar {
465
- border-right: none;
466
- border-bottom: 1px solid var(--border-color);
467
- }
468
-
469
- .fibers-grid {
470
- flex-direction: row;
471
- flex-wrap: wrap;
472
- }
473
-
474
- .fiber-btn {
475
- flex: 0 1 calc(50% - 0.375rem);
476
- }
477
-
478
- .care-sections {
479
- grid-template-columns: 1fr;
480
- }
481
-
482
- .care-grid {
483
- grid-template-columns: 1fr;
484
- }
485
- }
486
- </style>
@@ -0,0 +1,25 @@
1
+ import type { TextilesToolEntry } from '../../types';
2
+ export const laundryGuide: TextilesToolEntry = {
3
+ id: 'laundry-guide',
4
+ icons: {
5
+ bg: 'mdi:washing-machine',
6
+ fg: 'mdi:water-check',
7
+ },
8
+ i18n: {
9
+ es: () => import('./i18n/es').then((m) => m.content),
10
+ en: () => import('./i18n/en').then((m) => m.content),
11
+ fr: () => import('./i18n/fr').then((m) => m.content),
12
+ de: () => import('./i18n/de').then((m) => m.content),
13
+ id: () => import('./i18n/id').then((m) => m.content),
14
+ it: () => import('./i18n/it').then((m) => m.content),
15
+ ja: () => import('./i18n/ja').then((m) => m.content),
16
+ ko: () => import('./i18n/ko').then((m) => m.content),
17
+ nl: () => import('./i18n/nl').then((m) => m.content),
18
+ pl: () => import('./i18n/pl').then((m) => m.content),
19
+ pt: () => import('./i18n/pt').then((m) => m.content),
20
+ ru: () => import('./i18n/ru').then((m) => m.content),
21
+ sv: () => import('./i18n/sv').then((m) => m.content),
22
+ tr: () => import('./i18n/tr').then((m) => m.content),
23
+ zh: () => import('./i18n/zh').then((m) => m.content),
24
+ },
25
+ };
@@ -1,30 +1,5 @@
1
- import type { TextilesToolEntry, ToolDefinition } from '../../types';
2
- export const laundryGuide: TextilesToolEntry = {
3
- id: 'laundry-guide',
4
- icons: {
5
- bg: 'mdi:washing-machine',
6
- fg: 'mdi:water-check',
7
- },
8
- i18n: {
9
- es: () => import('./i18n/es').then((m) => m.content),
10
- en: () => import('./i18n/en').then((m) => m.content),
11
- fr: () => import('./i18n/fr').then((m) => m.content),
12
- de: () => import('./i18n/de').then((m) => m.content),
13
- id: () => import('./i18n/id').then((m) => m.content),
14
- it: () => import('./i18n/it').then((m) => m.content),
15
- ja: () => import('./i18n/ja').then((m) => m.content),
16
- ko: () => import('./i18n/ko').then((m) => m.content),
17
- nl: () => import('./i18n/nl').then((m) => m.content),
18
- pl: () => import('./i18n/pl').then((m) => m.content),
19
- pt: () => import('./i18n/pt').then((m) => m.content),
20
- ru: () => import('./i18n/ru').then((m) => m.content),
21
- sv: () => import('./i18n/sv').then((m) => m.content),
22
- tr: () => import('./i18n/tr').then((m) => m.content),
23
- zh: () => import('./i18n/zh').then((m) => m.content),
24
- },
25
- };
26
-
27
-
1
+ import { laundryGuide } from './entry';
2
+ export * from './entry';
28
3
  export const LAUNDRY_GUIDE_TOOL: ToolDefinition = {
29
4
  entry: laundryGuide,
30
5
  Component: () => import('./component.astro'),
@@ -0,0 +1,315 @@
1
+ .laundry-guide-container {
2
+ width: 100%;
3
+ padding: 1rem;
4
+ }
5
+
6
+ .guide-wrapper {
7
+ display: grid;
8
+ grid-template-columns: 250px 1fr;
9
+ gap: 2rem;
10
+ background: var(--bg-surface);
11
+ border: 1px solid var(--border-color);
12
+ border-radius: 1.5rem;
13
+ overflow: hidden;
14
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
15
+ }
16
+
17
+ .fibers-sidebar {
18
+ padding: 2rem;
19
+ border-right: 1px solid var(--border-color);
20
+ background: var(--bg-page);
21
+ }
22
+
23
+ .sidebar-title {
24
+ font-size: 0.9rem;
25
+ font-weight: 700;
26
+ text-transform: uppercase;
27
+ letter-spacing: 0.05em;
28
+ color: var(--text-muted);
29
+ margin: 0 0 1.5rem;
30
+ display: flex;
31
+ align-items: center;
32
+ gap: 0.5rem;
33
+ }
34
+
35
+ .sidebar-title svg {
36
+ width: 1rem;
37
+ height: 1rem;
38
+ }
39
+
40
+ .fibers-grid {
41
+ display: flex;
42
+ flex-direction: column;
43
+ gap: 0.75rem;
44
+ }
45
+
46
+ .fiber-btn {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 0.75rem;
50
+ padding: 0.75rem;
51
+ background: var(--bg-surface);
52
+ border: 1px solid var(--border-color);
53
+ border-radius: 0.75rem;
54
+ color: var(--text-main);
55
+ cursor: pointer;
56
+ transition: all 0.2s;
57
+ }
58
+
59
+ .fiber-btn:hover {
60
+ border-color: #6366f1;
61
+ background: rgba(99, 102, 241, 0.05);
62
+ }
63
+
64
+ .fiber-btn.active {
65
+ background: rgba(99, 102, 241, 0.1);
66
+ border-color: #6366f1;
67
+ font-weight: 600;
68
+ }
69
+
70
+ .fiber-icon {
71
+ width: 1.5rem;
72
+ height: 1.5rem;
73
+ color: var(--fiber-color);
74
+ }
75
+
76
+ .fiber-name {
77
+ font-size: 0.9rem;
78
+ text-align: left;
79
+ flex: 1;
80
+ }
81
+
82
+ .guide-main {
83
+ padding: 2rem;
84
+ display: flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ }
88
+
89
+ .welcome-message {
90
+ text-align: center;
91
+ color: var(--text-muted);
92
+ }
93
+
94
+ .welcome-message.hidden {
95
+ display: none;
96
+ }
97
+
98
+ .welcome-icon {
99
+ width: 5rem;
100
+ height: 5rem;
101
+ color: var(--border-color);
102
+ margin-bottom: 1rem;
103
+ }
104
+
105
+ .welcome-message h3 {
106
+ font-size: 1.5rem;
107
+ margin: 0;
108
+ color: var(--text-muted);
109
+ }
110
+
111
+ .care-display {
112
+ width: 100%;
113
+ max-width: 600px;
114
+ animation: fade-in 0.3s ease;
115
+ }
116
+
117
+ .care-display.hidden {
118
+ display: none;
119
+ }
120
+
121
+ @keyframes fade-in {
122
+ from { opacity: 0; }
123
+ to { opacity: 1; }
124
+ }
125
+
126
+ .care-header {
127
+ background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
128
+ color: white;
129
+ padding: 2rem;
130
+ border-radius: 1rem;
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 1.5rem;
134
+ margin-bottom: 2rem;
135
+ }
136
+
137
+ .header-icon-bg {
138
+ background: rgba(255, 255, 255, 0.2);
139
+ padding: 1rem;
140
+ border-radius: 0.75rem;
141
+ backdrop-filter: blur(10px);
142
+ }
143
+
144
+ .header-icon {
145
+ width: 2.5rem;
146
+ height: 2.5rem;
147
+ color: white;
148
+ }
149
+
150
+ .header-text h3 {
151
+ font-size: 1.75rem;
152
+ margin: 0 0 0.25rem;
153
+ font-weight: 900;
154
+ }
155
+
156
+ .header-text p {
157
+ margin: 0;
158
+ opacity: 0.9;
159
+ font-weight: 500;
160
+ }
161
+
162
+ .care-grid {
163
+ display: grid;
164
+ grid-template-columns: repeat(3, 1fr);
165
+ gap: 1rem;
166
+ margin-bottom: 2rem;
167
+ }
168
+
169
+ .care-card {
170
+ background: var(--bg-page);
171
+ padding: 1.5rem;
172
+ border-radius: 0.75rem;
173
+ border: 1px solid var(--border-color);
174
+ text-align: center;
175
+ }
176
+
177
+ .care-icon {
178
+ width: 2rem;
179
+ height: 2rem;
180
+ color: #3b82f6;
181
+ margin-bottom: 0.75rem;
182
+ }
183
+
184
+ .care-label {
185
+ display: block;
186
+ font-size: 0.75rem;
187
+ font-weight: 700;
188
+ text-transform: uppercase;
189
+ letter-spacing: 0.05em;
190
+ color: var(--text-muted);
191
+ margin-bottom: 0.5rem;
192
+ }
193
+
194
+ .care-value {
195
+ display: block;
196
+ font-size: 1.25rem;
197
+ font-weight: bold;
198
+ color: var(--text-main);
199
+ }
200
+
201
+ .care-sections {
202
+ display: grid;
203
+ grid-template-columns: 1fr 1fr;
204
+ gap: 1.5rem;
205
+ margin-bottom: 2rem;
206
+ }
207
+
208
+ .care-section {
209
+ background: var(--bg-page);
210
+ padding: 1.5rem;
211
+ border-radius: 0.75rem;
212
+ border: 1px solid var(--border-color);
213
+ }
214
+
215
+ .care-section.sos-section {
216
+ background: rgba(16, 185, 129, 0.05);
217
+ border-color: rgba(16, 185, 129, 0.2);
218
+ }
219
+
220
+ .section-title {
221
+ display: flex;
222
+ align-items: center;
223
+ gap: 0.5rem;
224
+ font-size: 0.9rem;
225
+ font-weight: 700;
226
+ margin: 0 0 1rem;
227
+ color: var(--text-main);
228
+ }
229
+
230
+ .section-title.avoid-title {
231
+ color: #ef4444;
232
+ }
233
+
234
+ .section-title.sos-title {
235
+ color: #10b981;
236
+ }
237
+
238
+ .section-title svg {
239
+ width: 1.25rem;
240
+ height: 1.25rem;
241
+ }
242
+
243
+ .dont-list {
244
+ list-style: none;
245
+ padding: 0;
246
+ margin: 0;
247
+ display: flex;
248
+ flex-direction: column;
249
+ gap: 0.75rem;
250
+ }
251
+
252
+ .dont-list li {
253
+ display: flex;
254
+ align-items: center;
255
+ gap: 0.75rem;
256
+ font-size: 0.9rem;
257
+ color: var(--text-muted);
258
+ }
259
+
260
+ .dont-bullet {
261
+ width: 0.5rem;
262
+ height: 0.5rem;
263
+ background: #ef4444;
264
+ border-radius: 50%;
265
+ flex-shrink: 0;
266
+ }
267
+
268
+ .sos-text {
269
+ margin: 0;
270
+ font-size: 0.95rem;
271
+ color: #059669;
272
+ font-weight: 500;
273
+ line-height: 1.5;
274
+ }
275
+
276
+ .description-box {
277
+ background: var(--bg-page);
278
+ padding: 1.5rem;
279
+ border-radius: 0.75rem;
280
+ border: 1px solid var(--border-color);
281
+ }
282
+
283
+ .description-box p {
284
+ margin: 0;
285
+ color: var(--text-muted);
286
+ line-height: 1.6;
287
+ }
288
+
289
+ @media (max-width: 768px) {
290
+ .guide-wrapper {
291
+ grid-template-columns: 1fr;
292
+ }
293
+
294
+ .fibers-sidebar {
295
+ border-right: none;
296
+ border-bottom: 1px solid var(--border-color);
297
+ }
298
+
299
+ .fibers-grid {
300
+ flex-direction: row;
301
+ flex-wrap: wrap;
302
+ }
303
+
304
+ .fiber-btn {
305
+ flex: 0 1 calc(50% - 0.375rem);
306
+ }
307
+
308
+ .care-sections {
309
+ grid-template-columns: 1fr;
310
+ }
311
+
312
+ .care-grid {
313
+ grid-template-columns: 1fr;
314
+ }
315
+ }