@nano133/nanoterra 0.3.1 → 0.4.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.
@@ -1,7 +1,10 @@
1
1
  /* The admin panel's styles (mountAdmin in ./mount.ts). Every rule is under .n133-admin, so nothing leaks into the page that holds the panel and the page's own
2
- styles do not reach in by accident. Phone first: every control is at least 40 px high (the order tabs), the rest 44 px or more; one column, two from 640px.
2
+ styles do not reach in by accident. Phone first: the keys, inputs, switches, swatches and price steps are 44 px or more; the tabs, filter keys, copy keys and
3
+ small keys 40 px. The layout follows the PANEL's width (a container query), not the window's: one column on a phone, two from 560 px, three cards a row and the
4
+ orders as a table from 760 px.
3
5
  To theme it, set the --n133-* custom properties on the element that holds the panel (or on any parent): --n133-ink, --n133-ink-soft, --n133-paper, --n133-line,
4
- --n133-gem, --n133-gem-dark, --n133-sea, --n133-radius and --n133-font. */
6
+ --n133-gem, --n133-gem-dark, --n133-sea, --n133-radius and --n133-font; and, with the tabbed layout, --n133-ground (the wells inside a card), --n133-warn and
7
+ --n133-bad (the amber and red of a warning and a problem) and --n133-shadow (the cards' shadow). */
5
8
 
6
9
  .n133-admin {
7
10
  --font: var(--n133-font, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);
@@ -13,11 +16,17 @@
13
16
  --paper: var(--n133-paper, #ffffff);
14
17
  --radius: var(--n133-radius, 18px);
15
18
  --sea: var(--n133-sea, #1f8fc4);
19
+ --ground: var(--n133-ground, #f4f7fb);
20
+ --warn: var(--n133-warn, #8a4b00);
21
+ --bad: var(--n133-bad, #b4142f);
22
+ --shadow: var(--n133-shadow, 0 1px 2px rgb(16 24 40 / 0.05), 0 6px 18px -6px rgb(16 24 40 / 0.1));
23
+ --gap: 12px;
24
+ container: n133 / inline-size;
16
25
  box-sizing: border-box;
17
- max-width: 900px;
26
+ max-width: 1200px;
18
27
  margin: 0 auto;
19
28
  color: var(--ink);
20
- font-family: var(--font);
29
+ font: 15px/1.45 var(--font);
21
30
  -webkit-text-size-adjust: 100%;
22
31
  }
23
32
 
@@ -31,30 +40,65 @@
31
40
  display: none !important;
32
41
  }
33
42
 
43
+ .n133-admin h2,
44
+ .n133-admin h3,
45
+ .n133-admin p {
46
+ margin: 0;
47
+ }
48
+
49
+ .n133-admin code {
50
+ font: 13px/1.4 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
51
+ overflow-wrap: anywhere;
52
+ }
53
+
54
+ .n133-admin .sr-only {
55
+ position: absolute;
56
+ width: 1px;
57
+ height: 1px;
58
+ overflow: hidden;
59
+ clip: rect(0 0 0 0);
60
+ white-space: nowrap;
61
+ }
62
+
63
+ .n133-admin .icon {
64
+ flex: none;
65
+ }
66
+
67
+ .n133-admin .fine {
68
+ color: var(--ink-soft);
69
+ font-size: 13px;
70
+ }
71
+
72
+ /* ---- Keys ---- */
73
+
34
74
  .n133-admin .btn {
35
75
  display: inline-flex;
36
76
  align-items: center;
37
77
  justify-content: center;
38
78
  gap: 8px;
39
- min-height: 48px;
40
- padding: 0 18px;
41
- border: 2px solid var(--line);
79
+ min-height: 44px;
80
+ padding: 0 16px;
81
+ border: 1px solid var(--line);
42
82
  border-radius: 999px;
43
83
  background: var(--paper);
44
84
  color: var(--ink);
45
- font: 700 16px/1 var(--font);
85
+ font: 650 15px/1 var(--font);
46
86
  text-decoration: none;
87
+ white-space: nowrap;
47
88
  cursor: pointer;
48
89
  touch-action: manipulation;
90
+ transition: background-color 0.15s, border-color 0.15s, box-shadow 0.15s;
49
91
  }
50
92
 
51
- .n133-admin .btn:focus-visible {
52
- outline: 3px solid var(--sea);
53
- outline-offset: 2px;
93
+ @media (hover: hover) {
94
+ .n133-admin .btn:not(:disabled):hover {
95
+ border-color: color-mix(in srgb, var(--ink) 30%, var(--line));
96
+ box-shadow: 0 1px 3px rgb(16 24 40 / 0.1);
97
+ }
54
98
  }
55
99
 
56
100
  .n133-admin .btn:disabled {
57
- opacity: 0.55;
101
+ opacity: 0.5;
58
102
  cursor: default;
59
103
  }
60
104
 
@@ -64,28 +108,139 @@
64
108
  color: #062b23;
65
109
  }
66
110
 
111
+ @media (hover: hover) {
112
+ .n133-admin .btn-primary:not(:disabled):hover {
113
+ border-color: var(--gem-dark);
114
+ background: color-mix(in srgb, var(--gem) 85%, #ffffff);
115
+ }
116
+ }
117
+
118
+ .n133-admin .btn-danger {
119
+ color: var(--bad);
120
+ }
121
+
67
122
  .n133-admin .btn-small {
68
123
  min-height: 40px;
69
124
  padding: 0 12px;
70
125
  font-size: 14px;
71
126
  }
72
127
 
73
- .n133-admin .fine {
128
+ .n133-admin .btn-quiet {
129
+ border-color: transparent;
130
+ background: transparent;
131
+ }
132
+
133
+ .n133-admin .copy-key {
134
+ gap: 5px;
135
+ padding: 0 10px;
74
136
  color: var(--ink-soft);
75
137
  font-size: 13px;
76
138
  }
77
139
 
140
+ .n133-admin .link-key {
141
+ gap: 6px;
142
+ color: var(--sea);
143
+ font-weight: 700;
144
+ }
145
+
146
+ .n133-admin :is(.btn, .tabbar-tab, .seg-btn, .kpi, .ladder-step, .swatch-btn, .switch, .shelf-add-tile, .input, .colour, summary):focus-visible,
147
+ .n133-admin .hat-choice:has(input:focus-visible),
148
+ .n133-admin .tabpanel:focus-visible {
149
+ outline: 3px solid var(--sea);
150
+ outline-offset: 2px;
151
+ }
152
+
153
+ .n133-admin .tabpanel:focus:not(:focus-visible) {
154
+ outline: none;
155
+ }
156
+
157
+ /* ---- Inputs ---- */
158
+
159
+ .n133-admin .input {
160
+ width: 100%;
161
+ min-height: 44px;
162
+ padding: 0 12px;
163
+ border: 1px solid color-mix(in srgb, var(--ink) 18%, var(--line));
164
+ border-radius: 12px;
165
+ background: var(--paper);
166
+ color: var(--ink);
167
+ font: 16px/1 var(--font);
168
+ }
169
+
170
+ .n133-admin .input-num {
171
+ max-width: 160px;
172
+ font-variant-numeric: tabular-nums;
173
+ }
174
+
175
+ /* WebKit draws a select at its own height and ignores min-height: take over the drawing, so it is 44px (a finger) on an iPad too. */
176
+ .n133-admin select.input {
177
+ width: auto;
178
+ height: 44px;
179
+ padding-right: 34px;
180
+ background-image: linear-gradient(45deg, transparent 50%, var(--ink) 50%), linear-gradient(135deg, var(--ink) 50%, transparent 50%);
181
+ background-position: calc(100% - 18px) 19px, calc(100% - 13px) 19px;
182
+ background-repeat: no-repeat;
183
+ background-size: 5px 5px, 5px 5px;
184
+ -webkit-appearance: none;
185
+ appearance: none;
186
+ }
187
+
188
+ .n133-admin .colour {
189
+ width: 56px;
190
+ min-height: 44px;
191
+ padding: 3px;
192
+ border: 1px solid color-mix(in srgb, var(--ink) 18%, var(--line));
193
+ border-radius: 12px;
194
+ background: var(--paper);
195
+ cursor: pointer;
196
+ }
197
+
198
+ .n133-admin .colour:disabled {
199
+ opacity: 0.4;
200
+ cursor: default;
201
+ }
202
+
203
+ .n133-admin .search {
204
+ position: relative;
205
+ display: flex;
206
+ align-items: center;
207
+ flex: 1 1 220px;
208
+ min-width: 0;
209
+ }
210
+
211
+ .n133-admin .search .icon {
212
+ position: absolute;
213
+ left: 12px;
214
+ color: var(--ink-soft);
215
+ pointer-events: none;
216
+ }
217
+
218
+ .n133-admin .search-input {
219
+ padding-left: 40px;
220
+ }
221
+
222
+ /* ---- Cards ---- */
223
+
78
224
  .n133-admin .admin-card {
79
- margin: 12px 0;
225
+ display: grid;
226
+ grid-template-columns: minmax(0, 1fr);
227
+ gap: 12px;
228
+ align-content: start;
229
+ min-width: 0;
80
230
  padding: 16px;
81
231
  border: 1px solid var(--line);
82
232
  border-radius: var(--radius);
83
- background: #fff;
233
+ background: var(--paper);
234
+ box-shadow: var(--shadow);
84
235
  }
85
236
 
86
237
  .n133-admin .admin-card h2 {
87
- margin: 0 0 10px;
88
- font-size: 19px;
238
+ font-size: 18px;
239
+ line-height: 1.25;
240
+ }
241
+
242
+ .n133-admin .card-head .link-key {
243
+ margin-right: -10px;
89
244
  }
90
245
 
91
246
  .n133-admin .card-head {
@@ -93,309 +248,1443 @@
93
248
  flex-wrap: wrap;
94
249
  align-items: center;
95
250
  justify-content: space-between;
96
- gap: 8px;
97
- margin-bottom: 8px;
251
+ gap: 8px 12px;
98
252
  }
99
253
 
100
- .n133-admin .card-head h2 {
101
- margin: 0;
254
+ .n133-admin .card-title {
255
+ display: grid;
256
+ gap: 2px;
257
+ min-width: 0;
102
258
  }
103
259
 
104
- .n133-admin .warnings {
105
- border-color: #f2b8c1;
106
- background: #fff4f6;
260
+ .n133-admin .card-keys {
261
+ display: flex;
262
+ flex-wrap: wrap;
263
+ align-items: center;
264
+ gap: 8px;
107
265
  }
108
266
 
109
- .n133-admin .warnings ul {
110
- margin: 0;
111
- padding-left: 20px;
267
+ .n133-admin .empty {
268
+ padding: 24px 12px;
269
+ border: 1px dashed var(--line);
270
+ border-radius: 14px;
271
+ color: var(--ink-soft);
272
+ text-align: center;
112
273
  }
113
274
 
114
- .n133-admin .totals {
115
- display: grid;
116
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
117
- gap: 12px;
275
+ /* ---- The gate: the screen before the data (sign in, the wrong address, no owner address) ---- */
276
+
277
+ .n133-admin .gate {
278
+ justify-items: center;
279
+ max-width: 560px;
280
+ margin: 24px auto;
281
+ padding: 28px 20px;
282
+ text-align: center;
118
283
  }
119
284
 
120
- .n133-admin .total {
121
- display: flex;
122
- flex-direction: column;
123
- gap: 4px;
124
- padding: 16px;
125
- border: 1px solid var(--line);
126
- border-radius: var(--radius);
127
- background: #fff;
285
+ .n133-admin .gate h2 {
286
+ font-size: 21px;
128
287
  }
129
288
 
130
- .n133-admin .total span {
289
+ .n133-admin .gate p {
290
+ max-width: 46ch;
131
291
  color: var(--ink-soft);
132
- font-size: 14px;
133
292
  }
134
293
 
135
- .n133-admin .total strong {
136
- font-size: 24px;
137
- font-variant-numeric: tabular-nums;
294
+ .n133-admin .gate-icon {
295
+ display: grid;
296
+ place-items: center;
297
+ width: 56px;
298
+ height: 56px;
299
+ border-radius: 50%;
300
+ background: color-mix(in srgb, var(--gem) 16%, var(--paper));
301
+ color: var(--gem-dark);
302
+ }
303
+
304
+ .n133-admin .gate-signin {
305
+ justify-self: stretch;
306
+ text-align: left;
307
+ }
308
+
309
+ /* ---- The top bar ---- */
310
+
311
+ .n133-admin #n133-data {
312
+ display: grid;
313
+ grid-template-columns: minmax(0, 1fr);
314
+ gap: var(--gap);
138
315
  }
139
316
 
140
- .n133-admin .tabs {
317
+ .n133-admin .topbar {
141
318
  display: flex;
142
- gap: 6px;
143
- overflow-x: auto;
144
- padding-bottom: 6px;
319
+ flex-wrap: wrap;
320
+ align-items: center;
321
+ gap: 8px 12px;
322
+ padding: 10px 12px;
323
+ border: 1px solid var(--line);
324
+ border-radius: var(--radius);
325
+ background: var(--paper);
326
+ box-shadow: var(--shadow);
145
327
  }
146
328
 
147
- .n133-admin .tab {
329
+ .n133-admin .who-mark {
330
+ display: grid;
148
331
  flex: none;
149
- min-height: 40px;
150
- padding: 0 14px;
151
- border: 2px solid var(--line);
152
- border-radius: 999px;
153
- background: #fff;
154
- font: 700 14px/1 var(--font);
155
- cursor: pointer;
332
+ place-items: center;
333
+ width: 40px;
334
+ height: 40px;
335
+ border-radius: 50%;
336
+ background: color-mix(in srgb, var(--gem) 16%, var(--paper));
337
+ color: var(--gem-dark);
156
338
  }
157
339
 
158
- .n133-admin .tab-on {
159
- border-color: var(--ink);
160
- background: var(--ink);
161
- color: #fff;
340
+ .n133-admin .who {
341
+ display: grid;
342
+ flex: 1 1 180px;
343
+ min-width: 0;
162
344
  }
163
345
 
164
- .n133-admin .order {
165
- padding: 12px 0;
166
- border-bottom: 1px solid var(--line);
346
+ .n133-admin .who-label {
347
+ color: var(--ink-soft);
348
+ font-size: 12px;
349
+ font-weight: 700;
350
+ letter-spacing: 0.04em;
351
+ text-transform: uppercase;
167
352
  }
168
353
 
169
- .n133-admin .order-top {
354
+ .n133-admin .who-address,
355
+ .n133-admin .fact-address,
356
+ .n133-admin .player-id {
170
357
  display: flex;
358
+ flex-wrap: wrap;
171
359
  align-items: center;
172
- justify-content: space-between;
173
- gap: 8px;
360
+ gap: 2px 4px;
361
+ min-width: 0;
174
362
  }
175
363
 
176
- .n133-admin .order-amount {
177
- margin: 4px 0;
178
- font-variant-numeric: tabular-nums;
364
+ .n133-admin .chips {
365
+ display: flex;
366
+ flex-wrap: wrap;
367
+ gap: 6px;
179
368
  }
180
369
 
181
- .n133-admin .badge {
182
- padding: 4px 10px;
370
+ .n133-admin .chip {
371
+ display: inline-flex;
372
+ align-items: center;
373
+ gap: 6px;
374
+ min-height: 28px;
375
+ padding: 0 10px;
183
376
  border-radius: 999px;
184
- background: #eef1f4;
185
377
  font-size: 13px;
186
378
  font-weight: 700;
187
379
  }
188
380
 
189
- .n133-admin .badge-paid {
190
- background: #dcf8ef;
191
- color: #0b6d5a;
381
+ .n133-admin .chip-dot {
382
+ width: 8px;
383
+ height: 8px;
384
+ border-radius: 50%;
385
+ background: currentColor;
192
386
  }
193
387
 
194
- .n133-admin .badge-open {
195
- background: #e3f1ff;
196
- color: #134e86;
388
+ .n133-admin .chip-ok {
389
+ background: #dcf6ec;
390
+ color: #0b6a52;
197
391
  }
198
392
 
199
- .n133-admin .badge-paid_late {
200
- background: #ffe3e8;
201
- color: #a1122a;
393
+ .n133-admin .chip-warn {
394
+ background: #fff1d6;
395
+ color: var(--warn);
202
396
  }
203
397
 
204
- .n133-admin .late-note {
205
- margin-top: 6px;
206
- padding: 8px 10px;
207
- border-radius: 10px;
208
- background: #fff4f6;
209
- font-size: 14px;
398
+ .n133-admin .topbar-keys {
399
+ display: flex;
400
+ margin-left: auto;
210
401
  }
211
402
 
212
- .n133-admin .late-note code,
213
- .n133-admin .player code,
214
- .n133-admin .admin-card code {
215
- word-break: break-all;
216
- font-size: 12px;
403
+ /* ---- What is still off: one banner ---- */
404
+
405
+ .n133-admin .banner {
406
+ display: flex;
407
+ gap: 12px;
408
+ padding: 14px 16px;
409
+ border: 1px solid #f3c27a;
410
+ border-radius: var(--radius);
411
+ background: #fff7e8;
412
+ color: #4a2d00;
217
413
  }
218
414
 
219
- .n133-admin .hash {
220
- word-break: break-all;
415
+ .n133-admin .banner h2 {
416
+ margin-bottom: 4px;
417
+ font-size: 16px;
221
418
  }
222
419
 
223
- .n133-admin .player {
224
- display: flex;
225
- flex-direction: column;
226
- gap: 2px;
227
- padding: 8px 0;
228
- border-bottom: 1px solid var(--line);
420
+ .n133-admin .banner ul {
421
+ margin: 0;
422
+ padding-left: 18px;
229
423
  }
230
424
 
231
- /* The Shelf (src/client/shelf.ts): phone first, one column; two from 640px. */
232
- .n133-admin .shelf-list {
233
- display: grid;
234
- grid-template-columns: 1fr;
235
- gap: 10px;
425
+ .n133-admin .banner-icon {
426
+ flex: none;
427
+ color: var(--warn);
236
428
  }
237
429
 
238
- @media (min-width: 640px) {
239
- .n133-admin .shelf-list {
240
- grid-template-columns: 1fr 1fr;
241
- }
430
+ /* ---- The four numbers ---- */
431
+
432
+ .n133-admin .kpis {
433
+ display: grid;
434
+ grid-template-columns: repeat(2, minmax(0, 1fr));
435
+ gap: var(--gap);
242
436
  }
243
437
 
244
- .n133-admin .shelf-card {
438
+ .n133-admin .kpi {
439
+ --accent: var(--gem-dark);
440
+ display: grid;
441
+ gap: 2px;
442
+ align-content: start;
443
+ min-width: 0;
245
444
  padding: 12px;
246
445
  border: 1px solid var(--line);
247
- border-radius: 14px;
248
- background: #fbfdff;
249
- }
250
-
251
- .n133-admin .shelf-top {
252
- display: flex;
253
- align-items: center;
254
- gap: 12px;
446
+ border-radius: var(--radius);
447
+ background: var(--paper);
448
+ box-shadow: var(--shadow);
449
+ color: var(--ink);
450
+ font: inherit;
451
+ text-align: left;
452
+ cursor: pointer;
453
+ transition: border-color 0.15s, transform 0.15s;
255
454
  }
256
455
 
257
- .n133-admin .shelf-pic {
258
- display: grid;
259
- flex: none;
260
- width: 68px;
261
- height: 76px;
262
- place-items: center;
263
- border-radius: 12px;
264
- background: #e8f3fb;
456
+ @media (hover: hover) {
457
+ .n133-admin .kpi:hover {
458
+ border-color: color-mix(in srgb, var(--accent) 50%, var(--line));
459
+ transform: translateY(-1px);
460
+ }
265
461
  }
266
462
 
267
- .n133-admin .shelf-preview {
268
- display: grid;
269
- place-items: center;
463
+ .n133-admin .kpi-open {
464
+ --accent: #1d5fa8;
270
465
  }
271
466
 
272
- .n133-admin .shelf-preview img {
273
- display: block;
467
+ .n133-admin .kpi-late {
468
+ --accent: #6b7686;
274
469
  }
275
470
 
276
- .n133-admin .shelf-text {
277
- display: grid;
278
- min-width: 0;
279
- gap: 2px;
471
+ .n133-admin .kpi-late.is-alert {
472
+ --accent: var(--bad);
473
+ border-color: color-mix(in srgb, var(--bad) 45%, var(--line));
474
+ background: color-mix(in srgb, var(--bad) 5%, var(--paper));
280
475
  }
281
476
 
282
- .n133-admin .shelf-text strong {
283
- overflow-wrap: anywhere;
477
+ .n133-admin .kpi-players {
478
+ --accent: #6d3fc0;
284
479
  }
285
480
 
286
- .n133-admin .shelf-price {
287
- font-weight: 700;
288
- font-variant-numeric: tabular-nums;
481
+ .n133-admin .kpi-top {
482
+ display: flex;
483
+ align-items: center;
484
+ gap: 8px;
289
485
  }
290
486
 
291
- .n133-admin .shelf-field {
487
+ .n133-admin .kpi-icon {
292
488
  display: grid;
293
- gap: 4px;
294
- margin-top: 10px;
489
+ place-items: center;
490
+ width: 28px;
491
+ height: 28px;
492
+ border-radius: 9px;
493
+ background: color-mix(in srgb, var(--accent) 13%, var(--paper));
494
+ color: var(--accent);
295
495
  }
296
496
 
297
- .n133-admin .shelf-field > span {
497
+ .n133-admin .kpi-label {
298
498
  color: var(--ink-soft);
299
499
  font-size: 13px;
300
500
  font-weight: 700;
301
501
  }
302
502
 
303
- .n133-admin .shelf-input {
304
- width: 100%;
305
- min-height: 44px;
306
- padding: 0 12px;
307
- border: 2px solid var(--line);
308
- border-radius: 12px;
309
- background: #fff;
310
- color: var(--ink);
311
- font: 16px/1 var(--font);
503
+ .n133-admin .kpi-value {
504
+ margin-top: 4px;
505
+ overflow-wrap: anywhere;
506
+ font-size: 20px;
507
+ line-height: 1.15;
508
+ font-variant-numeric: tabular-nums;
312
509
  }
313
510
 
314
- .n133-admin .shelf-color {
315
- width: 100%;
316
- min-height: 44px;
317
- padding: 2px;
318
- border: 2px solid var(--line);
319
- border-radius: 12px;
320
- background: #fff;
511
+ .n133-admin .kpi-late.is-alert .kpi-value {
512
+ color: var(--bad);
321
513
  }
322
514
 
323
- .n133-admin .shelf-color:disabled {
324
- opacity: 0.45;
515
+ .n133-admin .kpi-sub {
516
+ color: var(--ink-soft);
517
+ font-size: 13px;
325
518
  }
326
519
 
327
- .n133-admin .shelf-colors {
328
- display: grid;
329
- grid-template-columns: repeat(auto-fit, minmax(96px, 1fr));
330
- gap: 8px;
331
- }
520
+ /* ---- The tabs: a bar that stays at the top of the screen; on a phone it scrolls sideways ---- */
332
521
 
333
- .n133-admin .shelf-ladder {
522
+ .n133-admin .tabbar {
523
+ position: sticky;
524
+ top: 0;
525
+ z-index: 5;
334
526
  display: flex;
335
- flex-wrap: wrap;
336
- gap: 6px;
527
+ gap: 4px;
528
+ padding: 6px;
529
+ overflow-x: auto;
530
+ border: 1px solid var(--line);
531
+ border-radius: 16px;
532
+ background: color-mix(in srgb, var(--paper) 92%, transparent);
533
+ box-shadow: var(--shadow);
534
+ scrollbar-width: none;
535
+ -webkit-backdrop-filter: blur(8px);
536
+ backdrop-filter: blur(8px);
337
537
  }
338
538
 
339
- .n133-admin .chip {
340
- min-width: 44px;
341
- min-height: 44px;
342
- padding: 0 12px;
343
- border: 2px solid var(--line);
344
- border-radius: 999px;
345
- background: #fff;
346
- color: var(--ink);
347
- font: 700 14px/1 var(--font);
348
- cursor: pointer;
539
+ .n133-admin .tabbar::-webkit-scrollbar {
540
+ display: none;
349
541
  }
350
542
 
351
- .n133-admin .shelf-actions,
352
- .n133-admin .shelf-add {
543
+ .n133-admin .tabbar-tab {
544
+ display: inline-flex;
545
+ flex: 1 0 auto;
546
+ align-items: center;
547
+ justify-content: center;
548
+ gap: 7px;
549
+ min-height: 42px;
550
+ padding: 0 12px;
551
+ border: 0;
552
+ border-radius: 11px;
553
+ background: transparent;
554
+ color: var(--ink-soft);
555
+ font: 650 14px/1 var(--font);
556
+ white-space: nowrap;
557
+ cursor: pointer;
558
+ }
559
+
560
+ @media (hover: hover) {
561
+ .n133-admin .tabbar-tab:not(.is-on):hover {
562
+ background: var(--ground);
563
+ color: var(--ink);
564
+ }
565
+ }
566
+
567
+ .n133-admin .tabbar-tab.is-on {
568
+ background: var(--ink);
569
+ color: var(--paper);
570
+ }
571
+
572
+ .n133-admin .tab-count {
573
+ min-width: 22px;
574
+ padding: 3px 6px;
575
+ border-radius: 999px;
576
+ background: color-mix(in srgb, currentColor 14%, transparent);
577
+ font-size: 12px;
578
+ font-variant-numeric: tabular-nums;
579
+ }
580
+
581
+ .n133-admin .tabpanel {
582
+ display: grid;
583
+ grid-template-columns: minmax(0, 1fr);
584
+ gap: var(--gap);
585
+ min-width: 0;
586
+ scroll-margin-top: 72px;
587
+ }
588
+
589
+ /* ---- Filter keys (a segmented row) and the tool row above a list ---- */
590
+
591
+ .n133-admin .toolbar {
592
+ display: flex;
593
+ flex-wrap: wrap;
594
+ align-items: center;
595
+ gap: 8px 12px;
596
+ }
597
+
598
+ /* The keys wrap onto a second line on a narrow phone: a row that scrolls sideways with no bar cut "Not sold yet" and its count off at the edge. */
599
+ .n133-admin .seg {
600
+ display: flex;
601
+ flex: 0 1 auto;
602
+ flex-wrap: wrap;
603
+ gap: 4px;
604
+ min-width: 0;
605
+ max-width: 100%;
606
+ padding: 4px;
607
+ border-radius: 14px;
608
+ background: var(--ground);
609
+ }
610
+
611
+ .n133-admin .seg-btn {
612
+ display: inline-flex;
613
+ flex: none;
614
+ align-items: center;
615
+ gap: 6px;
616
+ min-height: 40px;
617
+ padding: 0 12px;
618
+ border: 0;
619
+ border-radius: 10px;
620
+ background: transparent;
621
+ color: var(--ink-soft);
622
+ font: 650 14px/1 var(--font);
623
+ white-space: nowrap;
624
+ cursor: pointer;
625
+ }
626
+
627
+ .n133-admin .seg-btn.is-on {
628
+ background: var(--paper);
629
+ color: var(--ink);
630
+ box-shadow: 0 1px 3px rgb(16 24 40 / 0.14);
631
+ }
632
+
633
+ .n133-admin .seg-btn.is-alert:not(.is-on) {
634
+ color: var(--bad);
635
+ }
636
+
637
+ .n133-admin .seg-count {
638
+ color: var(--ink-soft);
639
+ font-size: 12px;
640
+ font-variant-numeric: tabular-nums;
641
+ }
642
+
643
+ .n133-admin .sort {
644
+ display: inline-flex;
645
+ align-items: center;
646
+ gap: 8px;
647
+ margin-left: auto;
648
+ color: var(--ink-soft);
649
+ font-size: 13px;
650
+ font-weight: 700;
651
+ }
652
+
653
+ .n133-admin .list-count {
654
+ margin-top: -4px;
655
+ }
656
+
657
+ /* ---- Badges, pills, dots, marks ---- */
658
+
659
+ .n133-admin .badge {
660
+ display: inline-flex;
661
+ align-items: center;
662
+ padding: 3px 10px;
663
+ border-radius: 999px;
664
+ background: #eef1f4;
665
+ color: #3f4a5a;
666
+ font-size: 13px;
667
+ font-weight: 700;
668
+ white-space: nowrap;
669
+ }
670
+
671
+ .n133-admin .badge-paid {
672
+ background: #dcf6ec;
673
+ color: #0b6a52;
674
+ }
675
+
676
+ .n133-admin .badge-open {
677
+ background: #e3f0ff;
678
+ color: #134e86;
679
+ }
680
+
681
+ .n133-admin .badge-paid_late {
682
+ background: #ffe3e8;
683
+ color: #9e1029;
684
+ }
685
+
686
+ .n133-admin .pill {
687
+ flex: none;
688
+ padding: 3px 10px;
689
+ border-radius: 999px;
690
+ background: #eef1f4;
691
+ color: #3f4a5a;
692
+ font-size: 13px;
693
+ font-weight: 700;
694
+ }
695
+
696
+ .n133-admin .pill-on {
697
+ background: #dcf6ec;
698
+ color: #0b6a52;
699
+ }
700
+
701
+ .n133-admin .look-dot,
702
+ .n133-admin .swatch {
703
+ --swatch: #c9d3df;
704
+ display: inline-block;
705
+ flex: none;
706
+ width: 12px;
707
+ height: 12px;
708
+ border: 1px solid rgb(0 0 0 / 0.18);
709
+ border-radius: 50%;
710
+ background: var(--swatch);
711
+ }
712
+
713
+ .n133-admin .marks {
714
+ display: flex;
715
+ flex-wrap: wrap;
716
+ gap: 4px;
717
+ }
718
+
719
+ .n133-admin .marks:empty {
720
+ display: none;
721
+ }
722
+
723
+ .n133-admin .mark {
724
+ display: inline-flex;
725
+ align-items: center;
726
+ gap: 4px;
727
+ padding: 2px 8px;
728
+ border-radius: 999px;
729
+ background: #eef1f4;
730
+ color: #3f4a5a;
731
+ font-size: 12px;
732
+ font-weight: 700;
733
+ white-space: nowrap;
734
+ }
735
+
736
+ .n133-admin .mark-new {
737
+ background: #e3f0ff;
738
+ color: #134e86;
739
+ }
740
+
741
+ .n133-admin .mark-changed {
742
+ background: #fff1d6;
743
+ color: var(--warn);
744
+ }
745
+
746
+ .n133-admin .mark-bad {
747
+ background: #ffe3e8;
748
+ color: var(--bad);
749
+ }
750
+
751
+ .n133-admin .mark-ok {
752
+ background: #dcf6ec;
753
+ color: #0b6a52;
754
+ }
755
+
756
+ .n133-admin .share {
757
+ display: grid;
758
+ grid-template-columns: minmax(0, 1fr) auto;
759
+ align-items: center;
760
+ gap: 8px;
761
+ }
762
+
763
+ .n133-admin .share-bar {
764
+ --share: 0%;
765
+ position: relative;
766
+ height: 6px;
767
+ overflow: hidden;
768
+ border-radius: 999px;
769
+ background: var(--ground);
770
+ }
771
+
772
+ .n133-admin .share-bar::before {
773
+ content: "";
774
+ position: absolute;
775
+ inset: 0 auto 0 0;
776
+ width: var(--share);
777
+ border-radius: inherit;
778
+ background: var(--gem);
779
+ }
780
+
781
+ .n133-admin .late-note {
782
+ display: flex;
783
+ flex-wrap: wrap;
784
+ align-items: center;
785
+ gap: 6px 8px;
786
+ padding: 10px 12px;
787
+ border-radius: 12px;
788
+ background: #fff1f3;
789
+ color: #5c0716;
790
+ font-size: 14px;
791
+ }
792
+
793
+ .n133-admin .late-note > span {
794
+ flex: 1 1 220px;
795
+ min-width: 0;
796
+ }
797
+
798
+ .n133-admin .late-note ul {
799
+ flex-basis: 100%;
800
+ margin: 0;
801
+ padding-left: 20px;
802
+ }
803
+
804
+ /* ---- Overview ---- */
805
+
806
+ .n133-admin .overview,
807
+ .n133-admin .overview-main,
808
+ .n133-admin .overview-side {
809
+ display: grid;
810
+ grid-template-columns: minmax(0, 1fr);
811
+ gap: var(--gap);
812
+ align-content: start;
813
+ min-width: 0;
814
+ }
815
+
816
+ .n133-admin .glance-list,
817
+ .n133-admin .best-list {
818
+ display: grid;
819
+ margin: 0;
820
+ padding: 0;
821
+ list-style: none;
822
+ }
823
+
824
+ .n133-admin .glance-list li {
825
+ display: flex;
826
+ align-items: center;
827
+ justify-content: space-between;
828
+ gap: 12px;
829
+ padding: 10px 0;
830
+ border-top: 1px solid var(--line);
831
+ font-size: 14px;
832
+ }
833
+
834
+ .n133-admin .glance-list li:first-child {
835
+ border-top: 0;
836
+ }
837
+
838
+ .n133-admin .best-list li {
839
+ display: grid;
840
+ grid-template-columns: 22px 12px minmax(0, 1fr);
841
+ align-items: center;
842
+ gap: 10px;
843
+ padding: 10px 0;
844
+ border-top: 1px solid var(--line);
845
+ }
846
+
847
+ .n133-admin .best-list li:first-child {
848
+ border-top: 0;
849
+ }
850
+
851
+ .n133-admin .best-rank {
852
+ color: var(--ink-soft);
853
+ font-weight: 800;
854
+ font-variant-numeric: tabular-nums;
855
+ text-align: center;
856
+ }
857
+
858
+ .n133-admin .best-main {
859
+ display: grid;
860
+ gap: 4px;
861
+ min-width: 0;
862
+ }
863
+
864
+ .n133-admin .best-top {
865
+ display: flex;
866
+ justify-content: space-between;
867
+ gap: 8px;
868
+ }
869
+
870
+ .n133-admin .best-top strong {
871
+ overflow: hidden;
872
+ text-overflow: ellipsis;
873
+ white-space: nowrap;
874
+ }
875
+
876
+ .n133-admin .best-money {
877
+ font-weight: 800;
878
+ font-variant-numeric: tabular-nums;
879
+ }
880
+
881
+ .n133-admin .start-card {
882
+ border-style: dashed;
883
+ background: linear-gradient(160deg, color-mix(in srgb, var(--gem) 8%, var(--paper)), var(--paper));
884
+ box-shadow: none;
885
+ }
886
+
887
+ .n133-admin .start-icon {
888
+ display: grid;
889
+ place-items: center;
890
+ width: 48px;
891
+ height: 48px;
892
+ border-radius: 14px;
893
+ background: color-mix(in srgb, var(--gem) 18%, var(--paper));
894
+ color: var(--gem-dark);
895
+ }
896
+
897
+ .n133-admin .start-steps {
898
+ display: grid;
899
+ gap: 6px;
900
+ margin: 0;
901
+ padding-left: 22px;
902
+ }
903
+
904
+ .n133-admin .start-steps li {
905
+ padding-left: 4px;
906
+ }
907
+
908
+ .n133-admin .start-steps .link-key {
909
+ min-height: 36px;
910
+ padding: 0 6px;
911
+ }
912
+
913
+ /* ---- Orders: a card each on a phone, a table from 760 px ---- */
914
+
915
+ .n133-admin .orders {
916
+ display: grid;
917
+ gap: 8px;
918
+ }
919
+
920
+ .n133-admin .order {
921
+ display: grid;
922
+ grid-template-columns: minmax(0, 1fr) auto;
923
+ grid-template-areas: "look status" "amount when" "player player" "extra extra";
924
+ align-items: center;
925
+ gap: 6px 10px;
926
+ padding: 12px;
927
+ border: 1px solid var(--line);
928
+ border-radius: 14px;
929
+ background: var(--paper);
930
+ }
931
+
932
+ .n133-admin .order-paid_late {
933
+ border-color: color-mix(in srgb, var(--bad) 35%, var(--line));
934
+ }
935
+
936
+ .n133-admin .order-look {
937
+ display: flex;
938
+ grid-area: look;
939
+ align-items: center;
940
+ gap: 8px;
941
+ min-width: 0;
942
+ }
943
+
944
+ .n133-admin .order-look strong {
945
+ overflow: hidden;
946
+ text-overflow: ellipsis;
947
+ white-space: nowrap;
948
+ }
949
+
950
+ .n133-admin .order-status {
951
+ grid-area: status;
952
+ justify-self: end;
953
+ }
954
+
955
+ .n133-admin .order-amount {
956
+ display: flex;
957
+ grid-area: amount;
958
+ align-items: baseline;
959
+ gap: 8px;
960
+ font-variant-numeric: tabular-nums;
961
+ white-space: nowrap;
962
+ }
963
+
964
+ .n133-admin .order-player {
965
+ display: flex;
966
+ grid-area: player;
967
+ flex-wrap: wrap;
968
+ align-items: center;
969
+ gap: 2px 4px;
970
+ min-width: 0;
971
+ }
972
+
973
+ .n133-admin .order-when {
974
+ display: grid;
975
+ grid-area: when;
976
+ justify-items: end;
977
+ color: var(--ink-soft);
978
+ font-size: 13px;
979
+ text-align: right;
980
+ }
981
+
982
+ .n133-admin .order-extra {
983
+ grid-column: 1 / -1;
984
+ }
985
+
986
+ .n133-admin .order-hash {
987
+ display: flex;
988
+ flex-wrap: wrap;
989
+ align-items: center;
990
+ gap: 2px 4px;
991
+ }
992
+
993
+ .n133-admin .order-table-head {
994
+ display: none;
995
+ }
996
+
997
+ /* The five last orders on the Overview: one line each. */
998
+ .n133-admin .orders.is-compact {
999
+ gap: 0;
1000
+ }
1001
+
1002
+ .n133-admin .order.is-compact {
1003
+ grid-template-columns: minmax(0, 1fr) auto;
1004
+ grid-template-areas: "look status" "amount when";
1005
+ padding: 10px 0;
1006
+ border: 0;
1007
+ border-top: 1px solid var(--line);
1008
+ border-radius: 0;
1009
+ }
1010
+
1011
+ .n133-admin .orders.is-compact .order:first-child {
1012
+ border-top: 0;
1013
+ }
1014
+
1015
+ .n133-admin .order.is-compact .order-player {
1016
+ display: none;
1017
+ }
1018
+
1019
+ .n133-admin .order.is-compact .order-when {
1020
+ justify-self: end;
1021
+ }
1022
+
1023
+ .n133-admin .more-key {
1024
+ justify-self: center;
1025
+ }
1026
+
1027
+ /* ---- Players ---- */
1028
+
1029
+ .n133-admin .players {
1030
+ display: grid;
1031
+ gap: 8px;
1032
+ }
1033
+
1034
+ .n133-admin .player {
1035
+ display: grid;
1036
+ grid-template-columns: 36px minmax(0, 1fr);
1037
+ align-items: start;
1038
+ gap: 4px 12px;
1039
+ padding: 12px;
1040
+ border: 1px solid var(--line);
1041
+ border-radius: 14px;
1042
+ }
1043
+
1044
+ .n133-admin .player-mark {
1045
+ --hue: 200;
1046
+ width: 36px;
1047
+ height: 36px;
1048
+ border-radius: 50%;
1049
+ background: linear-gradient(135deg, hsl(var(--hue) 70% 62%), hsl(calc(var(--hue) + 40) 70% 48%));
1050
+ }
1051
+
1052
+ .n133-admin .player-main {
1053
+ display: grid;
1054
+ gap: 6px;
1055
+ min-width: 0;
1056
+ }
1057
+
1058
+ .n133-admin .player-count {
1059
+ grid-column: 2;
1060
+ color: var(--ink-soft);
1061
+ font-size: 13px;
1062
+ font-weight: 700;
1063
+ }
1064
+
1065
+ .n133-admin .look-chips,
1066
+ .n133-admin .slot-chips {
1067
+ display: flex;
1068
+ flex-wrap: wrap;
1069
+ gap: 6px;
1070
+ margin: 0;
1071
+ padding: 0;
1072
+ list-style: none;
1073
+ }
1074
+
1075
+ .n133-admin .look-chip,
1076
+ .n133-admin .slot-chip {
1077
+ display: inline-flex;
1078
+ align-items: center;
1079
+ gap: 6px;
1080
+ min-height: 26px;
1081
+ padding: 2px 10px;
1082
+ border: 1px solid var(--line);
1083
+ border-radius: 999px;
1084
+ background: var(--ground);
1085
+ font-size: 13px;
1086
+ overflow-wrap: anywhere;
1087
+ }
1088
+
1089
+ .n133-admin .slot-name {
1090
+ color: var(--ink-soft);
1091
+ font-weight: 700;
1092
+ }
1093
+
1094
+ /* ---- Settings ---- */
1095
+
1096
+ .n133-admin .settings-grid {
1097
+ display: grid;
1098
+ grid-template-columns: minmax(0, 1fr);
1099
+ gap: var(--gap);
1100
+ align-items: start;
1101
+ }
1102
+
1103
+ .n133-admin .facts {
1104
+ display: grid;
1105
+ gap: 0;
1106
+ margin: 0;
1107
+ }
1108
+
1109
+ .n133-admin .facts div {
1110
+ display: grid;
1111
+ gap: 2px;
1112
+ padding: 10px 0;
1113
+ border-top: 1px solid var(--line);
1114
+ }
1115
+
1116
+ .n133-admin .facts div:first-child {
1117
+ border-top: 0;
1118
+ }
1119
+
1120
+ .n133-admin .facts dt {
1121
+ color: var(--ink-soft);
1122
+ font-size: 13px;
1123
+ font-weight: 700;
1124
+ }
1125
+
1126
+ .n133-admin .facts dd {
1127
+ margin: 0;
1128
+ min-width: 0;
1129
+ overflow-wrap: anywhere;
1130
+ }
1131
+
1132
+ .n133-admin .about-card > .btn {
1133
+ justify-self: start;
1134
+ }
1135
+
1136
+ /* ---- The Shelf ---- */
1137
+
1138
+ .n133-admin .shelf-stats {
1139
+ display: flex;
1140
+ flex-wrap: wrap;
1141
+ gap: 6px;
1142
+ margin: 0;
1143
+ padding: 0;
1144
+ list-style: none;
1145
+ }
1146
+
1147
+ .n133-admin .shelf-stats li {
1148
+ padding: 6px 12px;
1149
+ border-radius: 999px;
1150
+ background: var(--ground);
1151
+ color: var(--ink-soft);
1152
+ font-size: 14px;
1153
+ }
1154
+
1155
+ .n133-admin .shelf-stats strong {
1156
+ color: var(--ink);
1157
+ font-variant-numeric: tabular-nums;
1158
+ }
1159
+
1160
+ .n133-admin .draft-note {
1161
+ display: flex;
1162
+ flex-wrap: wrap;
1163
+ align-items: center;
1164
+ gap: 8px 10px;
1165
+ padding: 10px 12px;
1166
+ border: 1px solid #f3c27a;
1167
+ border-radius: 14px;
1168
+ background: #fff7e8;
1169
+ color: #4a2d00;
1170
+ font-size: 14px;
1171
+ }
1172
+
1173
+ .n133-admin .draft-note > span {
1174
+ flex: 1 1 200px;
1175
+ }
1176
+
1177
+ .n133-admin .shelf-list {
1178
+ display: grid;
1179
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1180
+ gap: 10px;
1181
+ }
1182
+
1183
+ .n133-admin .shelf-list.is-editing {
1184
+ grid-template-columns: minmax(0, 1fr);
1185
+ }
1186
+
1187
+ .n133-admin .shelf-list > .empty {
1188
+ grid-column: 1 / -1;
1189
+ }
1190
+
1191
+ .n133-admin .shelf-card {
1192
+ position: relative;
1193
+ display: grid;
1194
+ align-content: start;
1195
+ min-width: 0;
1196
+ overflow: hidden;
1197
+ border: 1px solid var(--line);
1198
+ border-radius: 16px;
1199
+ background: var(--paper);
1200
+ }
1201
+
1202
+ /* The stage: the picture on a soft tint of the look's own body colour. */
1203
+ .n133-admin .shelf-stage {
1204
+ --tint: #9fb3c8;
1205
+ position: relative;
1206
+ display: grid;
1207
+ place-items: center;
1208
+ min-height: 128px;
1209
+ background: radial-gradient(circle at 50% 70%, color-mix(in srgb, var(--tint) 30%, var(--paper)), color-mix(in srgb, var(--tint) 10%, var(--paper)) 70%);
1210
+ }
1211
+
1212
+ .n133-admin .shelf-pic {
1213
+ display: grid;
1214
+ place-items: center;
1215
+ width: 112px;
1216
+ height: 112px;
1217
+ }
1218
+
1219
+ .n133-admin .shelf-pic > svg,
1220
+ .n133-admin .shelf-preview > svg {
1221
+ width: 96px;
1222
+ height: auto;
1223
+ }
1224
+
1225
+ .n133-admin .shelf-preview {
1226
+ display: grid;
1227
+ place-items: center;
1228
+ }
1229
+
1230
+ .n133-admin .shelf-preview img {
1231
+ display: block;
1232
+ width: 112px;
1233
+ height: 112px;
1234
+ }
1235
+
1236
+ .n133-admin .price-pill {
1237
+ position: absolute;
1238
+ top: 8px;
1239
+ right: 8px;
1240
+ max-width: calc(100% - 16px);
1241
+ overflow: hidden;
1242
+ text-overflow: ellipsis;
1243
+ white-space: nowrap;
1244
+ padding: 4px 10px;
1245
+ border-radius: 999px;
1246
+ background: var(--paper);
1247
+ box-shadow: 0 1px 3px rgb(16 24 40 / 0.15);
1248
+ font-size: 13px;
1249
+ font-weight: 800;
1250
+ font-variant-numeric: tabular-nums;
1251
+ }
1252
+
1253
+ .n133-admin .price-pill.is-free {
1254
+ background: var(--ink);
1255
+ color: var(--paper);
1256
+ }
1257
+
1258
+ .n133-admin .shelf-body {
1259
+ display: grid;
1260
+ gap: 6px;
1261
+ align-content: start;
1262
+ min-width: 0;
1263
+ padding: 10px 12px 12px;
1264
+ }
1265
+
1266
+ .n133-admin .shelf-name {
1267
+ overflow-wrap: anywhere;
1268
+ font-size: 15px;
1269
+ line-height: 1.25;
1270
+ }
1271
+
1272
+ .n133-admin .shelf-price {
1273
+ font-weight: 800;
1274
+ font-variant-numeric: tabular-nums;
1275
+ }
1276
+
1277
+ /* The editor: compact cards, one open card that takes the whole row, a tile to add a look. */
1278
+ .n133-admin .shelf-card.is-compact {
1279
+ grid-template-columns: 96px minmax(0, 1fr) auto;
1280
+ align-items: center;
1281
+ cursor: pointer;
1282
+ }
1283
+
1284
+ .n133-admin .shelf-card.is-compact .shelf-stage {
1285
+ align-self: stretch;
1286
+ min-height: 108px;
1287
+ }
1288
+
1289
+ .n133-admin .shelf-card.is-compact .shelf-pic {
1290
+ width: 84px;
1291
+ height: 84px;
1292
+ }
1293
+
1294
+ .n133-admin .shelf-card.is-compact .shelf-pic > svg,
1295
+ .n133-admin .shelf-card.is-compact .shelf-preview > svg {
1296
+ width: 64px;
1297
+ }
1298
+
1299
+ .n133-admin .shelf-card.is-compact .shelf-preview img {
1300
+ width: 84px;
1301
+ height: 84px;
1302
+ }
1303
+
1304
+ .n133-admin .shelf-card.is-compact .card-open {
1305
+ align-self: start;
1306
+ margin: 10px 10px 0 0;
1307
+ }
1308
+
1309
+ /* The whole card opens it: the Edit key's press area covers the card (the card is its positioned parent). */
1310
+ .n133-admin .shelf-card.is-compact .card-open::after {
1311
+ content: "";
1312
+ position: absolute;
1313
+ inset: 0;
1314
+ border-radius: inherit;
1315
+ }
1316
+
1317
+ .n133-admin .shelf-card.is-new {
1318
+ border-color: color-mix(in srgb, #1d5fa8 45%, var(--line));
1319
+ }
1320
+
1321
+ .n133-admin .shelf-card.is-changed {
1322
+ border-color: color-mix(in srgb, #c47a00 50%, var(--line));
1323
+ }
1324
+
1325
+ .n133-admin .shelf-card.has-problem {
1326
+ border-color: color-mix(in srgb, var(--bad) 55%, var(--line));
1327
+ }
1328
+
1329
+ .n133-admin .shelf-editing {
1330
+ grid-column: 1 / -1;
1331
+ gap: 0;
1332
+ border-width: 2px;
1333
+ border-color: var(--ink);
1334
+ box-shadow: 0 10px 30px -10px rgb(16 24 40 / 0.25);
1335
+ }
1336
+
1337
+ .n133-admin .shelf-editing:focus {
1338
+ outline: none;
1339
+ }
1340
+
1341
+ .n133-admin .edit-top {
1342
+ display: grid;
1343
+ grid-template-columns: 112px minmax(0, 1fr);
1344
+ align-items: center;
1345
+ border-bottom: 1px solid var(--line);
1346
+ }
1347
+
1348
+ .n133-admin .edit-top .shelf-stage {
1349
+ align-self: stretch;
1350
+ min-height: 128px;
1351
+ }
1352
+
1353
+ .n133-admin .edit-top .shelf-pic {
1354
+ width: 104px;
1355
+ height: 104px;
1356
+ }
1357
+
1358
+ .n133-admin .edit-top .shelf-preview img {
1359
+ width: 104px;
1360
+ height: 104px;
1361
+ }
1362
+
1363
+ .n133-admin .edit-top .shelf-pic > svg,
1364
+ .n133-admin .edit-top .shelf-preview > svg {
1365
+ width: 80px;
1366
+ }
1367
+
1368
+ .n133-admin .edit-top .shelf-stage {
1369
+ grid-row: span 2;
1370
+ }
1371
+
1372
+ .n133-admin .card-done {
1373
+ grid-column: 2;
1374
+ justify-self: start;
1375
+ margin: 0 12px 12px;
1376
+ }
1377
+
1378
+ .n133-admin .card-problems {
1379
+ margin: 12px 14px 0;
1380
+ padding: 10px 12px 10px 30px;
1381
+ border-radius: 12px;
1382
+ background: #fff1f3;
1383
+ color: #5c0716;
1384
+ font-size: 14px;
1385
+ }
1386
+
1387
+ .n133-admin .edit-groups {
1388
+ display: grid;
1389
+ gap: 12px;
1390
+ padding: 14px;
1391
+ }
1392
+
1393
+ .n133-admin .edit-group {
1394
+ display: grid;
1395
+ gap: 10px;
1396
+ align-content: start;
1397
+ min-width: 0;
1398
+ padding: 14px;
1399
+ border-radius: 14px;
1400
+ background: var(--ground);
1401
+ }
1402
+
1403
+ .n133-admin .edit-group h3 {
1404
+ color: var(--ink-soft);
1405
+ font-size: 12px;
1406
+ font-weight: 800;
1407
+ letter-spacing: 0.06em;
1408
+ text-transform: uppercase;
1409
+ }
1410
+
1411
+ .n133-admin .look-fields {
1412
+ display: grid;
1413
+ gap: 12px;
1414
+ }
1415
+
1416
+ .n133-admin .field {
1417
+ display: grid;
1418
+ gap: 6px;
1419
+ min-width: 0;
1420
+ }
1421
+
1422
+ .n133-admin .field > span {
1423
+ font-size: 14px;
1424
+ font-weight: 650;
1425
+ }
1426
+
1427
+ .n133-admin .ladder {
1428
+ display: grid;
1429
+ grid-template-columns: repeat(auto-fill, minmax(64px, 1fr));
1430
+ gap: 6px;
1431
+ }
1432
+
1433
+ .n133-admin .ladder-step {
1434
+ display: grid;
1435
+ place-content: center;
1436
+ gap: 2px;
1437
+ min-height: 52px;
1438
+ padding: 4px;
1439
+ border: 1px solid var(--line);
1440
+ border-radius: 12px;
1441
+ background: var(--paper);
1442
+ color: var(--ink);
1443
+ font: inherit;
1444
+ text-align: center;
1445
+ cursor: pointer;
1446
+ }
1447
+
1448
+ .n133-admin .ladder-step strong {
1449
+ font-size: 15px;
1450
+ font-variant-numeric: tabular-nums;
1451
+ }
1452
+
1453
+ .n133-admin .ladder-step span {
1454
+ color: var(--ink-soft);
1455
+ font-size: 12px;
1456
+ }
1457
+
1458
+ .n133-admin .ladder-step[aria-pressed="true"] {
1459
+ border-color: var(--gem-dark);
1460
+ background: color-mix(in srgb, var(--gem) 18%, var(--paper));
1461
+ box-shadow: inset 0 0 0 1px var(--gem-dark);
1462
+ }
1463
+
1464
+ .n133-admin .colour-row {
1465
+ display: flex;
1466
+ flex-wrap: wrap;
1467
+ align-items: center;
1468
+ gap: 8px;
1469
+ }
1470
+
1471
+ .n133-admin .swatches {
1472
+ display: flex;
1473
+ flex-wrap: wrap;
1474
+ gap: 6px;
1475
+ }
1476
+
1477
+ .n133-admin .swatch-btn {
1478
+ display: grid;
1479
+ place-items: center;
1480
+ width: 44px;
1481
+ height: 44px;
1482
+ padding: 0;
1483
+ border: 2px solid transparent;
1484
+ border-radius: 50%;
1485
+ background: transparent;
1486
+ cursor: pointer;
1487
+ }
1488
+
1489
+ .n133-admin .swatch-btn .swatch {
1490
+ width: 32px;
1491
+ height: 32px;
1492
+ }
1493
+
1494
+ .n133-admin .swatch-btn[aria-pressed="true"] {
1495
+ border-color: var(--ink);
1496
+ }
1497
+
1498
+ .n133-admin .hat-choices {
1499
+ display: grid;
1500
+ grid-template-columns: repeat(auto-fill, minmax(76px, 1fr));
1501
+ gap: 6px;
1502
+ }
1503
+
1504
+ .n133-admin .hat-choice {
1505
+ position: relative;
1506
+ display: grid;
1507
+ justify-items: center;
1508
+ gap: 2px;
1509
+ min-height: 72px;
1510
+ padding: 8px 4px 6px;
1511
+ border: 1px solid var(--line);
1512
+ border-radius: 12px;
1513
+ background: var(--paper);
1514
+ font-size: 13px;
1515
+ font-weight: 650;
1516
+ cursor: pointer;
1517
+ }
1518
+
1519
+ .n133-admin .hat-choice span {
1520
+ color: var(--ink);
1521
+ }
1522
+
1523
+ .n133-admin .hat-choice input {
1524
+ position: absolute;
1525
+ inset: 0;
1526
+ width: 100%;
1527
+ height: 100%;
1528
+ margin: 0;
1529
+ opacity: 0;
1530
+ cursor: inherit;
1531
+ }
1532
+
1533
+ .n133-admin .hat-choice.is-on {
1534
+ border-color: var(--gem-dark);
1535
+ background: color-mix(in srgb, var(--gem) 18%, var(--paper));
1536
+ box-shadow: inset 0 0 0 1px var(--gem-dark);
1537
+ }
1538
+
1539
+ .n133-admin .shelf-slot-list {
1540
+ display: grid;
1541
+ gap: 8px;
1542
+ }
1543
+
1544
+ .n133-admin .shelf-slot {
1545
+ display: grid;
1546
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr) auto;
1547
+ gap: 8px;
1548
+ align-items: center;
1549
+ }
1550
+
1551
+ .n133-admin .shelf-slots-edit > .btn {
1552
+ justify-self: start;
1553
+ }
1554
+
1555
+ .n133-admin .owned-note {
1556
+ display: flex;
1557
+ align-items: center;
1558
+ gap: 6px;
1559
+ padding: 0 14px;
1560
+ }
1561
+
1562
+ .n133-admin .shelf-actions {
1563
+ display: flex;
1564
+ flex-wrap: wrap;
1565
+ justify-content: flex-end;
1566
+ gap: 8px;
1567
+ padding: 12px 14px 14px;
1568
+ }
1569
+
1570
+ .n133-admin .shelf-ghost {
353
1571
  display: flex;
354
1572
  flex-wrap: wrap;
1573
+ align-items: center;
1574
+ justify-content: space-between;
355
1575
  gap: 8px;
356
- margin-top: 12px;
1576
+ padding: 4px 12px 4px 0;
1577
+ border: 1px dashed var(--line);
1578
+ border-radius: 16px;
1579
+ opacity: 0.8;
1580
+ }
1581
+
1582
+ .n133-admin .shelf-ghost .shelf-name {
1583
+ text-decoration: line-through;
1584
+ }
1585
+
1586
+ .n133-admin .shelf-add-tile {
1587
+ display: grid;
1588
+ place-content: center;
1589
+ justify-items: center;
1590
+ gap: 6px;
1591
+ min-height: 108px;
1592
+ border: 2px dashed color-mix(in srgb, var(--ink) 22%, var(--line));
1593
+ border-radius: 16px;
1594
+ background: transparent;
1595
+ color: var(--ink-soft);
1596
+ font: 700 15px/1 var(--font);
1597
+ cursor: pointer;
1598
+ }
1599
+
1600
+ @media (hover: hover) {
1601
+ .n133-admin .shelf-add-tile:hover {
1602
+ border-color: var(--gem-dark);
1603
+ color: var(--gem-dark);
1604
+ }
357
1605
  }
358
1606
 
1607
+ /* The change bar: it stays at the bottom of the screen while the Shelf is edited. Only the state and the two copy keys: about 110 px on a phone. */
359
1608
  .n133-admin .shelf-foot {
1609
+ position: sticky;
1610
+ bottom: 0;
1611
+ z-index: 4;
360
1612
  display: grid;
361
- gap: 10px;
362
- margin-top: 14px;
1613
+ gap: 8px;
1614
+ margin: 0 -16px;
1615
+ padding: 10px 16px calc(10px + env(safe-area-inset-bottom, 0px));
1616
+ border-top: 1px solid var(--line);
1617
+ border-bottom: 1px solid var(--line);
1618
+ background: color-mix(in srgb, var(--paper) 96%, transparent);
1619
+ box-shadow: 0 -8px 24px -12px rgb(16 24 40 / 0.25);
1620
+ -webkit-backdrop-filter: blur(8px);
1621
+ backdrop-filter: blur(8px);
363
1622
  }
364
1623
 
365
- .n133-admin .shelf-changes ul,
366
- .n133-admin .late-note ul {
367
- margin: 4px 0 0;
1624
+ .n133-admin .foot-status {
1625
+ display: flex;
1626
+ flex-wrap: wrap;
1627
+ align-items: center;
1628
+ gap: 4px 10px;
1629
+ }
1630
+
1631
+ .n133-admin .foot-keys {
1632
+ display: grid;
1633
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1634
+ gap: 8px;
1635
+ }
1636
+
1637
+ .n133-admin .foot-keys .btn {
1638
+ min-width: 0;
1639
+ padding: 0 10px;
1640
+ overflow: hidden;
1641
+ text-overflow: ellipsis;
1642
+ }
1643
+
1644
+ /* What comes after the bar: the problems in full, GitHub and Start over, what changed, the new file. */
1645
+ .n133-admin .shelf-foot-more {
1646
+ display: grid;
1647
+ gap: 8px;
1648
+ }
1649
+
1650
+ .n133-admin .foot-links {
1651
+ display: flex;
1652
+ flex-wrap: wrap;
1653
+ gap: 8px;
1654
+ }
1655
+
1656
+ .n133-admin .foot-more summary {
1657
+ display: inline-flex;
1658
+ align-items: center;
1659
+ min-height: 40px;
1660
+ color: var(--sea);
1661
+ font-weight: 700;
1662
+ cursor: pointer;
1663
+ }
1664
+
1665
+ .n133-admin .foot-more ul {
1666
+ margin: 0;
368
1667
  padding-left: 20px;
1668
+ font-size: 14px;
369
1669
  }
370
1670
 
371
1671
  .n133-admin .shelf-file pre {
372
- max-height: 320px;
373
- margin: 8px 0 0;
1672
+ max-height: 260px;
1673
+ margin: 6px 0 0;
374
1674
  padding: 12px;
375
1675
  overflow: auto;
376
1676
  border-radius: 12px;
377
1677
  background: #0f172a;
378
1678
  color: #e6edf6;
379
- font-size: 13px;
1679
+ font-size: 12px;
380
1680
  }
381
1681
 
382
- /* WebKit draws a select at its own height and ignores min-height: take over the drawing, so it is 44px (a finger) on an iPad too. */
383
- .n133-admin select.shelf-input {
384
- height: 44px;
385
- padding-right: 32px;
386
- background-image: linear-gradient(45deg, transparent 50%, var(--ink) 50%), linear-gradient(135deg, var(--ink) 50%, transparent 50%);
387
- background-position: calc(100% - 18px) 19px, calc(100% - 13px) 19px;
388
- background-repeat: no-repeat;
389
- background-size: 5px 5px, 5px 5px;
390
- -webkit-appearance: none;
391
- appearance: none;
392
- }
1682
+ /* ---- The "Game" card: two switches (gameCard.ts). Each is a button of at least 44 px ---- */
393
1683
 
394
- /* The "Game" card: two switches (src/client/gameSwitches.ts). Each is a button of at least 44 px, on a phone first. */
395
1684
  .n133-admin .game-card .switch-row {
396
1685
  display: grid;
397
1686
  gap: 6px;
398
- padding: 14px 0;
1687
+ padding: 14px 0 0;
399
1688
  border-top: 1px solid var(--line);
400
1689
  }
401
1690
 
@@ -404,25 +1693,22 @@
404
1693
  align-items: center;
405
1694
  justify-content: space-between;
406
1695
  gap: 12px;
407
- flex-wrap: wrap;
408
1696
  }
409
1697
 
410
1698
  .n133-admin .game-card .switch-title {
411
- font: 700 16px/1.3 var(--font);
412
1699
  flex: 1 1 14rem;
413
1700
  min-width: 0;
1701
+ font: 700 16px/1.3 var(--font);
414
1702
  }
415
1703
 
416
1704
  .n133-admin .game-card .switch-note {
417
- margin: 0;
1705
+ max-width: 62ch;
418
1706
  color: var(--ink-soft);
419
- font-size: 15px;
1707
+ font-size: 14px;
420
1708
  line-height: 1.45;
421
- max-width: 60ch;
422
1709
  }
423
1710
 
424
1711
  .n133-admin .game-card .switch-review {
425
- margin: 4px 0 0;
426
1712
  padding-top: 12px;
427
1713
  border-top: 1px solid var(--line);
428
1714
  }
@@ -430,12 +1716,13 @@
430
1716
  .n133-admin .game-card .switch-review a {
431
1717
  display: inline-block;
432
1718
  padding: 10px 0;
433
- color: var(--ink);
1719
+ color: var(--sea);
434
1720
  font-weight: 700;
435
1721
  }
436
1722
 
437
1723
  .n133-admin .switch {
438
1724
  display: inline-flex;
1725
+ flex: none;
439
1726
  align-items: center;
440
1727
  justify-content: space-between;
441
1728
  gap: 10px;
@@ -444,36 +1731,28 @@
444
1731
  /* Off: the knob is on the left and the word on the right. On: the word on the left and the knob on the right (the usual switch). */
445
1732
  flex-direction: row-reverse;
446
1733
  padding: 0 14px 0 6px;
447
- border: 2px solid var(--line);
1734
+ border: 1px solid color-mix(in srgb, var(--ink) 18%, var(--line));
448
1735
  border-radius: 999px;
449
- background: var(--paper);
1736
+ background: var(--ground);
450
1737
  color: var(--ink);
451
1738
  font: 700 14px/1 var(--font);
452
1739
  cursor: pointer;
453
1740
  }
454
1741
 
455
1742
  .n133-admin .switch .switch-knob {
456
- width: 28px;
457
- height: 28px;
1743
+ width: 30px;
1744
+ height: 30px;
458
1745
  border-radius: 50%;
459
- background: var(--line);
1746
+ background: var(--paper);
1747
+ box-shadow: 0 1px 3px rgb(16 24 40 / 0.25);
460
1748
  }
461
1749
 
462
1750
  .n133-admin .switch.switch-on {
1751
+ flex-direction: row;
1752
+ padding: 0 6px 0 14px;
463
1753
  border-color: var(--gem-dark);
464
1754
  background: var(--gem);
465
1755
  color: #052b23;
466
- flex-direction: row;
467
- padding: 0 6px 0 14px;
468
- }
469
-
470
- .n133-admin .switch.switch-on .switch-knob {
471
- background: var(--paper);
472
- }
473
-
474
- .n133-admin .switch:focus-visible {
475
- outline: 3px solid var(--sea);
476
- outline-offset: 2px;
477
1756
  }
478
1757
 
479
1758
  .n133-admin .switch:disabled {
@@ -481,71 +1760,297 @@
481
1760
  cursor: progress;
482
1761
  }
483
1762
 
484
- /* The slots of a look in the Shelf's editor: a name and a value in a row, and Remove; on a narrow phone Remove goes under them. */
485
- .n133-admin .shelf-slots-edit {
486
- gap: 8px;
487
- }
488
-
489
- .n133-admin .shelf-slot-list {
490
- display: grid;
491
- gap: 8px;
492
- }
493
-
494
- .n133-admin .shelf-slot {
495
- display: grid;
496
- grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr) auto;
497
- gap: 8px;
498
- align-items: center;
499
- }
500
-
501
- @media (max-width: 480px) {
502
- .n133-admin .shelf-slot {
503
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
504
- }
505
-
506
- .n133-admin .shelf-slot .btn {
507
- grid-column: 1 / -1;
508
- }
509
- }
510
-
511
- .n133-admin .shelf-slots-edit > .btn {
512
- justify-self: start;
513
- }
514
-
515
- .n133-admin .shelf-slots {
516
- overflow-wrap: anywhere;
517
- }
1763
+ /* ---- The Sign-ins card: the last sign-ins, and the two-step "Sign out everywhere" ---- */
518
1764
 
519
- /* The Sign-ins card: a list of the last sign-ins, and the two-step "Sign out everywhere". */
520
1765
  .n133-admin .signin-list {
521
1766
  display: grid;
522
- gap: 8px;
523
- margin: 8px 0;
1767
+ margin: 0;
524
1768
  padding: 0;
525
1769
  list-style: none;
526
1770
  }
527
1771
 
528
1772
  .n133-admin .signin-list li {
529
- padding: 8px 0;
530
- border-bottom: 1px solid var(--line);
1773
+ padding: 10px 0;
1774
+ border-top: 1px solid var(--line);
1775
+ font-size: 14px;
531
1776
  overflow-wrap: anywhere;
532
1777
  }
533
1778
 
1779
+ .n133-admin .signin-list li:first-child {
1780
+ border-top: 0;
1781
+ }
1782
+
534
1783
  .n133-admin .signout-box {
535
1784
  display: grid;
536
1785
  gap: 8px;
537
1786
  justify-items: start;
538
- margin-top: 8px;
539
1787
  }
540
1788
 
541
1789
  .n133-admin .signout-confirm {
542
- display: grid;
1790
+ display: flex;
1791
+ flex-wrap: wrap;
543
1792
  gap: 8px;
544
1793
  padding: 12px;
545
1794
  border-radius: 12px;
546
- background: #fff4f6;
1795
+ background: #fff1f3;
547
1796
  }
548
1797
 
549
1798
  .n133-admin .signout-confirm p {
550
- margin: 0;
1799
+ flex-basis: 100%;
1800
+ }
1801
+
1802
+ /* ---- Wider panels ---- */
1803
+
1804
+ @container n133 (min-width: 560px) {
1805
+ .n133-admin .kpis {
1806
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1807
+ }
1808
+
1809
+ .n133-admin .kpi {
1810
+ gap: 4px;
1811
+ padding: 14px;
1812
+ }
1813
+
1814
+ .n133-admin .kpi-value {
1815
+ font-size: 24px;
1816
+ }
1817
+
1818
+ .n133-admin .admin-card {
1819
+ padding: 18px 20px;
1820
+ }
1821
+
1822
+ .n133-admin .shelf-foot {
1823
+ grid-template-columns: minmax(0, 1fr) auto;
1824
+ align-items: center;
1825
+ margin: 0 -20px;
1826
+ padding-inline: 20px;
1827
+ }
1828
+
1829
+ .n133-admin .foot-keys {
1830
+ grid-template-columns: auto auto;
1831
+ }
1832
+
1833
+ .n133-admin .shelf-list {
1834
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1835
+ gap: var(--gap);
1836
+ }
1837
+
1838
+ .n133-admin .shelf-stage {
1839
+ min-height: 148px;
1840
+ }
1841
+
1842
+ .n133-admin .shelf-pic,
1843
+ .n133-admin .shelf-preview img {
1844
+ width: 128px;
1845
+ height: 128px;
1846
+ }
1847
+
1848
+ .n133-admin .shelf-body {
1849
+ padding: 12px 14px 14px;
1850
+ }
1851
+
1852
+ .n133-admin .shelf-name {
1853
+ font-size: 16px;
1854
+ }
1855
+
1856
+ .n133-admin .edit-top {
1857
+ grid-template-columns: 136px minmax(0, 1fr) auto;
1858
+ }
1859
+
1860
+ .n133-admin .edit-top .shelf-pic,
1861
+ .n133-admin .edit-top .shelf-preview img {
1862
+ width: 128px;
1863
+ height: 128px;
1864
+ }
1865
+
1866
+ .n133-admin .edit-top .shelf-stage {
1867
+ min-height: 148px;
1868
+ }
1869
+
1870
+ .n133-admin .edit-top .shelf-stage {
1871
+ grid-row: auto;
1872
+ }
1873
+
1874
+ .n133-admin .card-done {
1875
+ grid-column: auto;
1876
+ align-self: start;
1877
+ margin: 14px 14px 0 0;
1878
+ }
1879
+
1880
+ .n133-admin .player {
1881
+ grid-template-columns: 36px minmax(0, 1fr) auto;
1882
+ align-items: center;
1883
+ }
1884
+
1885
+ .n133-admin .player-count {
1886
+ grid-column: auto;
1887
+ }
1888
+ }
1889
+
1890
+ @container n133 (min-width: 760px) {
1891
+ .n133-admin .overview {
1892
+ grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
1893
+ }
1894
+
1895
+ .n133-admin .settings-grid {
1896
+ grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
1897
+ }
1898
+
1899
+ .n133-admin .settings-grid > .game-card {
1900
+ grid-row: span 2;
1901
+ }
1902
+
1903
+ .n133-admin .shelf-list.is-editing {
1904
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1905
+ }
1906
+
1907
+ .n133-admin .edit-groups {
1908
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1909
+ }
1910
+
1911
+ /* The Look group takes the whole row: the colours, the hats and the hat colour side by side. */
1912
+ .n133-admin .edit-groups > .group-look,
1913
+ .n133-admin .edit-groups > .shelf-slots-edit {
1914
+ grid-column: 1 / -1;
1915
+ }
1916
+
1917
+ .n133-admin .look-fields {
1918
+ display: flex;
1919
+ flex-wrap: wrap;
1920
+ align-items: flex-start;
1921
+ gap: 12px 28px;
1922
+ }
1923
+
1924
+ .n133-admin .swatches {
1925
+ max-width: 200px;
1926
+ }
1927
+
1928
+ .n133-admin .hat-choices {
1929
+ grid-template-columns: repeat(5, 72px);
1930
+ }
1931
+
1932
+ .n133-admin .tabbar-tab {
1933
+ flex: 1 1 0;
1934
+ }
1935
+
1936
+ /* Orders as a table: one line each, with the column names above. */
1937
+ .n133-admin .order-table-head,
1938
+ .n133-admin .orders:not(.is-compact) .order {
1939
+ grid-template-columns: minmax(0, 1.3fr) 96px minmax(0, 1fr) minmax(0, 1.5fr) minmax(0, 1fr);
1940
+ grid-template-areas: "look status amount player when";
1941
+ gap: 6px 14px;
1942
+ }
1943
+
1944
+ .n133-admin .order-table-head {
1945
+ display: grid;
1946
+ padding: 0 12px;
1947
+ color: var(--ink-soft);
1948
+ font-size: 12px;
1949
+ font-weight: 800;
1950
+ letter-spacing: 0.05em;
1951
+ text-transform: uppercase;
1952
+ }
1953
+
1954
+ .n133-admin .orders:not(.is-compact) .order {
1955
+ padding: 10px 12px;
1956
+ }
1957
+
1958
+ .n133-admin .orders:not(.is-compact) .order-status {
1959
+ justify-self: start;
1960
+ }
1961
+
1962
+ .n133-admin .orders:not(.is-compact) .order-amount {
1963
+ display: grid;
1964
+ gap: 0;
1965
+ }
1966
+
1967
+ .n133-admin .orders:not(.is-compact) .order-when {
1968
+ display: grid;
1969
+ gap: 0;
1970
+ }
1971
+
1972
+ .n133-admin .orders:not(.is-compact) .cell-label,
1973
+ .n133-admin .orders:not(.is-compact) .order-player .copy-word {
1974
+ display: none;
1975
+ }
1976
+
1977
+ .n133-admin .orders:not(.is-compact) .order-player {
1978
+ flex-wrap: nowrap;
1979
+ }
1980
+
1981
+ .n133-admin .orders:not(.is-compact) .order-player code {
1982
+ font-size: 12px;
1983
+ white-space: nowrap;
1984
+ }
1985
+
1986
+ .n133-admin .orders:not(.is-compact) .order-player .copy-key {
1987
+ flex: none;
1988
+ padding: 0 8px;
1989
+ }
1990
+
1991
+ .n133-admin .order-table-head span:last-child {
1992
+ text-align: right;
1993
+ }
1994
+ }
1995
+
1996
+ @container n133 (min-width: 1000px) {
1997
+ .n133-admin .shelf-list:not(.is-editing) {
1998
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1999
+ }
2000
+
2001
+ .n133-admin .shelf-list.is-editing {
2002
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2003
+ }
2004
+ }
2005
+
2006
+ /* A narrow panel (a phone): the five tabs fit across, each an icon over its word, the count on the icon's corner. */
2007
+ @container n133 (max-width: 559px) {
2008
+ .n133-admin .tabbar {
2009
+ gap: 2px;
2010
+ padding: 4px;
2011
+ }
2012
+
2013
+ .n133-admin .tabbar-tab {
2014
+ position: relative;
2015
+ flex: 1 1 0;
2016
+ flex-direction: column;
2017
+ gap: 3px;
2018
+ min-width: 0;
2019
+ min-height: 54px;
2020
+ padding: 6px 2px 5px;
2021
+ font-size: 12px;
2022
+ }
2023
+
2024
+ .n133-admin .tab-count {
2025
+ position: absolute;
2026
+ top: 3px;
2027
+ left: calc(50% + 6px);
2028
+ min-width: 18px;
2029
+ padding: 2px 5px;
2030
+ background: var(--ground);
2031
+ color: var(--ink-soft);
2032
+ font-size: 11px;
2033
+ line-height: 1;
2034
+ }
2035
+
2036
+ .n133-admin .tabbar-tab.is-on .tab-count {
2037
+ background: var(--gem);
2038
+ color: #062b23;
2039
+ }
2040
+ }
2041
+
2042
+ @container n133 (max-width: 420px) {
2043
+ .n133-admin .shelf-slot {
2044
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
2045
+ }
2046
+
2047
+ .n133-admin .shelf-slot .btn {
2048
+ grid-column: 1 / -1;
2049
+ justify-self: start;
2050
+ }
2051
+
2052
+ .n133-admin .sort {
2053
+ margin-left: 0;
2054
+ }
2055
+
551
2056
  }