@openwarelabs/ui 0.15.0 → 0.16.1

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 (59) hide show
  1. package/README.md +8 -8
  2. package/dist/components/ActivityHeatmap/ActivityHeatmap.d.cts +8 -0
  3. package/dist/components/ActivityHeatmap/ActivityHeatmap.d.ts +8 -0
  4. package/dist/components/ActivityHeatmap/ActivityHeatmap.types.d.cts +73 -0
  5. package/dist/components/ActivityHeatmap/ActivityHeatmap.types.d.ts +73 -0
  6. package/dist/components/DiffViewer/DiffViewer.d.cts +8 -0
  7. package/dist/components/DiffViewer/DiffViewer.d.ts +8 -0
  8. package/dist/components/DiffViewer/DiffViewer.types.d.cts +131 -0
  9. package/dist/components/DiffViewer/DiffViewer.types.d.ts +131 -0
  10. package/dist/components/DiffViewer/diff.d.cts +10 -0
  11. package/dist/components/DiffViewer/diff.d.ts +10 -0
  12. package/dist/components/Markdown/Markdown.d.cts +8 -0
  13. package/dist/components/Markdown/Markdown.d.ts +8 -0
  14. package/dist/components/Markdown/Markdown.types.d.cts +59 -0
  15. package/dist/components/Markdown/Markdown.types.d.ts +59 -0
  16. package/dist/components/MediaPlayer/MediaPlayer.d.cts +8 -0
  17. package/dist/components/MediaPlayer/MediaPlayer.d.ts +8 -0
  18. package/dist/components/MediaPlayer/MediaPlayer.types.d.cts +109 -0
  19. package/dist/components/MediaPlayer/MediaPlayer.types.d.ts +109 -0
  20. package/dist/components/MentionInput/MentionInput.d.cts +9 -0
  21. package/dist/components/MentionInput/MentionInput.d.ts +9 -0
  22. package/dist/components/MentionInput/MentionInput.types.d.cts +125 -0
  23. package/dist/components/MentionInput/MentionInput.types.d.ts +125 -0
  24. package/dist/components/MentionInput/useMentions.d.cts +8 -0
  25. package/dist/components/MentionInput/useMentions.d.ts +8 -0
  26. package/dist/components/NotificationCenter/NotificationCenter.d.cts +12 -0
  27. package/dist/components/NotificationCenter/NotificationCenter.d.ts +12 -0
  28. package/dist/components/NotificationCenter/NotificationCenter.types.d.cts +129 -0
  29. package/dist/components/NotificationCenter/NotificationCenter.types.d.ts +129 -0
  30. package/dist/components/QRCode/QRCode.d.cts +18 -0
  31. package/dist/components/QRCode/QRCode.d.ts +18 -0
  32. package/dist/components/QRCode/QRCode.types.d.cts +53 -0
  33. package/dist/components/QRCode/QRCode.types.d.ts +53 -0
  34. package/dist/components/QRCode/qr.d.cts +8 -0
  35. package/dist/components/QRCode/qr.d.ts +8 -0
  36. package/dist/components/SignaturePad/SignaturePad.d.cts +8 -0
  37. package/dist/components/SignaturePad/SignaturePad.d.ts +8 -0
  38. package/dist/components/SignaturePad/SignaturePad.types.d.cts +102 -0
  39. package/dist/components/SignaturePad/SignaturePad.types.d.ts +102 -0
  40. package/dist/components/TransferList/TransferList.d.cts +7 -0
  41. package/dist/components/TransferList/TransferList.d.ts +7 -0
  42. package/dist/components/TransferList/TransferList.types.d.cts +75 -0
  43. package/dist/components/TransferList/TransferList.types.d.ts +75 -0
  44. package/dist/components/UploadList/UploadList.d.cts +9 -0
  45. package/dist/components/UploadList/UploadList.d.ts +9 -0
  46. package/dist/components/UploadList/UploadList.types.d.cts +113 -0
  47. package/dist/components/UploadList/UploadList.types.d.ts +113 -0
  48. package/dist/components/UploadList/useUploadQueue.d.cts +8 -0
  49. package/dist/components/UploadList/useUploadQueue.d.ts +8 -0
  50. package/dist/components.css +1194 -104
  51. package/dist/index.cjs +5489 -2267
  52. package/dist/index.cjs.map +4 -4
  53. package/dist/index.d.cts +20 -0
  54. package/dist/index.d.ts +20 -0
  55. package/dist/index.js +5518 -2280
  56. package/dist/index.js.map +4 -4
  57. package/dist/openware-ui.iife.js +24 -9
  58. package/dist/styles.css +1194 -104
  59. package/package.json +1 -1
@@ -1790,6 +1790,99 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
1790
1790
  }
1791
1791
  }
1792
1792
 
1793
+ /* components/TransferList/TransferList.css */
1794
+ /* TransferList: two standalone ListBoxes (ListBox.css) with a column of Buttons between them. Its own width decides
1795
+ the layout (a container query): side by side, or stacked with the buttons turned to point down and up. */
1796
+ .ow-transfer-list {
1797
+ container: ow-transfer-list / inline-size;
1798
+ color: var(--ow-text);
1799
+ font-family: var(--ow-font-sans);
1800
+ }
1801
+
1802
+ .ow-transfer-list__body {
1803
+ display: grid;
1804
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
1805
+ gap: var(--ow-space-lg);
1806
+ }
1807
+
1808
+ .ow-transfer-list__pane {
1809
+ display: grid;
1810
+ min-width: 0;
1811
+ align-content: start;
1812
+ gap: var(--ow-space-sm);
1813
+ }
1814
+
1815
+ .ow-transfer-list__header {
1816
+ display: flex;
1817
+ align-items: baseline;
1818
+ justify-content: space-between;
1819
+ gap: var(--ow-space-sm);
1820
+ }
1821
+
1822
+ .ow-transfer-list__label {
1823
+ font-size: 14px;
1824
+ font-weight: var(--ow-weight-emphasis);
1825
+ line-height: 1.4;
1826
+ }
1827
+
1828
+ .ow-transfer-list__count {
1829
+ color: var(--ow-text-muted);
1830
+ font-size: 12px;
1831
+ font-variant-numeric: tabular-nums;
1832
+ white-space: nowrap;
1833
+ }
1834
+
1835
+ .ow-transfer-list .ow-transfer-list__list {
1836
+ height: var(--ow-transfer-list-height);
1837
+ }
1838
+
1839
+ .ow-transfer-list__actions {
1840
+ display: flex;
1841
+ flex-direction: column;
1842
+ align-self: center;
1843
+ gap: var(--ow-space-xs);
1844
+ }
1845
+
1846
+ .ow-transfer-list__icon {
1847
+ display: flex;
1848
+ }
1849
+
1850
+ /* The arrows point the way the items go, so they turn round right to left. */
1851
+ .ow-transfer-list__icon--back,
1852
+ .ow-transfer-list:dir(rtl) .ow-transfer-list__icon {
1853
+ transform: scaleX(-1);
1854
+ }
1855
+
1856
+ .ow-transfer-list:dir(rtl) .ow-transfer-list__icon--back {
1857
+ transform: none;
1858
+ }
1859
+
1860
+ .ow-transfer-list__order {
1861
+ display: flex;
1862
+ justify-content: flex-end;
1863
+ gap: var(--ow-space-2xs);
1864
+ }
1865
+
1866
+ @container ow-transfer-list (max-width: 519px) {
1867
+ .ow-transfer-list__body {
1868
+ grid-template-columns: minmax(0, 1fr);
1869
+ }
1870
+
1871
+ .ow-transfer-list__actions {
1872
+ flex-direction: row;
1873
+ justify-content: center;
1874
+ }
1875
+
1876
+ /* Across becomes down: → turns to ↓ and ← to ↑, whichever way the text runs. */
1877
+ .ow-transfer-list .ow-transfer-list__actions .ow-transfer-list__icon {
1878
+ transform: rotate(90deg);
1879
+ }
1880
+
1881
+ .ow-transfer-list .ow-transfer-list__actions .ow-transfer-list__icon--back {
1882
+ transform: rotate(-90deg);
1883
+ }
1884
+ }
1885
+
1793
1886
  /* components/Combobox/Combobox.css */
