@pitchfork-ui/react 0.6.0 → 0.8.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.
Files changed (49) hide show
  1. package/dist/components/AvatarGroup/AvatarGroup.css +26 -0
  2. package/dist/components/AvatarGroup/AvatarGroup2.js +37 -0
  3. package/dist/components/Calendar/Calendar.css +0 -1
  4. package/dist/components/Combobox/Combobox.css +155 -0
  5. package/dist/components/Combobox/Combobox2.js +191 -0
  6. package/dist/components/CommandPalette/CommandPalette.css +225 -0
  7. package/dist/components/CommandPalette/CommandPalette2.js +195 -0
  8. package/dist/components/DateRangePicker/DateRangePicker.css +258 -0
  9. package/dist/components/DateRangePicker/DateRangePicker2.js +378 -0
  10. package/dist/components/Heatmap/Heatmap.css +4 -0
  11. package/dist/components/Icon/Icon2.js +43 -0
  12. package/dist/components/Kbd/Kbd.css +25 -0
  13. package/dist/components/Kbd/Kbd2.js +17 -0
  14. package/dist/components/NumberInput/NumberInput.css +98 -0
  15. package/dist/components/NumberInput/NumberInput2.js +165 -0
  16. package/dist/components/Pagination/Pagination.css +5 -2
  17. package/dist/components/Popover/Popover.css +46 -0
  18. package/dist/components/Popover/Popover2.js +76 -0
  19. package/dist/components/Toast/Toast.js +129 -0
  20. package/dist/index.cjs +1190 -24
  21. package/dist/index.js +9 -1
  22. package/dist/src/components/AvatarGroup/AvatarGroup.d.ts +14 -0
  23. package/dist/src/components/AvatarGroup/AvatarGroup.test.d.ts +1 -0
  24. package/dist/src/components/AvatarGroup/index.d.ts +1 -0
  25. package/dist/src/components/Combobox/Combobox.d.ts +20 -0
  26. package/dist/src/components/Combobox/Combobox.test.d.ts +1 -0
  27. package/dist/src/components/Combobox/index.d.ts +1 -0
  28. package/dist/src/components/CommandPalette/CommandPalette.d.ts +18 -0
  29. package/dist/src/components/CommandPalette/CommandPalette.test.d.ts +1 -0
  30. package/dist/src/components/CommandPalette/index.d.ts +1 -0
  31. package/dist/src/components/DateRangePicker/DateRangePicker.d.ts +21 -0
  32. package/dist/src/components/DateRangePicker/DateRangePicker.test.d.ts +1 -0
  33. package/dist/src/components/DateRangePicker/index.d.ts +1 -0
  34. package/dist/src/components/Kbd/Kbd.d.ts +9 -0
  35. package/dist/src/components/Kbd/Kbd.test.d.ts +1 -0
  36. package/dist/src/components/Kbd/index.d.ts +1 -0
  37. package/dist/src/components/NumberInput/NumberInput.d.ts +19 -0
  38. package/dist/src/components/NumberInput/NumberInput.test.d.ts +1 -0
  39. package/dist/src/components/NumberInput/index.d.ts +1 -0
  40. package/dist/src/components/Popover/Popover.d.ts +21 -0
  41. package/dist/src/components/Popover/Popover.test.d.ts +1 -0
  42. package/dist/src/components/Popover/index.d.ts +1 -0
  43. package/dist/src/components/Toast/Toast.d.ts +35 -0
  44. package/dist/src/components/Toast/Toast.test.d.ts +1 -0
  45. package/dist/src/components/Toast/index.d.ts +1 -0
  46. package/dist/src/index.d.ts +8 -0
  47. package/dist/styles/theme.css +68 -0
  48. package/dist/styles.css +986 -79
  49. package/package.json +1 -1
package/dist/styles.css CHANGED
@@ -221,6 +221,39 @@
221
221
  --pf-select-option-active-bg: var(--color-semantic-action-primary);
222
222
  --pf-select-option-active-text: var(--color-semantic-action-primary-text);
223
223
 
224
+ /* Combobox aliases */
225
+ --pf-combobox-bg: var(--pf-input-bg);
226
+ --pf-combobox-border: var(--pf-input-border);
227
+ --pf-combobox-text: var(--pf-input-text);
228
+ --pf-combobox-placeholder: var(--pf-input-placeholder);
229
+ --pf-combobox-focus-border: var(--color-semantic-action-primary);
230
+ --pf-combobox-invalid-border: var(--color-semantic-status-danger-border);
231
+ --pf-combobox-menu-bg: var(--pf-surface-bg);
232
+ --pf-combobox-menu-border: var(--pf-surface-border-strong);
233
+ --pf-combobox-option-active-bg: var(--color-semantic-action-primary);
234
+ --pf-combobox-option-active-text: var(--color-semantic-action-primary-text);
235
+
236
+ /* Command palette aliases */
237
+ --pf-command-bg: var(--pf-surface-bg);
238
+ --pf-command-border: var(--pf-surface-border-strong);
239
+ --pf-command-text: var(--color-semantic-text-default);
240
+ --pf-command-text-muted: var(--color-semantic-text-muted);
241
+ --pf-command-shortcut-bg: var(--color-semantic-background-subtle);
242
+ --pf-command-item-active-bg: var(--color-semantic-action-primary);
243
+ --pf-command-item-active-text: var(--color-semantic-action-primary-text);
244
+
245
+ /* Number input aliases */
246
+ --pf-numberinput-bg: var(--pf-input-bg);
247
+ --pf-numberinput-border: var(--pf-input-border);
248
+ --pf-numberinput-text: var(--pf-input-text);
249
+ --pf-numberinput-placeholder: var(--pf-input-placeholder);
250
+ --pf-numberinput-focus-border: var(--color-semantic-action-primary);
251
+ --pf-numberinput-invalid-border: var(--color-semantic-status-danger-border);
252
+ --pf-numberinput-step-bg: var(--color-semantic-background-subtle);
253
+ --pf-numberinput-step-text: var(--color-semantic-text-default);
254
+ --pf-numberinput-step-hover-bg: var(--color-semantic-action-primary);
255
+ --pf-numberinput-step-hover-text: var(--color-semantic-action-primary-text);
256
+
224
257
  /* Overlay and elevation color aliases */
225
258
  --pf-overlay-backdrop: color-mix(in srgb, var(--color-gray-900) 48%, transparent);
