@pitvox/partner-react 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -1138,6 +1138,111 @@
1138
1138
  white-space: nowrap;
1139
1139
  }
1140
1140
 
1141
+ /* ─── Results view header ──────────────────────────────────────── */
1142
+
1143
+ .pvx-comp-results-header {
1144
+ display: flex;
1145
+ flex-wrap: wrap;
1146
+ align-items: flex-start;
1147
+ justify-content: space-between;
1148
+ gap: 1rem;
1149
+ }
1150
+
1151
+ .pvx-comp-results-cta {
1152
+ display: flex;
1153
+ flex-direction: column;
1154
+ align-items: flex-end;
1155
+ gap: 0.5rem;
1156
+ flex-shrink: 0;
1157
+ }
1158
+
1159
+ .pvx-comp-empty-sub {
1160
+ font-size: 0.875rem;
1161
+ color: var(--pvx-text-dimmed);
1162
+ margin-top: 0.5rem;
1163
+ }
1164
+
1165
+ /* ─── Accordion (round results) ────────────────────────────────── */
1166
+
1167
+ .pvx-comp-accordion {
1168
+ display: flex;
1169
+ flex-direction: column;
1170
+ gap: 0.75rem;
1171
+ padding: 1rem;
1172
+ }
1173
+
1174
+ .pvx-accordion-item {
1175
+ border-radius: var(--pvx-radius-sm);
1176
+ background: var(--pvx-tag-bg);
1177
+ overflow: hidden;
1178
+ }
1179
+
1180
+ .pvx-accordion-toggle {
1181
+ width: 100%;
1182
+ display: flex;
1183
+ align-items: center;
1184
+ justify-content: space-between;
1185
+ gap: 0.75rem;
1186
+ padding: 1rem 1.25rem;
1187
+ border: none;
1188
+ background: none;
1189
+ cursor: pointer;
1190
+ text-align: left;
1191
+ color: var(--pvx-text);
1192
+ transition: background 150ms;
1193
+ }
1194
+
1195
+ .pvx-accordion-toggle:hover {
1196
+ background: var(--pvx-bg-hover);
1197
+ }
1198
+
1199
+ .pvx-accordion-toggle-content {
1200
+ flex: 1;
1201
+ min-width: 0;
1202
+ }
1203
+
1204
+ .pvx-accordion-toggle-title {
1205
+ display: flex;
1206
+ align-items: baseline;
1207
+ flex-wrap: wrap;
1208
+ gap: 0.75rem;
1209
+ }
1210
+
1211
+ .pvx-accordion-round-label {
1212
+ font-weight: 600;
1213
+ color: var(--pvx-text-primary);
1214
+ }
1215
+
1216
+ .pvx-accordion-round-date {
1217
+ font-size: 0.875rem;
1218
+ color: var(--pvx-text-muted);
1219
+ }
1220
+
1221
+ .pvx-accordion-podium {
1222
+ display: flex;
1223
+ align-items: center;
1224
+ gap: 0.75rem;
1225
+ margin-top: 0.375rem;
1226
+ font-size: 0.75rem;
1227
+ color: var(--pvx-text-muted);
1228
+ }
1229
+
1230
+ .pvx-accordion-chevron {
1231
+ width: 1.25rem;
1232
+ height: 1.25rem;
1233
+ flex-shrink: 0;
1234
+ color: var(--pvx-text-muted);
1235
+ transition: transform 300ms;
1236
+ }
1237
+
1238
+ .pvx-accordion-chevron--open {
1239
+ transform: rotate(180deg);
1240
+ }
1241
+
1242
+ .pvx-accordion-content {
1243
+ padding: 0 1.25rem 1.25rem;
1244
+ }
1245
+
1141
1246
  /* ─── Registration CTA ───────────────────────────────────────── */
1142
1247
 
1143
1248
  .pvx-comp-register-cta {
@@ -1182,6 +1287,280 @@
1182
1287
  cursor: not-allowed;
1183
1288
  }
1184
1289
 