1794
1887
  /* Combobox: a grouped field (Input.css) with a chevron, over Select's listbox. */
1795
1888
  .ow-combobox {
@@ -1878,6 +1971,20 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
1878
1971
  padding-left: var(--ow-space-2xs);
1879
1972
  }
1880
1973
 
1974
+ /* components/MentionInput/MentionInput.css */
1975
+ /* MentionInput: an Input or a Textarea, with Select's listbox (Select.css) under the trigger character. */
1976
+ .ow-mention-list {
1977
+ width: max-content;
1978
+ min-width: 224px;
1979
+ max-width: min(360px, calc(100vw - 16px));
1980
+ }
1981
+
1982
+ .ow-mention-list__empty {
1983
+ display: flex;
1984
+ align-items: center;
1985
+ gap: var(--ow-space-xs);
1986
+ }
1987
+
1881
1988
  /* components/Checkbox/Checkbox.css */
1882
1989
  /* Checkbox: a native input with its look replaced. */
1883
1990
  .ow-checkbox {
@@ -2503,6 +2610,99 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
2503
2610
  }
2504
2611
  }
2505
2612
 
2613
+ /* components/SignaturePad/SignaturePad.css */
2614
+ /* SignaturePad: a field-like box to sign in, on a signing line, with its buttons underneath. */
2615
+ .ow-signature-pad {
2616
+ position: relative;
2617
+ display: grid;
2618
+ width: 100%;
2619
+ min-width: 0;
2620
+ gap: var(--ow-space-sm);
2621
+ }
2622
+
2623
+ .ow-signature-pad__surface {
2624
+ position: relative;
2625
+ height: var(--ow-signature-pad-height, 160px);
2626
+ overflow: hidden;
2627
+ border: 1px solid var(--ow-border-strong);
2628
+ border-radius: var(--ow-radius-form);
2629
+ background: var(--ow-surface);
2630
+ transition-property: border-color, box-shadow;
2631
+ transition-duration: var(--ow-duration-base);
2632
+ transition-timing-function: var(--ow-ease-standard);
2633
+ }
2634
+
2635
+ /* The ink is this colour (a penColor replaces it); the script reads it from CSS, so it follows the theme. */
2636
+ .ow-signature-pad__canvas {
2637
+ display: block;
2638
+ width: 100%;
2639
+ height: 100%;
2640
+ color: var(--ow-text);
2641
+ cursor: crosshair;
2642
+ touch-action: none;
2643
+ }
2644
+
2645
+ .ow-signature-pad--typing .ow-signature-pad__canvas,
2646
+ .ow-signature-pad--readonly .ow-signature-pad__canvas,
2647
+ .ow-signature-pad--disabled .ow-signature-pad__canvas {
2648
+ cursor: default;
2649
+ }
2650
+
2651
+ .ow-signature-pad:not(.ow-signature-pad--typing, .ow-signature-pad--readonly, .ow-signature-pad--disabled) .ow-signature-pad__surface:hover {
2652
+ border-color: var(--ow-border-hover);
2653
+ }
2654
+
2655
+ .ow-signature-pad--drawing .ow-signature-pad__surface {
2656
+ border-color: var(--ow-focus-border);
2657
+ box-shadow: var(--ow-shadow-focus);
2658
+ }
2659
+
2660
+ .ow-signature-pad--invalid .ow-signature-pad__surface {
2661
+ border-color: var(--ow-danger-line);
2662
+ }
2663
+
2664
+ /* At 72% of the height, where the script sets a typed name. */
2665
+ .ow-signature-pad__line {
2666
+ position: absolute;
2667
+ top: 72%;
2668
+ inset-inline: var(--ow-space-2xl);
2669
+ border-top: 1px dashed var(--ow-border-strong);
2670
+ pointer-events: none;
2671
+ }
2672
+
2673
+ .ow-signature-pad__prompt {
2674
+ position: absolute;
2675
+ bottom: calc(28% + var(--ow-space-xs));
2676
+ inset-inline-start: var(--ow-space-2xl);
2677
+ color: var(--ow-text-muted);
2678
+ font-size: 14px;
2679
+ line-height: 1.4;
2680
+ pointer-events: none;
2681
+ }
2682
+
2683
+ .ow-signature-pad__actions {
2684
+ display: flex;
2685
+ flex-wrap: wrap;
2686
+ align-items: center;
2687
+ gap: var(--ow-space-xs);
2688
+ }
2689
+
2690
+ .ow-signature-pad__edit {
2691
+ display: inline-flex;
2692
+ gap: var(--ow-space-xs);
2693
+ margin-inline-start: auto;
2694
+ }
2695
+
2696
+ .ow-signature-pad--disabled .ow-signature-pad__surface {
2697
+ opacity: 0.62;
2698
+ }
2699
+
2700
+ @media (prefers-reduced-motion: reduce) {
2701
+ .ow-signature-pad__surface {
2702
+ transition: none;
2703
+ }
2704
+ }
2705
+
2506
2706
  /* components/NumberField/NumberField.css */
2507
2707
  /* NumberField: − value + in one field. */
2508
2708
  .ow-number-field {
@@ -2764,6 +2964,198 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
2764
2964
  color: var(--ow-danger-text);
2765
2965
  }
2766
2966
 