226
259
  --pf-elevation-overlay-shadow: 0 24px 60px
@@ -372,6 +405,22 @@
372
405
  --pf-utility-btn-danger-text: var(--color-semantic-status-danger-foreground);
373
406
  --pf-utility-btn-danger-bg-hover: var(--color-danger-100);
374
407
 
408
+ /* Kbd aliases */
409
+ --pf-kbd-bg: var(--color-semantic-background-subtle);
410
+ --pf-kbd-border: var(--color-semantic-border-default);
411
+ --pf-kbd-text: var(--color-semantic-text-default);
412
+
413
+ /* Popover aliases */
414
+ --pf-popover-bg: var(--color-semantic-background-default);
415
+ --pf-popover-border: var(--color-semantic-border-default);
416
+ --pf-popover-text: var(--color-semantic-text-default);
417
+
418
+ /* AvatarGroup aliases */
419
+ --pf-avatar-group-ring: var(--color-semantic-background-default);
420
+ --pf-avatar-group-overflow-bg: var(--color-semantic-background-subtle);
421
+ /* default (not muted) text: muted on the subtle chip was only 4.34:1 in light */
422
+ --pf-avatar-group-overflow-text: var(--color-semantic-text-default);
423
+
375
424
  /* Accordion aliases */
376
425
  --pf-accordion-border: var(--color-semantic-border-default);
377
426
  --pf-accordion-trigger-text: var(--color-semantic-text-default);
@@ -484,6 +533,21 @@
484
533
  --pf-datepicker-focus-border: var(--color-semantic-action-primary);
485
534
  --pf-datepicker-invalid-border: var(--color-semantic-status-danger-border);
486
535
 
536
+ /* Date range picker aliases */
537
+ --pf-daterange-bg: var(--pf-datepicker-bg);
538
+ --pf-daterange-bg-subtle: var(--pf-datepicker-bg-subtle);
539
+ --pf-daterange-border: var(--pf-datepicker-border);
540
+ --pf-daterange-border-strong: var(--pf-datepicker-border-strong);
541
+ --pf-daterange-text: var(--pf-datepicker-text);
542
+ --pf-daterange-text-muted: var(--pf-datepicker-text-muted);
543
+ --pf-daterange-focus-ring: var(--pf-focus-ring);
544
+ --pf-daterange-invalid-border: var(--color-semantic-status-danger-border);
545
+ --pf-daterange-menu-bg: var(--pf-surface-bg);
546
+ --pf-daterange-menu-border: var(--pf-surface-border-strong);
547
+ /* brand-600 vs white popover = 6.25:1 non-text; white text on brand-600 = 6.25:1 text */
548
+ --pf-daterange-range-bg: var(--color-brand-600);
549
+ --pf-daterange-range-text: var(--color-base-white);
550
+
487
551
  /* BadgeGroup aliases */
488
552
  --pf-badgegroup-gray-100: var(--color-gray-100);
489
553
  --pf-badgegroup-gray-200: var(--color-gray-200);
@@ -760,6 +824,10 @@
760
824
  /* Calendar — same border-default contrast issue as TreeView */
761
825
  --pf-calendar-border: var(--color-semantic-border-strong);
762
826
 
827
+ /* Dark mode: brand-400 vs gray-800 = 4.08:1 non-text; gray-900 text on brand-400 = 5.58:1 text */
828
+ --pf-daterange-range-bg: var(--color-brand-400);
829
+ --pf-daterange-range-text: var(--color-gray-900);
830
+
763
831
  /* GaugeChart — track uses background-subtle (gray-700) which is 1.72:1 against gray-900 */
764
832
  --pf-gauge-track-color: var(--color-semantic-border-strong);
765
833
 
