@openwarelabs/ui 0.15.0 → 0.16.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 (58) hide show
  1. package/dist/components/ActivityHeatmap/ActivityHeatmap.d.cts +8 -0
  2. package/dist/components/ActivityHeatmap/ActivityHeatmap.d.ts +8 -0
  3. package/dist/components/ActivityHeatmap/ActivityHeatmap.types.d.cts +73 -0
  4. package/dist/components/ActivityHeatmap/ActivityHeatmap.types.d.ts +73 -0
  5. package/dist/components/DiffViewer/DiffViewer.d.cts +8 -0
  6. package/dist/components/DiffViewer/DiffViewer.d.ts +8 -0
  7. package/dist/components/DiffViewer/DiffViewer.types.d.cts +131 -0
  8. package/dist/components/DiffViewer/DiffViewer.types.d.ts +131 -0
  9. package/dist/components/DiffViewer/diff.d.cts +10 -0
  10. package/dist/components/DiffViewer/diff.d.ts +10 -0
  11. package/dist/components/Markdown/Markdown.d.cts +8 -0
  12. package/dist/components/Markdown/Markdown.d.ts +8 -0
  13. package/dist/components/Markdown/Markdown.types.d.cts +59 -0
  14. package/dist/components/Markdown/Markdown.types.d.ts +59 -0
  15. package/dist/components/MediaPlayer/MediaPlayer.d.cts +8 -0
  16. package/dist/components/MediaPlayer/MediaPlayer.d.ts +8 -0
  17. package/dist/components/MediaPlayer/MediaPlayer.types.d.cts +109 -0
  18. package/dist/components/MediaPlayer/MediaPlayer.types.d.ts +109 -0
  19. package/dist/components/MentionInput/MentionInput.d.cts +9 -0
  20. package/dist/components/MentionInput/MentionInput.d.ts +9 -0
  21. package/dist/components/MentionInput/MentionInput.types.d.cts +125 -0
  22. package/dist/components/MentionInput/MentionInput.types.d.ts +125 -0
  23. package/dist/components/MentionInput/useMentions.d.cts +8 -0
  24. package/dist/components/MentionInput/useMentions.d.ts +8 -0
  25. package/dist/components/NotificationCenter/NotificationCenter.d.cts +12 -0
  26. package/dist/components/NotificationCenter/NotificationCenter.d.ts +12 -0
  27. package/dist/components/NotificationCenter/NotificationCenter.types.d.cts +129 -0
  28. package/dist/components/NotificationCenter/NotificationCenter.types.d.ts +129 -0
  29. package/dist/components/QRCode/QRCode.d.cts +18 -0
  30. package/dist/components/QRCode/QRCode.d.ts +18 -0
  31. package/dist/components/QRCode/QRCode.types.d.cts +53 -0
  32. package/dist/components/QRCode/QRCode.types.d.ts +53 -0
  33. package/dist/components/QRCode/qr.d.cts +8 -0
  34. package/dist/components/QRCode/qr.d.ts +8 -0
  35. package/dist/components/SignaturePad/SignaturePad.d.cts +8 -0
  36. package/dist/components/SignaturePad/SignaturePad.d.ts +8 -0
  37. package/dist/components/SignaturePad/SignaturePad.types.d.cts +102 -0
  38. package/dist/components/SignaturePad/SignaturePad.types.d.ts +102 -0
  39. package/dist/components/TransferList/TransferList.d.cts +7 -0
  40. package/dist/components/TransferList/TransferList.d.ts +7 -0
  41. package/dist/components/TransferList/TransferList.types.d.cts +75 -0
  42. package/dist/components/TransferList/TransferList.types.d.ts +75 -0
  43. package/dist/components/UploadList/UploadList.d.cts +9 -0
  44. package/dist/components/UploadList/UploadList.d.ts +9 -0
  45. package/dist/components/UploadList/UploadList.types.d.cts +113 -0
  46. package/dist/components/UploadList/UploadList.types.d.ts +113 -0
  47. package/dist/components/UploadList/useUploadQueue.d.cts +8 -0
  48. package/dist/components/UploadList/useUploadQueue.d.ts +8 -0
  49. package/dist/components.css +1194 -104
  50. package/dist/index.cjs +5489 -2267
  51. package/dist/index.cjs.map +4 -4
  52. package/dist/index.d.cts +20 -0
  53. package/dist/index.d.ts +20 -0
  54. package/dist/index.js +5550 -2312
  55. package/dist/index.js.map +4 -4
  56. package/dist/openware-ui.iife.js +24 -9
  57. package/dist/styles.css +1194 -104
  58. package/package.json +1 -1
package/dist/styles.css CHANGED
@@ -2254,6 +2254,99 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
2254
2254
  }
2255
2255
  }
2256
2256
 
2257
+ /* components/TransferList/TransferList.css */
2258
+ /* TransferList: two standalone ListBoxes (ListBox.css) with a column of Buttons between them. Its own width decides
2259
+ the layout (a container query): side by side, or stacked with the buttons turned to point down and up. */
2260
+ .ow-transfer-list {
2261
+ container: ow-transfer-list / inline-size;
2262
+ color: var(--ow-text);
2263
+ font-family: var(--ow-font-sans);
2264
+ }
2265
+
2266
+ .ow-transfer-list__body {
2267
+ display: grid;
2268
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
2269
+ gap: var(--ow-space-lg);
2270
+ }
2271
+
2272
+ .ow-transfer-list__pane {
2273
+ display: grid;
2274
+ min-width: 0;
2275
+ align-content: start;
2276
+ gap: var(--ow-space-sm);
2277
+ }
2278
+
2279
+ .ow-transfer-list__header {
2280
+ display: flex;
2281
+ align-items: baseline;
2282
+ justify-content: space-between;
2283
+ gap: var(--ow-space-sm);
2284
+ }
2285
+
2286
+ .ow-transfer-list__label {
2287
+ font-size: 14px;
2288
+ font-weight: var(--ow-weight-emphasis);
2289
+ line-height: 1.4;
2290
+ }
2291
+
2292
+ .ow-transfer-list__count {
2293
+ color: var(--ow-text-muted);
2294
+ font-size: 12px;
2295
+ font-variant-numeric: tabular-nums;
2296
+ white-space: nowrap;
2297
+ }
2298
+
2299
+ .ow-transfer-list .ow-transfer-list__list {
2300
+ height: var(--ow-transfer-list-height);
2301
+ }
2302
+
2303
+ .ow-transfer-list__actions {
2304
+ display: flex;
2305
+ flex-direction: column;
2306
+ align-self: center;
2307
+ gap: var(--ow-space-xs);
2308
+ }
2309
+
2310
+ .ow-transfer-list__icon {
2311
+ display: flex;
2312
+ }
2313
+
2314
+ /* The arrows point the way the items go, so they turn round right to left. */
2315
+ .ow-transfer-list__icon--back,
2316
+ .ow-transfer-list:dir(rtl) .ow-transfer-list__icon {
2317
+ transform: scaleX(-1);
2318
+ }
2319
+
2320
+ .ow-transfer-list:dir(rtl) .ow-transfer-list__icon--back {
2321
+ transform: none;
2322
+ }
2323
+
2324
+ .ow-transfer-list__order {
2325
+ display: flex;
2326
+ justify-content: flex-end;
2327
+ gap: var(--ow-space-2xs);
2328
+ }
2329
+
2330
+ @container ow-transfer-list (max-width: 519px) {
2331
+ .ow-transfer-list__body {
2332
+ grid-template-columns: minmax(0, 1fr);
2333
+ }
2334
+
2335
+ .ow-transfer-list__actions {
2336
+ flex-direction: row;
2337
+ justify-content: center;
2338
+ }
2339
+
2340
+ /* Across becomes down: → turns to ↓ and ← to ↑, whichever way the text runs. */
2341
+ .ow-transfer-list .ow-transfer-list__actions .ow-transfer-list__icon {
2342
+ transform: rotate(90deg);
2343
+ }
2344
+
2345
+ .ow-transfer-list .ow-transfer-list__actions .ow-transfer-list__icon--back {
2346
+ transform: rotate(-90deg);
2347
+ }
2348
+ }
2349
+
2257
2350
  /* components/Combobox/Combobox.css */