1290
+ /* ─── Card registration action row ─────────────────────────────── */
1291
+
1292
+ .pvx-comp-card-reg-info {
1293
+ display: flex;
1294
+ align-items: center;
1295
+ gap: 0.5rem;
1296
+ }
1297
+
1298
+ .pvx-comp-card-reg-action {
1299
+ flex-shrink: 0;
1300
+ }
1301
+
1302
+ .pvx-comp-card-reg-btn {
1303
+ display: inline-block;
1304
+ padding: 0.25rem 0.75rem;
1305
+ border-radius: var(--pvx-radius-sm);
1306
+ font-size: 0.75rem;
1307
+ font-weight: 600;
1308
+ border: none;
1309
+ cursor: pointer;
1310
+ text-decoration: none;
1311
+ transition: all 150ms;
1312
+ }
1313
+
1314
+ .pvx-comp-card-reg-btn--open {
1315
+ background: var(--pvx-accent);
1316
+ color: #fff;
1317
+ }
1318
+
1319
+ .pvx-comp-card-reg-btn--open:hover {
1320
+ background: var(--pvx-accent-hover);
1321
+ }
1322
+
1323
+ .pvx-comp-card-reg-btn--registered {
1324
+ background: rgba(34, 197, 94, 0.2);
1325
+ color: #4ade80;
1326
+ }
1327
+
1328
+ .pvx-comp-card-reg-btn--registered:hover {
1329
+ background: rgba(34, 197, 94, 0.3);
1330
+ }
1331
+
1332
+ .pvx-comp-card-reg-btn--closed {
1333
+ background: rgba(107, 114, 128, 0.2);
1334
+ color: #9ca3af;
1335
+ cursor: default;
1336
+ }
1337
+
1338
+ /* ─── Capacity badge ───────────────────────────────────────────── */
1339
+
1340
+ .pvx-reg-capacity {
1341
+ display: inline-block;
1342
+ padding: 0.125rem 0.5rem;
1343
+ border-radius: 9999px;
1344
+ font-size: 0.6875rem;
1345
+ font-weight: 600;
1346
+ }
1347
+
1348
+ .pvx-reg-capacity--ok {
1349
+ background: rgba(34, 197, 94, 0.2);
1350
+ color: #4ade80;
1351
+ }
1352
+
1353
+ .pvx-reg-capacity--warning {
1354
+ background: rgba(245, 158, 11, 0.2);
1355
+ color: #fbbf24;
1356
+ }
1357
+
1358
+ .pvx-reg-capacity--full {
1359
+ background: rgba(239, 68, 68, 0.2);
1360
+ color: #f87171;
1361
+ }
1362
+
1363
+ /* ─── Registration Panel ───────────────────────────────────────── */
1364
+
1365
+ .pvx-reg-panel {
1366
+ display: flex;
1367
+ flex-direction: column;
1368
+ gap: 1rem;
1369
+ }
1370
+
1371
+ .pvx-reg-status-msg {
1372
+ text-align: center;
1373
+ padding: 2rem 1rem;
1374
+ color: var(--pvx-text-muted);
1375
+ font-size: 0.9375rem;
1376
+ }
1377
+
1378
+ .pvx-reg-no-drivers {
1379
+ text-align: center;
1380
+ padding: 1.5rem 1rem;
1381
+ color: var(--pvx-text-muted);
1382
+ font-size: 0.875rem;
1383
+ }
1384
+
1385
+ /* ─── Registration Form ────────────────────────────────────────── */
1386
+
1387
+ .pvx-reg-form {
1388
+ display: flex;
1389
+ flex-direction: column;
1390
+ gap: 1rem;
1391
+ max-width: 32rem;
1392
+ }
1393
+
1394
+ .pvx-reg-form-header {
1395
+ display: flex;
1396
+ align-items: center;
1397
+ justify-content: space-between;
1398
+ gap: 0.75rem;
1399
+ }
1400
+
1401
+ .pvx-reg-form-title {
1402
+ font-size: 1.125rem;
1403
+ font-weight: 600;
1404
+ color: var(--pvx-text-primary);
1405
+ margin: 0;
1406
+ }
1407
+
1408
+ .pvx-reg-error {
1409
+ padding: 0.625rem 0.75rem;
1410
+ border-radius: var(--pvx-radius-sm);
1411
+ background: rgba(239, 68, 68, 0.15);
1412
+ color: #f87171;
1413
+ font-size: 0.8125rem;
1414
+ border: 1px solid rgba(239, 68, 68, 0.3);
1415
+ }
1416
+
1417
+ .pvx-reg-field {
1418
+ display: flex;
1419
+ flex-direction: column;
1420
+ gap: 0.375rem;
1421
+ }
1422
+
1423
+ .pvx-reg-label {
1424
+ font-size: 0.8125rem;
1425
+ font-weight: 500;
1426
+ color: var(--pvx-text);
1427
+ }
1428
+
1429
+ .pvx-reg-optional {
1430
+ font-weight: 400;
1431
+ color: var(--pvx-text-muted);
1432
+ }
1433
+
1434
+ .pvx-reg-input,
1435
+ .pvx-reg-select,
1436
+ .pvx-reg-textarea {
1437
+ padding: 0.5rem 0.75rem;
1438
+ border-radius: var(--pvx-radius-sm);
1439
+ border: 1px solid var(--pvx-border);
1440
+ background: var(--pvx-tag-bg);
1441
+ color: var(--pvx-text);
1442
+ font-size: 0.875rem;
1443
+ font-family: inherit;
1444
+ transition: border-color 150ms;
1445
+ }
1446
+
1447
+ .pvx-reg-input:focus,
1448
+ .pvx-reg-select:focus,
1449
+ .pvx-reg-textarea:focus {
1450
+ outline: none;
1451
+ border-color: var(--pvx-accent);
1452
+ }
1453
+
1454
+ .pvx-reg-textarea {
1455
+ resize: vertical;
1456
+ min-height: 4rem;
1457
+ }
1458
+
1459
+ .pvx-reg-actions {
1460
+ display: flex;
1461
+ align-items: center;
1462
+ gap: 0.75rem;
1463
+ padding-top: 0.5rem;
1464
+ }
1465
+
1466
+ /* ─── Unregister / Confirm ─────────────────────────────────────── */
1467
+
1468
+ .pvx-reg-unregister-btn {
1469
+ padding: 0.5rem 1.25rem;
1470
+ border-radius: var(--pvx-radius-sm);
1471
+ font-size: 0.875rem;
1472
+ font-weight: 500;
1473
+ border: 1px solid var(--pvx-border);
1474
+ cursor: pointer;
1475
+ background: transparent;
1476
+ color: var(--pvx-text-muted);
1477
+ transition: all 150ms;
1478
+ }
1479
+
1480
+ .pvx-reg-unregister-btn:hover {
1481
+ border-color: var(--pvx-invalid);
1482
+ color: var(--pvx-invalid);
1483
+ }
1484
+
1485
+ .pvx-reg-confirm {
1486
+ display: flex;
1487
+ flex-direction: column;
1488
+ gap: 0.75rem;
1489
+ padding: 0.75rem;
1490
+ border-radius: var(--pvx-radius-sm);
1491
+ background: rgba(239, 68, 68, 0.1);
1492
+ border: 1px solid rgba(239, 68, 68, 0.3);
1493
+ }
1494
+
1495
+ .pvx-reg-confirm-text {
1496
+ font-size: 0.875rem;
1497
+ color: var(--pvx-text);
1498
+ margin: 0;
1499
+ }
1500
+
1501
+ .pvx-reg-confirm-actions {
1502
+ display: flex;
1503
+ gap: 0.5rem;
1504
+ }
1505
+
1506
+ .pvx-reg-cancel-btn {
1507
+ padding: 0.375rem 1rem;
1508
+ border-radius: var(--pvx-radius-sm);
1509
+ font-size: 0.8125rem;
1510
+ font-weight: 500;
1511
+ border: 1px solid var(--pvx-border);
1512
+ cursor: pointer;
1513
+ background: transparent;
1514
+ color: var(--pvx-text);
1515
+ transition: all 150ms;
1516
+ }
1517
+
1518
+ .pvx-reg-cancel-btn:hover {
1519
+ border-color: var(--pvx-text-muted);
1520
+ }
1521
+
1522
+ .pvx-reg-danger-btn {
1523
+ padding: 0.375rem 1rem;
1524
+ border-radius: var(--pvx-radius-sm);
1525
+ font-size: 0.8125rem;
1526
+ font-weight: 500;
1527
+ border: none;
1528
+ cursor: pointer;
1529
+ background: rgba(239, 68, 68, 0.8);
1530
+ color: #fff;
1531
+ transition: background 150ms;
1532
+ }
1533
+
1534
+ .pvx-reg-danger-btn:hover {
1535
+ background: rgba(239, 68, 68, 1);
1536
+ }
1537
+
1538
+ .pvx-reg-danger-btn:disabled {
1539
+ opacity: 0.5;
1540
+ cursor: not-allowed;
1541
+ }
1542
+
1543
+ /* ─── Entry card — current user highlight ──────────────────────── */
1544
+
1545
+ .pvx-entry-card--you {
1546
+ border-color: var(--pvx-accent);
1547
+ background: rgba(99, 102, 241, 0.1);
1548
+ }
1549
+
1550
+ .pvx-entry-you {
1551
+ font-size: 0.75rem;
1552
+ color: var(--pvx-accent);
1553
+ font-weight: 400;
1554
+ }
1555
+
1556
+ /* ─── Driver list in registration panel ────────────────────────── */
1557
+
1558
+ .pvx-reg-driver-list {
1559
+ display: grid;
1560
+ grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
1561
+ gap: 0.75rem;
1562
+ }
1563
+
1185
1564
  /* ═══════════════════════════════════════════════════════════════════════════
1186
1565
  Driver Dashboard Components
1187
1566
  ═══════════════════════════════════════════════════════════════════════════ */
