create-shopify-firebase-app 2.0.5 → 2.1.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,95 +1,10 @@
1
1
  /* ═══════════════════════════════════════════════════════════════════
2
- Polaris-inspired Design System for Shopify Embedded Admin Apps
3
- Firebase Hosting / Static HTML no build step required
2
+ Minimal CSS for Shopify Embedded Admin App
3
+ Most UI is handled by Polaris Web Components (<s-*> elements).
4
+ This file covers: product cards, data tables, code blocks,
5
+ toast fallback, and demo page styling.
4
6
  ═══════════════════════════════════════════════════════════════════ */
5
7
 
6
- /* ── Design Tokens (CSS Custom Properties) ─────────────────────── */
7
- :root {
8
- /* Primary */
9
- --p-color-primary: #008060;
10
- --p-color-primary-hovered: #006e52;
11
- --p-color-primary-pressed: #005c45;
12
- --p-color-primary-subdued: #f1f8f5;
13
-
14
- /* Neutral */
15
- --p-color-bg: #f6f6f7;
16
- --p-color-bg-surface: #ffffff;
17
- --p-color-bg-surface-hover: #f6f6f7;
18
- --p-color-bg-surface-active: #f1f1f1;
19
-
20
- /* Text */
21
- --p-color-text: #1a1a1a;
22
- --p-color-text-secondary: #6d7175;
23
- --p-color-text-disabled: #8c9196;
24
- --p-color-text-inverse: #ffffff;
25
- --p-color-text-success: #00713a;
26
- --p-color-text-warning: #8a6500;
27
- --p-color-text-critical: #d72c0d;
28
- --p-color-text-info: #005ea6;
29
-
30
- /* Borders */
31
- --p-color-border: #e1e3e5;
32
- --p-color-border-hover: #c9cccf;
33
- --p-color-border-focus: #008060;
34
- --p-color-border-critical: #e0b3b2;
35
-
36
- /* Status backgrounds */
37
- --p-color-bg-success: #e4f5e9;
38
- --p-color-bg-success-strong: #008060;
39
- --p-color-bg-warning: #fff8e6;
40
- --p-color-bg-critical: #fff4f4;
41
- --p-color-bg-critical-strong:#d72c0d;
42
- --p-color-bg-info: #eef6ff;
43
- --p-color-bg-info-strong: #005ea6;
44
- --p-color-bg-attention: #fff8e6;
45
- --p-color-bg-new: #f3e8ff;
46
-
47
- /* Shadows */
48
- --p-shadow-sm: 0 1px 0 rgba(0,0,0,0.04);
49
- --p-shadow-md: 0 1px 2px rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.04);
50
- --p-shadow-lg: 0 4px 12px rgba(0,0,0,0.08), 0 2px 6px rgba(0,0,0,0.04);
51
- --p-shadow-card: 0 1px 2px rgba(26,26,26,0.07), 0 1px 3px rgba(26,26,26,0.03);
52
-
53
- /* Spacing */
54
- --p-space-1: 4px;
55
- --p-space-2: 8px;
56
- --p-space-3: 12px;
57
- --p-space-4: 16px;
58
- --p-space-5: 20px;
59
- --p-space-6: 24px;
60
- --p-space-8: 32px;
61
- --p-space-10: 40px;
62
- --p-space-12: 48px;
63
- --p-space-16: 64px;
64
-
65
- /* Border radius */
66
- --p-radius-sm: 6px;
67
- --p-radius-md: 8px;
68
- --p-radius-lg: 12px;
69
- --p-radius-xl: 16px;
70
- --p-radius-full: 9999px;
71
-
72
- /* Typography */
73
- --p-font-family: -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
74
- --p-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
75
- --p-font-size-sm: 12px;
76
- --p-font-size-base: 13px;
77
- --p-font-size-md: 14px;
78
- --p-font-size-lg: 16px;
79
- --p-font-size-xl: 20px;
80
- --p-font-size-2xl: 24px;
81
- --p-font-weight-regular: 400;
82
- --p-font-weight-medium: 500;
83
- --p-font-weight-semibold: 600;
84
- --p-font-weight-bold: 700;
85
- --p-line-height: 1.5;
86
-
87
- /* Transitions */
88
- --p-duration-fast: 100ms;
89
- --p-duration-base: 200ms;
90
- --p-ease: cubic-bezier(0.25, 0.1, 0.25, 1);
91
- }
92
-
93
8
 
94
9
  /* ── Reset ─────────────────────────────────────────────────────── */