2258
2351
  /* Combobox: a grouped field (Input.css) with a chevron, over Select's listbox. */
2259
2352
  .ow-combobox {
@@ -2342,6 +2435,20 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
2342
2435
  padding-left: var(--ow-space-2xs);
2343
2436
  }
2344
2437
 
2438
+ /* components/MentionInput/MentionInput.css */
2439
+ /* MentionInput: an Input or a Textarea, with Select's listbox (Select.css) under the trigger character. */
2440
+ .ow-mention-list {
2441
+ width: max-content;
2442
+ min-width: 224px;
2443
+ max-width: min(360px, calc(100vw - 16px));
2444
+ }
2445
+
2446
+ .ow-mention-list__empty {
2447
+ display: flex;
2448
+ align-items: center;
2449
+ gap: var(--ow-space-xs);
2450
+ }
2451
+
2345
2452
  /* components/Checkbox/Checkbox.css */
2346
2453
  /* Checkbox: a native input with its look replaced. */
2347
2454
  .ow-checkbox {
@@ -2967,6 +3074,99 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
2967
3074
  }
2968
3075
  }
2969
3076
 
3077
+ /* components/SignaturePad/SignaturePad.css */
3078
+ /* SignaturePad: a field-like box to sign in, on a signing line, with its buttons underneath. */
3079
+ .ow-signature-pad {
3080
+ position: relative;
3081
+ display: grid;
3082
+ width: 100%;
3083
+ min-width: 0;
3084
+ gap: var(--ow-space-sm);
3085
+ }
3086
+
3087
+ .ow-signature-pad__surface {
3088
+ position: relative;
3089
+ height: var(--ow-signature-pad-height, 160px);
3090
+ overflow: hidden;
3091
+ border: 1px solid var(--ow-border-strong);
3092
+ border-radius: var(--ow-radius-form);
3093
+ background: var(--ow-surface);
3094
+ transition-property: border-color, box-shadow;
3095
+ transition-duration: var(--ow-duration-base);
3096
+ transition-timing-function: var(--ow-ease-standard);
3097
+ }
3098
+
3099
+ /* The ink is this colour (a penColor replaces it); the script reads it from CSS, so it follows the theme. */
3100
+ .ow-signature-pad__canvas {
3101
+ display: block;
3102
+ width: 100%;
3103
+ height: 100%;
3104
+ color: var(--ow-text);
3105
+ cursor: crosshair;
3106
+ touch-action: none;
3107
+ }
3108
+
3109
+ .ow-signature-pad--typing .ow-signature-pad__canvas,
3110
+ .ow-signature-pad--readonly .ow-signature-pad__canvas,
3111
+ .ow-signature-pad--disabled .ow-signature-pad__canvas {
3112
+ cursor: default;
3113
+ }
3114
+
3115
+ .ow-signature-pad:not(.ow-signature-pad--typing, .ow-signature-pad--readonly, .ow-signature-pad--disabled) .ow-signature-pad__surface:hover {
3116
+ border-color: var(--ow-border-hover);
3117
+ }
3118
+
3119
+ .ow-signature-pad--drawing .ow-signature-pad__surface {
3120
+ border-color: var(--ow-focus-border);
3121
+ box-shadow: var(--ow-shadow-focus);
3122
+ }
3123
+
3124
+ .ow-signature-pad--invalid .ow-signature-pad__surface {
3125
+ border-color: var(--ow-danger-line);
3126
+ }
3127
+
3128
+ /* At 72% of the height, where the script sets a typed name. */
3129
+ .ow-signature-pad__line {
3130
+ position: absolute;
3131
+ top: 72%;
3132
+ inset-inline: var(--ow-space-2xl);
3133
+ border-top: 1px dashed var(--ow-border-strong);
3134
+ pointer-events: none;
3135
+ }
3136
+
3137
+ .ow-signature-pad__prompt {
3138
+ position: absolute;
3139
+ bottom: calc(28% + var(--ow-space-xs));
3140
+ inset-inline-start: var(--ow-space-2xl);
3141
+ color: var(--ow-text-muted);
3142
+ font-size: 14px;
3143
+ line-height: 1.4;
3144
+ pointer-events: none;
3145
+ }
3146
+
3147
+ .ow-signature-pad__actions {
3148
+ display: flex;
3149
+ flex-wrap: wrap;
3150
+ align-items: center;
3151
+ gap: var(--ow-space-xs);
3152
+ }
3153
+
3154
+ .ow-signature-pad__edit {
3155
+ display: inline-flex;
3156
+ gap: var(--ow-space-xs);
3157
+ margin-inline-start: auto;
3158
+ }
3159
+
3160
+ .ow-signature-pad--disabled .ow-signature-pad__surface {
3161
+ opacity: 0.62;
3162
+ }
3163
+
3164
+ @media (prefers-reduced-motion: reduce) {
3165
+ .ow-signature-pad__surface {
3166
+ transition: none;
3167
+ }
3168
+ }
3169
+
2970
3170
  /* components/NumberField/NumberField.css */
2971
3171
  /* NumberField: − value + in one field. */
2972
3172
  .ow-number-field {
@@ -3228,6 +3428,198 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
3228
3428
  color: var(--ow-danger-text);
3229
3429
  }
3230
3430
 