@@ -1110,6 +1178,32 @@ body {
1110
1178
  .pf-avatar__status--offline {
1111
1179
  background: var(--pf-avatar-status-offline);
1112
1180
  }
1181
+ .pf-avatar-group {
1182
+ display: inline-flex;
1183
+ align-items: center;
1184
+ /* Overlap amount between avatars */
1185
+ --pf-avatar-group-overlap: 8px;
1186
+ }
1187
+
1188
+ .pf-avatar-group--lg,
1189
+ .pf-avatar-group--xl {
1190
+ --pf-avatar-group-overlap: 12px;
1191
+ }
1192
+
1193
+ .pf-avatar-group__item {
1194
+ position: relative;
1195
+ /* Ring in the surface color so overlapping avatars stay visually separated */
1196
+ box-shadow: 0 0 0 2px var(--pf-avatar-group-ring);
1197
+ }
1198
+
1199
+ .pf-avatar-group__item + .pf-avatar-group__item {
1200
+ margin-inline-start: calc(-1 * var(--pf-avatar-group-overlap));
1201
+ }
1202
+
1203
+ .pf-avatar-group__overflow {
1204
+ background: var(--pf-avatar-group-overflow-bg);
1205
+ color: var(--pf-avatar-group-overflow-text);
1206
+ }
1113
1207
  .pf-button {
1114
1208
  align-items: center;
1115
1209
  border: 1px solid transparent;
@@ -1203,6 +1297,231 @@ body {
1203
1297
  animation-iteration-count: 1;
1204
1298
  }
1205
1299
  }
1300
+ /* ── Backdrop ─────────────────────────────────────────────────────────────── */
1301
+
1302
+ .pf-command__backdrop {
1303
+ animation: pf-command-backdrop-in var(--pf-transition-fast);
1304
+ background: var(--pf-overlay-backdrop);
1305
+ inset: 0;
1306
+ position: fixed;
1307
+ z-index: 1100;
1308
+ }
1309
+
1310
+ .pf-command__backdrop--exiting {
1311
+ animation: pf-command-backdrop-out var(--pf-transition-fast) forwards;
1312
+ }
1313
+
1314
+ @keyframes pf-command-backdrop-in {
1315
+ from {
1316
+ opacity: 0;
1317
+ }
1318
+ to {
1319
+ opacity: 1;
1320
+ }
1321
+ }
1322
+
1323
+ @keyframes pf-command-backdrop-out {
1324
+ from {
1325
+ opacity: 1;
1326
+ }
1327
+ to {
1328
+ opacity: 0;
1329
+ }
1330
+ }
1331
+
1332
+ /* ── Dialog ───────────────────────────────────────────────────────────────── */
1333
+
1334
+ .pf-command {
1335
+ animation: pf-command-in var(--pf-transition-fast) var(--easing-decelerate);
1336
+ background: var(--pf-command-bg);
1337
+ border: 1px solid var(--pf-command-border);
1338
+ border-radius: var(--radius-lg);
1339
+ box-shadow: var(--pf-elevation-overlay-shadow);
1340
+ display: flex;
1341
+ flex-direction: column;
1342
+ left: 50%;
1343
+ max-height: min(560px, 80vh);
1344
+ max-width: 560px;
1345
+ overflow: hidden;
1346
+ position: fixed;
1347
+ top: 12%;
1348
+ transform: translateX(-50%);
1349
+ width: calc(100vw - var(--space-8));
1350
+ z-index: 1101;
1351
+ }
1352
+
1353
+ .pf-command--exiting {
1354
+ animation: pf-command-out var(--pf-transition-fast) var(--easing-accelerate) forwards;
1355
+ }
1356
+
1357
+ @keyframes pf-command-in {
1358
+ from {
1359
+ opacity: 0;
1360
+ transform: translateX(-50%) translateY(-8px) scale(0.97);
1361
+ }
1362
+ to {
1363
+ opacity: 1;
1364
+ transform: translateX(-50%) translateY(0) scale(1);
1365
+ }
1366
+ }
1367
+
1368
+ @keyframes pf-command-out {
1369
+ from {
1370
+ opacity: 1;
1371
+ transform: translateX(-50%) translateY(0) scale(1);
1372
+ }
1373
+ to {
1374
+ opacity: 0;
1375
+ transform: translateX(-50%) translateY(-8px) scale(0.97);
1376
+ }
1377
+ }
1378
+
1379
+ /* ── Search bar ───────────────────────────────────────────────────────────── */
1380
+
1381
+ .pf-command__search {
1382
+ align-items: center;
1383
+ border-block-end: 1px solid var(--pf-command-border);
1384
+ display: flex;
1385
+ flex-shrink: 0;
1386
+ gap: var(--space-2);
1387
+ padding: var(--space-3) var(--space-4);
1388
+ }
1389
+
1390
+ .pf-command__search-icon {
1391
+ color: var(--pf-command-text-muted);
1392
+ flex-shrink: 0;
1393
+ font-size: 1.1rem;
1394
+ }
1395
+
1396
+ .pf-command__input {
1397
+ background: transparent;
1398
+ border: none;
1399
+ color: var(--pf-command-text);
1400
+ flex: 1;
1401
+ font-size: var(--font-size-md);
1402
+ min-width: 0;
1403
+ outline: none;
1404
+ }
1405
+
1406
+ .pf-command__input::placeholder {
1407
+ color: var(--pf-command-text-muted);
1408
+ }
1409
+
1410
+ .pf-command__esc-hint {
1411
+ background: var(--pf-command-shortcut-bg);
1412
+ border: 1px solid var(--pf-command-border);
1413
+ border-bottom-width: 2px;
1414
+ border-radius: var(--radius-sm);
1415
+ color: var(--pf-command-text-muted);
1416
+ flex-shrink: 0;
1417
+ font-family: var(--font-family-mono);
1418
+ font-size: var(--font-size-xs);
1419
+ padding: 1px 6px;
1420
+ }
1421
+
1422
+ /* ── Results list ─────────────────────────────────────────────────────────── */
1423
+
1424
+ .pf-command__list {
1425
+ overflow-y: auto;
1426
+ padding: var(--space-2);
1427
+ }
1428
+
1429
+ .pf-command__empty {
1430
+ color: var(--pf-command-text-muted);
1431
+ font-size: var(--font-size-sm);
1432
+ margin: 0;
1433
+ padding: var(--space-6) var(--space-4);
1434
+ text-align: center;
1435
+ }
1436
+
1437
+ .pf-command__group-label {
1438
+ color: var(--pf-command-text-muted);
1439
+ font-size: var(--font-size-xs);
1440
+ font-weight: var(--font-weight-semibold);
1441
+ letter-spacing: 0.04em;
1442
+ margin: 0;
1443
+ padding: var(--space-2) var(--space-2) var(--space-1);
1444
+ text-transform: uppercase;
1445
+ }
1446
+
1447
+ /* ── Items ────────────────────────────────────────────────────────────────── */
1448
+
1449
+ .pf-command__item {
1450
+ align-items: center;
1451
+ border-radius: var(--radius-md);
1452
+ cursor: pointer;
1453
+ display: flex;
1454
+ gap: var(--space-3);
1455
+ padding: var(--space-2) var(--space-3);
1456
+ transition: background 0.1s;
1457
+ }
1458
+
1459
+ .pf-command__item--active {
1460
+ background: var(--pf-command-item-active-bg);
1461
+ }
1462
+
1463
+ .pf-command__item--disabled {
1464
+ cursor: not-allowed;
1465
+ opacity: 0.45;
1466
+ }
1467
+
1468
+ .pf-command__item-icon {
1469
+ align-items: center;
1470
+ color: var(--pf-command-text-muted);
1471
+ display: inline-flex;
1472
+ flex-shrink: 0;
1473
+ font-size: 1rem;
1474
+ height: 20px;
1475
+ justify-content: center;
1476
+ width: 20px;
1477
+ }
1478
+
1479
+ .pf-command__item--active .pf-command__item-icon {
1480
+ color: var(--pf-command-item-active-text);
1481
+ }
1482
+
1483
+ .pf-command__item-content {
1484
+ display: flex;
1485
+ flex: 1;
1486
+ flex-direction: column;
1487
+ gap: 1px;
1488
+ min-width: 0;
1489
+ }
1490
+
1491
+ .pf-command__item-label {
1492
+ color: var(--pf-command-text);
1493
+ font-size: var(--font-size-sm);
1494
+ font-weight: var(--font-weight-medium);
1495
+ overflow: hidden;
1496
+ text-overflow: ellipsis;
1497
+ white-space: nowrap;
1498
+ }
1499
+
1500
+ .pf-command__item--active .pf-command__item-label {
1501
+ color: var(--pf-command-item-active-text);
1502
+ }
1503
+
1504
+ .pf-command__item-description {
1505
+ color: var(--pf-command-text-muted);
1506
+ font-size: var(--font-size-xs);
1507
+ overflow: hidden;
1508
+ text-overflow: ellipsis;
1509
+ white-space: nowrap;
1510
+ }
1511
+
1512
+ .pf-command__item--active .pf-command__item-description {
1513
+ color: var(--pf-command-item-active-text);
1514
+ opacity: 0.85;
1515
+ }
1516
+
1517
+ @media (prefers-reduced-motion: reduce) {
1518
+ .pf-command__backdrop,
1519
+ .pf-command__backdrop--exiting,
1520
+ .pf-command,
1521
+ .pf-command--exiting {
1522
+ animation: none;
1523
+ }
1524
+ }
1206
1525
  .pf-badge-group {
1207
1526
  align-items: center;
1208
1527
  display: inline-flex;
@@ -2063,7 +2382,6 @@ body {
2063
2382
 
2064
2383
  .pf-calendar__day--outside {
2065
2384
  color: var(--pf-calendar-text-muted);
2066
- opacity: 0.55;
2067
2385
  }
2068
2386
 
2069
2387
  .pf-calendar__day--today {
@@ -2367,105 +2685,260 @@ body {
2367
2685
  white-space: nowrap;
2368
2686
  width: 1px;
2369
2687
  }
2370
- .pf-content-divider {
2371
- align-items: center;
2372
- color: var(--pf-content-divider-text);
2373
- display: flex;
2374
- gap: var(--space-3);
2375
- width: 100%;
2376
- }
2377
-
2378
- .pf-content-divider--inset {
2379
- padding-inline-start: var(--space-2);
2380
- padding-inline-end: var(--space-2);
2381
- }
2382
-
2383
- .pf-content-divider__line {
2384
- background: var(--pf-content-divider-line);
2385
- display: block;
2386
- flex: 1;
2387
- height: 1px;
2388
- }
2389
-
2390
- .pf-content-divider__label {
2391
- color: var(--pf-content-divider-text);
2392
- font-size: var(--font-size-xs);
2393
- font-weight: var(--font-weight-medium);
2394
- line-height: 1;
2395
- text-transform: uppercase;
2396
- white-space: nowrap;
2397
- }
2398
-
2399
- .pf-content-divider--vertical {
2400
- align-self: stretch;
2401
- background: var(--pf-content-divider-line);
2402
- display: inline-block;
2403
- flex: 0 0 auto;
2404
- height: auto;
2405
- min-height: 100%;
2406
- width: 1px;
2407
- }
2408
- .pf-date-picker {
2688
+ .pf-combobox {
2409
2689
  position: relative;
2410
2690
  }
2411
2691
 
2412
- .pf-date-picker__trigger {
2692
+ .pf-combobox__control {
2413
2693
  align-items: center;
2414
- background: var(--pf-datepicker-bg);
2415
- border: 1px solid var(--pf-datepicker-border);
2694
+ background: var(--pf-combobox-bg);
2695
+ border: 1px solid var(--pf-combobox-border);
2416
2696
  border-radius: var(--radius-md);
2417
- color: var(--pf-datepicker-text);
2418
- cursor: pointer;
2419
- display: inline-flex;
2420
- flex: 1;
2421
- font-size: var(--font-size-sm);
2697
+ display: flex;
2422
2698
  gap: var(--space-2);
2423
- justify-content: space-between;
2424
2699
  min-height: 40px;
2425
- min-width: 0;
2426
2700
  padding: 0 var(--space-3);
2427
- text-align: start;
2428
- }
2429
-
2430
- .pf-date-picker__trigger:hover:not(:disabled) {
2431
- border-color: var(--pf-datepicker-border-strong);
2701
+ transition:
2702
+ border 0.2s,
2703
+ box-shadow 0.2s;
2432
2704
  }
2433
2705
 
2434
- .pf-date-picker__trigger:focus-visible {
2435
- box-shadow: var(--pf-datepicker-focus-ring, var(--pf-focus-ring));
2436
- outline: none;
2706
+ .pf-combobox__control:focus-within {
2707
+ border-color: var(--pf-combobox-focus-border);
2708
+ box-shadow: var(--pf-combobox-focus-ring, var(--pf-focus-ring));
2437
2709
  }
2438
2710
 
2439
- .pf-date-picker__trigger:disabled {
2440
- background: var(--pf-datepicker-bg-subtle);
2441
- color: var(--pf-datepicker-text-muted);
2442
- cursor: not-allowed;
2711
+ .pf-combobox__control--invalid {
2712
+ border-color: var(--pf-combobox-invalid-border);
2443
2713
  }
2444
2714
 
2445
- .pf-date-picker__trigger--invalid {
2446
- border-color: var(--pf-datepicker-invalid-border);
2715
+ .pf-combobox__input {
2716
+ background: transparent;
2717
+ border: none;
2718
+ color: var(--pf-combobox-text);
2719
+ flex: 1;
2720
+ font: inherit;
2721
+ min-width: 0;
2722
+ outline: none;
2723
+ padding: 0;
2447
2724
  }
2448
2725
 
2449
- .pf-date-picker__value {
2450
- overflow: hidden;
2451
- text-overflow: ellipsis;
2452
- white-space: nowrap;
2726
+ .pf-combobox__input::placeholder {
2727
+ color: var(--pf-combobox-placeholder);
2453
2728
  }
2454
2729
 
2455
- .pf-date-picker__value--placeholder {
2456
- color: var(--pf-datepicker-text-muted);
2730
+ .pf-combobox__input:disabled {
2731
+ cursor: not-allowed;
2457
2732
  }
2458
2733
 
2459
- .pf-date-picker__control-row {
2460
- align-items: center;
2461
- display: flex;
2462
- gap: var(--space-1);
2734
+ .pf-combobox__control:has(.pf-combobox__input:disabled) {
2735
+ background: var(--pf-control-bg-disabled);
2736
+ border-color: var(--pf-control-border-disabled);
2737
+ color: var(--pf-control-text-disabled);
2738
+ opacity: 0.6;
2463
2739
  }
2464
2740
 
2465
- .pf-date-picker__icon-button {
2741
+ .pf-combobox__icon {
2466
2742
  align-items: center;
2467
- background: transparent;
2468
- border: 0;
2743
+ color: var(--pf-combobox-text);
2744
+ display: inline-flex;
2745
+ flex-shrink: 0;
2746
+ height: 20px;
2747
+ justify-content: center;
2748
+ transform-origin: center;
2749
+ transition: transform var(--pf-transition-fast);
2750
+ width: 20px;
2751
+ }
2752
+
2753
+ .pf-combobox__icon svg {
2754
+ display: block;
2755
+ height: 16px;
2756
+ width: 16px;
2757
+ }
2758
+
2759
+ .pf-combobox__icon--open {
2760
+ transform: rotate(180deg);
2761
+ }
2762
+
2763
+ .pf-combobox__menu {
2764
+ animation: pf-combobox-menu-in var(--duration-fast) var(--easing-decelerate);
2765
+ background: var(--pf-combobox-menu-bg);
2766
+ border: 1px solid var(--pf-combobox-menu-border);
2767
+ border-radius: var(--radius-md);
2768
+ box-shadow: var(--pf-combobox-elevation-popover-shadow, var(--pf-elevation-popover-shadow));
2769
+ list-style: none;
2770
+ margin: 0;
2771
+ max-height: 220px;
2772
+ overflow: auto;
2773
+ padding: var(--space-1);
2774
+ position: fixed;
2775
+ transform-origin: top center;
2776
+ z-index: 1000;
2777
+ }
2778
+
2779
+ .pf-combobox__menu--exiting {
2780
+ animation: pf-combobox-menu-out var(--duration-fast) var(--easing-accelerate) forwards;
2781
+ }
2782
+
2783
+ @keyframes pf-combobox-menu-in {
2784
+ from {
2785
+ opacity: 0;
2786
+ transform: translateY(-4px) scaleY(0.96);
2787
+ }
2788
+ to {
2789
+ opacity: 1;
2790
+ transform: translateY(0) scaleY(1);
2791
+ }
2792
+ }
2793
+
2794
+ @keyframes pf-combobox-menu-out {
2795
+ from {
2796
+ opacity: 1;
2797
+ transform: translateY(0) scaleY(1);
2798
+ }
2799
+ to {
2800
+ opacity: 0;
2801
+ transform: translateY(-4px) scaleY(0.96);
2802
+ }
2803
+ }
2804
+
2805
+ .pf-combobox__option {
2806
+ border-radius: var(--radius-sm);
2807
+ color: var(--pf-combobox-text);
2808
+ cursor: pointer;
2809
+ padding: var(--space-2) var(--space-3);
2810
+ }
2811
+
2812
+ .pf-combobox__option--active {
2813
+ background: var(--pf-combobox-option-active-bg);
2814
+ color: var(--pf-combobox-option-active-text);
2815
+ }
2816
+
2817
+ .pf-combobox__option--selected {
2818
+ font-weight: var(--font-weight-medium);
2819
+ }
2820
+
2821
+ .pf-combobox__option--disabled {
2822
+ background: transparent;
2823
+ color: var(--pf-combobox-placeholder);
2824
+ cursor: not-allowed;
2825
+ }
2826
+
2827
+ .pf-combobox__empty {
2828
+ color: var(--pf-combobox-placeholder);
2829
+ padding: var(--space-2) var(--space-3);
2830
+ }
2831
+
2832
+ @media (prefers-reduced-motion: reduce) {
2833
+ .pf-combobox__control,
2834
+ .pf-combobox__icon {
2835
+ transition: none;
2836
+ }
2837
+
2838
+ .pf-combobox__menu,
2839
+ .pf-combobox__menu--exiting {
2840
+ animation: none;
2841
+ }
2842
+ }
2843
+ .pf-content-divider {
2844
+ align-items: center;
2845
+ color: var(--pf-content-divider-text);
2846
+ display: flex;
2847
+ gap: var(--space-3);
2848
+ width: 100%;
2849
+ }
2850
+
2851
+ .pf-content-divider--inset {
2852
+ padding-inline-start: var(--space-2);
2853
+ padding-inline-end: var(--space-2);
2854
+ }
2855
+
2856
+ .pf-content-divider__line {
2857
+ background: var(--pf-content-divider-line);
2858
+ display: block;
2859
+ flex: 1;
2860
+ height: 1px;
2861
+ }
2862
+
2863
+ .pf-content-divider__label {
2864
+ color: var(--pf-content-divider-text);
2865
+ font-size: var(--font-size-xs);
2866
+ font-weight: var(--font-weight-medium);
2867
+ line-height: 1;
2868
+ text-transform: uppercase;
2869
+ white-space: nowrap;
2870
+ }
2871
+
2872
+ .pf-content-divider--vertical {
2873
+ align-self: stretch;
2874
+ background: var(--pf-content-divider-line);
2875
+ display: inline-block;
2876
+ flex: 0 0 auto;
2877
+ height: auto;
2878
+ min-height: 100%;
2879
+ width: 1px;
2880
+ }
2881
+ .pf-date-picker {
2882
+ position: relative;
2883
+ }
2884
+
2885
+ .pf-date-picker__trigger {
2886
+ align-items: center;
2887
+ background: var(--pf-datepicker-bg);
2888
+ border: 1px solid var(--pf-datepicker-border);
2889
+ border-radius: var(--radius-md);
2890
+ color: var(--pf-datepicker-text);
2891
+ cursor: pointer;
2892
+ display: inline-flex;
2893
+ flex: 1;
2894
+ font-size: var(--font-size-sm);
2895
+ gap: var(--space-2);
2896
+ justify-content: space-between;
2897
+ min-height: 40px;
2898
+ min-width: 0;
2899
+ padding: 0 var(--space-3);
2900
+ text-align: start;
2901
+ }
2902
+
2903
+ .pf-date-picker__trigger:hover:not(:disabled) {
2904
+ border-color: var(--pf-datepicker-border-strong);
2905
+ }
2906
+
2907
+ .pf-date-picker__trigger:focus-visible {
2908
+ box-shadow: var(--pf-datepicker-focus-ring, var(--pf-focus-ring));
2909
+ outline: none;
2910
+ }
2911
+
2912
+ .pf-date-picker__trigger:disabled {
2913
+ background: var(--pf-datepicker-bg-subtle);
2914
+ color: var(--pf-datepicker-text-muted);
2915
+ cursor: not-allowed;
2916
+ }
2917
+
2918
+ .pf-date-picker__trigger--invalid {
2919
+ border-color: var(--pf-datepicker-invalid-border);
2920
+ }
2921
+
2922
+ .pf-date-picker__value {
2923
+ overflow: hidden;
2924
+ text-overflow: ellipsis;
2925
+ white-space: nowrap;
2926
+ }
2927
+
2928
+ .pf-date-picker__value--placeholder {
2929
+ color: var(--pf-datepicker-text-muted);
2930
+ }
2931
+
2932
+ .pf-date-picker__control-row {
2933
+ align-items: center;
2934
+ display: flex;
2935
+ gap: var(--space-1);
2936
+ }
2937
+
2938
+ .pf-date-picker__icon-button {
2939
+ align-items: center;
2940
+ background: transparent;
2941
+ border: 0;
2469
2942
  border-radius: var(--radius-sm);
2470
2943
  color: var(--pf-datepicker-text-muted);
2471
2944
  cursor: pointer;
@@ -2496,6 +2969,264 @@ body {
2496
2969
  .pf-date-picker__popover .pf-field {
2497
2970
  margin: 0;
2498
2971
  }
2972
+ .pf-daterange {
2973
+ position: relative;
2974
+ }
2975
+
2976
+ .pf-daterange__control-row {
2977
+ align-items: center;
2978
+ display: flex;
2979
+ gap: var(--space-1);
2980
+ }
2981
+
2982
+ /* ── Trigger button ───────────────────────────────────────────────────────── */
2983
+
2984
+ .pf-daterange__trigger {
2985
+ align-items: center;
2986
+ background: var(--pf-daterange-bg);
2987
+ border: 1px solid var(--pf-daterange-border);
2988
+ border-radius: var(--radius-md);
2989
+ color: var(--pf-daterange-text);
2990
+ cursor: pointer;
2991
+ display: inline-flex;
2992
+ flex: 1;
2993
+ font-size: var(--font-size-sm);
2994
+ gap: var(--space-2);
2995
+ justify-content: space-between;
2996
+ min-height: 40px;
2997
+ min-width: 0;
2998
+ padding: 0 var(--space-3);
2999
+ text-align: start;
3000
+ transition: border 0.2s;
3001
+ }
3002
+
3003
+ .pf-daterange__trigger:hover:not(:disabled) {
3004
+ border-color: var(--pf-daterange-border-strong);
3005
+ }
3006
+
3007
+ .pf-daterange__trigger:focus-visible {
3008
+ box-shadow: var(--pf-daterange-focus-ring, var(--pf-focus-ring));
3009
+ outline: none;
3010
+ }
3011
+
3012
+ .pf-daterange__trigger:disabled {
3013
+ background: var(--pf-daterange-bg-subtle);
3014
+ color: var(--pf-daterange-text-muted);
3015
+ cursor: not-allowed;
3016
+ }
3017
+
3018
+ .pf-daterange__trigger--invalid {
3019
+ border-color: var(--pf-daterange-invalid-border);
3020
+ }
3021
+
3022
+ .pf-daterange__value {
3023
+ align-items: center;
3024
+ display: flex;
3025
+ flex-wrap: wrap;
3026
+ gap: var(--space-1);
3027
+ min-width: 0;
3028
+ overflow: hidden;
3029
+ }
3030
+
3031
+ .pf-daterange__value--placeholder {
3032
+ color: var(--pf-daterange-text-muted);
3033
+ }
3034
+
3035
+ .pf-daterange__separator {
3036
+ color: var(--pf-daterange-text-muted);
3037
+ }
3038
+
3039
+ /* ── Popover ──────────────────────────────────────────────────────────────── */
3040
+
3041
+ .pf-daterange__popover {
3042
+ background: var(--pf-daterange-menu-bg);
3043
+ border: 1px solid var(--pf-daterange-menu-border);
3044
+ border-radius: var(--radius-lg);
3045
+ box-shadow: var(--pf-elevation-popover-shadow);
3046
+ color: var(--pf-calendar-text);
3047
+ padding: var(--space-4);
3048
+ position: fixed;
3049
+ z-index: 999;
3050
+ }
3051
+
3052
+ .pf-daterange__hint {
3053
+ color: var(--pf-daterange-text-muted);
3054
+ font-size: var(--font-size-xs);
3055
+ margin: 0 0 var(--space-3);
3056
+ }
3057
+
3058
+ /* ── Two-month layout ─────────────────────────────────────────────────────── */
3059
+
3060
+ .pf-daterange__months {
3061
+ display: grid;
3062
+ gap: var(--space-4);
3063
+ grid-template-columns: 1fr;
3064
+ }
3065
+
3066
+ @media (min-width: 640px) {
3067
+ .pf-daterange__months {
3068
+ grid-template-columns: 1fr 1fr;
3069
+ }
3070
+ }
3071
+
3072
+ /* ── Individual calendar panel ────────────────────────────────────────────── */
3073
+
3074
+ .pf-daterange__calendar {
3075
+ background: var(--pf-calendar-bg);
3076
+ color: var(--pf-calendar-text);
3077
+ display: grid;
3078
+ gap: var(--space-2);
3079
+ min-width: 0;
3080
+ }
3081
+
3082
+ .pf-daterange__cal-header {
3083
+ align-items: center;
3084
+ display: grid;
3085
+ grid-template-columns: 28px 1fr 28px;
3086
+ }
3087
+
3088
+ .pf-daterange__cal-title {
3089
+ font-size: var(--font-size-sm);
3090
+ font-weight: var(--font-weight-semibold);
3091
+ text-align: center;
3092
+ }
3093
+
3094
+ /* Nav buttons — desktop right-panel hides its own nav (left panel drives both) */
3095
+ .pf-daterange__nav {
3096
+ align-items: center;
3097
+ background: transparent;
3098
+ border: 0;
3099
+ border-radius: var(--radius-sm);
3100
+ color: var(--pf-calendar-text-muted);
3101
+ cursor: pointer;
3102
+ display: inline-flex;
3103
+ font-size: var(--font-size-sm);
3104
+ height: 28px;
3105
+ justify-content: center;
3106
+ padding: 0;
3107
+ width: 28px;
3108
+ }
3109
+
3110
+ .pf-daterange__nav:hover:not(:disabled) {
3111
+ background: var(--pf-calendar-bg-subtle);
3112
+ color: var(--pf-calendar-text);
3113
+ }
3114
+
3115
+ .pf-daterange__nav:focus-visible {
3116
+ box-shadow: var(--pf-calendar-focus-ring, var(--pf-focus-ring));
3117
+ outline: none;
3118
+ }
3119
+
3120
+ .pf-daterange__nav svg {
3121
+ display: block;
3122
+ height: 14px;
3123
+ width: 14px;
3124
+ }
3125
+
3126
+ @media (min-width: 640px) {
3127
+ .pf-daterange__cal-header--hide-nav-desktop .pf-daterange__nav {
3128
+ pointer-events: none;
3129
+ visibility: hidden;
3130
+ }
3131
+ }
3132
+
3133
+ /* ── Grid & weekday labels ────────────────────────────────────────────────── */
3134
+
3135
+ .pf-daterange__grid {
3136
+ display: grid;
3137
+ gap: var(--space-1);
3138
+ grid-template-columns: repeat(7, minmax(0, 1fr));
3139
+ }
3140
+
3141
+ .pf-daterange__weekday {
3142
+ color: var(--pf-calendar-text-muted);
3143
+ font-size: var(--font-size-xs);
3144
+ font-weight: var(--font-weight-medium);
3145
+ text-align: center;
3146
+ }
3147
+
3148
+ /* ── Day cells ────────────────────────────────────────────────────────────── */
3149
+
3150
+ .pf-daterange__day,
3151
+ .pf-daterange__day-empty {
3152
+ align-items: center;
3153
+ aspect-ratio: 1 / 1;
3154
+ border-radius: var(--radius-sm);
3155
+ display: inline-flex;
3156
+ font-size: var(--font-size-xs);
3157
+ justify-content: center;
3158
+ }
3159
+
3160
+ .pf-daterange__day {
3161
+ background: transparent;
3162
+ border: 0;
3163
+ color: var(--pf-calendar-text);
3164
+ cursor: pointer;
3165
+ }
3166
+
3167
+ .pf-daterange__day:hover:not(:disabled):not(.pf-daterange__day--selected):not(
3168
+ .pf-daterange__day--in-range
3169
+ ) {
3170
+ background: var(--pf-calendar-bg-subtle);
3171
+ }
3172
+
3173
+ .pf-daterange__day--outside {
3174
+ color: var(--pf-calendar-text-muted);
3175
+ }
3176
+
3177
+ .pf-daterange__day--today {
3178
+ background: var(--pf-calendar-today-bg);
3179
+ border: 1.5px solid var(--pf-calendar-today-border);
3180
+ }
3181
+
3182
+ .pf-daterange__day--selected {
3183
+ background: var(--pf-calendar-selected-bg);
3184
+ color: var(--pf-calendar-selected-text);
3185
+ font-weight: var(--font-weight-semibold);
3186
+ }
3187
+
3188
+ .pf-daterange__day--selected:hover:not(:disabled) {
3189
+ background: var(--pf-calendar-selected-bg-hover);
3190
+ color: var(--pf-calendar-selected-text);
3191
+ }
3192
+
3193
+ .pf-daterange__day:disabled {
3194
+ color: var(--pf-calendar-text-muted);
3195
+ cursor: not-allowed;
3196
+ opacity: 0.45;
3197
+ }
3198
+
3199
+ /* ── Range highlight ──────────────────────────────────────────────────────── */
3200
+
3201
+ .pf-daterange__day--in-range {
3202
+ background: var(--pf-daterange-range-bg);
3203
+ border-radius: 0;
3204
+ color: var(--pf-daterange-range-text);
3205
+ }
3206
+
3207
+ /* In-range overrides today indicator bg (today border still shows through) */
3208
+ .pf-daterange__day--today.pf-daterange__day--in-range {
3209
+ background: var(--pf-daterange-range-bg);
3210
+ color: var(--pf-daterange-range-text);
3211
+ }
3212
+
3213
+ /* Selected caps already have the right bg/color from --selected;
3214
+ just shape the radius to connect flush with the range band. */
3215
+ .pf-daterange__day--range-start:not(.pf-daterange__day--range-end) {
3216
+ border-end-end-radius: 0;
3217
+ border-start-end-radius: 0;
3218
+ }
3219
+
3220
+ .pf-daterange__day--range-end:not(.pf-daterange__day--range-start) {
3221
+ border-end-start-radius: 0;
3222
+ border-start-start-radius: 0;
3223
+ }
3224
+
3225
+ @media (prefers-reduced-motion: reduce) {
3226
+ .pf-daterange__trigger {
3227
+ transition: none;
3228
+ }
3229
+ }
2499
3230
  .pf-empty-state {
2500
3231
  align-items: center;
2501
3232
  display: flex;
@@ -2934,6 +3665,31 @@ body {
2934
3665
  background: color-mix(in srgb, var(--pf-inline-cta-warning-bg) 60%, var(--color-base-white));
2935
3666
  border-color: var(--pf-inline-cta-warning-border);
2936
3667
  }
3668
+ .pf-kbd {
3669
+ align-items: center;
3670
+ background: var(--pf-kbd-bg);
3671
+ border: 1px solid var(--pf-kbd-border);
3672
+ border-bottom-width: 2px;
3673
+ border-radius: var(--radius-sm);
3674
+ color: var(--pf-kbd-text);
3675
+ display: inline-flex;
3676
+ font-family: var(--font-family-mono, ui-monospace, monospace);
3677
+ font-weight: var(--font-weight-medium);
3678
+ line-height: 1;
3679
+ white-space: nowrap;
3680
+ }
3681
+
3682
+ .pf-kbd--md {
3683
+ font-size: var(--font-size-xs);
3684
+ min-width: 1.5em;
3685
+ padding: 3px 6px;
3686
+ }
3687
+
3688
+ .pf-kbd--sm {
3689
+ font-size: var(--font-size-2xs);
3690
+ min-width: 1.35em;
3691
+ padding: 2px 5px;
3692
+ }
2937
3693
  .pf-gauge {
2938
3694
  position: relative;
2939
3695
  display: inline-flex;
@@ -2999,6 +3755,10 @@ body {
2999
3755
  }
3000
3756
  .pf-heatmap {
3001
3757
  display: inline-block;
3758
+ max-width: 100%;
3759
+ /* A full year is wider than small screens — scroll horizontally instead of
3760
+ overflowing the page. */
3761
+ overflow-x: auto;
3002
3762
  font-family: var(--font-family-sans);
3003
3763
  }
3004
3764
 
@@ -4046,6 +4806,104 @@ body {
4046
4806
  color: var(--pf-notification-text);
4047
4807
  outline: none;
4048
4808
  }
4809
+ .pf-numberinput {
4810
+ align-items: stretch;
4811
+ background: var(--pf-numberinput-bg);
4812
+ border: 1px solid var(--pf-numberinput-border);
4813
+ border-radius: var(--radius-md);
4814
+ display: inline-flex;
4815
+ min-height: 40px;
4816
+ overflow: hidden;
4817
+ width: 100%;
4818
+ transition:
4819
+ border 0.2s,
4820
+ box-shadow 0.2s;
4821
+ }
4822
+
4823
+ .pf-numberinput:focus-within {
4824
+ border-color: var(--pf-numberinput-focus-border);
4825
+ box-shadow: var(--pf-numberinput-focus-ring, var(--pf-focus-ring));
4826
+ }
4827
+
4828
+ .pf-numberinput--invalid {
4829
+ border-color: var(--pf-numberinput-invalid-border);
4830
+ }
4831
+
4832
+ .pf-numberinput__input {
4833
+ background: transparent;
4834
+ border: none;
4835
+ color: var(--pf-numberinput-text);
4836
+ flex: 1;
4837
+ font: inherit;
4838
+ min-width: 0;
4839
+ outline: none;
4840
+ padding: 0 var(--space-3);
4841
+ text-align: center;
4842
+ width: 100%;
4843
+ }
4844
+
4845
+ .pf-numberinput__input::placeholder {
4846
+ color: var(--pf-numberinput-placeholder);
4847
+ }
4848
+
4849
+ .pf-numberinput__input:disabled {
4850
+ cursor: not-allowed;
4851
+ }
4852
+
4853
+ .pf-numberinput:has(.pf-numberinput__input:disabled) {
4854
+ background: var(--pf-control-bg-disabled);
4855
+ border-color: var(--pf-control-border-disabled);
4856
+ color: var(--pf-control-text-disabled);
4857
+ opacity: 0.6;
4858
+ }
4859
+
4860
+ .pf-numberinput__step {
4861
+ align-items: center;
4862
+ align-self: stretch;
4863
+ background: var(--pf-numberinput-step-bg);
4864
+ border: none;
4865
+ color: var(--pf-numberinput-step-text);
4866
+ cursor: pointer;
4867
+ display: inline-flex;
4868
+ flex-shrink: 0;
4869
+ justify-content: center;
4870
+ padding: 0;
4871
+ width: 40px;
4872
+ transition:
4873
+ background 0.15s,
4874
+ color 0.15s;
4875
+ }
4876
+
4877
+ .pf-numberinput__step:hover:not(:disabled) {
4878
+ background: var(--pf-numberinput-step-hover-bg);
4879
+ color: var(--pf-numberinput-step-hover-text);
4880
+ }
4881
+
4882
+ .pf-numberinput__step:disabled {
4883
+ cursor: not-allowed;
4884
+ opacity: 0.45;
4885
+ }
4886
+
4887
+ .pf-numberinput__step--decrement {
4888
+ border-inline-end: 1px solid var(--pf-numberinput-border);
4889
+ }
4890
+
4891
+ .pf-numberinput__step--increment {
4892
+ border-inline-start: 1px solid var(--pf-numberinput-border);
4893
+ }
4894
+
4895
+ .pf-numberinput__step svg {
4896
+ display: block;
4897
+ height: 16px;
4898
+ width: 16px;
4899
+ }
4900
+
4901
+ @media (prefers-reduced-motion: reduce) {
4902
+ .pf-numberinput,
4903
+ .pf-numberinput__step {
4904
+ transition: none;
4905
+ }
4906
+ }
4049
4907
  .pf-page-header {
4050
4908
  display: grid;
4051
4909
  gap: var(--space-4);
@@ -4133,7 +4991,8 @@ body {
4133
4991
  }
4134
4992
  .pf-pagination {
4135
4993
  align-items: center;
4136
- display: inline-flex;
4994
+ display: flex;
4995
+ flex-wrap: wrap;
4137
4996
  gap: var(--space-2);
4138
4997
  }
4139
4998
 
@@ -4149,7 +5008,9 @@ body {
4149
5008
 
4150
5009
  .pf-pagination__list {
4151
5010
  align-items: center;
4152
- display: inline-flex;
5011
+ display: flex;
5012
+ flex-wrap: wrap;
5013
+ justify-content: center;
4153
5014
  gap: var(--space-2);
4154
5015
  list-style: none;
4155
5016
  margin: 0;
@@ -4347,6 +5208,52 @@ body {
4347
5208
  font-size: var(--font-size-sm);
4348
5209
  font-variant-numeric: tabular-nums;
4349
5210
  }
5211
+ .pf-popover {
5212
+ position: fixed;
5213
+ z-index: 1100;
5214
+ max-width: min(360px, calc(100vw - 16px));
5215
+ background: var(--pf-popover-bg);
5216
+ border: 1px solid var(--pf-popover-border);
5217
+ border-radius: var(--radius-md);
5218
+ box-shadow: var(--pf-popover-elevation-popover-shadow, var(--pf-elevation-popover-shadow));
5219
+ color: var(--pf-popover-text);
5220
+ padding: var(--space-4);
5221
+ transform-origin: top center;
5222
+ animation: pf-popover-in var(--duration-fast) var(--easing-decelerate);
5223
+ }
5224
+
5225
+ .pf-popover:focus-visible {
5226
+ outline: none;
5227
+ }
5228
+
5229
+ @keyframes pf-popover-in {
5230
+ from {
5231
+ opacity: 0;
5232
+ transform: translateY(-4px) scale(0.97);
5233
+ }
5234
+ to {
5235
+ opacity: 1;
5236
+ transform: translateY(0) scale(1);
5237
+ }
5238
+ }
5239
+
5240
+ .pf-popover--exiting {
5241
+ animation: pf-popover-out var(--duration-fast) var(--easing-accelerate) forwards;
5242
+ }
5243
+
5244
+ @keyframes pf-popover-out {
5245
+ to {
5246
+ opacity: 0;
5247
+ transform: translateY(-4px) scale(0.97);
5248
+ }
5249
+ }
5250
+
5251
+ @media (prefers-reduced-motion: reduce) {
5252
+ .pf-popover,
5253
+ .pf-popover--exiting {
5254
+ animation: none;
5255
+ }
5256
+ }
4350
5257
  .pf-progress-bar {
4351
5258
  align-items: center;
4352
5259
  display: inline-flex;