2967
+ /* components/UploadList/UploadList.css */
2968
+ /* UploadList: a row (or a tile) per file being uploaded, with its progress, status and buttons. */
2969
+ .ow-upload-list {
2970
+ width: 100%;
2971
+ min-width: 0;
2972
+ }
2973
+
2974
+ .ow-upload-list__items {
2975
+ display: grid;
2976
+ gap: var(--ow-space-sm);
2977
+ margin: 0;
2978
+ padding: 0;
2979
+ list-style: none;
2980
+ border-radius: var(--ow-radius-container);
2981
+ }
2982
+
2983
+ .ow-upload-list__items:focus-visible {
2984
+ outline: 2px solid var(--ow-focus-ring);
2985
+ outline-offset: 2px;
2986
+ }
2987
+
2988
+ .ow-upload-list__item {
2989
+ position: relative;
2990
+ display: flex;
2991
+ min-width: 0;
2992
+ align-items: center;
2993
+ gap: var(--ow-space-md);
2994
+ border: 1px solid var(--ow-border);
2995
+ border-radius: var(--ow-radius-container);
2996
+ background: var(--ow-surface);
2997
+ padding: var(--ow-space-sm);
2998
+ padding-inline-start: var(--ow-space-md);
2999
+ }
3000
+
3001
+ .ow-upload-list__item--error {
3002
+ border-color: var(--ow-danger-line);
3003
+ }
3004
+
3005
+ .ow-upload-list__thumb {
3006
+ position: relative;
3007
+ display: inline-flex;
3008
+ width: 40px;
3009
+ height: 40px;
3010
+ flex-shrink: 0;
3011
+ align-items: center;
3012
+ justify-content: center;
3013
+ overflow: hidden;
3014
+ border-radius: var(--ow-radius-md);
3015
+ background: var(--ow-surface-muted);
3016
+ color: var(--ow-text-muted);
3017
+ }
3018
+
3019
+ .ow-upload-list__thumb img {
3020
+ position: absolute;
3021
+ inset: 0;
3022
+ width: 100%;
3023
+ height: 100%;
3024
+ object-fit: cover;
3025
+ }
3026
+
3027
+ .ow-upload-list__body {
3028
+ display: grid;
3029
+ min-width: 0;
3030
+ flex: 1;
3031
+ gap: 2px;
3032
+ }
3033
+
3034
+ .ow-upload-list__name {
3035
+ overflow: hidden;
3036
+ color: var(--ow-text);
3037
+ font-size: 14px;
3038
+ font-weight: var(--ow-weight-emphasis);
3039
+ line-height: 1.35;
3040
+ text-overflow: ellipsis;
3041
+ white-space: nowrap;
3042
+ }
3043
+
3044
+ .ow-upload-list__detail {
3045
+ display: flex;
3046
+ min-width: 0;
3047
+ align-items: center;
3048
+ gap: var(--ow-space-xs);
3049
+ color: var(--ow-text-muted);
3050
+ font-size: 12px;
3051
+ line-height: 1.35;
3052
+ font-variant-numeric: tabular-nums;
3053
+ }
3054
+
3055
+ .ow-upload-list__detail > span {
3056
+ overflow: hidden;
3057
+ text-overflow: ellipsis;
3058
+ white-space: nowrap;
3059
+ }
3060
+
3061
+ .ow-upload-list__icon {
3062
+ flex-shrink: 0;
3063
+ }
3064
+
3065
+ .ow-upload-list__item--done .ow-upload-list__icon {
3066
+ color: var(--ow-success-text);
3067
+ }
3068
+
3069
+ .ow-upload-list__item--error .ow-upload-list__detail {
3070
+ color: var(--ow-danger-text);
3071
+ }
3072
+
3073
+ .ow-upload-list__progress {
3074
+ margin-top: var(--ow-space-xs);
3075
+ }
3076
+
3077
+ .ow-upload-list__actions {
3078
+ display: flex;
3079
+ flex-shrink: 0;
3080
+ gap: var(--ow-space-2xs);
3081
+ }
3082
+
3083
+ .ow-upload-list__actions:empty {
3084
+ display: none;
3085
+ }
3086
+
3087
+ /* Compact: one short line per file, its progress a hairline along the bottom. */
3088
+ .ow-upload-list--compact .ow-upload-list__items {
3089
+ gap: var(--ow-space-xs);
3090
+ }
3091
+
3092
+ .ow-upload-list--compact .ow-upload-list__item {
3093
+ gap: var(--ow-space-sm);
3094
+ padding-block: var(--ow-space-2xs);
3095
+ }
3096
+
3097
+ .ow-upload-list--compact .ow-upload-list__thumb {
3098
+ width: auto;
3099
+ height: auto;
3100
+ background: none;
3101
+ }
3102
+
3103
+ .ow-upload-list--compact .ow-upload-list__body {
3104
+ display: flex;
3105
+ align-items: baseline;
3106
+ gap: var(--ow-space-sm);
3107
+ }
3108
+
3109
+ .ow-upload-list--compact .ow-upload-list__name {
3110
+ min-width: 4em;
3111
+ flex: 1 1 auto;
3112
+ font-size: 13px;
3113
+ }
3114
+
3115
+ .ow-upload-list--compact .ow-upload-list__progress {
3116
+ position: absolute;
3117
+ inset: auto var(--ow-space-md) 2px;
3118
+ margin: 0;
3119
+ }
3120
+
3121
+ /* Grid: a tile per file, the thumbnail on top and the buttons over its corner. */
3122
+ .ow-upload-list--grid .ow-upload-list__items {
3123
+ grid-template-columns: repeat(auto-fill, minmax(144px, 1fr));
3124
+ gap: var(--ow-space-md);
3125
+ }
3126
+
3127
+ .ow-upload-list--grid .ow-upload-list__item {
3128
+ flex-direction: column;
3129
+ align-items: stretch;
3130
+ gap: var(--ow-space-sm);
3131
+ padding: var(--ow-space-xs) var(--ow-space-xs) var(--ow-space-sm);
3132
+ }
3133
+
3134
+ .ow-upload-list--grid .ow-upload-list__thumb {
3135
+ width: auto;
3136
+ height: auto;
3137
+ aspect-ratio: 1;
3138
+ border-radius: calc(var(--ow-radius-container) - 4px);
3139
+ }
3140
+
3141
+ .ow-upload-list--grid .ow-upload-list__thumb svg {
3142
+ width: 28px;
3143
+ height: 28px;
3144
+ }
3145
+
3146
+ .ow-upload-list--grid .ow-upload-list__body {
3147
+ padding-inline: var(--ow-space-xs);
3148
+ }
3149
+
3150
+ .ow-upload-list--grid .ow-upload-list__actions {
3151
+ position: absolute;
3152
+ inset-block-start: var(--ow-space-sm);
3153
+ inset-inline-end: var(--ow-space-sm);
3154
+ border-radius: var(--ow-radius-md);
3155
+ background: var(--ow-surface);
3156
+ box-shadow: 0 0 0 1px var(--ow-border);
3157
+ }
3158
+
2767
3159
  /* components/Field/Field.css */
2768
3160
  /* Field: label, control, hint, error. */
2769
3161
  .ow-field {
@@ -3968,103 +4360,320 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
3968
4360
  display 220ms allow-discrete;
3969
4361
  }
3970
4362
 