3431
+ /* components/UploadList/UploadList.css */
3432
+ /* UploadList: a row (or a tile) per file being uploaded, with its progress, status and buttons. */
3433
+ .ow-upload-list {
3434
+ width: 100%;
3435
+ min-width: 0;
3436
+ }
3437
+
3438
+ .ow-upload-list__items {
3439
+ display: grid;
3440
+ gap: var(--ow-space-sm);
3441
+ margin: 0;
3442
+ padding: 0;
3443
+ list-style: none;
3444
+ border-radius: var(--ow-radius-container);
3445
+ }
3446
+
3447
+ .ow-upload-list__items:focus-visible {
3448
+ outline: 2px solid var(--ow-focus-ring);
3449
+ outline-offset: 2px;
3450
+ }
3451
+
3452
+ .ow-upload-list__item {
3453
+ position: relative;
3454
+ display: flex;
3455
+ min-width: 0;
3456
+ align-items: center;
3457
+ gap: var(--ow-space-md);
3458
+ border: 1px solid var(--ow-border);
3459
+ border-radius: var(--ow-radius-container);
3460
+ background: var(--ow-surface);
3461
+ padding: var(--ow-space-sm);
3462
+ padding-inline-start: var(--ow-space-md);
3463
+ }
3464
+
3465
+ .ow-upload-list__item--error {
3466
+ border-color: var(--ow-danger-line);
3467
+ }
3468
+
3469
+ .ow-upload-list__thumb {
3470
+ position: relative;
3471
+ display: inline-flex;
3472
+ width: 40px;
3473
+ height: 40px;
3474
+ flex-shrink: 0;
3475
+ align-items: center;
3476
+ justify-content: center;
3477
+ overflow: hidden;
3478
+ border-radius: var(--ow-radius-md);
3479
+ background: var(--ow-surface-muted);
3480
+ color: var(--ow-text-muted);
3481
+ }
3482
+
3483
+ .ow-upload-list__thumb img {
3484
+ position: absolute;
3485
+ inset: 0;
3486
+ width: 100%;
3487
+ height: 100%;
3488
+ object-fit: cover;
3489
+ }
3490
+
3491
+ .ow-upload-list__body {
3492
+ display: grid;
3493
+ min-width: 0;
3494
+ flex: 1;
3495
+ gap: 2px;
3496
+ }
3497
+
3498
+ .ow-upload-list__name {
3499
+ overflow: hidden;
3500
+ color: var(--ow-text);
3501
+ font-size: 14px;
3502
+ font-weight: var(--ow-weight-emphasis);
3503
+ line-height: 1.35;
3504
+ text-overflow: ellipsis;
3505
+ white-space: nowrap;
3506
+ }
3507
+
3508
+ .ow-upload-list__detail {
3509
+ display: flex;
3510
+ min-width: 0;
3511
+ align-items: center;
3512
+ gap: var(--ow-space-xs);
3513
+ color: var(--ow-text-muted);
3514
+ font-size: 12px;
3515
+ line-height: 1.35;
3516
+ font-variant-numeric: tabular-nums;
3517
+ }
3518
+
3519
+ .ow-upload-list__detail > span {
3520
+ overflow: hidden;
3521
+ text-overflow: ellipsis;
3522
+ white-space: nowrap;
3523
+ }
3524
+
3525
+ .ow-upload-list__icon {
3526
+ flex-shrink: 0;
3527
+ }
3528
+
3529
+ .ow-upload-list__item--done .ow-upload-list__icon {
3530
+ color: var(--ow-success-text);
3531
+ }
3532
+
3533
+ .ow-upload-list__item--error .ow-upload-list__detail {
3534
+ color: var(--ow-danger-text);
3535
+ }
3536
+
3537
+ .ow-upload-list__progress {
3538
+ margin-top: var(--ow-space-xs);
3539
+ }
3540
+
3541
+ .ow-upload-list__actions {
3542
+ display: flex;
3543
+ flex-shrink: 0;
3544
+ gap: var(--ow-space-2xs);
3545
+ }
3546
+
3547
+ .ow-upload-list__actions:empty {
3548
+ display: none;
3549
+ }
3550
+
3551
+ /* Compact: one short line per file, its progress a hairline along the bottom. */
3552
+ .ow-upload-list--compact .ow-upload-list__items {
3553
+ gap: var(--ow-space-xs);
3554
+ }
3555
+
3556
+ .ow-upload-list--compact .ow-upload-list__item {
3557
+ gap: var(--ow-space-sm);
3558
+ padding-block: var(--ow-space-2xs);
3559
+ }
3560
+
3561
+ .ow-upload-list--compact .ow-upload-list__thumb {
3562
+ width: auto;
3563
+ height: auto;
3564
+ background: none;
3565
+ }
3566
+
3567
+ .ow-upload-list--compact .ow-upload-list__body {
3568
+ display: flex;
3569
+ align-items: baseline;
3570
+ gap: var(--ow-space-sm);
3571
+ }
3572
+
3573
+ .ow-upload-list--compact .ow-upload-list__name {
3574
+ min-width: 4em;
3575
+ flex: 1 1 auto;
3576
+ font-size: 13px;
3577
+ }
3578
+
3579
+ .ow-upload-list--compact .ow-upload-list__progress {
3580
+ position: absolute;
3581
+ inset: auto var(--ow-space-md) 2px;
3582
+ margin: 0;
3583
+ }
3584
+
3585
+ /* Grid: a tile per file, the thumbnail on top and the buttons over its corner. */
3586
+ .ow-upload-list--grid .ow-upload-list__items {
3587
+ grid-template-columns: repeat(auto-fill, minmax(144px, 1fr));
3588
+ gap: var(--ow-space-md);
3589
+ }
3590
+
3591
+ .ow-upload-list--grid .ow-upload-list__item {
3592
+ flex-direction: column;
3593
+ align-items: stretch;
3594
+ gap: var(--ow-space-sm);
3595
+ padding: var(--ow-space-xs) var(--ow-space-xs) var(--ow-space-sm);
3596
+ }
3597
+
3598
+ .ow-upload-list--grid .ow-upload-list__thumb {
3599
+ width: auto;
3600
+ height: auto;
3601
+ aspect-ratio: 1;
3602
+ border-radius: calc(var(--ow-radius-container) - 4px);
3603
+ }
3604
+
3605
+ .ow-upload-list--grid .ow-upload-list__thumb svg {
3606
+ width: 28px;
3607
+ height: 28px;
3608
+ }
3609
+
3610
+ .ow-upload-list--grid .ow-upload-list__body {
3611
+ padding-inline: var(--ow-space-xs);
3612
+ }
3613
+
3614
+ .ow-upload-list--grid .ow-upload-list__actions {
3615
+ position: absolute;
3616
+ inset-block-start: var(--ow-space-sm);
3617
+ inset-inline-end: var(--ow-space-sm);
3618
+ border-radius: var(--ow-radius-md);
3619
+ background: var(--ow-surface);
3620
+ box-shadow: 0 0 0 1px var(--ow-border);
3621
+ }
3622
+
3231
3623
  /* components/Field/Field.css */
3232
3624
  /* Field: label, control, hint, error. */
3233
3625
  .ow-field {
@@ -4432,103 +4824,320 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
4432
4824
  display 220ms allow-discrete;
4433
4825
  }
4434
4826
 
