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