95
10
  *, *::before, *::after {
@@ -105,485 +20,53 @@ html {
105
20
  }
106
21
 
107
22
  body {
108
- font-family: var(--p-font-family);
109
- font-size: var(--p-font-size-md);
110
- line-height: var(--p-line-height);
111
- color: var(--p-color-text);
112
- background: var(--p-color-bg);
23
+ font-family: -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
24
+ font-size: 14px;
25
+ line-height: 1.5;
26
+ color: #1a1a1a;
27
+ background: #f6f6f7;
113
28
  min-height: 100vh;
114
29
  }
115
30
 
116
- a { color: var(--p-color-primary); text-decoration: none; }
31
+ a { color: #008060; text-decoration: none; }
117
32
  a:hover { text-decoration: underline; }
118
33
 
119
34
  img { max-width: 100%; height: auto; display: block; }
120
35
 
121
36
 
122
- /* ── Page Layout ───────────────────────────────────────────────── */
123
- .page {
124
- max-width: 960px;
125
- margin: 0 auto;
126
- padding: var(--p-space-5) var(--p-space-4);
127
- }
128
-
129
- .page-narrow {
130
- max-width: 720px;
131
- margin: 0 auto;
132
- padding: var(--p-space-5) var(--p-space-4);
133
- }
134
-
135
- .page-wide {
136
- max-width: 1200px;
137
- margin: 0 auto;
138
- padding: var(--p-space-5) var(--p-space-4);
139
- }
140
-
141
- .page-header {
142
- display: flex;
143
- align-items: center;
144
- justify-content: space-between;
145
- margin-bottom: var(--p-space-5);
146
- gap: var(--p-space-4);
147
- }
148
-
149
- .page-header h1 {
150
- font-size: var(--p-font-size-xl);
151
- font-weight: var(--p-font-weight-semibold);
152
- line-height: 1.3;
153
- }
154
-
155
-
156
- /* ── Cards ─────────────────────────────────────────────────────── */
157
- .card {
158
- background: var(--p-color-bg-surface);
159
- border: 1px solid var(--p-color-border);
160
- border-radius: var(--p-radius-lg);
161
- padding: var(--p-space-5);
162
- margin-bottom: var(--p-space-4);
163
- box-shadow: var(--p-shadow-card);
164
- }
165
-
166
- .card-flush {
167
- padding: 0;
168
- }
169
-
170
- .card-header {
171
- display: flex;
172
- align-items: center;
173
- justify-content: space-between;
174
- padding-bottom: var(--p-space-4);
175
- gap: var(--p-space-3);
176
- }
177
-
178
- .card-header h2,
179
- .card h2 {
180
- font-size: var(--p-font-size-lg);
181
- font-weight: var(--p-font-weight-semibold);
182
- line-height: 1.4;
183
- }
184
-
185
- .card-header h3,
186
- .card h3 {
187
- font-size: var(--p-font-size-md);
188
- font-weight: var(--p-font-weight-semibold);
189
- margin-bottom: var(--p-space-2);
190
- }
191
-
192
- .card p {
193
- color: var(--p-color-text-secondary);
194
- margin-top: var(--p-space-2);
195
- }
196
-
197
- .card-section {
198
- padding: var(--p-space-5);
199
- border-top: 1px solid var(--p-color-border);
200
- }
201
-
202
- .card-section:first-child {
203
- border-top: none;
204
- }
205
-
206
- .card-grid {
207
- display: grid;
208
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
209
- gap: var(--p-space-4);
210
- }
211
-
212
-
213
- /* ── Buttons ───────────────────────────────────────────────────── */
214
- .btn {
215
- display: inline-flex;
216
- align-items: center;
217
- justify-content: center;
218
- gap: var(--p-space-2);
219
- padding: 7px 15px;
220
- border-radius: var(--p-radius-md);
221
- font-family: var(--p-font-family);
222
- font-size: var(--p-font-size-base);
223
- font-weight: var(--p-font-weight-medium);
224
- line-height: 1;
225
- cursor: pointer;
226
- border: 1px solid var(--p-color-border-hover);
227
- background: var(--p-color-bg-surface);
228
- color: var(--p-color-text);
229
- transition: background var(--p-duration-fast) var(--p-ease),
230
- border-color var(--p-duration-fast) var(--p-ease),
231
- box-shadow var(--p-duration-fast) var(--p-ease);
232
- text-decoration: none;
233
- white-space: nowrap;
234
- user-select: none;
235
- -webkit-user-select: none;
236
- vertical-align: middle;
237
- }
238
-
239
- .btn:hover {
240
- background: var(--p-color-bg-surface-hover);
241
- text-decoration: none;
242
- }
243
-
244
- .btn:active {
245
- background: var(--p-color-bg-surface-active);
246
- }
247
-
248
- .btn:focus-visible {
249
- outline: 2px solid var(--p-color-primary);
250
- outline-offset: 2px;
251
- }
252
-
253
- .btn-primary {
254
- background: var(--p-color-primary);
255
- color: var(--p-color-text-inverse);
256
- border-color: var(--p-color-primary);
257
- }
258
- .btn-primary:hover {
259
- background: var(--p-color-primary-hovered);
260
- border-color: var(--p-color-primary-hovered);
261
- }
262
- .btn-primary:active {
263
- background: var(--p-color-primary-pressed);
264
- border-color: var(--p-color-primary-pressed);
265
- }
266
-
267
- .btn-destructive {
268
- background: var(--p-color-bg-critical-strong);
269
- color: var(--p-color-text-inverse);
270
- border-color: var(--p-color-bg-critical-strong);
271
- }
272
- .btn-destructive:hover {
273
- background: #b5200f;
274
- border-color: #b5200f;
275
- }
276
- .btn-destructive:active {
277
- background: #9e1a0c;
278
- border-color: #9e1a0c;
279
- }
280
-
281
- .btn-outline {
282
- background: transparent;
283
- border-color: var(--p-color-border-hover);
284
- color: var(--p-color-text);
285
- }
286
- .btn-outline:hover {
287
- background: var(--p-color-bg-surface-hover);
288
- }
289
-
290
- .btn-plain {
291
- background: transparent;
292
- border-color: transparent;
293
- color: var(--p-color-primary);
294
- padding: 4px 8px;
295
- }
296
- .btn-plain:hover {
297
- background: var(--p-color-primary-subdued);
298
- text-decoration: underline;
299
- }
300
-
301
- .btn[disabled],
302
- .btn-disabled {
303
- opacity: 0.5;
304
- cursor: not-allowed;
305
- pointer-events: none;
306
- }
307
-
308
- .btn-loading {
309
- position: relative;
310
- color: transparent !important;
311
- pointer-events: none;
312
- }
313
- .btn-loading::after {
314
- content: "";
315
- position: absolute;
316
- width: 14px;
317
- height: 14px;
318
- border: 2px solid currentColor;
319
- border-right-color: transparent;
320
- border-radius: 50%;
321
- animation: spin 0.6s linear infinite;
322
- left: 50%;
323
- top: 50%;
324
- margin: -7px 0 0 -7px;
325
- color: var(--p-color-text-secondary);
326
- }
327
- .btn-primary.btn-loading::after {
328
- color: var(--p-color-text-inverse);
329
- }
330
-
331
- .btn-group {
332
- display: flex;
333
- gap: var(--p-space-2);
334
- flex-wrap: wrap;
335
- align-items: center;
336
- }
337
-
338
- .btn-sm {
339
- padding: 4px 10px;
340
- font-size: var(--p-font-size-sm);
341
- }
342
-
343
- .btn-lg {
344
- padding: 10px 20px;
345
- font-size: var(--p-font-size-md);
346
- }
347
-
348
-
349
- /* ── Badges ────────────────────────────────────────────────────── */
350
- .badge {
351
- display: inline-flex;
352
- align-items: center;
353
- padding: 2px 8px;
354
- border-radius: var(--p-radius-full);
355
- font-size: var(--p-font-size-sm);
356
- font-weight: var(--p-font-weight-medium);
357
- line-height: 1.5;
358
- white-space: nowrap;
359
- vertical-align: middle;
360
- }
361
-
362
- .badge-default {
363
- background: var(--p-color-bg-surface-hover);
364
- color: var(--p-color-text-secondary);
365
- }
366
-
367
- .badge-success {
368
- background: var(--p-color-bg-success);
369
- color: var(--p-color-text-success);
370
- }
371
-
372
- .badge-warning {
373
- background: var(--p-color-bg-warning);
374
- color: var(--p-color-text-warning);
375
- }
376
-
377
- .badge-critical {
378
- background: var(--p-color-bg-critical);
379
- color: var(--p-color-text-critical);
380
- }
381
-
382
- .badge-info {
383
- background: var(--p-color-bg-info);
384
- color: var(--p-color-text-info);
385
- }
386
-
387
- .badge-attention {
388
- background: var(--p-color-bg-attention);
389
- color: var(--p-color-text-warning);
390
- }
391
-
392
- .badge-new {
393
- background: var(--p-color-bg-new);
394
- color: #6b21a8;
395
- }
396
-
397
-
398
- /* ── Form Elements ─────────────────────────────────────────────── */
399
- .form-group {
400
- margin-bottom: var(--p-space-4);
401
- }
402
-
403
- .form-group label {
404
- display: block;
405
- font-size: var(--p-font-size-base);
406
- font-weight: var(--p-font-weight-medium);
407
- margin-bottom: var(--p-space-1);
408
- color: var(--p-color-text);
409
- }
410
-
411
- .form-hint {
412
- font-size: var(--p-font-size-sm);
413
- color: var(--p-color-text-secondary);
414
- margin-top: var(--p-space-1);
415
- }
416
-
417
- .form-input,
418
- .form-select,
419
- .form-textarea {
420
- width: 100%;
421
- padding: 8px 12px;
422
- border: 1px solid var(--p-color-border-hover);
423
- border-radius: var(--p-radius-md);
424
- font-family: var(--p-font-family);
425
- font-size: var(--p-font-size-md);
426
- color: var(--p-color-text);
427
- background: var(--p-color-bg-surface);
428
- transition: border-color var(--p-duration-fast) var(--p-ease),
429
- box-shadow var(--p-duration-fast) var(--p-ease);
430
- -webkit-appearance: none;
431
- appearance: none;
432
- }
433
-
434
- .form-input:focus,
435
- .form-select:focus,
436
- .form-textarea:focus {
437
- outline: none;
438
- border-color: var(--p-color-border-focus);
439
- box-shadow: 0 0 0 1px var(--p-color-border-focus);
440
- }
441
-
442
- .form-input::placeholder {
443
- color: var(--p-color-text-disabled);
444
- }
445
-
446
- .form-input-error {
447
- border-color: var(--p-color-text-critical);
448
- }
449
- .form-input-error:focus {
450
- box-shadow: 0 0 0 1px var(--p-color-text-critical);
451
- border-color: var(--p-color-text-critical);
452
- }
453
-
454
- .form-error {
455
- font-size: var(--p-font-size-sm);
456
- color: var(--p-color-text-critical);
457
- margin-top: var(--p-space-1);
458
- }
459
-
460
- .form-select {
461
- 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 d='M3 4.5L6 7.5L9 4.5' stroke='%236d7175' fill='none' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
462
- background-repeat: no-repeat;
463
- background-position: right 12px center;
464
- padding-right: 32px;
465
- }
466
-
467
- .form-textarea {
468
- min-height: 80px;
469
- resize: vertical;
470
- line-height: var(--p-line-height);
471
- }
472
-
473
- .form-checkbox {
474
- display: flex;
475
- align-items: flex-start;
476
- gap: var(--p-space-2);
477
- cursor: pointer;
478
- }
479
-
480
- .form-checkbox input[type="checkbox"],
481
- .form-checkbox input[type="radio"] {
482
- width: 18px;
483
- height: 18px;
484
- margin-top: 1px;
485
- accent-color: var(--p-color-primary);
486
- cursor: pointer;
487
- flex-shrink: 0;
488
- }
489
-
490
- .form-checkbox span {
491
- font-size: var(--p-font-size-md);
492
- color: var(--p-color-text);
493
- }
494
-
495
-
496
- /* ── Tables ────────────────────────────────────────────────────── */
497
- .table-container {
498
- overflow-x: auto;
499
- -webkit-overflow-scrolling: touch;
500
- }
501
-
502
- table {
503
- width: 100%;
504
- border-collapse: collapse;
505
- font-size: var(--p-font-size-md);
506
- }
507
-
508
- thead th {
509
- text-align: left;
510
- padding: var(--p-space-3) var(--p-space-4);
511
- font-weight: var(--p-font-weight-medium);
512
- font-size: var(--p-font-size-base);
513
- color: var(--p-color-text-secondary);
514
- background: var(--p-color-bg-surface-hover);
515
- border-bottom: 1px solid var(--p-color-border);
516
- white-space: nowrap;
517
- }
518
-
519
- tbody td {
520
- padding: var(--p-space-3) var(--p-space-4);
521
- border-bottom: 1px solid var(--p-color-border);
522
- vertical-align: middle;
523
- }
524
-
525
- tbody tr:last-child td {
526
- border-bottom: none;
527
- }
528
-
529
- tbody tr:hover {
530
- background: var(--p-color-bg-surface-hover);
531
- }
532
-
533
- th.sortable {
534
- cursor: pointer;
535
- user-select: none;
536
- }
537
-
538
- th.sortable:hover {
539
- color: var(--p-color-text);
540
- }
541
-
542
- th.sortable::after {
543
- content: " \2195";
544
- font-size: 10px;
545
- opacity: 0.4;
546
- }
547
-
548
- td .table-actions {
549
- display: flex;
550
- gap: var(--p-space-2);
551
- }
552
-
553
-
554
- /* ── Product Cards ─────────────────────────────────────────────── */
37
+ /* ── Product Cards (used on Products page) ─────────────────────── */
555
38
  .product-grid {
556
39
  display: grid;
557
40
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
558
- gap: var(--p-space-4);
41
+ gap: 16px;
559
42
  }
560
43
 
561
44
  .product-card {
562
- background: var(--p-color-bg-surface);
563
- border: 1px solid var(--p-color-border);
564
- border-radius: var(--p-radius-lg);
45
+ background: #ffffff;
46
+ border: 1px solid #e1e3e5;
47
+ border-radius: 12px;
565
48
  overflow: hidden;
566
49
  cursor: pointer;
567
- transition: box-shadow var(--p-duration-base) var(--p-ease),
568
- border-color var(--p-duration-base) var(--p-ease);
569
- box-shadow: var(--p-shadow-card);
50
+ transition: box-shadow 200ms cubic-bezier(0.25, 0.1, 0.25, 1),
51
+ border-color 200ms cubic-bezier(0.25, 0.1, 0.25, 1);
52
+ box-shadow: 0 1px 2px rgba(26,26,26,0.07), 0 1px 3px rgba(26,26,26,0.03);
570
53
  }
571
54
 
572
55
  .product-card:hover {
573
- box-shadow: var(--p-shadow-md);
574
- border-color: var(--p-color-border-hover);
56
+ box-shadow: 0 1px 2px rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.04);
57
+ border-color: #c9cccf;
575
58
  }
576
59
 
577
60
  .product-card-image {
578
61
  width: 100%;
579
62
  aspect-ratio: 1;
580
63
  object-fit: cover;
581
- background: var(--p-color-bg);
64
+ background: #f6f6f7;
582
65
  display: flex;
583
66
  align-items: center;
584
67
  justify-content: center;
585
- color: var(--p-color-text-disabled);
586
- font-size: var(--p-font-size-sm);
68
+ color: #8c9196;
69
+ font-size: 12px;
587
70
  }
588
71
 
589
72
  .product-card-image img {
@@ -593,265 +76,68 @@ td .table-actions {
593
76
  }
594
77
 
595
78
  .product-card-body {
596
- padding: var(--p-space-3) var(--p-space-4) var(--p-space-4);
597
- }
598
-
599
- .product-card-title {
600
- font-size: var(--p-font-size-md);
601
- font-weight: var(--p-font-weight-semibold);
602
- color: var(--p-color-text);
603
- margin-bottom: var(--p-space-1);
604
- overflow: hidden;
605
- text-overflow: ellipsis;
606
- white-space: nowrap;
79
+ padding: 12px 16px 16px;
607
80
  }
608
81
 
609
- .product-card-vendor {
610
- font-size: var(--p-font-size-sm);
611
- color: var(--p-color-text-secondary);
612
- margin-bottom: var(--p-space-2);
613
- }
614
82
 
615
- .product-card-meta {
616
- display: flex;
617
- align-items: center;
618
- justify-content: space-between;
619
- gap: var(--p-space-2);
620
- }
621
-
622
- .product-card-price {
623
- font-size: var(--p-font-size-md);
624
- font-weight: var(--p-font-weight-semibold);
625
- color: var(--p-color-text);
626
- }
627
-
628
-
629
- /* ── Banners ───────────────────────────────────────────────────── */
630
- .banner {
631
- display: flex;
632
- gap: var(--p-space-3);
633
- padding: var(--p-space-4);
634
- border-radius: var(--p-radius-lg);
635
- margin-bottom: var(--p-space-4);
636
- align-items: flex-start;
637
- position: relative;
638
- }
639
-
640
- .banner-icon {
641
- flex-shrink: 0;
642
- font-size: 18px;
643
- line-height: 1;
644
- margin-top: 1px;
645
- }
646
-
647
- .banner-content {
648
- flex: 1;
649
- min-width: 0;
650
- }
651
-
652
- .banner-content p {
653
- color: inherit;
654
- margin: 0;
655
- }
656
-
657
- .banner-content p + p {
658
- margin-top: var(--p-space-1);
659
- }
660
-
661
- .banner-dismiss {
662
- flex-shrink: 0;
663
- background: none;
664
- border: none;
665
- cursor: pointer;
666
- font-size: 18px;
667
- color: inherit;
668
- opacity: 0.6;
669
- padding: 2px;
670
- line-height: 1;
671
- }
672
- .banner-dismiss:hover {
673
- opacity: 1;
674
- }
675
-
676
- .banner-info {
677
- background: var(--p-color-bg-info);
678
- color: var(--p-color-text-info);
679
- border: 1px solid #b4d5f0;
680
- }
681
-
682
- .banner-success {
683
- background: var(--p-color-bg-success);
684
- color: var(--p-color-text-success);
685
- border: 1px solid #b4dfca;
686
- }
687
-
688
- .banner-warning {
689
- background: var(--p-color-bg-warning);
690
- color: var(--p-color-text-warning);
691
- border: 1px solid #e0cf8a;
692
- }
693
-
694
- .banner-critical {
695
- background: var(--p-color-bg-critical);
696
- color: var(--p-color-text-critical);
697
- border: 1px solid var(--p-color-border-critical);
698
- }
699
-
700
-
701
- /* ── Empty State ───────────────────────────────────────────────── */
702
- .empty-state {
703
- text-align: center;
704
- padding: var(--p-space-12) var(--p-space-5);
705
- }
706
-
707
- .empty-state-icon {
708
- font-size: 48px;
709
- margin-bottom: var(--p-space-4);
710
- opacity: 0.5;
711
- }
712
-
713
- .empty-state h3 {
714
- font-size: var(--p-font-size-lg);
715
- font-weight: var(--p-font-weight-semibold);
716
- margin-bottom: var(--p-space-2);
717
- color: var(--p-color-text);
718
- }
719
-
720
- .empty-state p {
721
- color: var(--p-color-text-secondary);
722
- margin-bottom: var(--p-space-5);
723
- max-width: 400px;
724
- margin-left: auto;
725
- margin-right: auto;
726
- }
727
-
728
-
729
- /* ── Loading / Spinners ────────────────────────────────────────── */
730
- .spinner {
731
- width: 20px;
732
- height: 20px;
733
- border: 2.5px solid var(--p-color-border);
734
- border-top-color: var(--p-color-primary);
735
- border-radius: 50%;
736
- animation: spin 0.6s linear infinite;
737
- }
738
-
739
- .spinner-lg {
740
- width: 32px;
741
- height: 32px;
742
- border-width: 3px;
743
- }
744
-
745
- @keyframes spin {
746
- to { transform: rotate(360deg); }
747
- }
748
-
749
- .loading-state {
750
- display: flex;
751
- flex-direction: column;
752
- align-items: center;
753
- justify-content: center;
754
- gap: var(--p-space-3);
755
- padding: var(--p-space-12) var(--p-space-5);
756
- color: var(--p-color-text-secondary);
757
- }
758
-
759
- /* Skeleton loader */
760
- .skeleton {
761
- background: linear-gradient(90deg,
762
- var(--p-color-bg-surface-hover) 25%,
763
- var(--p-color-bg-surface-active) 50%,
764
- var(--p-color-bg-surface-hover) 75%
765
- );
766
- background-size: 200% 100%;
767
- animation: skeleton-pulse 1.5s ease-in-out infinite;
768
- border-radius: var(--p-radius-sm);
769
- }
770
-
771
- .skeleton-text {
772
- height: 14px;
773
- margin-bottom: var(--p-space-2);
774
- }
775
-
776
- .skeleton-text:last-child {
777
- width: 60%;
778
- }
779
-
780
- .skeleton-heading {
781
- height: 20px;
782
- width: 40%;
783
- margin-bottom: var(--p-space-3);
83
+ /* ── Data Tables (used in product detail modal) ────────────────── */
84
+ .table-container {
85
+ overflow-x: auto;
86
+ -webkit-overflow-scrolling: touch;
784
87
  }
785
88
 
786
- .skeleton-image {
89
+ table {
787
90
  width: 100%;
788
- aspect-ratio: 1;
789
- }
790
-
791
- @keyframes skeleton-pulse {
792
- 0% { background-position: 200% 0; }
793
- 100% { background-position: -200% 0; }
794
- }
795
-
796
-
797
- /* ── Stats / Metric Cards ──────────────────────────────────────── */
798
- .stats-grid {
799
- display: grid;
800
- grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
801
- gap: var(--p-space-4);
802
- margin-bottom: var(--p-space-4);
91
+ border-collapse: collapse;
92
+ font-size: 14px;
803
93
  }
804
94
 
805
- .stat-card {
806
- background: var(--p-color-bg-surface);
807
- border: 1px solid var(--p-color-border);
808
- border-radius: var(--p-radius-lg);
809
- padding: var(--p-space-5);
810
- box-shadow: var(--p-shadow-card);
95
+ thead th {
96
+ text-align: left;
97
+ padding: 12px 16px;
98
+ font-weight: 500;
99
+ font-size: 13px;
100
+ color: #6d7175;
101
+ background: #f6f6f7;
102
+ border-bottom: 1px solid #e1e3e5;
103
+ white-space: nowrap;
811
104
  }
812
105
 
813
- .stat-label {
814
- font-size: var(--p-font-size-base);
815
- font-weight: var(--p-font-weight-medium);
816
- color: var(--p-color-text-secondary);
817
- margin-bottom: var(--p-space-1);
106
+ tbody td {
107
+ padding: 12px 16px;
108
+ border-bottom: 1px solid #e1e3e5;
109
+ vertical-align: middle;
818
110
  }
819
111
 
820
- .stat-value {
821
- font-size: var(--p-font-size-2xl);
822
- font-weight: var(--p-font-weight-bold);
823
- color: var(--p-color-text);
824
- line-height: 1.2;
112
+ tbody tr:last-child td {
113
+ border-bottom: none;
825
114
  }
826
115
 
827
- .stat-change {
828
- font-size: var(--p-font-size-sm);
829
- margin-top: var(--p-space-1);
116
+ tbody tr:hover {
117
+ background: #f6f6f7;
830
118
  }
831
- .stat-change-positive { color: var(--p-color-text-success); }
832
- .stat-change-negative { color: var(--p-color-text-critical); }
833
-
834
119
 
835
- /* ── Code Blocks ───────────────────────────────────────────────── */
836
120
  code {
837
- font-family: var(--p-font-family-mono);
121
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
838
122
  font-size: 0.9em;
839
- background: var(--p-color-bg-surface-hover);
123
+ background: #f6f6f7;
840
124
  padding: 1px 5px;
841
- border-radius: var(--p-radius-sm);
842
- color: var(--p-color-text);
125
+ border-radius: 6px;
126
+ color: #1a1a1a;
843
127
  }
844
128
 
129
+
130
+ /* ── Code Blocks (demo page) ──────────────────────────────────── */
845
131
  pre {
846
- font-family: var(--p-font-family-mono);
847
- font-size: var(--p-font-size-base);
132
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
133
+ font-size: 13px;
848
134
  line-height: 1.6;
849
135
  background: #1e1e2e;
850
136
  color: #cdd6f4;
851
- padding: var(--p-space-4);
852
- border-radius: var(--p-radius-md);
137
+ padding: 16px;
138
+ border-radius: 8px;
853
139
  overflow-x: auto;
854
- margin: var(--p-space-3) 0;
140
+ margin: 12px 0;
855
141
  -webkit-overflow-scrolling: touch;
856
142
  }
857
143
 
@@ -863,9 +149,8 @@ pre code {
863
149
  border-radius: 0;
864
150
  }
865
151
 
866
- .code-block {
867
- position: relative;
868
- margin: var(--p-space-3) 0;
152
+ .demo-code {
153
+ margin-top: 12px;
869
154
  }
870
155
 
871
156
  .code-block-header {
@@ -873,28 +158,27 @@ pre code {
873
158
  align-items: center;
874
159
  justify-content: space-between;
875
160
  background: #181825;
876
- padding: var(--p-space-2) var(--p-space-4);
877
- border-radius: var(--p-radius-md) var(--p-radius-md) 0 0;
878
- font-size: var(--p-font-size-sm);
161
+ padding: 8px 16px;
162
+ border-radius: 8px 8px 0 0;
163
+ font-size: 12px;
879
164
  color: #a6adc8;
880
165
  }
881
166
 
882
167
  .code-block-header + pre {
883
168
  margin-top: 0;
884
- border-radius: 0 0 var(--p-radius-md) var(--p-radius-md);
169
+ border-radius: 0 0 8px 8px;
885
170
  }
886
171
 
887
172
  .btn-copy {
888
173
  background: transparent;
889
174
  border: 1px solid #45475a;
890
175
  color: #a6adc8;
891
- font-size: var(--p-font-size-sm);
176
+ font-size: 12px;
892
177
  padding: 2px 10px;
893
- border-radius: var(--p-radius-sm);
178
+ border-radius: 6px;
894
179
  cursor: pointer;
895
- font-family: var(--p-font-family);
896
- transition: background var(--p-duration-fast),
897
- color var(--p-duration-fast);
180
+ font-family: inherit;
181
+ transition: background 100ms, color 100ms;
898
182
  }
899
183
 
900
184
  .btn-copy:hover {
@@ -908,7 +192,7 @@ pre code {
908
192
  }
909
193
 
910
194
 
911
- /* ── Toast Fallback (non-embedded) ─────────────────────────────── */
195
+ /* ── Toast Fallback (non-embedded preview) ─────────────────────── */
912
196
  .toast-fallback {
913
197
  position: fixed;
914
198
  bottom: 20px;
@@ -917,13 +201,14 @@ pre code {
917
201
  background: #1a1a1a;
918
202
  color: #fff;
919
203
  padding: 10px 20px;
920
- border-radius: var(--p-radius-md);
921
- font-size: var(--p-font-size-base);
922
- font-weight: var(--p-font-weight-medium);
204
+ border-radius: 8px;
205
+ font-size: 13px;
206
+ font-weight: 500;
923
207
  z-index: 10000;
924
208
  opacity: 0;
925
- transition: transform 0.3s var(--p-ease), opacity 0.3s var(--p-ease);
926
- box-shadow: var(--p-shadow-lg);
209
+ transition: transform 0.3s cubic-bezier(0.25, 0.1, 0.25, 1),
210
+ opacity 0.3s cubic-bezier(0.25, 0.1, 0.25, 1);
211
+ box-shadow: 0 4px 12px rgba(0,0,0,0.08), 0 2px 6px rgba(0,0,0,0.04);
927
212
  max-width: 90%;
928
213
  text-align: center;
929
214
  }
@@ -934,364 +219,19 @@ pre code {
934
219
  }
935
220
 
936
221
  .toast-fallback.toast-error {
937
- background: var(--p-color-bg-critical-strong);
938
- }
939
-
940
-
941
- /* ── Info List / Description List ──────────────────────────────── */
942
- .info-list {
943
- list-style: none;
944
- }
945
-
946
- .info-list li {
947
- display: flex;
948
- justify-content: space-between;
949
- align-items: center;
950
- padding: var(--p-space-3) 0;
951
- border-bottom: 1px solid var(--p-color-border);
952
- gap: var(--p-space-4);
953
- }
954
-
955
- .info-list li:last-child {
956
- border-bottom: none;
957
- }
958
-
959
- .info-list-label {
960
- font-weight: var(--p-font-weight-medium);
961
- color: var(--p-color-text-secondary);
962
- font-size: var(--p-font-size-base);
963
- flex-shrink: 0;
964
- }
965
-
966
- .info-list-value {
967
- color: var(--p-color-text);
968
- text-align: right;
969
- word-break: break-word;
970
- }
971
-
972
-
973
- /* ── Quick Links Grid ──────────────────────────────────────────── */
974
- .quick-links {
975
- display: grid;
976
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
977
- gap: var(--p-space-3);
978
- }
979
-
980
- .quick-link {
981
- display: flex;
982
- align-items: center;
983
- gap: var(--p-space-3);
984
- padding: var(--p-space-4);
985
- border: 1px solid var(--p-color-border);
986
- border-radius: var(--p-radius-lg);
987
- background: var(--p-color-bg-surface);
988
- cursor: pointer;
989
- transition: background var(--p-duration-fast),
990
- border-color var(--p-duration-fast),
991
- box-shadow var(--p-duration-fast);
992
- text-decoration: none;
993
- color: var(--p-color-text);
994
- }
995
-
996
- .quick-link:hover {
997
- background: var(--p-color-bg-surface-hover);
998
- border-color: var(--p-color-border-hover);
999
- box-shadow: var(--p-shadow-sm);
1000
- text-decoration: none;
1001
- }
1002
-
1003
- .quick-link-icon {
1004
- font-size: 24px;
1005
- flex-shrink: 0;
1006
- width: 40px;
1007
- height: 40px;
1008
- display: flex;
1009
- align-items: center;
1010
- justify-content: center;
1011
- border-radius: var(--p-radius-md);
1012
- background: var(--p-color-primary-subdued);
1013
- }
1014
-
1015
- .quick-link-text h4 {
1016
- font-size: var(--p-font-size-md);
1017
- font-weight: var(--p-font-weight-semibold);
1018
- margin-bottom: 2px;
1019
- }
1020
-
1021
- .quick-link-text p {
1022
- font-size: var(--p-font-size-sm);
1023
- color: var(--p-color-text-secondary);
1024
- margin: 0;
1025
- }
1026
-
1027
-
1028
- /* ── Demo Sections (Polaris component page) ────────────────────── */
1029
- .demo-section {
1030
- margin-bottom: var(--p-space-8);
1031
- }
1032
-
1033
- .demo-section-title {
1034
- font-size: var(--p-font-size-xl);
1035
- font-weight: var(--p-font-weight-bold);
1036
- margin-bottom: var(--p-space-2);
1037
- color: var(--p-color-text);
1038
- padding-bottom: var(--p-space-3);
1039
- border-bottom: 2px solid var(--p-color-border);
1040
- }
1041
-
1042
- .demo-block {
1043
- background: var(--p-color-bg-surface);
1044
- border: 1px solid var(--p-color-border);
1045
- border-radius: var(--p-radius-lg);
1046
- margin-bottom: var(--p-space-4);
1047
- overflow: hidden;
1048
- }
1049
-
1050
- .demo-block-title {
1051
- font-size: var(--p-font-size-md);
1052
- font-weight: var(--p-font-weight-semibold);
1053
- padding: var(--p-space-4) var(--p-space-5);
1054
- border-bottom: 1px solid var(--p-color-border);
1055
- background: var(--p-color-bg-surface-hover);
1056
- }
1057
-
1058
- .demo-preview {
1059
- padding: var(--p-space-5);
1060
- }
1061
-
1062
- .demo-code {
1063
- border-top: 1px solid var(--p-color-border);
1064
- }
1065
-
1066
- .demo-code pre {
1067
- margin: 0;
1068
- border-radius: 0;
1069
- }
1070
-
1071
- .demo-description {
1072
- font-size: var(--p-font-size-base);
1073
- color: var(--p-color-text-secondary);
1074
- padding: 0 var(--p-space-5) var(--p-space-3);
1075
- }
1076
-
1077
-
1078
- /* ── Collapsible ───────────────────────────────────────────────── */
1079
- .collapsible-trigger {
1080
- width: 100%;
1081
- display: flex;
1082
- align-items: center;
1083
- justify-content: space-between;
1084
- padding: var(--p-space-4) var(--p-space-5);
1085
- background: var(--p-color-bg-surface-hover);
1086
- border: none;
1087
- border-bottom: 1px solid var(--p-color-border);
1088
- cursor: pointer;
1089
- font-family: var(--p-font-family);
1090
- font-size: var(--p-font-size-md);
1091
- font-weight: var(--p-font-weight-semibold);
1092
- color: var(--p-color-text);
1093
- text-align: left;
1094
- }
1095
-
1096
- .collapsible-trigger:hover {
1097
- background: var(--p-color-bg-surface-active);
1098
- }
1099
-
1100
- .collapsible-trigger::after {
1101
- content: "\25BC";
1102
- font-size: 10px;
1103
- transition: transform var(--p-duration-base) var(--p-ease);
1104
- color: var(--p-color-text-secondary);
1105
- }
1106
-
1107
- .collapsible-trigger.collapsed::after {
1108
- transform: rotate(-90deg);
1109
- }
1110
-
1111
- .collapsible-content {
1112
- overflow: hidden;
1113
- transition: max-height 0.3s var(--p-ease);
1114
- }
1115
-
1116
- .collapsible-content.collapsed {
1117
- max-height: 0 !important;
222
+ background: #d72c0d;
1118
223
  }
1119
224
 
1120
225
 
1121
- /* ── Search Input ──────────────────────────────────────────────── */
1122
- .search-wrapper {
1123
- position: relative;
1124
- margin-bottom: var(--p-space-5);
1125
- }
1126
-
1127
- .search-icon {
1128
- position: absolute;
1129
- left: 12px;
1130
- top: 50%;
1131
- transform: translateY(-50%);
1132
- color: var(--p-color-text-disabled);
1133
- pointer-events: none;
1134
- font-size: 16px;
1135
- }
1136
-
1137
- .search-input {
1138
- width: 100%;
1139
- padding: 10px 12px 10px 36px;
1140
- border: 1px solid var(--p-color-border-hover);
1141
- border-radius: var(--p-radius-md);
1142
- font-family: var(--p-font-family);
1143
- font-size: var(--p-font-size-md);
1144
- color: var(--p-color-text);
1145
- background: var(--p-color-bg-surface);
1146
- transition: border-color var(--p-duration-fast),
1147
- box-shadow var(--p-duration-fast);
1148
- }
1149
-
1150
- .search-input:focus {
1151
- outline: none;
1152
- border-color: var(--p-color-border-focus);
1153
- box-shadow: 0 0 0 1px var(--p-color-border-focus);
1154
- }
1155
-
1156
-
1157
- /* ── Responsive ────────────────────────────────────────────────── */
226
+ /* ── Responsive ───────────────────────────────────────────────── */
1158
227
  @media (max-width: 768px) {
1159
- .page,
1160
- .page-narrow,
1161
- .page-wide {
1162
- padding: var(--p-space-4) var(--p-space-3);
1163
- }
1164
-
1165
- .stats-grid {
1166
- grid-template-columns: repeat(2, 1fr);
1167
- }
1168
-
1169
228
  .product-grid {
1170
229
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
1171
230
  }
1172
-
1173
- .card-grid {
1174
- grid-template-columns: 1fr;
1175
- }
1176
-
1177
- .quick-links {
1178
- grid-template-columns: 1fr;
1179
- }
1180
-
1181
- table {
1182
- font-size: var(--p-font-size-base);
1183
- }
1184
-
1185
- thead th,
1186
- tbody td {
1187
- padding: var(--p-space-2) var(--p-space-3);
1188
- }
1189
231
  }
1190
232
 
1191
233
  @media (max-width: 480px) {
1192
- .stats-grid {
1193
- grid-template-columns: 1fr;
1194
- }
1195
-
1196
234
  .product-grid {
1197
235
  grid-template-columns: 1fr;
1198
236
  }
1199
-
1200
- .btn-group {
1201
- flex-direction: column;
1202
- align-items: stretch;
1203
- }
1204
-
1205
- .btn-group .btn {
1206
- justify-content: center;
1207
- }
1208
-
1209
- .page-header {
1210
- flex-direction: column;
1211
- align-items: flex-start;
1212
- }
1213
- }
1214
-
1215
-
1216
- /* ── Utility Classes ───────────────────────────────────────────── */
1217
- /* Margins */
1218
- .mt-0 { margin-top: 0; }
1219
- .mt-1 { margin-top: var(--p-space-1); }
1220
- .mt-2 { margin-top: var(--p-space-2); }
1221
- .mt-3 { margin-top: var(--p-space-3); }
1222
- .mt-4 { margin-top: var(--p-space-4); }
1223
- .mt-5 { margin-top: var(--p-space-5); }
1224
- .mt-6 { margin-top: var(--p-space-6); }
1225
- .mt-8 { margin-top: var(--p-space-8); }
1226
-
1227
- .mb-0 { margin-bottom: 0; }
1228
- .mb-1 { margin-bottom: var(--p-space-1); }
1229
- .mb-2 { margin-bottom: var(--p-space-2); }
1230
- .mb-3 { margin-bottom: var(--p-space-3); }
1231
- .mb-4 { margin-bottom: var(--p-space-4); }
1232
- .mb-5 { margin-bottom: var(--p-space-5); }
1233
- .mb-6 { margin-bottom: var(--p-space-6); }
1234
- .mb-8 { margin-bottom: var(--p-space-8); }
1235
-
1236
- /* Padding */
1237
- .p-0 { padding: 0; }
1238
- .p-3 { padding: var(--p-space-3); }
1239
- .p-4 { padding: var(--p-space-4); }
1240
- .p-5 { padding: var(--p-space-5); }
1241
-
1242
- /* Text */
1243
- .text-center { text-align: center; }
1244
- .text-right { text-align: right; }
1245
- .text-left { text-align: left; }
1246
-
1247
- .text-sm { font-size: var(--p-font-size-sm); }
1248
- .text-base { font-size: var(--p-font-size-base); }
1249
- .text-md { font-size: var(--p-font-size-md); }
1250
- .text-lg { font-size: var(--p-font-size-lg); }
1251
- .text-xl { font-size: var(--p-font-size-xl); }
1252
-
1253
- .text-secondary { color: var(--p-color-text-secondary); }
1254
- .text-success { color: var(--p-color-text-success); }
1255
- .text-warning { color: var(--p-color-text-warning); }
1256
- .text-critical { color: var(--p-color-text-critical); }
1257
-
1258
- .font-medium { font-weight: var(--p-font-weight-medium); }
1259
- .font-semibold { font-weight: var(--p-font-weight-semibold); }
1260
- .font-bold { font-weight: var(--p-font-weight-bold); }
1261
-
1262
- /* Flexbox */
1263
- .flex { display: flex; }
1264
- .flex-col { flex-direction: column; }
1265
- .flex-wrap { flex-wrap: wrap; }
1266
- .items-center { align-items: center; }
1267
- .items-start { align-items: flex-start; }
1268
- .justify-between { justify-content: space-between; }
1269
- .justify-center { justify-content: center; }
1270
- .justify-end { justify-content: flex-end; }
1271
- .gap-1 { gap: var(--p-space-1); }
1272
- .gap-2 { gap: var(--p-space-2); }
1273
- .gap-3 { gap: var(--p-space-3); }
1274
- .gap-4 { gap: var(--p-space-4); }
1275
- .gap-5 { gap: var(--p-space-5); }
1276
-
1277
- /* Display */
1278
- .hidden { display: none; }
1279
- .block { display: block; }
1280
- .inline { display: inline; }
1281
-
1282
- /* Sizing */
1283
- .w-full { width: 100%; }
1284
-
1285
- /* Overflow */
1286
- .truncate {
1287
- overflow: hidden;
1288
- text-overflow: ellipsis;
1289
- white-space: nowrap;
1290
- }
1291
-
1292
- /* Divider */
1293
- .divider {
1294
- border: none;
1295
- border-top: 1px solid var(--p-color-border);
1296
- margin: var(--p-space-4) 0;
1297
237
  }