4435
- .ow-drawer[open]::backdrop {
4436
- background-color: var(--ow-backdrop);
4827
+ .ow-drawer[open]::backdrop {
4828
+ background-color: var(--ow-backdrop);
4829
+ }
4830
+
4831
+ @starting-style {
4832
+ .ow-drawer[open]::backdrop {
4833
+ background-color: rgb(0 0 0 / 0);
4834
+ }
4835
+ }
4836
+
4837
+ .ow-drawer__header {
4838
+ display: flex;
4839
+ flex-shrink: 0;
4840
+ align-items: flex-start;
4841
+ gap: var(--ow-space-md);
4842
+ border-bottom: 1px solid var(--ow-border);
4843
+ padding: var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-3xl);
4844
+ }
4845
+
4846
+ .ow-drawer__titles {
4847
+ display: grid;
4848
+ min-width: 0;
4849
+ flex: 1;
4850
+ gap: var(--ow-space-2xs);
4851
+ padding-top: 5px;
4852
+ }
4853
+
4854
+ .ow-drawer__title {
4855
+ margin: 0;
4856
+ font-size: 16px;
4857
+ font-weight: var(--ow-weight-display);
4858
+ line-height: 1.3;
4859
+ }
4860
+
4861
+ .ow-drawer__description {
4862
+ margin: 0;
4863
+ color: var(--ow-text-muted);
4864
+ font-size: 13px;
4865
+ line-height: 1.5;
4866
+ }
4867
+
4868
+ .ow-drawer__body {
4869
+ min-height: 0;
4870
+ flex: 1;
4871
+ overflow-y: auto;
4872
+ padding: var(--ow-space-xl) var(--ow-space-3xl);
4873
+ }
4874
+
4875
+ .ow-drawer__footer {
4876
+ display: flex;
4877
+ flex-shrink: 0;
4878
+ flex-wrap: wrap;
4879
+ justify-content: flex-end;
4880
+ gap: var(--ow-space-sm);
4881
+ border-top: 1px solid var(--ow-border);
4882
+ padding: var(--ow-space-lg) var(--ow-space-3xl);
4883
+ }
4884
+
4885
+ @media (prefers-reduced-motion: reduce) {
4886
+ .ow-drawer,
4887
+ .ow-drawer::backdrop {
4888
+ transition: none;
4889
+ }
4890
+ }
4891
+
4892
+ /* components/Popover/Popover.css */
4893
+ /* Popover: a surface card with the menu shadow, attached to its trigger. */
4894
+ .ow-popover-anchor {
4895
+ display: inline-flex;
4896
+ }
4897
+
4898
+ .ow-popover {
4899
+ z-index: 60;
4900
+ display: grid;
4901
+ gap: var(--ow-space-md);
4902
+ overflow: auto;
4903
+ border: 1px solid var(--ow-border);
4904
+ border-radius: var(--ow-radius-container);
4905
+ background: var(--ow-surface);
4906
+ padding: var(--ow-space-xl);
4907
+ color: var(--ow-text);
4908
+ font-family: var(--ow-font-sans);
4909
+ font-size: 14px;
4910
+ line-height: 1.45;
4911
+ box-shadow: var(--ow-shadow-menu);
4912
+ outline: none;
4913
+ }
4914
+
4915
+ /* Children may shrink to the popover's width instead of pushing past it. */
4916
+ .ow-popover > * {
4917
+ min-width: 0;
4918
+ }
4919
+
4920
+ .ow-popover__title {
4921
+ font-size: 14px;
4922
+ font-weight: var(--ow-weight-emphasis);
4923
+ line-height: 1.3;
4924
+ }
4925
+
4926
+ /* components/NotificationCenter/NotificationCenter.css */
4927
+ /* NotificationCenter: a bell with a count, opening a popover inbox. NotificationList: the rows inside it. */
4928
+ .ow-notification-center {
4929
+ display: inline-flex;
4930
+ }
4931
+
4932
+ .ow-notification-center__bell {
4933
+ position: relative;
4934
+ }
4935
+
4936
+ /* The count sits on the bell's corner, cut out of whatever is behind it. */
4937
+ .ow-notification-center__count.ow-badge {
4938
+ position: absolute;
4939
+ top: 0;
4940
+ inset-inline-end: -2px;
4941
+ min-width: 18px;
4942
+ min-height: 18px;
4943
+ border: 2px solid var(--ow-surface);
4944
+ background: var(--ow-primary);
4945
+ padding: 0 4px;
4946
+ color: var(--ow-on-primary);
4947
+ font-size: 10.5px;
4948
+ font-variant-numeric: tabular-nums;
4949
+ pointer-events: none;
4950
+ }
4951
+
4952
+ /* Edge-to-edge rows, so the popover's own padding goes; only the list scrolls when the window is short. */
4953
+ .ow-notification-center__popover.ow-popover {
4954
+ display: flex;
4955
+ flex-direction: column;
4956
+ padding: 0;
4957
+ overflow: hidden;
4958
+ }
4959
+
4960
+ .ow-notification-center__head,
4961
+ .ow-notification-center__foot {
4962
+ display: flex;
4963
+ align-items: center;
4964
+ justify-content: space-between;
4965
+ gap: var(--ow-space-md);
4966
+ padding: var(--ow-space-md) var(--ow-space-md) var(--ow-space-xs);
4967
+ padding-inline-start: var(--ow-space-2xl);
4968
+ }
4969
+
4970
+ .ow-notification-center__title {
4971
+ font-weight: var(--ow-weight-emphasis);
4972
+ }
4973
+
4974
+ .ow-notification-center__tabs.ow-tabs {
4975
+ display: flex;
4976
+ min-height: 0;
4977
+ flex-direction: column;
4978
+ gap: 0;
4979
+ }
4980
+
4981
+ .ow-notification-center__tabs .ow-tabs__list {
4982
+ padding: 0 var(--ow-space-2xl);
4983
+ }
4984
+
4985
+ .ow-notification-center__tab-count {
4986
+ border-radius: var(--ow-radius-pill);
4987
+ background: var(--ow-surface-muted);
4988
+ padding: 1px 6px;
4989
+ font-size: 11px;
4990
+ font-variant-numeric: tabular-nums;
4991
+ }
4992
+
4993
+ .ow-notification-center__body {
4994
+ min-height: 0;
4995
+ max-height: min(420px, 60dvh);
4996
+ overflow-y: auto;
4997
+ padding: var(--ow-space-xs);
4998
+ outline: none;
4999
+ }
5000
+
5001
+ .ow-notification-center__body:focus-visible {
5002
+ box-shadow: inset 0 0 0 2px var(--ow-focus-ring);
5003
+ }
5004
+
5005
+ .ow-notification-center__foot {
5006
+ border-top: 1px solid var(--ow-border);
5007
+ padding-block: var(--ow-space-md);
5008
+ }
5009
+
5010
+ /* The list. */
5011
+ .ow-notification-list__heading {
5012
+ margin: 0;
5013
+ padding: var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-xs);
5014
+ color: var(--ow-text-muted);
5015
+ font-size: 12px;
5016
+ font-weight: var(--ow-weight-strong);
5017
+ }
5018
+
5019
+ .ow-notification-list__items {
5020
+ margin: 0;
5021
+ padding: 0;
5022
+ list-style: none;
5023
+ }
5024
+
5025
+ /* One row: the whole of it opens the item, through the link stretched over it. */
5026
+ .ow-notification {
5027
+ position: relative;
5028
+ display: flex;
5029
+ align-items: flex-start;
5030
+ gap: var(--ow-space-lg);
5031
+ border-radius: var(--ow-radius-form);
5032
+ padding-block: var(--ow-space-lg);
5033
+ padding-inline: 22px var(--ow-space-md);
5034
+ color: var(--ow-text-soft);
5035
+ transition: background-color var(--ow-duration-fast) var(--ow-ease-standard);
5036
+ }
5037
+
5038
+ .ow-notification:hover {
5039
+ background: var(--ow-hover);
4437
5040
  }
4438
5041
 
