@jjlmoya/utils-textiles 1.14.0 → 1.16.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 (93) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +2 -2
  3. package/src/category/i18n/en.ts +2 -2
  4. package/src/category/i18n/es.ts +2 -2
  5. package/src/category/i18n/fr.ts +9 -9
  6. package/src/category/i18n/id.ts +2 -2
  7. package/src/category/i18n/it.ts +2 -2
  8. package/src/category/i18n/nl.ts +2 -2
  9. package/src/category/i18n/pl.ts +3 -3
  10. package/src/category/i18n/pt.ts +2 -2
  11. package/src/category/i18n/ru.ts +5 -5
  12. package/src/category/i18n/sv.ts +3 -3
  13. package/src/category/i18n/zh.ts +2 -2
  14. package/src/layouts/PreviewLayout.astro +1 -0
  15. package/src/tests/diacritics_density.test.ts +118 -0
  16. package/src/tests/inverted_punctuation.test.ts +84 -0
  17. package/src/tests/no_en_dash.test.ts +70 -0
  18. package/src/tests/script_density.test.ts +94 -0
  19. package/src/tool/burnTest/i18n/de.ts +3 -3
  20. package/src/tool/burnTest/i18n/fr.ts +3 -3
  21. package/src/tool/burnTest/i18n/pl.ts +3 -3
  22. package/src/tool/burnTest/i18n/ru.ts +6 -6
  23. package/src/tool/burnTest/i18n/zh.ts +3 -3
  24. package/src/tool/clothingSizeConverter/i18n/en.ts +1 -1
  25. package/src/tool/clothingSizeConverter/i18n/fr.ts +6 -6
  26. package/src/tool/clothingSizeConverter/i18n/pl.ts +1 -1
  27. package/src/tool/clothingSizeConverter/i18n/ru.ts +2 -2
  28. package/src/tool/clothingSizeConverter/i18n/zh.ts +1 -1
  29. package/src/tool/fabricProjectCalculator/component.astro +4 -5
  30. package/src/tool/fabricProjectCalculator/fabric-project-calculator.css +474 -502
  31. package/src/tool/fabricProjectCalculator/i18n/ru.ts +2 -2
  32. package/src/tool/fabricProjectCalculator/i18n/zh.ts +1 -1
  33. package/src/tool/fabricTruth/i18n/de.ts +1 -1
  34. package/src/tool/fabricTruth/i18n/en.ts +1 -1
  35. package/src/tool/fabricTruth/i18n/es.ts +1 -1
  36. package/src/tool/fabricTruth/i18n/fr.ts +13 -13
  37. package/src/tool/fabricTruth/i18n/id.ts +1 -1
  38. package/src/tool/fabricTruth/i18n/it.ts +1 -1
  39. package/src/tool/fabricTruth/i18n/ja.ts +1 -1
  40. package/src/tool/fabricTruth/i18n/ko.ts +1 -1
  41. package/src/tool/fabricTruth/i18n/nl.ts +1 -1
  42. package/src/tool/fabricTruth/i18n/pl.ts +1 -1
  43. package/src/tool/fabricTruth/i18n/pt.ts +1 -1
  44. package/src/tool/fabricTruth/i18n/ru.ts +11 -11
  45. package/src/tool/fabricTruth/i18n/sv.ts +1 -1
  46. package/src/tool/fabricTruth/i18n/tr.ts +1 -1
  47. package/src/tool/fabricTruth/i18n/zh.ts +9 -9
  48. package/src/tool/fiberPrep/fiber-preparation-natural-dyeing.css +130 -11
  49. package/src/tool/fiberPrep/i18n/fr.ts +4 -4
  50. package/src/tool/fiberPrep/i18n/ru.ts +3 -3
  51. package/src/tool/fiberPrep/i18n/zh.ts +2 -2
  52. package/src/tool/knittingGauge/i18n/ru.ts +6 -6
  53. package/src/tool/knittingGauge/i18n/zh.ts +1 -1
  54. package/src/tool/laundryGuide/i18n/de.ts +1 -1
  55. package/src/tool/laundryGuide/i18n/en.ts +1 -1
  56. package/src/tool/laundryGuide/i18n/es.ts +1 -1
  57. package/src/tool/laundryGuide/i18n/fr.ts +12 -12
  58. package/src/tool/laundryGuide/i18n/id.ts +1 -1
  59. package/src/tool/laundryGuide/i18n/it.ts +1 -1
  60. package/src/tool/laundryGuide/i18n/nl.ts +1 -1
  61. package/src/tool/laundryGuide/i18n/pl.ts +2 -2
  62. package/src/tool/laundryGuide/i18n/pt.ts +1 -1
  63. package/src/tool/laundryGuide/i18n/ru.ts +6 -6
  64. package/src/tool/laundryGuide/i18n/sv.ts +1 -1
  65. package/src/tool/laundryGuide/i18n/zh.ts +2 -2
  66. package/src/tool/needleConverter/i18n/fr.ts +5 -5
  67. package/src/tool/needleConverter/i18n/ru.ts +4 -4
  68. package/src/tool/sewingPatternScaler/i18n/fr.ts +2 -2
  69. package/src/tool/sewingPatternScaler/i18n/pl.ts +2 -2
  70. package/src/tool/sewingPatternScaler/i18n/ru.ts +7 -7
  71. package/src/tool/sewingPatternScaler/i18n/zh.ts +3 -3
  72. package/src/tool/shoeSizeConverter/i18n/fr.ts +1 -1
  73. package/src/tool/shoeSizeConverter/i18n/ru.ts +4 -4
  74. package/src/tool/shoeSizeConverter/i18n/zh.ts +3 -3
  75. package/src/tool/stainChemistry/bibliography.ts +2 -2
  76. package/src/tool/stainChemistry/i18n/de.ts +3 -3
  77. package/src/tool/stainChemistry/i18n/en.ts +3 -3
  78. package/src/tool/stainChemistry/i18n/es.ts +3 -3
  79. package/src/tool/stainChemistry/i18n/fr.ts +6 -6
  80. package/src/tool/stainChemistry/i18n/id.ts +3 -3
  81. package/src/tool/stainChemistry/i18n/it.ts +3 -3
  82. package/src/tool/stainChemistry/i18n/ja.ts +3 -3
  83. package/src/tool/stainChemistry/i18n/ko.ts +3 -3
  84. package/src/tool/stainChemistry/i18n/nl.ts +3 -3
  85. package/src/tool/stainChemistry/i18n/pl.ts +3 -3
  86. package/src/tool/stainChemistry/i18n/pt.ts +3 -3
  87. package/src/tool/stainChemistry/i18n/ru.ts +7 -7
  88. package/src/tool/stainChemistry/i18n/sv.ts +3 -3
  89. package/src/tool/stainChemistry/i18n/tr.ts +3 -3
  90. package/src/tool/stainChemistry/i18n/zh.ts +7 -7
  91. package/src/tool/yarnCalculator/i18n/fr.ts +4 -4
  92. package/src/tool/yarnCalculator/i18n/ru.ts +7 -7
  93. package/src/tool/yarnCalculator/i18n/zh.ts +5 -5