@@ -1194,6 +1573,24 @@
1194
1573
  gap: 1.5rem;
1195
1574
  }
1196
1575
 
1576
+ .pvx-dash-row {
1577
+ display: flex;
1578
+ flex-direction: column;
1579
+ gap: 1.5rem;
1580
+ }
1581
+
1582
+ .pvx-dash-row--2col {
1583
+ display: grid;
1584
+ grid-template-columns: 1fr 1fr;
1585
+ gap: 1.5rem;
1586
+ }
1587
+
1588
+ @media (max-width: 768px) {
1589
+ .pvx-dash-row--2col {
1590
+ grid-template-columns: 1fr;
1591
+ }
1592
+ }
1593
+
1197
1594
  /* ─── Driver profile card ──────────────────────────────────────── */
1198
1595
 
1199
1596
  .pvx-dash-profile {
@@ -1246,7 +1643,7 @@
1246
1643
  .pvx-dash-stats {
1247
1644
  display: grid;
1248
1645
  grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
1249
- gap: 0.75rem;
1646
+ gap: 1.5rem;
1250
1647
  }
1251
1648
 
1252
1649
  .pvx-dash-stat-card {
@@ -1381,6 +1778,8 @@
1381
1778
  .pvx-dash-records-list {
1382
1779
  display: flex;
1383
1780
  flex-direction: column;
1781
+ max-height: 24rem;
1782
+ overflow-y: auto;
1384
1783
  }
1385
1784
 
1386
1785
  .pvx-dash-record-row {
@@ -1434,23 +1833,6 @@
1434
1833
  color: var(--pvx-text-primary);
1435
1834
  }
1436
1835
 
1437
- .pvx-dash-records-toggle {
1438
- display: block;
1439
- width: 100%;
1440
- padding: 0.625rem 1rem;
1441
- border: none;
1442
- border-top: 1px solid var(--pvx-border);
1443
- background: transparent;
1444
- color: var(--pvx-accent);
1445
- font-size: 0.8125rem;
1446
- font-weight: 500;
1447
- cursor: pointer;
1448
- transition: color 150ms;
1449
- }
1450
-
1451
- .pvx-dash-records-toggle:hover {
1452
- color: var(--pvx-accent-hover);
1453
- }
1454
1836
 
1455
1837
  /* ─── Game badge ───────────────────────────────────────────────── */
1456
1838
 
@@ -1472,3 +1854,217 @@
1472
1854
  background: rgba(245, 158, 11, 0.2);
1473
1855
  color: #fbbf24;
1474
1856
  }
1857
+
1858
+ /* ═══════════════════════════════════════════════════════════════════
1859
+ Upcoming Events
1860
+ ═══════════════════════════════════════════════════════════════════ */
1861
+
1862
+ .pvx-upcoming-list {
1863
+ display: flex;
1864
+ flex-direction: column;
1865
+ }
1866
+
1867
+ .pvx-upcoming-item {
1868
+ display: flex;
1869
+ justify-content: space-between;
1870
+ align-items: center;
1871
+ padding: 0.75rem 1rem;
1872
+ gap: 1rem;
1873
+ }
1874
+
1875
+ .pvx-upcoming-item + .pvx-upcoming-item {
1876
+ border-top: 1px solid rgba(31, 41, 55, 0.5);
1877
+ }
1878
+
1879
+ .pvx-upcoming-item--next {
1880
+ background: rgba(99, 102, 241, 0.06);
1881
+ }
1882
+
1883
+ .pvx-upcoming-info {
1884
+ display: flex;
1885
+ flex-direction: column;
1886
+ gap: 0.125rem;
1887
+ min-width: 0;
1888
+ }
1889
+
1890
+ .pvx-upcoming-comp {
1891
+ font-size: 0.75rem;
1892
+ color: var(--pvx-text-muted);
1893
+ overflow: hidden;
1894
+ text-overflow: ellipsis;
1895
+ white-space: nowrap;
1896
+ }
1897
+
1898
+ .pvx-upcoming-round {
1899
+ font-weight: 600;
1900
+ font-size: 0.9375rem;
1901
+ color: var(--pvx-text);
1902
+ }
1903
+
1904
+ .pvx-upcoming-time {
1905
+ display: flex;
1906
+ flex-direction: column;
1907
+ align-items: flex-end;
1908
+ gap: 0.125rem;
1909
+ flex-shrink: 0;
1910
+ }
1911
+
1912
+ .pvx-upcoming-date {
1913
+ font-size: 0.8125rem;
1914
+ color: var(--pvx-text-muted);
1915
+ white-space: nowrap;
1916
+ }
1917
+
1918
+ .pvx-upcoming-relative {
1919
+ font-size: 0.75rem;
1920
+ color: var(--pvx-accent);
1921
+ font-weight: 500;
1922
+ }
1923
+
1924
+ .pvx-upcoming-badge {
1925
+ display: inline-block;
1926
+ padding: 0.0625rem 0.375rem;
1927
+ border-radius: 999px;
1928
+ font-size: 0.625rem;
1929
+ font-weight: 700;
1930
+ text-transform: uppercase;
1931
+ letter-spacing: 0.05em;
1932
+ background: var(--pvx-accent);
1933
+ color: #fff;
1934
+ }
1935
+
1936
+ /* ═══════════════════════════════════════════════════════════════════
1937
+ Notifications
1938
+ ═══════════════════════════════════════════════════════════════════ */
1939
+
1940
+ .pvx-notif-badge {
1941
+ display: inline-flex;
1942
+ align-items: center;
1943
+ justify-content: center;
1944
+ min-width: 1.25rem;
1945
+ height: 1.25rem;
1946
+ padding: 0 0.375rem;
1947
+ border-radius: 999px;
1948
+ font-size: 0.6875rem;
1949
+ font-weight: 700;
1950
+ background: var(--pvx-accent);
1951
+ color: #fff;
1952
+ margin-left: 0.375rem;
1953
+ }
1954
+
1955
+ .pvx-notif-mark-all {
1956
+ font-size: 0.75rem;
1957
+ color: var(--pvx-accent);
1958
+ background: none;
1959
+ border: none;
1960
+ cursor: pointer;
1961
+ padding: 0.25rem 0.5rem;
1962
+ border-radius: 0.25rem;
1963
+ transition: background 0.15s;
1964
+ }
1965
+
1966
+ .pvx-notif-mark-all:hover {
1967
+ background: rgba(99, 102, 241, 0.1);
1968
+ }
1969
+
1970
+ .pvx-notif-empty {
1971
+ padding: 1.5rem 1rem;
1972
+ text-align: center;
1973
+ color: var(--pvx-text-dimmed);
1974
+ font-size: 0.875rem;
1975
+ }
1976
+
1977
+ .pvx-notif-list {
1978
+ display: flex;
1979
+ flex-direction: column;
1980
+ max-height: 24rem;
1981
+ overflow-y: auto;
1982
+ }
1983
+
1984
+ .pvx-notif-item {
1985
+ display: flex;
1986
+ align-items: flex-start;
1987
+ gap: 0.75rem;
1988
+ padding: 0.75rem 1rem;
1989
+ border: none;
1990
+ background: none;
1991
+ cursor: pointer;
1992
+ text-align: left;
1993
+ width: 100%;
1994
+ transition: background 0.15s;
1995
+ }
1996
+
1997
+ .pvx-notif-item + .pvx-notif-item {
1998
+ border-top: 1px solid rgba(31, 41, 55, 0.5);
1999
+ }
2000
+
2001
+ .pvx-notif-item:hover {
2002
+ background: rgba(255, 255, 255, 0.03);
2003
+ }
2004
+
2005
+ .pvx-notif-item--unread {
2006
+ background: rgba(99, 102, 241, 0.06);
2007
+ }
2008
+
2009
+ .pvx-notif-item--unread:hover {
2010
+ background: rgba(99, 102, 241, 0.1);
2011
+ }
2012
+
2013
+ .pvx-notif-icon {
2014
+ display: flex;
2015
+ align-items: center;
2016
+ justify-content: center;
2017
+ width: 2rem;
2018
+ height: 2rem;
2019
+ border-radius: 50%;
2020
+ flex-shrink: 0;
2021
+ margin-top: 0.125rem;
2022
+ }
2023
+
2024
+ .pvx-notif-icon svg {
2025
+ width: 1rem;
2026
+ height: 1rem;
2027
+ }
2028
+
2029
+ .pvx-notif-icon--record {
2030
+ background: rgba(34, 197, 94, 0.15);
2031
+ color: #22c55e;
2032
+ }
2033
+
2034
+ .pvx-notif-icon--beaten {
2035
+ background: rgba(239, 68, 68, 0.15);
2036
+ color: #ef4444;
2037
+ }
2038
+
2039
+ .pvx-notif-icon--admin {
2040
+ background: rgba(59, 130, 246, 0.15);
2041
+ color: #3b82f6;
2042
+ }
2043
+
2044
+ .pvx-notif-content {
2045
+ display: flex;
2046
+ flex-direction: column;
2047
+ gap: 0.125rem;
2048
+ min-width: 0;
2049
+ flex: 1;
2050
+ }
2051
+
2052
+ .pvx-notif-message {
2053
+ font-size: 0.875rem;
2054
+ color: var(--pvx-text);
2055
+ line-height: 1.4;
2056
+ }
2057
+
2058
+ .pvx-notif-time {
2059
+ font-size: 0.75rem;
2060
+ color: var(--pvx-text-dimmed);
2061
+ }
2062
+
2063
+ .pvx-notif-dot {
2064
+ width: 0.5rem;
2065
+ height: 0.5rem;
2066
+ border-radius: 50%;
2067
+ background: var(--pvx-accent);
2068
+ flex-shrink: 0;
2069
+ margin-top: 0.375rem;
2070
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pitvox/partner-react",
3
- "version": "0.3.0",
4
- "description": "React hooks, components, and drop-in leaderboard + competition experiences for PitVox partner websites",
3
+ "version": "0.5.0",
4
+ "description": "React hooks and styled components for PitVox partner websites — leaderboards, competitions, driver dashboards",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
7
7
  "module": "dist/index.js",
@@ -23,8 +23,7 @@
23
23
  "peerDependencies": {
24
24
  "react": "^18.0.0 || ^19.0.0",
25
25
  "react-dom": "^18.0.0 || ^19.0.0",
26
- "@tanstack/react-query": "^5.0.0",
27
- "react-router-dom": "^6.0.0 || ^7.0.0"
26
+ "@tanstack/react-query": "^5.0.0"
28
27
  },
29
28
  "devDependencies": {
30
29
  "react": "^19.0.0",