3971
- .ow-drawer[open]::backdrop {
3972
- background-color: var(--ow-backdrop);
4363
+ .ow-drawer[open]::backdrop {
4364
+ background-color: var(--ow-backdrop);
4365
+ }
4366
+
4367
+ @starting-style {
4368
+ .ow-drawer[open]::backdrop {
4369
+ background-color: rgb(0 0 0 / 0);
4370
+ }
4371
+ }
4372
+
4373
+ .ow-drawer__header {
4374
+ display: flex;
4375
+ flex-shrink: 0;
4376
+ align-items: flex-start;
4377
+ gap: var(--ow-space-md);
4378
+ border-bottom: 1px solid var(--ow-border);
4379
+ padding: var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-3xl);
4380
+ }
4381
+
4382
+ .ow-drawer__titles {
4383
+ display: grid;
4384
+ min-width: 0;
4385
+ flex: 1;
4386
+ gap: var(--ow-space-2xs);
4387
+ padding-top: 5px;
4388
+ }
4389
+
4390
+ .ow-drawer__title {
4391
+ margin: 0;
4392
+ font-size: 16px;
4393
+ font-weight: var(--ow-weight-display);
4394
+ line-height: 1.3;
4395
+ }
4396
+
4397
+ .ow-drawer__description {
4398
+ margin: 0;
4399
+ color: var(--ow-text-muted);
4400
+ font-size: 13px;
4401
+ line-height: 1.5;
4402
+ }
4403
+
4404
+ .ow-drawer__body {
4405
+ min-height: 0;
4406
+ flex: 1;
4407
+ overflow-y: auto;
4408
+ padding: var(--ow-space-xl) var(--ow-space-3xl);
4409
+ }
4410
+
4411
+ .ow-drawer__footer {
4412
+ display: flex;
4413
+ flex-shrink: 0;
4414
+ flex-wrap: wrap;
4415
+ justify-content: flex-end;
4416
+ gap: var(--ow-space-sm);
4417
+ border-top: 1px solid var(--ow-border);
4418
+ padding: var(--ow-space-lg) var(--ow-space-3xl);
4419
+ }
4420
+
4421
+ @media (prefers-reduced-motion: reduce) {
4422
+ .ow-drawer,
4423
+ .ow-drawer::backdrop {
4424
+ transition: none;
4425
+ }
4426
+ }
4427
+
4428
+ /* components/Popover/Popover.css */
4429
+ /* Popover: a surface card with the menu shadow, attached to its trigger. */
4430
+ .ow-popover-anchor {
4431
+ display: inline-flex;
4432
+ }
4433
+
4434
+ .ow-popover {
4435
+ z-index: 60;
4436
+ display: grid;
4437
+ gap: var(--ow-space-md);
4438
+ overflow: auto;
4439
+ border: 1px solid var(--ow-border);
4440
+ border-radius: var(--ow-radius-container);
4441
+ background: var(--ow-surface);
4442
+ padding: var(--ow-space-xl);
4443
+ color: var(--ow-text);
4444
+ font-family: var(--ow-font-sans);
4445
+ font-size: 14px;
4446
+ line-height: 1.45;
4447
+ box-shadow: var(--ow-shadow-menu);
4448
+ outline: none;
4449
+ }
4450
+
4451
+ /* Children may shrink to the popover's width instead of pushing past it. */
4452
+ .ow-popover > * {
4453
+ min-width: 0;
4454
+ }
4455
+
4456
+ .ow-popover__title {
4457
+ font-size: 14px;
4458
+ font-weight: var(--ow-weight-emphasis);
4459
+ line-height: 1.3;
4460
+ }
4461
+
4462
+ /* components/NotificationCenter/NotificationCenter.css */
4463
+ /* NotificationCenter: a bell with a count, opening a popover inbox. NotificationList: the rows inside it. */
4464
+ .ow-notification-center {
4465
+ display: inline-flex;
4466
+ }
4467
+
4468
+ .ow-notification-center__bell {
4469
+ position: relative;
4470
+ }
4471
+
4472
+ /* The count sits on the bell's corner, cut out of whatever is behind it. */
4473
+ .ow-notification-center__count.ow-badge {
4474
+ position: absolute;
4475
+ top: 0;
4476
+ inset-inline-end: -2px;
4477
+ min-width: 18px;
4478
+ min-height: 18px;
4479
+ border: 2px solid var(--ow-surface);
4480
+ background: var(--ow-primary);
4481
+ padding: 0 4px;
4482
+ color: var(--ow-on-primary);
4483
+ font-size: 10.5px;
4484
+ font-variant-numeric: tabular-nums;
4485
+ pointer-events: none;
4486
+ }
4487
+
4488
+ /* Edge-to-edge rows, so the popover's own padding goes; only the list scrolls when the window is short. */
4489
+ .ow-notification-center__popover.ow-popover {
4490
+ display: flex;
4491
+ flex-direction: column;
4492
+ padding: 0;
4493
+ overflow: hidden;
4494
+ }
4495
+
4496
+ .ow-notification-center__head,
4497
+ .ow-notification-center__foot {
4498
+ display: flex;
4499
+ align-items: center;
4500
+ justify-content: space-between;
4501
+ gap: var(--ow-space-md);
4502
+ padding: var(--ow-space-md) var(--ow-space-md) var(--ow-space-xs);
4503
+ padding-inline-start: var(--ow-space-2xl);
4504
+ }
4505
+
4506
+ .ow-notification-center__title {
4507
+ font-weight: var(--ow-weight-emphasis);
4508
+ }
4509
+
4510
+ .ow-notification-center__tabs.ow-tabs {
4511
+ display: flex;
4512
+ min-height: 0;
4513
+ flex-direction: column;
4514
+ gap: 0;
4515
+ }
4516
+
4517
+ .ow-notification-center__tabs .ow-tabs__list {
4518
+ padding: 0 var(--ow-space-2xl);
4519
+ }
4520
+
4521
+ .ow-notification-center__tab-count {
4522
+ border-radius: var(--ow-radius-pill);
4523
+ background: var(--ow-surface-muted);
4524
+ padding: 1px 6px;
4525
+ font-size: 11px;
4526
+ font-variant-numeric: tabular-nums;
4527
+ }
4528
+
4529
+ .ow-notification-center__body {
4530
+ min-height: 0;
4531
+ max-height: min(420px, 60dvh);
4532
+ overflow-y: auto;
4533
+ padding: var(--ow-space-xs);
4534
+ outline: none;
4535
+ }
4536
+
4537
+ .ow-notification-center__body:focus-visible {
4538
+ box-shadow: inset 0 0 0 2px var(--ow-focus-ring);
4539
+ }
4540
+
4541
+ .ow-notification-center__foot {
4542
+ border-top: 1px solid var(--ow-border);
4543
+ padding-block: var(--ow-space-md);
4544
+ }
4545
+
4546
+ /* The list. */
4547
+ .ow-notification-list__heading {
4548
+ margin: 0;
4549
+ padding: var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-xs);
4550
+ color: var(--ow-text-muted);
4551
+ font-size: 12px;
4552
+ font-weight: var(--ow-weight-strong);
4553
+ }
4554
+
4555
+ .ow-notification-list__items {
4556
+ margin: 0;
4557
+ padding: 0;
4558
+ list-style: none;
4559
+ }
4560
+
4561
+ /* One row: the whole of it opens the item, through the link stretched over it. */
4562
+ .ow-notification {
4563
+ position: relative;
4564
+ display: flex;
4565
+ align-items: flex-start;
4566
+ gap: var(--ow-space-lg);
4567
+ border-radius: var(--ow-radius-form);
4568
+ padding-block: var(--ow-space-lg);
4569
+ padding-inline: 22px var(--ow-space-md);
4570
+ color: var(--ow-text-soft);
4571
+ transition: background-color var(--ow-duration-fast) var(--ow-ease-standard);
4572
+ }
4573
+
4574
+ .ow-notification:hover {
4575
+ background: var(--ow-hover);
3973
4576
  }
3974
4577
 
