@jjlmoya/utils-textiles 1.15.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-textiles",
3
- "version": "1.15.0",
3
+ "version": "1.16.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -61,7 +61,7 @@ const calcUI = ui as FabricProjectCalculatorUI;
61
61
  </div>
62
62
  </div>
63
63
 
64
- <main class="fabric-main">
64
+ <div class="fabric-main">
65
65
  <div id="warning-msg" class="warning-banner"></div>
66
66
 
67
67
  <section class="magic-result-area">
@@ -89,7 +89,7 @@ const calcUI = ui as FabricProjectCalculatorUI;
89
89
  </div>
90
90
  <ul id="check-list" class="merceria-checklist"></ul>
91
91
  </section>
92
- </main>
92
+ </div>
93
93
  </div>
94
94
 
95
95
  <script define:vars={{ ui }} is:inline>
@@ -1,600 +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;
375
- }
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
- display: flex;
474
- flex-direction: column;
475
- grid-template-columns: 1fr;
476
- width: 100%;
477
- border-radius: 1rem;
478
- margin: 0;
479
- overflow: visible;
480
- }
481
-
482
- .fabric-sidebar {
483
- border-right: none;
484
- border-bottom: 1px solid var(--border-color);
485
- padding: 1.75rem 1.5rem;
486
- }
487
-
488
- .btn-actions {
489
- margin-top: 1rem;
490
- }
491
-
492
- .fabric-main {
493
- padding: 2rem 1.5rem;
494
- gap: 2rem;
495
- }
496
-
497
- .magic-result-area .val {
498
- font-size: 4.5rem;
499
- letter-spacing: -3px;
500
- }
501
- }
502
-
503
- @media (max-width: 600px) {
504
- .fabric-calculator-card {
505
- background: transparent;
506
- border: 0;
507
- box-shadow: none;
508
- gap: 1rem;
509
- }
510
-
511
- .fabric-sidebar {
512
- background: var(--bg-surface);
513
- border: 1px solid var(--border-color);
514
- border-radius: 1rem;
515
- padding: 1.25rem;
516
- gap: 1.5rem;
517
- min-width: 0;
518
- }
519
-
520
- .config-group {
521
- gap: 1rem;
522
- min-width: 0;
523
- }
524
-
525
- .fabric-field {
526
- min-width: 0;
527
- }
528
-
529
- .fabric-select,
530
- .fabric-input {
531
- display: block;
532
- min-width: 0;
533
- min-height: 48px;
534
- color: var(--text-main);
535
- }
536
-
537
- .fabric-select {
538
- background-color: var(--bg-surface);
539
- }
540
-
541
- .shop-stepper {
542
- width: 100%;
543
- max-width: none;
544
- grid-template-columns: 48px minmax(0, 1fr) 48px;
545
- }
546
-
547
- .preset-group {
548
- grid-template-columns: 1fr;
549
- }
550
-
551
- .preset-pill {
552
- min-height: 44px;
553
- padding: 0.75rem;
554
- }
555
-
556
- .btn-actions {
557
- grid-template-columns: 1fr;
558
- }
559
-
560
- .fabric-main {
561
- background: var(--bg-surface);
562
- border: 1px solid var(--border-color);
563
- border-radius: 1rem;
564
- padding: 1.25rem;
565
- gap: 1.5rem;
566
- min-width: 0;
567
- }
568
-
569
- .magic-result-area {
570
- padding: 1.5rem 1.25rem;
571
- border-radius: 1rem;
572
- }
573
-
574
- .magic-result-area .val {
575
- font-size: 3rem;
576
- letter-spacing: -2px;
577
- }
578
-
579
- .magic-result-area .unit {
580
- font-size: 1.2rem;
581
- }
582
-
583
- .advice-tag {
584
- font-size: 0.875rem;
585
- padding: 0.7rem 1.25rem;
586
- max-width: 100%;
587
- overflow-wrap: anywhere;
588
- }
589
-
590
- .canvas-wrapper {
591
- padding: 14px 14px 10px 8px;
592
- border-radius: 16px;
593
- min-width: 0;
594
- }
595
-
596
- .fabric-board {
597
- height: 220px;
598
- padding-bottom: 20px;
599
- }
507
+ height: 220px;
508
+ min-height: 220px;
600
509
  }
510
+ }