4439
- @starting-style {
4440
- .ow-drawer[open]::backdrop {
4441
- background-color: rgb(0 0 0 / 0);
4442
- }
5042
+ .ow-notification__dot {
5043
+ position: absolute;
5044
+ top: 20px;
5045
+ inset-inline-start: 8px;
5046
+ width: 8px;
5047
+ height: 8px;
5048
+ border-radius: 50%;
5049
+ background: var(--ow-primary);
4443
5050
  }
4444
5051
 
4445
- .ow-drawer__header {
4446
- display: flex;
5052
+ .ow-notification__media {
5053
+ display: inline-flex;
4447
5054
  flex-shrink: 0;
4448
- align-items: flex-start;
4449
- gap: var(--ow-space-md);
4450
- border-bottom: 1px solid var(--ow-border);
4451
- padding: var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-3xl);
4452
5055
  }
4453
5056
 
4454
- .ow-drawer__titles {
5057
+ .ow-notification__icon {
5058
+ display: inline-flex;
5059
+ width: 28px;
5060
+ height: 28px;
5061
+ align-items: center;
5062
+ justify-content: center;
5063
+ border: 1px solid var(--ow-border);
5064
+ border-radius: 50%;
5065
+ background: var(--ow-surface-muted);
5066
+ color: var(--ow-text-soft);
5067
+ }
5068
+
5069
+ .ow-notification__body {
4455
5070
  display: grid;
4456
5071
  min-width: 0;
4457
5072
  flex: 1;
4458
- gap: var(--ow-space-2xs);
4459
- padding-top: 5px;
5073
+ gap: var(--ow-space-md);
4460
5074
  }
4461
5075
 
4462
- .ow-drawer__title {
4463
- margin: 0;
4464
- font-size: 16px;
4465
- font-weight: var(--ow-weight-display);
4466
- line-height: 1.3;
5076
+ .ow-notification__main {
5077
+ display: grid;
5078
+ gap: 2px;
5079
+ border: 0;
5080
+ background: none;
5081
+ padding: 0;
5082
+ color: inherit;
5083
+ font: inherit;
5084
+ text-align: start;
5085
+ text-decoration: none;
5086
+ cursor: pointer;
5087
+ outline: none;
4467
5088
  }
4468
5089
 
4469
- .ow-drawer__description {
4470
- margin: 0;
4471
- color: var(--ow-text-muted);
4472
- font-size: 13px;
4473
- line-height: 1.5;
5090
+ .ow-notification__main::after {
5091
+ content: "";
5092
+ position: absolute;
5093
+ inset: 0;
5094
+ border-radius: inherit;
4474
5095
  }
4475
5096
 
4476
- .ow-drawer__body {
4477
- min-height: 0;
4478
- flex: 1;
4479
- overflow-y: auto;
4480
- padding: var(--ow-space-xl) var(--ow-space-3xl);
5097
+ .ow-notification__main:focus-visible::after {
5098
+ outline: 2px solid var(--ow-focus-ring);
5099
+ outline-offset: -2px;
4481
5100
  }
4482
5101
 
4483
- .ow-drawer__footer {
4484
- display: flex;
4485
- flex-shrink: 0;
4486
- flex-wrap: wrap;
4487
- justify-content: flex-end;
4488
- gap: var(--ow-space-sm);
4489
- border-top: 1px solid var(--ow-border);
4490
- padding: var(--ow-space-lg) var(--ow-space-3xl);
5102
+ .ow-notification--unread .ow-notification__title {
5103
+ color: var(--ow-text);
5104
+ font-weight: var(--ow-weight-strong);
4491
5105
  }
4492
5106
 
4493
- @media (prefers-reduced-motion: reduce) {
4494
- .ow-drawer,
4495
- .ow-drawer::backdrop {
4496
- transition: none;
4497
- }
5107
+ .ow-notification__description {
5108
+ display: -webkit-box;
5109
+ overflow: hidden;
5110
+ -webkit-box-orient: vertical;
5111
+ -webkit-line-clamp: 2;
4498
5112
  }
4499
5113
 
4500
- /* components/Popover/Popover.css */
4501
- /* Popover: a surface card with the menu shadow, attached to its trigger. */
4502
- .ow-popover-anchor {
4503
- display: inline-flex;
5114
+ .ow-notification__time {
5115
+ color: var(--ow-text-muted);
5116
+ font-size: 12px;
4504
5117
  }
4505
5118
 
4506
- .ow-popover {
4507
- z-index: 60;
4508
- display: grid;
4509
- gap: var(--ow-space-md);
4510
- overflow: auto;
4511
- border: 1px solid var(--ow-border);
4512
- border-radius: var(--ow-radius-container);
4513
- background: var(--ow-surface);
4514
- padding: var(--ow-space-xl);
4515
- color: var(--ow-text);
4516
- font-family: var(--ow-font-sans);
4517
- font-size: 14px;
4518
- line-height: 1.45;
4519
- box-shadow: var(--ow-shadow-menu);
4520
- outline: none;
5119
+ /* Actions and the ✕ sit above the stretched link, so they take their own clicks. */
5120
+ .ow-notification__actions,
5121
+ .ow-notification__dismiss {
5122
+ position: relative;
5123
+ z-index: 1;
4521
5124
  }
4522
5125
 
4523
- /* Children may shrink to the popover's width instead of pushing past it. */
4524
- .ow-popover > * {
4525
- min-width: 0;
5126
+ .ow-notification__actions {
5127
+ display: flex;
5128
+ flex-wrap: wrap;
5129
+ gap: var(--ow-space-sm);
4526
5130
  }
4527
5131
 
4528
- .ow-popover__title {
4529
- font-size: 14px;
4530
- font-weight: var(--ow-weight-emphasis);
4531
- line-height: 1.3;
5132
+ .ow-notification__dismiss {
5133
+ flex-shrink: 0;
5134
+ margin: -4px 0;
5135
+ }
5136
+
5137
+ @media (prefers-reduced-motion: reduce) {
5138
+ .ow-notification {
5139
+ transition: none;
5140
+ }
4532
5141
  }
4533
5142
 
4534
5143
  /* components/Tour/Tour.css */
@@ -6783,6 +7392,25 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
6783
7392
  white-space: nowrap;
6784
7393
  }
6785
7394
 
7395
+ /* components/QRCode/QRCode.css */
7396
+ /* QRCode: near black on near white in both themes, since scanners need a light ground and strong contrast. */
7397
+ .ow-qr-code {
7398
+ display: block;
7399
+ flex: none;
7400
+ max-width: 100%;
7401
+ height: auto;
7402
+ forced-color-adjust: none;
7403
+ print-color-adjust: exact;
7404
+ }
7405
+
7406
+ .ow-qr-code__ground {
7407
+ fill: var(--ow-gray-50);
7408
+ }
7409
+
7410
+ .ow-qr-code__modules {
7411
+ fill: var(--ow-gray-950);
7412
+ }
7413
+
6786
7414
  /* components/Image/Image.css */
6787
7415
  /* Image: an <img> in a box that pulses while it loads and shows a fallback if it fails. With a ratio, the box is an
6788
7416
  AspectRatio and the image fills it. */
@@ -6804,63 +7432,227 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
6804
7432
  transition: opacity var(--ow-duration-base) var(--ow-ease-standard);
6805
7433
  }
6806
7434
 
6807
- .ow-image--cover .ow-image__img {
6808
- object-fit: cover;
7435
+ .ow-image--cover .ow-image__img {
7436
+ object-fit: cover;
7437
+ }
7438
+
7439
+ .ow-image--contain .ow-image__img {
7440
+ object-fit: contain;
7441
+ }
7442
+
7443
+ .ow-image--radius-control {
7444
+ border-radius: var(--ow-radius-form);
7445
+ }
7446
+
7447
+ .ow-image--radius-container {
7448
+ border-radius: var(--ow-radius-container);
7449
+ }
7450
+
7451
+ /* Loading: the Skeleton's grey and pulse, with the image hidden until it's ready. */
7452
+ .ow-image--loading {
7453
+ background: var(--ow-skeleton);
7454
+ animation: ow-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
7455
+ }
7456
+
7457
+ .ow-image--loading .ow-image__img {
7458
+ opacity: 0;
7459
+ }
7460
+
7461
+ .ow-image__fallback {
7462
+ display: flex;
7463
+ box-sizing: border-box;
7464
+ min-width: 64px;
7465
+ max-width: 100%;
7466
+ min-height: 64px;
7467
+ align-items: center;
7468
+ justify-content: center;
7469
+ }
7470
+
7471
+ .ow-image__fallback--default {
7472
+ background: var(--ow-skeleton-soft);
7473
+ color: var(--ow-icon);
7474
+ }
7475
+
7476
+ .ow-image-figure {
7477
+ display: grid;
7478
+ margin: 0;
7479
+ gap: var(--ow-space-sm);
7480
+ justify-items: start;
7481
+ }
7482
+
7483
+ .ow-image-figure > .ow-aspect-ratio {
7484
+ justify-self: stretch;
7485
+ }
7486
+
7487
+ .ow-image-figure__caption {
7488
+ color: var(--ow-text-muted);
7489
+ font-family: var(--ow-font-sans);
7490
+ font-size: 13px;
7491
+ line-height: 1.4;
7492
+ }
7493
+
7494
+ /* components/MediaPlayer/MediaPlayer.css */
7495
+ /* MediaPlayer: audio is a bar of controls; video is the picture, with the same bar floating over its foot. */
7496
+ .ow-media {
7497
+ position: relative;
7498
+ container-type: inline-size;
7499
+ border-radius: var(--ow-radius-container);
7500
+ color: var(--ow-text);
7501
+ font-family: var(--ow-font-sans);
7502
+ }
7503
+
7504
+ .ow-media:focus-visible {
7505
+ outline: 2px solid var(--ow-focus-ring);
7506
+ outline-offset: 2px;
7507
+ }
7508
+
7509
+ .ow-media--audio {
7510
+ display: grid;
7511
+ gap: var(--ow-space-2xs);
7512
+ border: 1px solid var(--ow-border);
7513
+ background: var(--ow-surface);
7514
+ padding: var(--ow-space-xs);
7515
+ }
7516
+
7517
+ .ow-media--audio .ow-media__element {
7518
+ display: none;
7519
+ }
7520
+
7521
+ .ow-media__title {
7522
+ overflow: hidden;
7523
+ padding: var(--ow-space-2xs) var(--ow-space-xs) 0;
7524
+ font-size: 14px;
7525
+ font-weight: var(--ow-weight-emphasis);
7526
+ text-overflow: ellipsis;
7527
+ white-space: nowrap;
7528
+ }
7529
+
7530
+ .ow-media--video {
7531
+ overflow: hidden;
7532
+ background: var(--ow-gray-950);
7533
+ }
7534
+
7535
+ /* Letterboxed, never cropped. */
7536
+ .ow-media__screen > .ow-media__element {
7537
+ object-fit: contain;
7538
+ cursor: pointer;
7539
+ }
7540
+
7541
+ .ow-media__controls {
7542
+ display: flex;
7543
+ align-items: center;
7544
+ gap: var(--ow-space-2xs);
7545
+ min-width: 0;
7546
+ }
7547
+
7548
+ .ow-media--video .ow-media__controls {
7549
+ position: absolute;
7550
+ inset-inline: var(--ow-space-sm);
7551
+ bottom: var(--ow-space-sm);
7552
+ border: 1px solid var(--ow-border);
7553
+ border-radius: var(--ow-radius-lg);
7554
+ background: var(--ow-surface);
7555
+ padding: var(--ow-space-2xs);
7556
+ box-shadow: var(--ow-shadow-menu);
7557
+ transition: opacity var(--ow-duration-base) var(--ow-ease-standard);
7558
+ }
7559
+
7560
+ /* Playing and left alone: the controls fade out (still reachable with Tab, which brings them back) and so does the pointer. */
7561
+ .ow-media--idle {
7562
+ cursor: none;
7563
+ }
7564
+
7565
+ .ow-media--idle .ow-media__controls {
7566
+ opacity: 0;
7567
+ pointer-events: none;
7568
+ }
7569
+
7570
+ /* Captions rise above the controls while they show (Chromium and Safari let the page move them). */
7571
+ .ow-media__element::-webkit-media-text-track-container {
7572
+ transition: transform var(--ow-duration-base) var(--ow-ease-standard);
7573
+ }
7574
+
7575
+ .ow-media--video:not(.ow-media--idle) .ow-media__element::-webkit-media-text-track-container {
7576
+ transform: translateY(-56px);
7577
+ }
7578
+
7579
+ /* The timeline reads left to right in every language, as players do; the loaded part is a shade darker than the rest. */
7580
+ .ow-media__seek {
7581
+ flex: 1;
7582
+ min-width: 48px;
7583
+ direction: ltr;
6809
7584
  }
6810
7585
 
6811
- .ow-image--contain .ow-image__img {
6812
- object-fit: contain;
7586
+ .ow-media__seek .ow-slider__track {
7587
+ background: linear-gradient(to right, var(--ow-border-strong) var(--ow-media-buffered), var(--ow-meter-track) 0);
6813
7588
  }
6814
7589
 
6815
- .ow-image--radius-control {
6816
- border-radius: var(--ow-radius-form);
7590
+ .ow-media__volume {
7591
+ width: 72px;
6817
7592
  }
6818
7593
 
6819
- .ow-image--radius-container {
6820
- border-radius: var(--ow-radius-container);
7594
+ .ow-media__time {
7595
+ padding-inline: var(--ow-space-2xs);
7596
+ color: var(--ow-text-muted);
7597
+ font-size: 12px;
7598
+ font-variant-numeric: tabular-nums;
7599
+ white-space: nowrap;
6821
7600
  }
6822
7601
 
6823
- /* Loading: the Skeleton's grey and pulse, with the image hidden until it's ready. */
6824
- .ow-image--loading {
6825
- background: var(--ow-skeleton);
6826
- animation: ow-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
7602
+ .ow-media__rate {
7603
+ min-width: 44px;
7604
+ font-variant-numeric: tabular-nums;
6827
7605
  }
6828
7606
 
6829
- .ow-image--loading .ow-image__img {
6830
- opacity: 0;
7607
+ .ow-media__controls [aria-pressed="true"],
7608
+ .ow-media__on {
7609
+ background: var(--ow-surface-muted);
7610
+ color: var(--ow-primary-text);
6831
7611
  }
6832
7612
 
6833
- .ow-image__fallback {
7613
+ .ow-media__blank {
7614
+ display: block;
7615
+ width: 15px;
7616
+ height: 15px;
7617
+ }
7618
+
7619
+ .ow-media--fullscreen {
6834
7620
  display: flex;
6835
- box-sizing: border-box;
6836
- min-width: 64px;
6837
- max-width: 100%;
6838
- min-height: 64px;
6839
7621
  align-items: center;
6840
- justify-content: center;
7622
+ border-radius: 0;
6841
7623
  }
6842
7624
 
6843
- .ow-image__fallback--default {
6844
- background: var(--ow-skeleton-soft);
6845
- color: var(--ow-icon);
7625
+ /* AspectRatio sets its ratio inline; full screen, the picture takes the whole screen instead. */
7626
+ .ow-media--fullscreen .ow-media__screen {
7627
+ height: 100%;
7628
+ aspect-ratio: auto !important;
6846
7629
  }
6847
7630
 
6848
- .ow-image-figure {
6849
- display: grid;
6850
- margin: 0;
6851
- gap: var(--ow-space-sm);
6852
- justify-items: start;
7631
+ @container (max-width: 440px) {
7632
+ .ow-media__volume,
7633
+ .ow-media__pip {
7634
+ display: none;
7635
+ }
6853
7636
  }
6854
7637
 
6855
- .ow-image-figure > .ow-aspect-ratio {
6856
- justify-self: stretch;
7638
+ /* On a phone the device's buttons set the volume; M still mutes. */
7639
+ @container (max-width: 360px) {
7640
+ .ow-media--video .ow-media__mute {
7641
+ display: none;
7642
+ }
6857
7643
  }
6858
7644
 
6859
- .ow-image-figure__caption {
6860
- color: var(--ow-text-muted);
6861
- font-family: var(--ow-font-sans);
6862
- font-size: 13px;
6863
- line-height: 1.4;
7645
+ @container (max-width: 240px) {
7646
+ .ow-media__time {
7647
+ display: none;
7648
+ }
7649
+ }
7650
+
7651
+ @media (prefers-reduced-motion: reduce) {
7652
+ .ow-media__controls,
7653
+ .ow-media__element::-webkit-media-text-track-container {
7654
+ transition: none !important;
7655
+ }
6864
7656
  }
6865
7657
 
6866
7658
  /* components/Kbd/Kbd.css */
@@ -7092,6 +7884,159 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
7092
7884
  transform: none;
7093
7885
  }
7094
7886
 
7887
+ /* components/DiffViewer/DiffViewer.css */
7888
+ /* DiffViewer: a code block's ground and header (it uses CodeBlock's classes), with a table of lines tinted from the
7889
+ success and danger colours. The code block is dark in both themes, so the tints are too. */
7890
+ .ow-diff {
7891
+ --ow-diff-add: var(--ow-success-solid);
7892
+ --ow-diff-del: var(--ow-danger-solid);
7893
+ display: grid;
7894
+ min-width: 0;
7895
+ gap: var(--ow-space-md);
7896
+ }
7897
+
7898
+ .ow-diff__counts {
7899
+ font-family: var(--ow-font-mono);
7900
+ font-size: 12px;
7901
+ white-space: nowrap;
7902
+ }
7903
+
7904
+ /* Signs and counts are lifted toward the text colour so they read on the tints. */
7905
+ .ow-diff__added,
7906
+ .ow-diff__add > .ow-diff__sign {
7907
+ color: color-mix(in srgb, var(--ow-diff-add) 60%, var(--ow-on-code-block));
7908
+ }
7909
+
7910
+ .ow-diff__removed,
7911
+ .ow-diff__del > .ow-diff__sign {
7912
+ color: color-mix(in srgb, var(--ow-diff-del) 60%, var(--ow-on-code-block));
7913
+ }
7914
+
7915
+ .ow-diff__scroll {
7916
+ overflow: auto;
7917
+ }
7918
+
7919
+ .ow-diff__scroll:focus-visible {
7920
+ outline: 2px solid var(--ow-brand-300);
7921
+ outline-offset: -2px;
7922
+ }
7923
+
7924
+ .ow-diff__table {
7925
+ min-width: 100%;
7926
+ border-collapse: collapse;
7927
+ font-family: var(--ow-font-mono);
7928
+ font-size: 13px;
7929
+ line-height: 1.6;
7930
+ tab-size: 4;
7931
+ }
7932
+
7933
+ .ow-diff__table--wrap {
7934
+ width: 100%;
7935
+ table-layout: fixed;
7936
+ }
7937
+
7938
+ /* Cells have no padding of their own; the classes below add it. */
7939
+ :where(.ow-diff__table td) {
7940
+ padding: 0;
7941
+ vertical-align: top;
7942
+ }
7943
+
7944
+ .ow-diff__num-col {
7945
+ width: calc(var(--ow-diff-digits) * 1ch + 20px);
7946
+ }
7947
+
7948
+ .ow-diff__num {
7949
+ padding-inline: 10px;
7950
+ color: var(--ow-on-code-block-muted);
7951
+ text-align: right;
7952
+ user-select: none;
7953
+ }
7954
+
7955
+ /* The sign hangs in the margin, so wrapped lines line up under the code. */
7956
+ .ow-diff__code {
7957
+ padding: 0 var(--ow-space-lg) 0 calc(var(--ow-space-sm) + 2ch);
7958
+ text-indent: -2ch;
7959
+ white-space: pre;
7960
+ }
7961
+
7962
+ .ow-diff__table--wrap .ow-diff__code {
7963
+ overflow-wrap: anywhere;
7964
+ white-space: pre-wrap;
7965
+ }
7966
+
7967
+ .ow-diff__code:focus {
7968
+ outline: none;
7969
+ }
7970
+
7971
+ .ow-diff__sign {
7972
+ display: inline-block;
7973
+ width: 2ch;
7974
+ text-indent: 0;
7975
+ user-select: none;
7976
+ }
7977
+
7978
+ .ow-diff__add {
7979
+ background: color-mix(in srgb, var(--ow-diff-add) 14%, transparent);
7980
+ }
7981
+
7982
+ .ow-diff__del {
7983
+ background: color-mix(in srgb, var(--ow-diff-del) 14%, transparent);
7984
+ }
7985
+
7986
+ .ow-diff__word {
7987
+ border-radius: 2px;
7988
+ background: color-mix(in srgb, var(--ow-diff-add) 34%, transparent);
7989
+ }
7990
+
7991
+ .ow-diff__del .ow-diff__word {
7992
+ background: color-mix(in srgb, var(--ow-diff-del) 34%, transparent);
7993
+ }
7994
+
7995
+ .ow-diff__empty {
7996
+ background: color-mix(in srgb, var(--ow-on-code-block) 3%, transparent);
7997
+ }
7998
+
7999
+ .ow-diff__table--split .ow-diff__num:nth-child(3) {
8000
+ border-left: 1px solid color-mix(in srgb, var(--ow-on-code-block) 8%, transparent);
8001
+ }
8002
+
8003
+ .ow-diff__hunk > td,
8004
+ .ow-diff__gap > td {
8005
+ background: color-mix(in srgb, var(--ow-on-code-block) 5%, transparent);
8006
+ color: var(--ow-on-code-block-muted);
8007
+ }
8008
+
8009
+ .ow-diff__hunk > td {
8010
+ padding: 2px var(--ow-space-lg);
8011
+ white-space: pre;
8012
+ }
8013
+
8014
+ .ow-diff__expand {
8015
+ display: flex;
8016
+ width: 100%;
8017
+ min-height: 28px;
8018
+ align-items: center;
8019
+ gap: var(--ow-space-sm);
8020
+ border: 0;
8021
+ background: transparent;
8022
+ padding: 0 var(--ow-space-lg);
8023
+ color: inherit;
8024
+ font: inherit;
8025
+ font-family: var(--ow-font-sans);
8026
+ font-size: 12px;
8027
+ cursor: pointer;
8028
+ }
8029
+
8030
+ .ow-diff__expand:hover {
8031
+ background: color-mix(in srgb, var(--ow-on-code-block) 6%, transparent);
8032
+ color: var(--ow-on-code-block);
8033
+ }
8034
+
8035
+ .ow-diff__expand:focus-visible {
8036
+ outline: 2px solid var(--ow-brand-300);
8037
+ outline-offset: -2px;
8038
+ }
8039
+
7095
8040
  /* components/Tag/Tag.css */
7096
8041
  /* Tag, TagGroup and ColorSwatch. */
7097
8042
  .ow-tag-group {
@@ -8225,6 +9170,113 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
8225
9170
  }
8226
9171
  }
8227
9172
 
9173
+ /* components/ActivityHeatmap/ActivityHeatmap.css */
9174
+ /* ActivityHeatmap: a square per day, shaded from the empty track to one chart colour, so the shades follow the theme. */
9175
+ .ow-heatmap {
9176
+ --ow-heatmap-cell: 12px;
9177
+ display: grid;
9178
+ min-width: 0;
9179
+ gap: var(--ow-space-xs);
9180
+ color: var(--ow-text-muted);
9181
+ font-size: 11.5px;
9182
+ line-height: 1;
9183
+ }
9184
+
9185
+ /* It scrolls sideways inside itself on a narrow screen, never the page. */
9186
+ .ow-heatmap__scroll {
9187
+ min-width: 0;
9188
+ overflow-x: auto;
9189
+ overscroll-behavior-x: contain;
9190
+ }
9191
+
9192
+ /* The spacing round the edge leaves room for the focus ring. */
9193
+ .ow-heatmap__grid {
9194
+ border-collapse: separate;
9195
+ border-spacing: max(3px, calc(var(--ow-heatmap-cell) / 4));
9196
+ }
9197
+
9198
+ .ow-heatmap__grid th,
9199
+ .ow-heatmap__grid td {
9200
+ padding: 0;
9201
+ }
9202
+
9203
+ .ow-heatmap__grid th {
9204
+ font-weight: var(--ow-weight-regular);
9205
+ text-align: start;
9206
+ white-space: nowrap;
9207
+ }
9208
+
9209
+ /* A month's name starts over its first week and runs on over the next, without widening the columns. */
9210
+ .ow-heatmap__month {
9211
+ position: relative;
9212
+ height: 1.3em;
9213
+ }
9214
+
9215
+ .ow-heatmap__month span {
9216
+ position: absolute;
9217
+ inset-inline-start: 0;
9218
+ top: 0;
9219
+ }
9220
+
9221
+ .ow-heatmap__grid .ow-heatmap__weekday {
9222
+ padding-inline-end: 4px;
9223
+ font-size: 11px;
9224
+ }
9225
+
9226
+ .ow-heatmap__cell {
9227
+ width: var(--ow-heatmap-cell);
9228
+ height: var(--ow-heatmap-cell);
9229
+ border-radius: 3px;
9230
+ }
9231
+
9232
+ .ow-heatmap__day {
9233
+ display: block;
9234
+ width: var(--ow-heatmap-cell);
9235
+ height: var(--ow-heatmap-cell);
9236
+ border: 0;
9237
+ border-radius: 3px;
9238
+ background: color-mix(in oklab, var(--ow-heatmap-color) var(--ow-heatmap-mix, 0%), var(--ow-meter-track));
9239
+ padding: 0;
9240
+ }
9241
+
9242
+ button.ow-heatmap__day {
9243
+ cursor: pointer;
9244
+ }
9245
+
9246
+ .ow-heatmap__cell:hover > .ow-heatmap__day {
9247
+ box-shadow: inset 0 0 0 1px var(--ow-text-muted);
9248
+ }
9249
+
9250
+ .ow-heatmap [data-date]:focus {
9251
+ outline: none;
9252
+ }
9253
+
9254
+ .ow-heatmap [data-date]:focus-visible {
9255
+ outline: 2px solid var(--ow-focus-ring);
9256
+ outline-offset: 1px;
9257
+ }
9258
+
9259
+ .ow-heatmap__legend {
9260
+ display: flex;
9261
+ align-items: center;
9262
+ justify-content: flex-end;
9263
+ gap: calc(var(--ow-heatmap-cell) / 4);
9264
+ }
9265
+
9266
+ .ow-heatmap__legend > :first-child {
9267
+ margin-inline-start: 4px;
9268
+ }
9269
+
9270
+ .ow-heatmap__legend > :last-child {
9271
+ margin-inline-end: 4px;
9272
+ }
9273
+
9274
+ @media (forced-colors: active) {
9275
+ .ow-heatmap__day {
9276
+ forced-color-adjust: none;
9277
+ }
9278
+ }
9279
+
8228
9280
  /* components/FileTree/FileTree.css */
8229
9281
  /* FileTree: a project structure explorer. Monospace names, hairline guides, a tinted selected file. */
8230
9282
  .ow-tree,
@@ -10205,6 +11257,44 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
10205
11257
  }
10206
11258
  }
10207
11259
 
11260
+ /* components/Markdown/Markdown.css */
11261
+ /* Markdown: Prose does the typography; this is only the caret that follows a streaming answer's last character. */
11262
+ .ow-markdown__caret {
11263
+ display: inline-block;
11264
+ width: 2px;
11265
+ height: 1.15em;
11266
+ margin-inline-start: 2px;
11267
+ border-radius: 1px;
11268
+ background: currentColor;
11269
+ vertical-align: -0.2em;
11270
+ animation: ow-markdown-caret 1s var(--ow-ease-standard) infinite;
11271
+ }
11272
+
11273
+ @keyframes ow-markdown-caret {
11274
+ 0%,
11275
+ 100% {
11276
+ opacity: 0.9;
11277
+ }
11278
+ 50% {
11279
+ opacity: 0.15;
11280
+ }
11281
+ }
11282
+
11283
+ @media (prefers-reduced-motion: reduce) {
11284
+ .ow-markdown__caret {
11285
+ opacity: 0.6;
11286
+ animation: none;
11287
+ }
11288
+ }
11289
+
11290
+ /* Forced colours drop backgrounds: draw the caret in the text colour. */
11291
+ @media (forced-colors: active) {
11292
+ .ow-markdown__caret {
11293
+ forced-color-adjust: none;
11294
+ background: CanvasText;
11295
+ }
11296
+ }
11297
+
10208
11298
  /* components/TextShimmer/TextShimmer.css */
10209
11299
  /* TextShimmer: muted text with a band of full-strength text sweeping across it. */
10210
11300
  .ow-shimmer {