3975
- @starting-style {
3976
- .ow-drawer[open]::backdrop {
3977
- background-color: rgb(0 0 0 / 0);
3978
- }
4578
+ .ow-notification__dot {
4579
+ position: absolute;
4580
+ top: 20px;
4581
+ inset-inline-start: 8px;
4582
+ width: 8px;
4583
+ height: 8px;
4584
+ border-radius: 50%;
4585
+ background: var(--ow-primary);
3979
4586
  }
3980
4587
 
3981
- .ow-drawer__header {
3982
- display: flex;
4588
+ .ow-notification__media {
4589
+ display: inline-flex;
3983
4590
  flex-shrink: 0;
3984
- align-items: flex-start;
3985
- gap: var(--ow-space-md);
3986
- border-bottom: 1px solid var(--ow-border);
3987
- padding: var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-lg) var(--ow-space-3xl);
3988
4591
  }
3989
4592
 
3990
- .ow-drawer__titles {
4593
+ .ow-notification__icon {
4594
+ display: inline-flex;
4595
+ width: 28px;
4596
+ height: 28px;
4597
+ align-items: center;
4598
+ justify-content: center;
4599
+ border: 1px solid var(--ow-border);
4600
+ border-radius: 50%;
4601
+ background: var(--ow-surface-muted);
4602
+ color: var(--ow-text-soft);
4603
+ }
4604
+
4605
+ .ow-notification__body {
3991
4606
  display: grid;
3992
4607
  min-width: 0;
3993
4608
  flex: 1;
3994
- gap: var(--ow-space-2xs);
3995
- padding-top: 5px;
4609
+ gap: var(--ow-space-md);
3996
4610
  }
3997
4611
 
3998
- .ow-drawer__title {
3999
- margin: 0;
4000
- font-size: 16px;
4001
- font-weight: var(--ow-weight-display);
4002
- line-height: 1.3;
4612
+ .ow-notification__main {
4613
+ display: grid;
4614
+ gap: 2px;
4615
+ border: 0;
4616
+ background: none;
4617
+ padding: 0;
4618
+ color: inherit;
4619
+ font: inherit;
4620
+ text-align: start;
4621
+ text-decoration: none;
4622
+ cursor: pointer;
4623
+ outline: none;
4003
4624
  }
4004
4625
 
4005
- .ow-drawer__description {
4006
- margin: 0;
4007
- color: var(--ow-text-muted);
4008
- font-size: 13px;
4009
- line-height: 1.5;
4626
+ .ow-notification__main::after {
4627
+ content: "";
4628
+ position: absolute;
4629
+ inset: 0;
4630
+ border-radius: inherit;
4010
4631
  }
4011
4632
 
4012
- .ow-drawer__body {
4013
- min-height: 0;
4014
- flex: 1;
4015
- overflow-y: auto;
4016
- padding: var(--ow-space-xl) var(--ow-space-3xl);
4633
+ .ow-notification__main:focus-visible::after {
4634
+ outline: 2px solid var(--ow-focus-ring);
4635
+ outline-offset: -2px;
4017
4636
  }
4018
4637
 
4019
- .ow-drawer__footer {
4020
- display: flex;
4021
- flex-shrink: 0;
4022
- flex-wrap: wrap;
4023
- justify-content: flex-end;
4024
- gap: var(--ow-space-sm);
4025
- border-top: 1px solid var(--ow-border);
4026
- padding: var(--ow-space-lg) var(--ow-space-3xl);
4638
+ .ow-notification--unread .ow-notification__title {
4639
+ color: var(--ow-text);
4640
+ font-weight: var(--ow-weight-strong);
4027
4641
  }
4028
4642
 
4029
- @media (prefers-reduced-motion: reduce) {
4030
- .ow-drawer,
4031
- .ow-drawer::backdrop {
4032
- transition: none;
4033
- }
4643
+ .ow-notification__description {
4644
+ display: -webkit-box;
4645
+ overflow: hidden;
4646
+ -webkit-box-orient: vertical;
4647
+ -webkit-line-clamp: 2;
4034
4648
  }
4035
4649
 
4036
- /* components/Popover/Popover.css */
4037
- /* Popover: a surface card with the menu shadow, attached to its trigger. */
4038
- .ow-popover-anchor {
4039
- display: inline-flex;
4650
+ .ow-notification__time {
4651
+ color: var(--ow-text-muted);
4652
+ font-size: 12px;
4040
4653
  }
4041
4654
 
4042
- .ow-popover {
4043
- z-index: 60;
4044
- display: grid;
4045
- gap: var(--ow-space-md);
4046
- overflow: auto;
4047
- border: 1px solid var(--ow-border);
4048
- border-radius: var(--ow-radius-container);
4049
- background: var(--ow-surface);
4050
- padding: var(--ow-space-xl);
4051
- color: var(--ow-text);
4052
- font-family: var(--ow-font-sans);
4053
- font-size: 14px;
4054
- line-height: 1.45;
4055
- box-shadow: var(--ow-shadow-menu);
4056
- outline: none;
4655
+ /* Actions and the ✕ sit above the stretched link, so they take their own clicks. */
4656
+ .ow-notification__actions,
4657
+ .ow-notification__dismiss {
4658
+ position: relative;
4659
+ z-index: 1;
4057
4660
  }
4058
4661
 
4059
- /* Children may shrink to the popover's width instead of pushing past it. */
4060
- .ow-popover > * {
4061
- min-width: 0;
4662
+ .ow-notification__actions {
4663
+ display: flex;
4664
+ flex-wrap: wrap;
4665
+ gap: var(--ow-space-sm);
4062
4666
  }
4063
4667
 
4064
- .ow-popover__title {
4065
- font-size: 14px;
4066
- font-weight: var(--ow-weight-emphasis);
4067
- line-height: 1.3;
4668
+ .ow-notification__dismiss {
4669
+ flex-shrink: 0;
4670
+ margin: -4px 0;
4671
+ }
4672
+
4673
+ @media (prefers-reduced-motion: reduce) {
4674
+ .ow-notification {
4675
+ transition: none;
4676
+ }
4068
4677
  }
4069
4678
 
4070
4679
  /* components/Tour/Tour.css */
@@ -6319,6 +6928,25 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
6319
6928
  white-space: nowrap;
6320
6929
  }
6321
6930
 
6931
+ /* components/QRCode/QRCode.css */
6932
+ /* QRCode: near black on near white in both themes, since scanners need a light ground and strong contrast. */
6933
+ .ow-qr-code {
6934
+ display: block;
6935
+ flex: none;
6936
+ max-width: 100%;
6937
+ height: auto;
6938
+ forced-color-adjust: none;
6939
+ print-color-adjust: exact;
6940
+ }
6941
+
6942
+ .ow-qr-code__ground {
6943
+ fill: var(--ow-gray-50);
6944
+ }
6945
+
6946
+ .ow-qr-code__modules {
6947
+ fill: var(--ow-gray-950);
6948
+ }
6949
+
6322
6950
  /* components/Image/Image.css */
6323
6951
  /* 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
6324
6952
  AspectRatio and the image fills it. */
@@ -6340,63 +6968,227 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
6340
6968
  transition: opacity var(--ow-duration-base) var(--ow-ease-standard);
6341
6969
  }
6342
6970
 
6343
- .ow-image--cover .ow-image__img {
6344
- object-fit: cover;
6971
+ .ow-image--cover .ow-image__img {
6972
+ object-fit: cover;
6973
+ }
6974
+
6975
+ .ow-image--contain .ow-image__img {
6976
+ object-fit: contain;
6977
+ }
6978
+
6979
+ .ow-image--radius-control {
6980
+ border-radius: var(--ow-radius-form);
6981
+ }
6982
+
6983
+ .ow-image--radius-container {
6984
+ border-radius: var(--ow-radius-container);
6985
+ }
6986
+
6987
+ /* Loading: the Skeleton's grey and pulse, with the image hidden until it's ready. */
6988
+ .ow-image--loading {
6989
+ background: var(--ow-skeleton);
6990
+ animation: ow-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
6991
+ }
6992
+
6993
+ .ow-image--loading .ow-image__img {
6994
+ opacity: 0;
6995
+ }
6996
+
6997
+ .ow-image__fallback {
6998
+ display: flex;
6999
+ box-sizing: border-box;
7000
+ min-width: 64px;
7001
+ max-width: 100%;
7002
+ min-height: 64px;
7003
+ align-items: center;
7004
+ justify-content: center;
7005
+ }
7006
+
7007
+ .ow-image__fallback--default {
7008
+ background: var(--ow-skeleton-soft);
7009
+ color: var(--ow-icon);
7010
+ }
7011
+
7012
+ .ow-image-figure {
7013
+ display: grid;
7014
+ margin: 0;
7015
+ gap: var(--ow-space-sm);
7016
+ justify-items: start;
7017
+ }
7018
+
7019
+ .ow-image-figure > .ow-aspect-ratio {
7020
+ justify-self: stretch;
7021
+ }
7022
+
7023
+ .ow-image-figure__caption {
7024
+ color: var(--ow-text-muted);
7025
+ font-family: var(--ow-font-sans);
7026
+ font-size: 13px;
7027
+ line-height: 1.4;
7028
+ }
7029
+
7030
+ /* components/MediaPlayer/MediaPlayer.css */
7031
+ /* MediaPlayer: audio is a bar of controls; video is the picture, with the same bar floating over its foot. */
7032
+ .ow-media {
7033
+ position: relative;
7034
+ container-type: inline-size;
7035
+ border-radius: var(--ow-radius-container);
7036
+ color: var(--ow-text);
7037
+ font-family: var(--ow-font-sans);
7038
+ }
7039
+
7040
+ .ow-media:focus-visible {
7041
+ outline: 2px solid var(--ow-focus-ring);
7042
+ outline-offset: 2px;
7043
+ }
7044
+
7045
+ .ow-media--audio {
7046
+ display: grid;
7047
+ gap: var(--ow-space-2xs);
7048
+ border: 1px solid var(--ow-border);
7049
+ background: var(--ow-surface);
7050
+ padding: var(--ow-space-xs);
7051
+ }
7052
+
7053
+ .ow-media--audio .ow-media__element {
7054
+ display: none;
7055
+ }
7056
+
7057
+ .ow-media__title {
7058
+ overflow: hidden;
7059
+ padding: var(--ow-space-2xs) var(--ow-space-xs) 0;
7060
+ font-size: 14px;
7061
+ font-weight: var(--ow-weight-emphasis);
7062
+ text-overflow: ellipsis;
7063
+ white-space: nowrap;
7064
+ }
7065
+
7066
+ .ow-media--video {
7067
+ overflow: hidden;
7068
+ background: var(--ow-gray-950);
7069
+ }
7070
+
7071
+ /* Letterboxed, never cropped. */
7072
+ .ow-media__screen > .ow-media__element {
7073
+ object-fit: contain;
7074
+ cursor: pointer;
7075
+ }
7076
+
7077
+ .ow-media__controls {
7078
+ display: flex;
7079
+ align-items: center;
7080
+ gap: var(--ow-space-2xs);
7081
+ min-width: 0;
7082
+ }
7083
+
7084
+ .ow-media--video .ow-media__controls {
7085
+ position: absolute;
7086
+ inset-inline: var(--ow-space-sm);
7087
+ bottom: var(--ow-space-sm);
7088
+ border: 1px solid var(--ow-border);
7089
+ border-radius: var(--ow-radius-lg);
7090
+ background: var(--ow-surface);
7091
+ padding: var(--ow-space-2xs);
7092
+ box-shadow: var(--ow-shadow-menu);
7093
+ transition: opacity var(--ow-duration-base) var(--ow-ease-standard);
7094
+ }
7095
+
7096
+ /* Playing and left alone: the controls fade out (still reachable with Tab, which brings them back) and so does the pointer. */
7097
+ .ow-media--idle {
7098
+ cursor: none;
7099
+ }
7100
+
7101
+ .ow-media--idle .ow-media__controls {
7102
+ opacity: 0;
7103
+ pointer-events: none;
7104
+ }
7105
+
7106
+ /* Captions rise above the controls while they show (Chromium and Safari let the page move them). */
7107
+ .ow-media__element::-webkit-media-text-track-container {
7108
+ transition: transform var(--ow-duration-base) var(--ow-ease-standard);
7109
+ }
7110
+
7111
+ .ow-media--video:not(.ow-media--idle) .ow-media__element::-webkit-media-text-track-container {
7112
+ transform: translateY(-56px);
7113
+ }
7114
+
7115
+ /* The timeline reads left to right in every language, as players do; the loaded part is a shade darker than the rest. */
7116
+ .ow-media__seek {
7117
+ flex: 1;
7118
+ min-width: 48px;
7119
+ direction: ltr;
6345
7120
  }
6346
7121
 
6347
- .ow-image--contain .ow-image__img {
6348
- object-fit: contain;
7122
+ .ow-media__seek .ow-slider__track {
7123
+ background: linear-gradient(to right, var(--ow-border-strong) var(--ow-media-buffered), var(--ow-meter-track) 0);
6349
7124
  }
6350
7125
 
6351
- .ow-image--radius-control {
6352
- border-radius: var(--ow-radius-form);
7126
+ .ow-media__volume {
7127
+ width: 72px;
6353
7128
  }
6354
7129
 
6355
- .ow-image--radius-container {
6356
- border-radius: var(--ow-radius-container);
7130
+ .ow-media__time {
7131
+ padding-inline: var(--ow-space-2xs);
7132
+ color: var(--ow-text-muted);
7133
+ font-size: 12px;
7134
+ font-variant-numeric: tabular-nums;
7135
+ white-space: nowrap;
6357
7136
  }
6358
7137
 
6359
- /* Loading: the Skeleton's grey and pulse, with the image hidden until it's ready. */
6360
- .ow-image--loading {
6361
- background: var(--ow-skeleton);
6362
- animation: ow-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
7138
+ .ow-media__rate {
7139
+ min-width: 44px;
7140
+ font-variant-numeric: tabular-nums;
6363
7141
  }
6364
7142
 
6365
- .ow-image--loading .ow-image__img {
6366
- opacity: 0;
7143
+ .ow-media__controls [aria-pressed="true"],
7144
+ .ow-media__on {
7145
+ background: var(--ow-surface-muted);
7146
+ color: var(--ow-primary-text);
6367
7147
  }
6368
7148
 
6369
- .ow-image__fallback {
7149
+ .ow-media__blank {
7150
+ display: block;
7151
+ width: 15px;
7152
+ height: 15px;
7153
+ }
7154
+
7155
+ .ow-media--fullscreen {
6370
7156
  display: flex;
6371
- box-sizing: border-box;
6372
- min-width: 64px;
6373
- max-width: 100%;
6374
- min-height: 64px;
6375
7157
  align-items: center;
6376
- justify-content: center;
7158
+ border-radius: 0;
6377
7159
  }
6378
7160
 
6379
- .ow-image__fallback--default {
6380
- background: var(--ow-skeleton-soft);
6381
- color: var(--ow-icon);
7161
+ /* AspectRatio sets its ratio inline; full screen, the picture takes the whole screen instead. */
7162
+ .ow-media--fullscreen .ow-media__screen {
7163
+ height: 100%;
7164
+ aspect-ratio: auto !important;
6382
7165
  }
6383
7166
 
6384
- .ow-image-figure {
6385
- display: grid;
6386
- margin: 0;
6387
- gap: var(--ow-space-sm);
6388
- justify-items: start;
7167
+ @container (max-width: 440px) {
7168
+ .ow-media__volume,
7169
+ .ow-media__pip {
7170
+ display: none;
7171
+ }
6389
7172
  }
6390
7173
 
6391
- .ow-image-figure > .ow-aspect-ratio {
6392
- justify-self: stretch;
7174
+ /* On a phone the device's buttons set the volume; M still mutes. */
7175
+ @container (max-width: 360px) {
7176
+ .ow-media--video .ow-media__mute {
7177
+ display: none;
7178
+ }
6393
7179
  }
6394
7180
 
6395
- .ow-image-figure__caption {
6396
- color: var(--ow-text-muted);
6397
- font-family: var(--ow-font-sans);
6398
- font-size: 13px;
6399
- line-height: 1.4;
7181
+ @container (max-width: 240px) {
7182
+ .ow-media__time {
7183
+ display: none;
7184
+ }
7185
+ }
7186
+
7187
+ @media (prefers-reduced-motion: reduce) {
7188
+ .ow-media__controls,
7189
+ .ow-media__element::-webkit-media-text-track-container {
7190
+ transition: none !important;
7191
+ }
6400
7192
  }
6401
7193
 
6402
7194
  /* components/Kbd/Kbd.css */
@@ -6628,6 +7420,159 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
6628
7420
  transform: none;
6629
7421
  }
6630
7422
 
7423
+ /* components/DiffViewer/DiffViewer.css */
7424
+ /* DiffViewer: a code block's ground and header (it uses CodeBlock's classes), with a table of lines tinted from the
7425
+ success and danger colours. The code block is dark in both themes, so the tints are too. */
7426
+ .ow-diff {
7427
+ --ow-diff-add: var(--ow-success-solid);
7428
+ --ow-diff-del: var(--ow-danger-solid);
7429
+ display: grid;
7430
+ min-width: 0;
7431
+ gap: var(--ow-space-md);
7432
+ }
7433
+
7434
+ .ow-diff__counts {
7435
+ font-family: var(--ow-font-mono);
7436
+ font-size: 12px;
7437
+ white-space: nowrap;
7438
+ }
7439
+
7440
+ /* Signs and counts are lifted toward the text colour so they read on the tints. */
7441
+ .ow-diff__added,
7442
+ .ow-diff__add > .ow-diff__sign {
7443
+ color: color-mix(in srgb, var(--ow-diff-add) 60%, var(--ow-on-code-block));
7444
+ }
7445
+
7446
+ .ow-diff__removed,
7447
+ .ow-diff__del > .ow-diff__sign {
7448
+ color: color-mix(in srgb, var(--ow-diff-del) 60%, var(--ow-on-code-block));
7449
+ }
7450
+
7451
+ .ow-diff__scroll {
7452
+ overflow: auto;
7453
+ }
7454
+
7455
+ .ow-diff__scroll:focus-visible {
7456
+ outline: 2px solid var(--ow-brand-300);
7457
+ outline-offset: -2px;
7458
+ }
7459
+
7460
+ .ow-diff__table {
7461
+ min-width: 100%;
7462
+ border-collapse: collapse;
7463
+ font-family: var(--ow-font-mono);
7464
+ font-size: 13px;
7465
+ line-height: 1.6;
7466
+ tab-size: 4;
7467
+ }
7468
+
7469
+ .ow-diff__table--wrap {
7470
+ width: 100%;
7471
+ table-layout: fixed;
7472
+ }
7473
+
7474
+ /* Cells have no padding of their own; the classes below add it. */
7475
+ :where(.ow-diff__table td) {
7476
+ padding: 0;
7477
+ vertical-align: top;
7478
+ }
7479
+
7480
+ .ow-diff__num-col {
7481
+ width: calc(var(--ow-diff-digits) * 1ch + 20px);
7482
+ }
7483
+
7484
+ .ow-diff__num {
7485
+ padding-inline: 10px;
7486
+ color: var(--ow-on-code-block-muted);
7487
+ text-align: right;
7488
+ user-select: none;
7489
+ }
7490
+
7491
+ /* The sign hangs in the margin, so wrapped lines line up under the code. */
7492
+ .ow-diff__code {
7493
+ padding: 0 var(--ow-space-lg) 0 calc(var(--ow-space-sm) + 2ch);
7494
+ text-indent: -2ch;
7495
+ white-space: pre;
7496
+ }
7497
+
7498
+ .ow-diff__table--wrap .ow-diff__code {
7499
+ overflow-wrap: anywhere;
7500
+ white-space: pre-wrap;
7501
+ }
7502
+
7503
+ .ow-diff__code:focus {
7504
+ outline: none;
7505
+ }
7506
+
7507
+ .ow-diff__sign {
7508
+ display: inline-block;
7509
+ width: 2ch;
7510
+ text-indent: 0;
7511
+ user-select: none;
7512
+ }
7513
+
7514
+ .ow-diff__add {
7515
+ background: color-mix(in srgb, var(--ow-diff-add) 14%, transparent);
7516
+ }
7517
+
7518
+ .ow-diff__del {
7519
+ background: color-mix(in srgb, var(--ow-diff-del) 14%, transparent);
7520
+ }
7521
+
7522
+ .ow-diff__word {
7523
+ border-radius: 2px;
7524
+ background: color-mix(in srgb, var(--ow-diff-add) 34%, transparent);
7525
+ }
7526
+
7527
+ .ow-diff__del .ow-diff__word {
7528
+ background: color-mix(in srgb, var(--ow-diff-del) 34%, transparent);
7529
+ }
7530
+
7531
+ .ow-diff__empty {
7532
+ background: color-mix(in srgb, var(--ow-on-code-block) 3%, transparent);
7533
+ }
7534
+
7535
+ .ow-diff__table--split .ow-diff__num:nth-child(3) {
7536
+ border-left: 1px solid color-mix(in srgb, var(--ow-on-code-block) 8%, transparent);
7537
+ }
7538
+
7539
+ .ow-diff__hunk > td,
7540
+ .ow-diff__gap > td {
7541
+ background: color-mix(in srgb, var(--ow-on-code-block) 5%, transparent);
7542
+ color: var(--ow-on-code-block-muted);
7543
+ }
7544
+
7545
+ .ow-diff__hunk > td {
7546
+ padding: 2px var(--ow-space-lg);
7547
+ white-space: pre;
7548
+ }
7549
+
7550
+ .ow-diff__expand {
7551
+ display: flex;
7552
+ width: 100%;
7553
+ min-height: 28px;
7554
+ align-items: center;
7555
+ gap: var(--ow-space-sm);
7556
+ border: 0;
7557
+ background: transparent;
7558
+ padding: 0 var(--ow-space-lg);
7559
+ color: inherit;
7560
+ font: inherit;
7561
+ font-family: var(--ow-font-sans);
7562
+ font-size: 12px;
7563
+ cursor: pointer;
7564
+ }
7565
+
7566
+ .ow-diff__expand:hover {
7567
+ background: color-mix(in srgb, var(--ow-on-code-block) 6%, transparent);
7568
+ color: var(--ow-on-code-block);
7569
+ }
7570
+
7571
+ .ow-diff__expand:focus-visible {
7572
+ outline: 2px solid var(--ow-brand-300);
7573
+ outline-offset: -2px;
7574
+ }
7575
+
6631
7576
  /* components/Tag/Tag.css */
6632
7577
  /* Tag, TagGroup and ColorSwatch. */
6633
7578
  .ow-tag-group {
@@ -7761,6 +8706,113 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
7761
8706
  }
7762
8707
  }
7763
8708
 
8709
+ /* components/ActivityHeatmap/ActivityHeatmap.css */
8710
+ /* ActivityHeatmap: a square per day, shaded from the empty track to one chart colour, so the shades follow the theme. */
8711
+ .ow-heatmap {
8712
+ --ow-heatmap-cell: 12px;
8713
+ display: grid;
8714
+ min-width: 0;
8715
+ gap: var(--ow-space-xs);
8716
+ color: var(--ow-text-muted);
8717
+ font-size: 11.5px;
8718
+ line-height: 1;
8719
+ }
8720
+
8721
+ /* It scrolls sideways inside itself on a narrow screen, never the page. */
8722
+ .ow-heatmap__scroll {
8723
+ min-width: 0;
8724
+ overflow-x: auto;
8725
+ overscroll-behavior-x: contain;
8726
+ }
8727
+
8728
+ /* The spacing round the edge leaves room for the focus ring. */
8729
+ .ow-heatmap__grid {
8730
+ border-collapse: separate;
8731
+ border-spacing: max(3px, calc(var(--ow-heatmap-cell) / 4));
8732
+ }
8733
+
8734
+ .ow-heatmap__grid th,
8735
+ .ow-heatmap__grid td {
8736
+ padding: 0;
8737
+ }
8738
+
8739
+ .ow-heatmap__grid th {
8740
+ font-weight: var(--ow-weight-regular);
8741
+ text-align: start;
8742
+ white-space: nowrap;
8743
+ }
8744
+
8745
+ /* A month's name starts over its first week and runs on over the next, without widening the columns. */
8746
+ .ow-heatmap__month {
8747
+ position: relative;
8748
+ height: 1.3em;
8749
+ }
8750
+
8751
+ .ow-heatmap__month span {
8752
+ position: absolute;
8753
+ inset-inline-start: 0;
8754
+ top: 0;
8755
+ }
8756
+
8757
+ .ow-heatmap__grid .ow-heatmap__weekday {
8758
+ padding-inline-end: 4px;
8759
+ font-size: 11px;
8760
+ }
8761
+
8762
+ .ow-heatmap__cell {
8763
+ width: var(--ow-heatmap-cell);
8764
+ height: var(--ow-heatmap-cell);
8765
+ border-radius: 3px;
8766
+ }
8767
+
8768
+ .ow-heatmap__day {
8769
+ display: block;
8770
+ width: var(--ow-heatmap-cell);
8771
+ height: var(--ow-heatmap-cell);
8772
+ border: 0;
8773
+ border-radius: 3px;
8774
+ background: color-mix(in oklab, var(--ow-heatmap-color) var(--ow-heatmap-mix, 0%), var(--ow-meter-track));
8775
+ padding: 0;
8776
+ }
8777
+
8778
+ button.ow-heatmap__day {
8779
+ cursor: pointer;
8780
+ }
8781
+
8782
+ .ow-heatmap__cell:hover > .ow-heatmap__day {
8783
+ box-shadow: inset 0 0 0 1px var(--ow-text-muted);
8784
+ }
8785
+
8786
+ .ow-heatmap [data-date]:focus {
8787
+ outline: none;
8788
+ }
8789
+
8790
+ .ow-heatmap [data-date]:focus-visible {
8791
+ outline: 2px solid var(--ow-focus-ring);
8792
+ outline-offset: 1px;
8793
+ }
8794
+
8795
+ .ow-heatmap__legend {
8796
+ display: flex;
8797
+ align-items: center;
8798
+ justify-content: flex-end;
8799
+ gap: calc(var(--ow-heatmap-cell) / 4);
8800
+ }
8801
+
8802
+ .ow-heatmap__legend > :first-child {
8803
+ margin-inline-start: 4px;
8804
+ }
8805
+
8806
+ .ow-heatmap__legend > :last-child {
8807
+ margin-inline-end: 4px;
8808
+ }
8809
+
8810
+ @media (forced-colors: active) {
8811
+ .ow-heatmap__day {
8812
+ forced-color-adjust: none;
8813
+ }
8814
+ }
8815
+
7764
8816
  /* components/FileTree/FileTree.css */
7765
8817
  /* FileTree: a project structure explorer. Monospace names, hairline guides, a tinted selected file. */
7766
8818
  .ow-tree,
@@ -9741,6 +10793,44 @@ textarea.ow-inline-edit__input[aria-invalid="true"]:focus {
9741
10793
  }
9742
10794
  }
9743
10795
 
10796
+ /* components/Markdown/Markdown.css */
10797
+ /* Markdown: Prose does the typography; this is only the caret that follows a streaming answer's last character. */
10798
+ .ow-markdown__caret {
10799
+ display: inline-block;
10800
+ width: 2px;
10801
+ height: 1.15em;
10802
+ margin-inline-start: 2px;
10803
+ border-radius: 1px;
10804
+ background: currentColor;
10805
+ vertical-align: -0.2em;
10806
+ animation: ow-markdown-caret 1s var(--ow-ease-standard) infinite;
10807
+ }
10808
+
10809
+ @keyframes ow-markdown-caret {
10810
+ 0%,
10811
+ 100% {
10812
+ opacity: 0.9;
10813
+ }
10814
+ 50% {
10815
+ opacity: 0.15;
10816
+ }
10817
+ }
10818
+
10819
+ @media (prefers-reduced-motion: reduce) {
10820
+ .ow-markdown__caret {
10821
+ opacity: 0.6;
10822
+ animation: none;
10823
+ }
10824
+ }
10825
+
10826
+ /* Forced colours drop backgrounds: draw the caret in the text colour. */
10827
+ @media (forced-colors: active) {
10828
+ .ow-markdown__caret {
10829
+ forced-color-adjust: none;
10830
+ background: CanvasText;
10831
+ }
10832
+ }
10833
+
9744
10834
  /* components/TextShimmer/TextShimmer.css */
9745
10835
  /* TextShimmer: muted text with a band of full-strength text sweeping across it. */
9746
10836
  .ow-shimmer {