@@ -1,538 +1,510 @@
1
1
  .fabric-calculator-card {
2
- --f-p: #4f46e5;
3
- --f-a: #818cf8;
4
- --f-side: rgba(79, 70, 229, 0.04);
5
-
6
- display: grid;
7
- grid-template-columns: 360px 1fr;
8
- max-width: 1200px;
9
- width: 95%;
10
- margin: 2rem auto;
11
- background: var(--bg-surface);
12
- backdrop-filter: blur(25px);
13
- border-radius: 32px;
14
- overflow: hidden;
15
- border: 1px solid var(--border-color);
16
- box-shadow: 0 40px 100px rgba(0, 0, 0, 0.15);
17
- color: var(--text-main);
2
+ --fabric-accent: #4f46e5;
3
+ --fabric-accent-soft: rgba(79, 70, 229, 0.12);
4
+ --fabric-panel: color-mix(in srgb, var(--bg-surface) 92%, var(--fabric-accent) 8%);
5
+
6
+ width: min(100%, 1120px);
7
+ margin: 1.5rem auto;
8
+ padding: 1.25rem;
9
+ display: grid;
10
+ grid-template-columns: minmax(260px, 340px) minmax(0, 1fr);
11
+ gap: 1.25rem;
12
+ background: var(--bg-surface);
13
+ border: 1px solid var(--border-color);
14
+ border-radius: 1.25rem;
15
+ box-shadow: 0 24px 70px rgba(0, 0, 0, 0.14);
16
+ color: var(--text-main);
17
+ overflow: visible;
18
+ }
19
+
20
+ .fabric-sidebar,
21
+ .fabric-main,
22
+ .magic-result-area,
23
+ .canvas-wrapper,
24
+ .merch-section {
25
+ min-width: 0;
26
+ }
27
+
28
+ .fabric-sidebar {
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: 1.25rem;
32
+ padding: 1rem;
33
+ background: var(--bg-page);
34
+ border: 1px solid var(--border-color);
35
+ border-radius: 1rem;
36
+ }
37
+
38
+ .config-group {
39
+ display: flex;
40
+ flex-direction: column;
41
+ gap: 1rem;
42
+ }
43
+
44
+ .config-group + .config-group {
45
+ padding-top: 1rem;
46
+ border-top: 1px solid var(--border-color);
47
+ }
48
+
49
+ .config-group h3,
50
+ .merch-title {
51
+ margin: 0;
52
+ font-size: 0.7rem;
53
+ font-weight: 900;
54
+ letter-spacing: 0.12em;
55
+ text-transform: uppercase;
56
+ color: var(--fabric-accent);
57
+ }
58
+
59
+ .fabric-field {
60
+ display: flex;
61
+ flex-direction: column;
62
+ gap: 0.45rem;
63
+ }
64
+
65
+ .fabric-field label {
66
+ font-size: 0.7rem;
67
+ font-weight: 800;
68
+ letter-spacing: 0.06em;
69
+ text-transform: uppercase;
70
+ color: var(--text-muted);
71
+ }
72
+
73
+ .fabric-select,
74
+ .fabric-input {
75
+ width: 100%;
76
+ min-width: 0;
77
+ min-height: 46px;
78
+ color: var(--text-main);
79
+ background-color: var(--bg-surface);
80
+ border: 1.5px solid var(--border-color);
81
+ border-radius: 0.75rem;
82
+ outline: none;
83
+ }
84
+
85
+ .fabric-select {
86
+ padding: 0.75rem 2.5rem 0.75rem 0.9rem;
87
+ font-size: 0.875rem;
88
+ font-weight: 750;
89
+ cursor: pointer;
90
+ appearance: none;
91
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234F46E5' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
92
+ background-repeat: no-repeat;
93
+ background-position: right 0.85rem center;
94
+ background-size: 1rem;
95
+ }
96
+
97
+ .fabric-select:focus,
98
+ .fabric-input:focus {
99
+ border-color: var(--fabric-accent);
100
+ box-shadow: 0 0 0 3px var(--fabric-accent-soft);
101
+ }
102
+
103
+ .preset-group {
104
+ display: grid;
105
+ grid-template-columns: repeat(3, minmax(0, 1fr));
106
+ gap: 0.5rem;
107
+ }
108
+
109
+ .preset-pill {
110
+ min-height: 42px;
111
+ padding: 0.65rem 0.45rem;
112
+ border: 1.5px solid rgba(79, 70, 229, 0.28);
113
+ border-radius: 0.75rem;
114
+ background: rgba(79, 70, 229, 0.07);
115
+ color: var(--fabric-accent);
116
+ font-size: 0.72rem;
117
+ font-weight: 900;
118
+ line-height: 1.1;
119
+ cursor: pointer;
120
+ }
121
+
122
+ .preset-pill.active {
123
+ color: #fff;
124
+ background: var(--fabric-accent);
125
+ border-color: var(--fabric-accent);
126
+ }
127
+
128
+ .shop-stepper {
129
+ width: 100%;
130
+ display: grid;
131
+ grid-template-columns: 46px minmax(0, 1fr) 46px;
132
+ align-items: stretch;
133
+ overflow: hidden;
134
+ background: var(--bg-surface);
135
+ border: 1.5px solid var(--border-color);
136
+ border-radius: 0.75rem;
137
+ }
138
+
139
+ .step-btn {
140
+ min-height: 46px;
141
+ border: 0;
142
+ background: transparent;
143
+ color: var(--fabric-accent);
144
+ font-size: 1.35rem;
145
+ font-weight: 800;
146
+ cursor: pointer;
147
+ }
148
+
149
+ .step-btn:hover {
150
+ background: var(--fabric-accent);
151
+ color: #fff;
152
+ }
153
+
154
+ .fabric-input {
155
+ min-height: 46px;
156
+ border: 0;
157
+ border-right: 1px solid var(--border-color);
158
+ border-left: 1px solid var(--border-color);
159
+ border-radius: 0;
160
+ text-align: center;
161
+ font-size: 1rem;
162
+ font-weight: 850;
163
+ box-shadow: none;
164
+ }
165
+
166
+ .btn-actions {
167
+ display: grid;
168
+ grid-template-columns: 1fr 1fr;
169
+ gap: 0.75rem;
170
+ margin-top: auto;
171
+ }
172
+
173
+ .f-btn,
174
+ .copy-list-btn {
175
+ min-height: 44px;
176
+ border: 0;
177
+ border-radius: 0.75rem;
178
+ font-weight: 850;
179
+ cursor: pointer;
180
+ }
181
+
182
+ .f-seco {
183
+ color: var(--text-main);
184
+ background: var(--bg-muted);
185
+ border: 1px solid var(--border-color);
186
+ }
187
+
188
+ .f-prim {
189
+ color: #fff;
190
+ background: var(--fabric-accent);
191
+ }
192
+
193
+ .fabric-main {
194
+ display: grid;
195
+ grid-template-columns: minmax(220px, 0.8fr) minmax(0, 1.2fr);
196
+ gap: 1.25rem;
197
+ align-content: start;
198
+ }
199
+
200
+ .warning-banner {
201
+ grid-column: 1 / -1;
202
+ display: none;
203
+ padding: 0.85rem 1rem;
204
+ color: #c2410c;
205
+ background: #fff7ed;
206
+ border: 1px solid #fed7aa;
207
+ border-radius: 0.85rem;
208
+ font-size: 0.85rem;
209
+ font-weight: 650;
210
+ }
211
+
212
+ .magic-result-area {
213
+ padding: 1.5rem;
214
+ background: var(--fabric-panel);
215
+ border: 1px solid rgba(79, 70, 229, 0.16);
216
+ border-radius: 1rem;
217
+ }
218
+
219
+ .result-lbl {
220
+ display: block;
221
+ margin-bottom: 0.4rem;
222
+ color: var(--text-muted);
223
+ font-size: 0.68rem;
224
+ font-weight: 900;
225
+ letter-spacing: 0.12em;
226
+ text-transform: uppercase;
227
+ }
228
+
229
+ .magic-result-area .val {
230
+ display: flex;
231
+ flex-wrap: wrap;
232
+ align-items: baseline;
233
+ gap: 0.4rem;
234
+ color: var(--fabric-accent);
235
+ font-size: 4.25rem;
236
+ font-weight: 950;
237
+ line-height: 0.95;
238
+ }
239
+
240
+ .magic-result-area .unit {
241
+ color: var(--text-muted);
242
+ font-size: 1.35rem;
243
+ font-weight: 900;
244
+ }
245
+
246
+ .advice-tag {
247
+ display: inline-flex;
248
+ max-width: 100%;
249
+ margin-top: 1rem;
250
+ padding: 0.65rem 0.9rem;
251
+ color: var(--fabric-accent);
252
+ background: rgba(79, 70, 229, 0.09);
253
+ border: 1px solid rgba(79, 70, 229, 0.22);
254
+ border-radius: 999px;
255
+ font-size: 0.9rem;
256
+ font-weight: 850;
257
+ overflow-wrap: anywhere;
258
+ }
259
+
260
+ .layout-container {
261
+ grid-row: span 2;
262
+ }
263
+
264
+ .canvas-wrapper {
265
+ height: 100%;
266
+ padding: 1rem;
267
+ background: var(--bg-page);
268
+ border: 1px solid var(--border-color);
269
+ border-radius: 1rem;
270
+ }
271
+
272
+ .scheme-area {
273
+ display: grid;
274
+ grid-template-columns: 38px minmax(0, 1fr);
275
+ gap: 0.6rem;
276
+ min-width: 0;
277
+ }
278
+
279
+ .ruler {
280
+ position: relative;
281
+ min-height: 260px;
282
+ }
283
+
284
+ .ruler-mark {
285
+ position: absolute;
286
+ right: 0;
287
+ left: 0;
288
+ display: flex;
289
+ align-items: flex-start;
290
+ transform: translateY(-50%);
291
+ }
292
+
293
+ .ruler-mark::before {
294
+ content: '';
295
+ width: 8px;
296
+ height: 1.5px;
297
+ margin-top: 0.42em;
298
+ margin-right: 4px;
299
+ background: var(--text-muted);
300
+ flex-shrink: 0;
301
+ }
302
+
303
+ .ruler-mark span {
304
+ color: var(--text-muted);
305
+ font-size: 0.58rem;
306
+ font-weight: 750;
307
+ white-space: nowrap;
308
+ }
309
+
310
+ .fabric-board {
311
+ min-width: 0;
312
+ height: 260px;
313
+ padding: 6px 6px 22px;
314
+ display: flex;
315
+ flex-direction: column;
316
+ gap: 4px;
317
+ overflow: hidden;
318
+ background: var(--bg-surface);
319
+ border: 2px solid var(--fabric-accent);
320
+ border-radius: 0.35rem;
321
+ }
322
+
323
+ .piece-row {
324
+ display: flex;
325
+ gap: 4px;
326
+ align-items: stretch;
327
+ min-height: 0;
328
+ flex-shrink: 0;
329
+ }
330
+
331
+ .piece-block {
332
+ min-width: 0;
333
+ padding: 4px 8px;
334
+ display: flex;
335
+ flex-direction: column;
336
+ justify-content: center;
337
+ overflow: hidden;
338
+ border: 1.5px solid;
339
+ border-radius: 0.3rem;
340
+ }
341
+
342
+ .piece-name {
343
+ width: 100%;
344
+ overflow: hidden;
345
+ color: var(--text-main);
346
+ font-size: 0.62rem;
347
+ font-weight: 850;
348
+ line-height: 1.2;
349
+ text-overflow: ellipsis;
350
+ white-space: nowrap;
351
+ }
352
+
353
+ .piece-fold {
354
+ border-left: 3px dashed rgba(79, 70, 229, 0.65);
355
+ }
356
+
357
+ .fold-indicator {
358
+ margin-top: 2px;
359
+ color: rgba(79, 70, 229, 0.78);
360
+ font-size: 0.48rem;
361
+ font-weight: 850;
362
+ letter-spacing: 0.04em;
363
+ text-transform: uppercase;
364
+ }
365
+
366
+ .board-empty-state {
367
+ flex: 1;
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ padding: 1rem;
372
+ color: var(--text-muted);
373
+ font-size: 0.8rem;
374
+ font-weight: 650;
375
+ text-align: center;
376
+ }
377
+
378
+ .scheme-info {
379
+ margin-top: 0.6rem;
380
+ color: var(--text-muted);
381
+ font-size: 0.68rem;
382
+ font-weight: 750;
383
+ text-align: right;
384
+ }
385
+
386
+ .merch-section {
387
+ padding: 1.25rem;
388
+ background: var(--bg-page);
389
+ border: 1px solid var(--border-color);
390
+ border-radius: 1rem;
391
+ }
392
+
393
+ .merch-header {
394
+ display: flex;
395
+ align-items: center;
396
+ justify-content: space-between;
397
+ gap: 0.75rem;
398
+ margin-bottom: 0.9rem;
399
+ }
400
+
401
+ .copy-list-btn {
402
+ min-height: 36px;
403
+ padding: 0 0.85rem;
404
+ color: var(--fabric-accent);
405
+ background: rgba(79, 70, 229, 0.08);
406
+ border: 1px solid rgba(79, 70, 229, 0.2);
407
+ font-size: 0.72rem;
408
+ }
409
+
410
+ .merceria-checklist {
411
+ margin: 0;
412
+ padding: 0;
413
+ display: flex;
414
+ flex-direction: column;
415
+ gap: 0.55rem;
416
+ list-style: none;
417
+ }
418
+
419
+ .merch-item {
420
+ display: flex;
421
+ align-items: center;
422
+ gap: 0.55rem;
423
+ color: var(--text-main);
424
+ font-size: 0.875rem;
425
+ font-weight: 650;
426
+ }
427
+
428
+ .merch-dot {
429
+ color: var(--fabric-accent);
430
+ font-size: 0.5rem;
431
+ flex-shrink: 0;
432
+ opacity: 0.7;
433
+ }
434
+
435
+ @media (max-width: 900px) {
436
+ .fabric-calculator-card,
437
+ .fabric-main {
438
+ grid-template-columns: 1fr;
18
439
  }
19
440
 
20
- .theme-dark .fabric-calculator-card {
21
- --f-side: rgba(255, 255, 255, 0.03);
441
+ .layout-container {
442
+ grid-row: auto;
22
443
  }
23
444
 
24
445
  .fabric-sidebar {
25
- background: var(--f-side);
26
- padding: 2.5rem 2rem;
27
- display: flex;
28
- flex-direction: column;
29
- gap: 2rem;
30
- border-right: 1px solid var(--border-color);
31
- }
32
-
33
- .config-group {
34
- display: flex;
35
- flex-direction: column;
36
- gap: 1.25rem;
37
- }
38
-
39
- .config-group h3 {
40
- font-size: 0.7rem;
41
- font-weight: 900;
42
- text-transform: uppercase;
43
- letter-spacing: 0.18rem;
44
- color: var(--f-p);
45
- margin: 0;
46
- }
47
-
48
- .fabric-field {
49
- display: flex;
50
- flex-direction: column;
51
- gap: 0.6rem;
446
+ display: grid;
447
+ grid-template-columns: repeat(2, minmax(0, 1fr));
448
+ align-items: start;
52
449
  }
53
450
 
54
- .fabric-field label {
55
- font-size: 0.72rem;
56
- font-weight: 800;
57
- text-transform: uppercase;
58
- letter-spacing: 0.06rem;
59
- color: var(--text-muted);
451
+ .btn-actions {
452
+ grid-column: 1 / -1;
60
453
  }
454
+ }
61
455
 
62
- .fabric-select {
456
+ @media (max-width: 600px) {
457
+ .fabric-calculator-card {
63
458
  width: 100%;
64
- padding: 0.85rem 3rem 0.85rem 1.1rem;
65
- border-radius: 14px;
66
- border: 1.5px solid var(--border-color);
67
- background: var(--bg-surface);
68
- font-size: 0.875rem;
69
- font-weight: 700;
70
- color: inherit;
71
- cursor: pointer;
72
- appearance: none;
73
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234F46E5' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
74
- background-repeat: no-repeat;
75
- background-position: right 1rem center;
76
- background-size: 1.1rem;
77
- transition: border-color 0.2s, box-shadow 0.2s;
78
- outline: none;
79
- }
80
-
81
- .fabric-select:focus {
82
- border-color: var(--f-p);
83
- box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.15);
84
- }
85
-
86
- .shop-stepper {
87
- display: grid;
88
- grid-template-columns: 48px 1fr 48px;
89
- align-items: center;
90
- background: var(--bg-surface);
91
- border-radius: 14px;
92
- border: 1.5px solid var(--border-color);
93
- overflow: hidden;
94
- height: 50px;
95
- max-width: 190px;
459
+ margin: 0;
460
+ padding: 1rem;
461
+ gap: 1rem;
462
+ border-radius: 1rem;
96
463
  }
97
464
 
98
- .step-btn {
99
- height: 100%;
100
- border: none;
465
+ .fabric-sidebar {
466
+ grid-template-columns: 1fr;
467
+ padding: 0;
101
468
  background: transparent;
102
- color: var(--f-p);
103
- font-size: 1.6rem;
104
- font-weight: 300;
105
- cursor: pointer;
106
- display: flex;
107
- align-items: center;
108
- justify-content: center;
109
- transition: background 0.15s, color 0.15s;
110
- flex-shrink: 0;
469
+ border: 0;
111
470
  }
112
471
 
113
- .step-btn:hover {
114
- background: var(--f-p);
115
- color: white;
472
+ .config-group {
473
+ padding: 1rem;
474
+ background: var(--bg-page);
475
+ border: 1px solid var(--border-color);
476
+ border-radius: 1rem;
116
477
  }
117
478
 
118
- .fabric-input {
119
- width: 100%;
120
- height: 100%;
121
- border: none;
122
- background: transparent;
123
- text-align: center;
124
- font-size: 1rem;
125
- font-weight: 800;
126
- color: inherit;
127
- padding: 0;
128
- outline: none;
129
- box-shadow: none;
479
+ .config-group + .config-group {
480
+ padding-top: 1rem;
130
481
  }
131
482
 
132
483
  .preset-group {
133
- display: grid;
134
- grid-template-columns: repeat(3, 1fr);
135
- gap: 0.5rem;
136
- }
137
-
138
- .preset-pill {
139
- padding: 0.75rem 0;
140
- border-radius: 12px;
141
- border: 1.5px solid rgba(79, 70, 229, 0.25);
142
- background: rgba(79, 70, 229, 0.06);
143
- font-size: 0.72rem;
144
- font-weight: 900;
145
- color: var(--f-p);
146
- cursor: pointer;
147
- transition: all 0.2s;
148
- text-align: center;
149
- }
150
-
151
- .theme-dark .preset-pill {
152
- background: rgba(79, 70, 229, 0.08);
153
- border-color: rgba(129, 140, 248, 0.3);
154
- color: var(--f-a);
155
- }
156
-
157
- .preset-pill:hover {
158
- background: rgba(79, 70, 229, 0.12);
159
- border-color: var(--f-p);
160
- }
161
-
162
- .preset-pill.active {
163
- background: var(--f-p);
164
- color: white;
165
- border-color: var(--f-p);
166
- box-shadow: 0 6px 16px rgba(79, 70, 229, 0.35);
484
+ grid-template-columns: 1fr;
167
485
  }
168
486
 
169
487
  .btn-actions {
170
- display: grid;
171
- grid-template-columns: 1fr 1fr;
172
- gap: 1rem;
173
- margin-top: auto;
174
- padding-top: 1rem;
175
- }
176
-
177
- .f-btn {
178
- height: 50px;
179
- border-radius: 14px;
180
- font-size: 0.85rem;
181
- font-weight: 800;
182
- cursor: pointer;
183
- border: none;
184
- transition: all 0.2s;
185
- }
186
-
187
- .f-seco {
188
- background: var(--bg-muted);
189
- color: var(--text-muted);
190
- border: 1.5px solid var(--border-color);
191
- }
192
-
193
- .f-seco:hover {
194
- filter: brightness(0.95);
195
- }
196
-
197
- .f-prim {
198
- background: var(--f-p);
199
- color: white;
200
- }
201
-
202
- .f-prim:hover {
203
- filter: brightness(1.1);
488
+ grid-template-columns: 1fr;
204
489
  }
205
490
 
206
- .fabric-main {
207
- padding: 3rem;
208
- display: flex;
209
- flex-direction: column;
210
- gap: 2.5rem;
211
- min-width: 0;
212
- }
213
-
214
- .magic-result-area {
215
- background: linear-gradient(145deg, rgba(79, 70, 229, 0.07), rgba(129, 140, 248, 0.03));
216
- padding: 2.5rem 2rem;
217
- border-radius: 28px;
218
- border: 1px solid rgba(79, 70, 229, 0.12);
219
- }
220
-
221
- .result-lbl {
222
- display: block;
223
- font-size: 0.68rem;
224
- font-weight: 900;
225
- text-transform: uppercase;
226
- letter-spacing: 0.12rem;
227
- color: var(--text-muted);
228
- margin-bottom: 0.4rem;
491
+ .magic-result-area,
492
+ .canvas-wrapper,
493
+ .merch-section {
494
+ padding: 1rem;
229
495
  }
230
496
 
231
497
  .magic-result-area .val {
232
- font-size: 6rem;
233
- font-weight: 950;
234
- letter-spacing: -5px;
235
- color: var(--f-p);
236
- line-height: 0.85;
237
- }
238
-
239
- .magic-result-area .unit {
240
- font-size: 1.75rem;
241
- font-weight: 900;
242
- opacity: 0.4;
243
- margin-left: 0.5rem;
244
- }
245
-
246
- .advice-tag {
247
- display: inline-flex;
248
- align-items: center;
249
- margin-top: 1.5rem;
250
- padding: 0.85rem 2rem;
251
- background: rgba(79, 70, 229, 0.1);
252
- border: 1.5px solid rgba(79, 70, 229, 0.22);
253
- border-radius: 50px;
254
- font-size: 1rem;
255
- font-weight: 800;
256
- color: var(--f-p);
257
- }
258
-
259
- .theme-dark .advice-tag {
260
- background: rgba(129, 140, 248, 0.12);
261
- border-color: rgba(129, 140, 248, 0.25);
262
- color: var(--f-a);
263
- }
264
-
265
- .layout-container {
266
- min-width: 0;
267
- }
268
-
269
- .canvas-wrapper {
270
- background: var(--bg-muted);
271
- padding: 24px 24px 14px 12px;
272
- border-radius: 28px;
498
+ font-size: 3rem;
273
499
  }
274
500
 
275
501
  .scheme-area {
276
- display: flex;
277
- align-items: stretch;
278
- gap: 10px;
279
- }
280
-
281
- .ruler {
282
- width: 34px;
283
- flex-shrink: 0;
284
- position: relative;
285
- }
286
-
287
- .ruler-mark {
288
- position: absolute;
289
- left: 0;
290
- right: 0;
291
- display: flex;
292
- align-items: flex-start;
293
- transform: translateY(-50%);
294
- }
295
-
296
- .ruler-mark::before {
297
- content: '';
298
- width: 8px;
299
- height: 1.5px;
300
- background: var(--text-muted);
301
- flex-shrink: 0;
302
- margin-top: 0.42em;
303
- margin-right: 4px;
304
- }
305
-
306
- .ruler-mark span {
307
- font-size: 0.58rem;
308
- font-weight: 700;
309
- color: var(--text-muted);
310
- white-space: nowrap;
502
+ grid-template-columns: 34px minmax(0, 1fr);
311
503
  }
312
504
 
505
+ .ruler,
313
506
  .fabric-board {
314
- flex: 1;
315
- height: 300px;
316
- background: var(--bg-surface);
317
- border: 2.5px solid var(--f-p);
318
- padding: 6px 6px 28px;
319
- box-shadow: 0 16px 36px rgba(0, 0, 0, 0.09);
320
- display: flex;
321
- flex-direction: column;
322
- gap: 4px;
323
- position: relative;
324
- overflow: hidden;
325
- border-radius: 4px;
326
- }
327
-
328
- .piece-row {
329
- display: flex;
330
- flex-direction: row;
331
- gap: 4px;
332
- flex-shrink: 0;
333
- align-items: stretch;
334
- }
335
-
336
- .piece-block {
337
- border-radius: 4px;
338
- border: 1.5px solid;
339
- display: flex;
340
- flex-direction: column;
341
- align-items: flex-start;
342
- justify-content: center;
343
- padding: 4px 8px;
344
- overflow: hidden;
345
- min-width: 0;
346
- transition: filter 0.15s;
347
- }
348
-
349
- .piece-block:hover {
350
- filter: brightness(1.08);
351
- }
352
-
353
- .piece-name {
354
- font-size: 0.62rem;
355
- font-weight: 800;
356
- color: var(--text-main);
357
- line-height: 1.2;
358
- white-space: nowrap;
359
- overflow: hidden;
360
- text-overflow: ellipsis;
361
- width: 100%;
362
- }
363
-
364
- .piece-fold {
365
- border-left: 3px dashed rgba(79, 70, 229, 0.65);
366
- }
367
-
368
- .fold-indicator {
369
- font-size: 0.48rem;
370
- font-weight: 800;
371
- color: rgba(79, 70, 229, 0.75);
372
- text-transform: uppercase;
373
- letter-spacing: 0.04em;
374
- margin-top: 2px;
507
+ height: 220px;
508
+ min-height: 220px;
375
509
  }
376
-
377
- .board-empty-state {
378
- flex: 1;
379
- display: flex;
380
- align-items: center;
381
- justify-content: center;
382
- font-size: 0.8rem;
383
- font-weight: 600;
384
- color: var(--text-muted);
385
- text-align: center;
386
- padding: 2rem;
387
- }
388
-
389
- .scheme-info {
390
- font-size: 0.68rem;
391
- font-weight: 700;
392
- color: var(--text-muted);
393
- margin-top: 0.6rem;
394
- text-align: right;
395
- }
396
-
397
- .merch-section {
398
- min-width: 0;
399
- }
400
-
401
- .merch-header {
402
- display: flex;
403
- align-items: center;
404
- justify-content: space-between;
405
- margin-bottom: 1rem;
406
- padding-bottom: 0.5rem;
407
- border-bottom: 2px solid var(--border-color);
408
- }
409
-
410
- .merch-title {
411
- font-size: 0.7rem;
412
- font-weight: 900;
413
- text-transform: uppercase;
414
- letter-spacing: 0.18rem;
415
- color: var(--f-p);
416
- margin: 0;
417
- }
418
-
419
- .copy-list-btn {
420
- font-size: 0.7rem;
421
- font-weight: 800;
422
- color: var(--f-p);
423
- background: rgba(79, 70, 229, 0.08);
424
- border: 1px solid rgba(79, 70, 229, 0.2);
425
- border-radius: 8px;
426
- padding: 0.35rem 0.85rem;
427
- cursor: pointer;
428
- transition: all 0.2s;
429
- }
430
-
431
- .copy-list-btn:hover {
432
- background: rgba(79, 70, 229, 0.15);
433
- }
434
-
435
- .merceria-checklist {
436
- list-style: none;
437
- margin: 0;
438
- padding: 0;
439
- display: flex;
440
- flex-direction: column;
441
- gap: 0.6rem;
442
- }
443
-
444
- .merch-item {
445
- display: flex;
446
- align-items: center;
447
- gap: 0.6rem;
448
- font-size: 0.875rem;
449
- font-weight: 600;
450
- color: var(--text-main);
451
- }
452
-
453
- .merch-dot {
454
- color: var(--f-p);
455
- font-size: 0.5rem;
456
- flex-shrink: 0;
457
- opacity: 0.65;
458
- }
459
-
460
- .warning-banner {
461
- display: none;
462
- background: #fff7ed;
463
- color: #c2410c;
464
- border: 1.5px solid #fed7aa;
465
- padding: 1rem 1.25rem;
466
- border-radius: 16px;
467
- font-size: 0.85rem;
468
- font-weight: 600;
469
- }
470
-
471
- @media (max-width: 1100px) {
472
- .fabric-calculator-card {
473
- grid-template-columns: 1fr;
474
- width: 100%;
475
- border-radius: 1rem;
476
- margin: 0;
477
- }
478
-
479
- .fabric-sidebar {
480
- border-right: none;
481
- border-bottom: 1px solid var(--border-color);
482
- padding: 1.75rem 1.5rem;
483
- }
484
-
485
- .btn-actions {
486
- margin-top: 1rem;
487
- }
488
-
489
- .fabric-main {
490
- padding: 2rem 1.5rem;
491
- gap: 2rem;
492
- }
493
-
494
- .magic-result-area .val {
495
- font-size: 4.5rem;
496
- letter-spacing: -3px;
497
- }
498
- }
499
-
500
- @media (max-width: 600px) {
501
- .fabric-sidebar {
502
- padding: 1.25rem;
503
- }
504
-
505
- .fabric-main {
506
- padding: 1.25rem;
507
- gap: 1.5rem;
508
- }
509
-
510
- .magic-result-area {
511
- padding: 1.5rem 1.25rem;
512
- border-radius: 1rem;
513
- }
514
-
515
- .magic-result-area .val {
516
- font-size: 3rem;
517
- letter-spacing: -2px;
518
- }
519
-
520
- .magic-result-area .unit {
521
- font-size: 1.2rem;
522
- }
523
-
524
- .advice-tag {
525
- font-size: 0.875rem;
526
- padding: 0.7rem 1.25rem;
527
- }
528
-
529
- .canvas-wrapper {
530
- padding: 14px 14px 10px 8px;
531
- border-radius: 16px;
532
- }
533
-
534
- .fabric-board {
535
- height: 220px;
536
- padding-bottom: 20px;
537
- }
538
- }
510
+ }