anurag008w commited on
Commit
87b78f5
Β·
1 Parent(s): f32ab0f

Upload env-builder.html

Browse files
Files changed (1) hide show
  1. env-builder.html +819 -0
env-builder.html ADDED
@@ -0,0 +1,819 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>HuggingClaw Β· ENV Builder</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Syne:wght@400;500;600;700;800&display=swap" rel="stylesheet">
10
+
11
+ <style>
12
+ /* ── Reset & Tokens ── */
13
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
14
+
15
+ :root {
16
+ --bg: #0b0c0f;
17
+ --bg2: #111318;
18
+ --bg3: #181c23;
19
+ --bg4: #1e2330;
20
+ --border: #252b38;
21
+ --border2: #2e3648;
22
+ --amber: #f5a623;
23
+ --amber2: #ffbe55;
24
+ --amber-dim: rgba(245,166,35,.12);
25
+ --amber-glow:rgba(245,166,35,.22);
26
+ --green: #3dd68c;
27
+ --red: #f05f5f;
28
+ --blue: #5b8af5;
29
+ --text: #e4e8f0;
30
+ --text2: #8d97ad;
31
+ --text3: #535f76;
32
+ --mono: 'JetBrains Mono', monospace;
33
+ --sans: 'Syne', sans-serif;
34
+ --r: 8px;
35
+ --r2: 12px;
36
+ --sidebar-w: 220px;
37
+ --panel-w: 340px;
38
+ }
39
+
40
+ html { scroll-behavior: smooth; }
41
+
42
+ body {
43
+ font-family: var(--sans);
44
+ background: var(--bg);
45
+ color: var(--text);
46
+ min-height: 100vh;
47
+ display: flex;
48
+ flex-direction: column;
49
+ overflow-x: hidden;
50
+ }
51
+
52
+ /* ── Topbar ── */
53
+ .topbar {
54
+ position: sticky;
55
+ top: 0;
56
+ z-index: 100;
57
+ height: 52px;
58
+ background: rgba(11,12,15,.9);
59
+ backdrop-filter: blur(14px);
60
+ border-bottom: 1px solid var(--border);
61
+ display: flex;
62
+ align-items: center;
63
+ padding: 0 20px;
64
+ gap: 16px;
65
+ flex-shrink: 0;
66
+ }
67
+
68
+ .topbar-logo {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 10px;
72
+ flex-shrink: 0;
73
+ }
74
+
75
+ .topbar-logo svg { width: 26px; height: 26px; }
76
+
77
+ .topbar-wordmark {
78
+ font-weight: 800;
79
+ font-size: 14px;
80
+ letter-spacing: -.2px;
81
+ color: var(--text);
82
+ white-space: nowrap;
83
+ }
84
+
85
+ .topbar-wordmark em {
86
+ color: var(--amber);
87
+ font-style: normal;
88
+ }
89
+
90
+ .topbar-divider {
91
+ width: 1px;
92
+ height: 22px;
93
+ background: var(--border2);
94
+ }
95
+
96
+ .topbar-title {
97
+ font-size: 12px;
98
+ font-weight: 600;
99
+ color: var(--text2);
100
+ letter-spacing: .5px;
101
+ text-transform: uppercase;
102
+ }
103
+
104
+ .topbar-spacer { flex: 1; }
105
+
106
+ .topbar-pill {
107
+ font-family: var(--mono);
108
+ font-size: 10px;
109
+ color: var(--amber);
110
+ background: var(--amber-dim);
111
+ border: 1px solid var(--amber-glow);
112
+ border-radius: 20px;
113
+ padding: 3px 10px;
114
+ letter-spacing: .5px;
115
+ }
116
+
117
+ /* ── Layout ── */
118
+ .layout {
119
+ display: flex;
120
+ flex: 1;
121
+ min-height: 0;
122
+ height: calc(100vh - 52px);
123
+ }
124
+
125
+ /* ── Sidebar ── */
126
+ .sidebar-wrap {
127
+ width: var(--sidebar-w);
128
+ flex-shrink: 0;
129
+ border-right: 1px solid var(--border);
130
+ background: var(--bg2);
131
+ display: flex;
132
+ flex-direction: column;
133
+ overflow: hidden;
134
+ }
135
+
136
+ .sidebar-scroll {
137
+ flex: 1;
138
+ overflow-y: auto;
139
+ padding: 14px 10px;
140
+ }
141
+
142
+ .sidebar-scroll::-webkit-scrollbar { width: 4px; }
143
+ .sidebar-scroll::-webkit-scrollbar-track { background: transparent; }
144
+ .sidebar-scroll::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 4px; }
145
+
146
+ /* sb-label rendered by JS */
147
+ .sb-label {
148
+ font-size: 9px;
149
+ font-weight: 700;
150
+ text-transform: uppercase;
151
+ letter-spacing: 1.2px;
152
+ color: var(--text3);
153
+ padding: 0 8px 10px;
154
+ }
155
+
156
+ .nav-btn {
157
+ width: 100%;
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 8px;
161
+ padding: 8px 10px;
162
+ border: none;
163
+ background: transparent;
164
+ cursor: pointer;
165
+ border-radius: var(--r);
166
+ text-align: left;
167
+ color: var(--text2);
168
+ font-family: var(--sans);
169
+ font-size: 12.5px;
170
+ font-weight: 500;
171
+ transition: background .15s, color .15s;
172
+ margin-bottom: 2px;
173
+ }
174
+
175
+ .nav-btn:hover { background: var(--bg3); color: var(--text); }
176
+ .nav-btn.active {
177
+ background: var(--amber-dim);
178
+ color: var(--amber);
179
+ border: 1px solid var(--amber-glow);
180
+ }
181
+
182
+ .nav-icon { font-size: 13px; flex-shrink: 0; }
183
+ .nav-label { flex: 1; }
184
+ .nav-count {
185
+ font-family: var(--mono);
186
+ font-size: 10px;
187
+ font-weight: 600;
188
+ color: var(--text3);
189
+ background: var(--bg3);
190
+ border-radius: 10px;
191
+ padding: 1px 6px;
192
+ min-width: 20px;
193
+ text-align: center;
194
+ transition: background .2s, color .2s;
195
+ }
196
+ .nav-btn.active .nav-count {
197
+ background: var(--amber-glow);
198
+ color: var(--amber2);
199
+ }
200
+
201
+ /* ── Main ── */
202
+ .main {
203
+ flex: 1;
204
+ display: flex;
205
+ flex-direction: column;
206
+ min-width: 0;
207
+ overflow: hidden;
208
+ }
209
+
210
+ /* ── Toolbar ── */
211
+ .toolbar {
212
+ display: flex;
213
+ align-items: center;
214
+ gap: 10px;
215
+ padding: 12px 20px;
216
+ border-bottom: 1px solid var(--border);
217
+ background: var(--bg2);
218
+ flex-shrink: 0;
219
+ flex-wrap: wrap;
220
+ }
221
+
222
+ .search-wrap {
223
+ position: relative;
224
+ flex: 1;
225
+ min-width: 160px;
226
+ max-width: 340px;
227
+ }
228
+
229
+ .search-icon {
230
+ position: absolute;
231
+ left: 10px;
232
+ top: 50%;
233
+ transform: translateY(-50%);
234
+ color: var(--text3);
235
+ pointer-events: none;
236
+ font-size: 12px;
237
+ }
238
+
239
+ #search {
240
+ width: 100%;
241
+ background: var(--bg3);
242
+ border: 1px solid var(--border2);
243
+ border-radius: var(--r);
244
+ padding: 7px 10px 7px 30px;
245
+ font-family: var(--mono);
246
+ font-size: 12px;
247
+ color: var(--text);
248
+ outline: none;
249
+ transition: border-color .15s;
250
+ }
251
+
252
+ #search:focus { border-color: var(--amber); }
253
+ #search::placeholder { color: var(--text3); }
254
+
255
+ .tb-sep {
256
+ width: 1px;
257
+ height: 24px;
258
+ background: var(--border2);
259
+ }
260
+
261
+ .btn {
262
+ display: inline-flex;
263
+ align-items: center;
264
+ gap: 5px;
265
+ padding: 6px 13px;
266
+ border-radius: var(--r);
267
+ border: 1px solid var(--border2);
268
+ background: var(--bg3);
269
+ color: var(--text2);
270
+ font-family: var(--sans);
271
+ font-size: 11.5px;
272
+ font-weight: 600;
273
+ cursor: pointer;
274
+ transition: all .15s;
275
+ white-space: nowrap;
276
+ }
277
+
278
+ .btn:hover { background: var(--bg4); color: var(--text); border-color: var(--border2); }
279
+
280
+ .btn-amber {
281
+ background: var(--amber);
282
+ color: #0b0c0f;
283
+ border-color: var(--amber);
284
+ }
285
+ .btn-amber:hover { background: var(--amber2); border-color: var(--amber2); }
286
+
287
+ .btn-ghost {
288
+ background: transparent;
289
+ border-color: transparent;
290
+ color: var(--text3);
291
+ }
292
+ .btn-ghost:hover { background: var(--bg3); color: var(--text2); border-color: var(--border2); }
293
+
294
+ /* ── Content area ── */
295
+ .content-wrap {
296
+ flex: 1;
297
+ display: flex;
298
+ min-height: 0;
299
+ overflow: hidden;
300
+ }
301
+
302
+ /* ── Sections scroll ── */
303
+ .sections-scroll {
304
+ flex: 1;
305
+ overflow-y: auto;
306
+ padding: 16px 20px 80px;
307
+ min-width: 0;
308
+ }
309
+
310
+ .sections-scroll::-webkit-scrollbar { width: 5px; }
311
+ .sections-scroll::-webkit-scrollbar-track { background: transparent; }
312
+ .sections-scroll::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 4px; }
313
+
314
+ /* ── Section ── */
315
+ .sec { margin-bottom: 28px; }
316
+ .sec.sec-hidden { display: none !important; }
317
+
318
+ .sec-header {
319
+ display: flex;
320
+ align-items: center;
321
+ gap: 8px;
322
+ margin-bottom: 12px;
323
+ }
324
+
325
+ .sec-icon { font-size: 14px; }
326
+ .sec-title {
327
+ font-size: 11px;
328
+ font-weight: 700;
329
+ text-transform: uppercase;
330
+ letter-spacing: 1.2px;
331
+ color: var(--text3);
332
+ }
333
+
334
+ .sec-line {
335
+ flex: 1;
336
+ height: 1px;
337
+ background: var(--border);
338
+ }
339
+
340
+ .cards {
341
+ display: grid;
342
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
343
+ gap: 10px;
344
+ }
345
+
346
+ /* ── ENV Card ── */
347
+ .env-card {
348
+ background: var(--bg2);
349
+ border: 1px solid var(--border);
350
+ border-radius: var(--r2);
351
+ padding: 12px;
352
+ transition: border-color .2s, background .2s;
353
+ }
354
+
355
+ .env-card:hover { border-color: var(--border2); }
356
+ .env-card.hidden { display: none; }
357
+
358
+ .env-card.selected {
359
+ border-color: var(--amber-glow);
360
+ background: linear-gradient(135deg, var(--bg2) 80%, rgba(245,166,35,.04));
361
+ }
362
+
363
+ .card-top {
364
+ display: flex;
365
+ align-items: flex-start;
366
+ gap: 9px;
367
+ margin-bottom: 9px;
368
+ }
369
+
370
+ .card-check {
371
+ width: 15px;
372
+ height: 15px;
373
+ accent-color: var(--amber);
374
+ flex-shrink: 0;
375
+ margin-top: 2px;
376
+ cursor: pointer;
377
+ }
378
+
379
+ .card-info { flex: 1; min-width: 0; }
380
+
381
+ .card-key {
382
+ font-family: var(--mono);
383
+ font-size: 11.5px;
384
+ font-weight: 600;
385
+ color: var(--text);
386
+ letter-spacing: .3px;
387
+ white-space: nowrap;
388
+ overflow: hidden;
389
+ text-overflow: ellipsis;
390
+ }
391
+
392
+ .card-lbl {
393
+ font-size: 11px;
394
+ color: var(--text3);
395
+ margin-top: 2px;
396
+ line-height: 1.35;
397
+ }
398
+
399
+ .badge {
400
+ flex-shrink: 0;
401
+ font-family: var(--mono);
402
+ font-size: 9px;
403
+ font-weight: 700;
404
+ text-transform: uppercase;
405
+ letter-spacing: .6px;
406
+ padding: 2px 7px;
407
+ border-radius: 20px;
408
+ }
409
+
410
+ .badge-s {
411
+ background: rgba(240,95,95,.12);
412
+ color: var(--red);
413
+ border: 1px solid rgba(240,95,95,.25);
414
+ }
415
+
416
+ .badge-f {
417
+ background: rgba(61,214,140,.1);
418
+ color: var(--green);
419
+ border: 1px solid rgba(61,214,140,.2);
420
+ }
421
+
422
+ /* ── Card inputs ── */
423
+ .card-input { position: relative; }
424
+
425
+ .card-input input[type="text"],
426
+ .card-input input[type="password"],
427
+ .card-input input[type="number"],
428
+ .card-input textarea,
429
+ .card-input select {
430
+ width: 100%;
431
+ background: var(--bg3);
432
+ border: 1px solid var(--border);
433
+ border-radius: var(--r);
434
+ padding: 7px 10px;
435
+ font-family: var(--mono);
436
+ font-size: 11.5px;
437
+ color: var(--text);
438
+ outline: none;
439
+ transition: border-color .15s;
440
+ resize: vertical;
441
+ }
442
+
443
+ .card-input input[type="text"]:focus,
444
+ .card-input input[type="password"]:focus,
445
+ .card-input input[type="number"]:focus,
446
+ .card-input textarea:focus,
447
+ .card-input select:focus {
448
+ border-color: var(--amber);
449
+ }
450
+
451
+ .card-input textarea { min-height: 64px; }
452
+ .card-input select {
453
+ cursor: pointer;
454
+ appearance: none;
455
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%238d97ad' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
456
+ background-repeat: no-repeat;
457
+ background-position: right 10px center;
458
+ padding-right: 28px;
459
+ }
460
+
461
+ .card-input optgroup { color: var(--text2); font-weight: 600; }
462
+ .card-input option { color: var(--text); background: var(--bg3); }
463
+
464
+ /* ── Toggle ── */
465
+ .toggle-shell { display: flex; align-items: center; gap: 8px; }
466
+ .tog {
467
+ padding: 5px 14px;
468
+ border-radius: 20px;
469
+ border: 1px solid var(--border2);
470
+ background: var(--bg3);
471
+ color: var(--text3);
472
+ font-family: var(--mono);
473
+ font-size: 11px;
474
+ font-weight: 700;
475
+ cursor: pointer;
476
+ transition: all .18s;
477
+ letter-spacing: .5px;
478
+ }
479
+ .tog.on {
480
+ background: rgba(61,214,140,.15);
481
+ border-color: rgba(61,214,140,.4);
482
+ color: var(--green);
483
+ }
484
+
485
+ /* ── Picker shell ── */
486
+ .picker-shell { display: flex; flex-direction: column; gap: 6px; }
487
+ .picker-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
488
+
489
+ .picker-select {
490
+ flex: 1;
491
+ min-width: 0;
492
+ padding: 6px 28px 6px 8px !important;
493
+ font-size: 11px !important;
494
+ }
495
+
496
+ .mini-btn {
497
+ padding: 5px 9px;
498
+ border-radius: var(--r);
499
+ border: 1px solid var(--border2);
500
+ background: var(--bg3);
501
+ color: var(--text2);
502
+ font-family: var(--mono);
503
+ font-size: 10px;
504
+ font-weight: 600;
505
+ cursor: pointer;
506
+ transition: all .15s;
507
+ white-space: nowrap;
508
+ }
509
+ .mini-btn:hover { background: var(--bg4); color: var(--text); }
510
+
511
+ /* ── Right panel ── */
512
+ .right-panel {
513
+ width: var(--panel-w);
514
+ flex-shrink: 0;
515
+ border-left: 1px solid var(--border);
516
+ background: var(--bg2);
517
+ display: flex;
518
+ flex-direction: column;
519
+ overflow: hidden;
520
+ }
521
+
522
+ .panel-scroll {
523
+ flex: 1;
524
+ overflow-y: auto;
525
+ padding: 16px;
526
+ display: flex;
527
+ flex-direction: column;
528
+ gap: 16px;
529
+ }
530
+
531
+ .panel-scroll::-webkit-scrollbar { width: 4px; }
532
+ .panel-scroll::-webkit-scrollbar-track { background: transparent; }
533
+ .panel-scroll::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 4px; }
534
+
535
+ /* ── Panel block ── */
536
+ .pblock {
537
+ background: var(--bg3);
538
+ border: 1px solid var(--border);
539
+ border-radius: var(--r2);
540
+ overflow: hidden;
541
+ }
542
+
543
+ .pblock-head {
544
+ display: flex;
545
+ align-items: center;
546
+ justify-content: space-between;
547
+ padding: 10px 14px;
548
+ border-bottom: 1px solid var(--border);
549
+ }
550
+
551
+ .pblock-title {
552
+ font-size: 10.5px;
553
+ font-weight: 700;
554
+ text-transform: uppercase;
555
+ letter-spacing: 1px;
556
+ color: var(--text3);
557
+ display: flex;
558
+ align-items: center;
559
+ gap: 6px;
560
+ }
561
+
562
+ .pblock-body { padding: 12px 14px; display: flex; flex-direction: column; gap: 8px; }
563
+
564
+ .pblock-body textarea,
565
+ .pblock-body input[type="text"] {
566
+ width: 100%;
567
+ background: var(--bg);
568
+ border: 1px solid var(--border);
569
+ border-radius: var(--r);
570
+ padding: 8px 10px;
571
+ font-family: var(--mono);
572
+ font-size: 10.5px;
573
+ color: var(--text2);
574
+ outline: none;
575
+ resize: vertical;
576
+ transition: border-color .15s;
577
+ }
578
+
579
+ .pblock-body textarea:focus,
580
+ .pblock-body input[type="text"]:focus {
581
+ border-color: var(--amber);
582
+ color: var(--text);
583
+ }
584
+
585
+ #importText { min-height: 80px; }
586
+ #bundleOut { min-height: 60px; color: var(--amber2); }
587
+ #envLineOut { font-size: 10px; }
588
+
589
+ .row-btns { display: flex; gap: 6px; flex-wrap: wrap; }
590
+
591
+ /* ── Summary ── */
592
+ #summary {
593
+ font-size: 11.5px;
594
+ color: var(--text2);
595
+ line-height: 1.6;
596
+ }
597
+
598
+ #summary strong {
599
+ font-size: 15px;
600
+ color: var(--amber);
601
+ font-family: var(--mono);
602
+ }
603
+
604
+ .sum-keys {
605
+ margin-top: 8px;
606
+ display: flex;
607
+ flex-wrap: wrap;
608
+ gap: 4px;
609
+ }
610
+
611
+ .sum-key {
612
+ font-family: var(--mono);
613
+ font-size: 9.5px;
614
+ color: var(--text2);
615
+ background: var(--bg4);
616
+ border: 1px solid var(--border2);
617
+ border-radius: 4px;
618
+ padding: 2px 6px;
619
+ }
620
+
621
+ /* ── Custom Env section ── */
622
+ #customSec {
623
+ margin-top: 8px;
624
+ }
625
+
626
+ .custom-row {
627
+ display: flex;
628
+ gap: 8px;
629
+ align-items: center;
630
+ margin-bottom: 8px;
631
+ }
632
+
633
+ .custom-row input {
634
+ flex: 1;
635
+ background: var(--bg3);
636
+ border: 1px solid var(--border);
637
+ border-radius: var(--r);
638
+ padding: 7px 10px;
639
+ font-family: var(--mono);
640
+ font-size: 11px;
641
+ color: var(--text);
642
+ outline: none;
643
+ transition: border-color .15s;
644
+ min-width: 0;
645
+ }
646
+
647
+ .custom-row input:focus { border-color: var(--amber); }
648
+ .custom-row input:first-child { flex: 0 0 40%; }
649
+
650
+ /* ── Toast ── */
651
+ #toast {
652
+ position: fixed;
653
+ bottom: 24px;
654
+ left: 50%;
655
+ transform: translateX(-50%) translateY(20px);
656
+ background: var(--bg4);
657
+ border: 1px solid var(--border2);
658
+ color: var(--amber);
659
+ font-family: var(--mono);
660
+ font-size: 12px;
661
+ font-weight: 600;
662
+ padding: 9px 20px;
663
+ border-radius: 30px;
664
+ z-index: 9999;
665
+ opacity: 0;
666
+ transition: opacity .2s, transform .2s;
667
+ pointer-events: none;
668
+ box-shadow: 0 8px 32px rgba(0,0,0,.5);
669
+ }
670
+
671
+ #toast.show {
672
+ opacity: 1;
673
+ transform: translateX(-50%) translateY(0);
674
+ }
675
+
676
+ /* ── Scrollbar global ── */
677
+ ::-webkit-scrollbar { width: 6px; height: 6px; }
678
+ ::-webkit-scrollbar-track { background: transparent; }
679
+ ::-webkit-scrollbar-thumb { background: var(--border2); border-radius: 4px; }
680
+
681
+ /* ── Responsive ── */
682
+ @media (max-width: 900px) {
683
+ :root { --panel-w: 280px; --sidebar-w: 180px; }
684
+ }
685
+
686
+ @media (max-width: 700px) {
687
+ .right-panel { display: none; }
688
+ :root { --sidebar-w: 160px; }
689
+ }
690
+
691
+ @media (max-width: 520px) {
692
+ .sidebar-wrap { display: none; }
693
+ .topbar-divider, .topbar-title { display: none; }
694
+ }
695
+ </style>
696
+ </head>
697
+
698
+ <body>
699
+
700
+ <!-- ── Topbar ── -->
701
+ <header class="topbar">
702
+ <div class="topbar-logo">
703
+ <svg viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
704
+ <rect width="64" height="64" rx="14" fill="#1a1f2e"/>
705
+ <text x="10" y="46" font-size="40" font-family="monospace">πŸ€—</text>
706
+ <circle cx="46" cy="20" r="10" fill="#f5a623"/>
707
+ <text x="40" y="25" font-size="14" font-family="monospace" fill="#0b0c0f">⚑</text>
708
+ </svg>
709
+ <span class="topbar-wordmark">Hugging<em>Claw</em></span>
710
+ </div>
711
+ <div class="topbar-divider"></div>
712
+ <span class="topbar-title">ENV Builder</span>
713
+ <div class="topbar-spacer"></div>
714
+ <span class="topbar-pill">v2025</span>
715
+ </header>
716
+
717
+ <!-- ── Layout ── -->
718
+ <div class="layout">
719
+
720
+ <!-- ── Sidebar ── -->
721
+ <aside class="sidebar-wrap">
722
+ <div class="sidebar-scroll">
723
+ <div id="sidebar"></div>
724
+ </div>
725
+ </aside>
726
+
727
+ <!-- ── Main ── -->
728
+ <main class="main">
729
+
730
+ <!-- toolbar -->
731
+ <div class="toolbar">
732
+ <div class="search-wrap">
733
+ <span class="search-icon">βŒ•</span>
734
+ <input id="search" type="text" placeholder="Search variables…" autocomplete="off" spellcheck="false">
735
+ </div>
736
+
737
+ <div class="tb-sep"></div>
738
+
739
+ <button id="selectCommon" class="btn">β˜… Common</button>
740
+ <button id="selectVisible" class="btn">β˜‘ Visible</button>
741
+ <button id="clearAll" class="btn btn-ghost">βœ• Clear</button>
742
+ </div>
743
+
744
+ <!-- content row -->
745
+ <div class="content-wrap">
746
+
747
+ <!-- sections -->
748
+ <div class="sections-scroll">
749
+ <div id="sections"></div>
750
+
751
+ <!-- Custom Env section -->
752
+ <div id="customSec" class="sec" data-section="Custom Env">
753
+ <div class="sec-header">
754
+ <span class="sec-icon">πŸ”§</span>
755
+ <span class="sec-title">Custom Env</span>
756
+ <div class="sec-line"></div>
757
+ </div>
758
+ <div id="customRows"></div>
759
+ <button id="addCustom" class="btn" style="margin-top:6px;">+ Add variable</button>
760
+ </div>
761
+ </div>
762
+
763
+ <!-- right panel -->
764
+ <aside class="right-panel">
765
+ <div class="panel-scroll">
766
+
767
+ <!-- Summary -->
768
+ <div class="pblock">
769
+ <div class="pblock-head">
770
+ <span class="pblock-title">πŸ“Š Summary</span>
771
+ </div>
772
+ <div class="pblock-body">
773
+ <div id="summary">No variables selected yet.</div>
774
+ </div>
775
+ </div>
776
+
777
+ <!-- Output -->
778
+ <div class="pblock">
779
+ <div class="pblock-head">
780
+ <span class="pblock-title">πŸ“¦ Bundle Output</span>
781
+ </div>
782
+ <div class="pblock-body">
783
+ <textarea id="bundleOut" placeholder="Your encoded bundle will appear here…" readonly spellcheck="false"></textarea>
784
+ <input type="text" id="envLineOut" placeholder="HUGGINGCLAW_ENV_BUNDLE=…" readonly spellcheck="false">
785
+ <div class="row-btns">
786
+ <button id="copyBundle" class="btn btn-amber">⎘ Bundle</button>
787
+ <button id="copyEnvLine" class="btn">⎘ Env Line</button>
788
+ <button id="copyJson" class="btn">⎘ JSON</button>
789
+ <button id="applyBundle" class="btn btn-ghost">β†Ί Apply</button>
790
+ </div>
791
+ </div>
792
+ </div>
793
+
794
+ <!-- Import -->
795
+ <div class="pblock">
796
+ <div class="pblock-head">
797
+ <span class="pblock-title">πŸ“₯ Import</span>
798
+ </div>
799
+ <div class="pblock-body">
800
+ <textarea id="importText" placeholder="Paste .env, JSON, or HUGGINGCLAW_ENV_BUNDLE=… here" spellcheck="false"></textarea>
801
+ <button id="applyImport" class="btn btn-amber" style="width:100%;">↓ Import & Apply</button>
802
+ </div>
803
+ </div>
804
+
805
+ </div>
806
+ </aside>
807
+
808
+ </div><!-- /content-wrap -->
809
+ </main>
810
+ </div><!-- /layout -->
811
+
812
+ <!-- Toast -->
813
+ <div id="toast">Copied βœ“</div>
814
+
815
+ <!-- env-builder.js provides MODEL_CATALOGS, FIELDS, ICONS and all logic -->
816
+ <script src="env-builder.js"></script>
817
+
818
+ </body>
819
+ </html>