@realmorg/ui 2.0.0-alpha.2 → 2.0.0-alpha.3

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 (64) hide show
  1. package/components/accordion.html +18 -0
  2. package/components/alert-dialog.html +40 -0
  3. package/components/alert.html +14 -0
  4. package/components/aspect-ratio.html +6 -0
  5. package/components/attachment.html +14 -0
  6. package/components/avatar.html +22 -0
  7. package/components/badge.html +6 -0
  8. package/components/breadcrumb.html +30 -0
  9. package/components/bubble.html +10 -0
  10. package/components/button-group.html +14 -0
  11. package/components/button.html +6 -0
  12. package/components/calendar.html +6 -0
  13. package/components/card.html +30 -0
  14. package/components/carousel.html +22 -0
  15. package/components/chart.html +6 -0
  16. package/components/checkbox.html +6 -0
  17. package/components/code-block.html +6 -0
  18. package/components/collapsible.html +14 -0
  19. package/components/combobox.html +13 -0
  20. package/components/command.html +12 -0
  21. package/components/context-menu.html +14 -0
  22. package/components/dialog.html +49 -3
  23. package/components/direction.html +6 -0
  24. package/components/drawer.html +46 -3
  25. package/components/dropdown-menu.html +49 -0
  26. package/components/empty.html +26 -0
  27. package/components/field.html +26 -0
  28. package/components/hover-card.html +17 -0
  29. package/components/input-group.html +16 -0
  30. package/components/input-otp.html +12 -0
  31. package/components/input.html +12 -0
  32. package/components/item.html +38 -0
  33. package/components/kbd.html +10 -0
  34. package/components/label.html +6 -0
  35. package/components/marker.html +6 -0
  36. package/components/menubar.html +21 -0
  37. package/components/message-scroller.html +6 -0
  38. package/components/message.html +18 -0
  39. package/components/navigation-menu.html +29 -0
  40. package/components/pagination.html +6 -0
  41. package/components/popover.html +31 -0
  42. package/components/progress.html +6 -0
  43. package/components/radio-group.html +6 -0
  44. package/components/resizable.html +14 -0
  45. package/components/scroll-area.html +6 -0
  46. package/components/select.html +12 -0
  47. package/components/separator.html +6 -0
  48. package/components/sheet.html +30 -0
  49. package/components/sidebar.html +52 -2
  50. package/components/skeleton.html +6 -0
  51. package/components/slider.html +28 -1
  52. package/components/spinner.html +6 -0
  53. package/components/switch.html +6 -0
  54. package/components/table.html +6 -0
  55. package/components/tabs.html +18 -0
  56. package/components/textarea.html +12 -0
  57. package/components/toaster.html +6 -0
  58. package/components/toggle-group.html +6 -0
  59. package/components/toggle.html +6 -0
  60. package/components/tooltip.html +17 -0
  61. package/dist/theme.css +13 -0
  62. package/dist/ui.html +988 -9
  63. package/package.json +3 -3
  64. package/theme.css +13 -0
package/dist/ui.html CHANGED
@@ -14,6 +14,12 @@
14
14
  </script>
15
15
 
16
16
  <style>
17
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
18
+ touch-action does not reach shadow content in iOS Safari. */
19
+ :host,
20
+ * {
21
+ touch-action: manipulation;
22
+ }
17
23
  :host {
18
24
  display: block;
19
25
  }
@@ -41,6 +47,10 @@
41
47
  </script>
42
48
 
43
49
  <style>
50
+ :host,
51
+ * {
52
+ touch-action: manipulation;
53
+ }
44
54
  :host {
45
55
  display: block;
46
56
  border-bottom: 1px solid var(--border);
@@ -97,6 +107,10 @@
97
107
 
98
108
  <custom-element name="ui-accordion-trigger" slot="trigger">
99
109
  <style>
110
+ :host,
111
+ * {
112
+ touch-action: manipulation;
113
+ }
100
114
  :host {
101
115
  display: flex;
102
116
  flex: 1;
@@ -110,6 +124,10 @@
110
124
 
111
125
  <custom-element name="ui-accordion-content">
112
126
  <style>
127
+ :host,
128
+ * {
129
+ touch-action: manipulation;
130
+ }
113
131
  :host {
114
132
  display: block;
115
133
  padding-bottom: calc(var(--spacing) * 4);
@@ -181,6 +199,12 @@
181
199
  </script>
182
200
 
183
201
  <style>
202
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
203
+ touch-action does not reach shadow content in iOS Safari. */
204
+ :host,
205
+ * {
206
+ touch-action: manipulation;
207
+ }
184
208
  :host {
185
209
  display: contents;
186
210
  }
@@ -188,6 +212,10 @@
188
212
  box-sizing: border-box;
189
213
  width: 100%;
190
214
  max-width: min(calc(var(--spacing) * 128), calc(100% - calc(var(--spacing) * 8)));
215
+ /* See ui-dialog: an explicit height keeps it from stretching, svh from resizing on scroll. */
216
+ height: fit-content;
217
+ max-height: calc(100svh - calc(var(--spacing) * 8));
218
+ overflow: auto;
191
219
  padding: calc(var(--spacing) * 6);
192
220
  border: 1px solid var(--border);
193
221
  border-radius: var(--radius-lg);
@@ -197,6 +225,8 @@
197
225
  }
198
226
  dialog[open] {
199
227
  display: grid;
228
+ /* Safari stretches a grid overlay to its max-height unless the rows are packed at the start. */
229
+ align-content: start;
200
230
  gap: calc(var(--spacing) * 4);
201
231
  }
202
232
  dialog::backdrop {
@@ -221,6 +251,10 @@
221
251
 
222
252
  <custom-element name="ui-alert-dialog-trigger" slot="trigger">
223
253
  <style>
254
+ :host,
255
+ * {
256
+ touch-action: manipulation;
257
+ }
224
258
  :host,
225
259
  span {
226
260
  display: contents;
@@ -232,6 +266,10 @@
232
266
 
233
267
  <custom-element name="ui-alert-dialog-header" slot="header">
234
268
  <style>
269
+ :host,
270
+ * {
271
+ touch-action: manipulation;
272
+ }
235
273
  :host {
236
274
  display: grid;
237
275
  gap: calc(var(--spacing) * 2);
@@ -243,6 +281,10 @@
243
281
 
244
282
  <custom-element name="ui-alert-dialog-title">
245
283
  <style>
284
+ :host,
285
+ * {
286
+ touch-action: manipulation;
287
+ }
246
288
  :host {
247
289
  display: block;
248
290
  }
@@ -258,6 +300,10 @@
258
300
 
259
301
  <custom-element name="ui-alert-dialog-description">
260
302
  <style>
303
+ :host,
304
+ * {
305
+ touch-action: manipulation;
306
+ }
261
307
  :host {
262
308
  display: block;
263
309
  }
@@ -273,6 +319,10 @@
273
319
 
274
320
  <custom-element name="ui-alert-dialog-footer" slot="footer">
275
321
  <style>
322
+ :host,
323
+ * {
324
+ touch-action: manipulation;
325
+ }
276
326
  :host {
277
327
  display: flex;
278
328
  flex-wrap: wrap;
@@ -293,6 +343,10 @@
293
343
  </script>
294
344
 
295
345
  <style>
346
+ :host,
347
+ * {
348
+ touch-action: manipulation;
349
+ }
296
350
  :host {
297
351
  display: inline-flex;
298
352
  }
@@ -307,6 +361,10 @@
307
361
  </script>
308
362
 
309
363
  <style>
364
+ :host,
365
+ * {
366
+ touch-action: manipulation;
367
+ }
310
368
  :host {
311
369
  display: inline-flex;
312
370
  }
@@ -323,6 +381,12 @@
323
381
  </script>
324
382
 
325
383
  <style>
384
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
385
+ touch-action does not reach shadow content in iOS Safari. */
386
+ :host,
387
+ * {
388
+ touch-action: manipulation;
389
+ }
326
390
  :host {
327
391
  position: relative;
328
392
  display: grid;
@@ -361,6 +425,10 @@
361
425
 
362
426
  <custom-element name="ui-alert-title">
363
427
  <style>
428
+ :host,
429
+ * {
430
+ touch-action: manipulation;
431
+ }
364
432
  :host {
365
433
  display: block;
366
434
  min-height: calc(var(--spacing) * 4);
@@ -374,6 +442,10 @@
374
442
 
375
443
  <custom-element name="ui-alert-description">
376
444
  <style>
445
+ :host,
446
+ * {
447
+ touch-action: manipulation;
448
+ }
377
449
  :host {
378
450
  display: grid;
379
451
  justify-items: start;
@@ -391,6 +463,12 @@
391
463
  </script>
392
464
 
393
465
  <style>
466
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
467
+ touch-action does not reach shadow content in iOS Safari. */
468
+ :host,
469
+ * {
470
+ touch-action: manipulation;
471
+ }
394
472
  :host {
395
473
  display: block;
396
474
  position: relative;
@@ -415,6 +493,12 @@
415
493
  </script>
416
494
 
417
495
  <style>
496
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
497
+ touch-action does not reach shadow content in iOS Safari. */
498
+ :host,
499
+ * {
500
+ touch-action: manipulation;
501
+ }
418
502
  :host {
419
503
  display: inline-flex;
420
504
  align-items: center;
@@ -459,6 +543,10 @@
459
543
 
460
544
  <custom-element name="ui-attachment-media" slot="media">
461
545
  <style>
546
+ :host,
547
+ * {
548
+ touch-action: manipulation;
549
+ }
462
550
  :host {
463
551
  display: grid;
464
552
  place-content: center;
@@ -485,6 +573,10 @@
485
573
 
486
574
  <custom-element name="ui-attachment-actions" slot="actions">
487
575
  <style>
576
+ :host,
577
+ * {
578
+ touch-action: manipulation;
579
+ }
488
580
  :host {
489
581
  display: flex;
490
582
  gap: calc(var(--spacing) * 1);
@@ -514,6 +606,12 @@
514
606
  </script>
515
607
 
516
608
  <style>
609
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
610
+ touch-action does not reach shadow content in iOS Safari. */
611
+ :host,
612
+ * {
613
+ touch-action: manipulation;
614
+ }
517
615
  :host {
518
616
  position: relative;
519
617
  display: inline-flex;
@@ -551,6 +649,10 @@
551
649
  </script>
552
650
 
553
651
  <style>
652
+ :host,
653
+ * {
654
+ touch-action: manipulation;
655
+ }
554
656
  :host {
555
657
  display: contents;
556
658
  }
@@ -568,6 +670,10 @@
568
670
 
569
671
  <custom-element name="ui-avatar-fallback">
570
672
  <style>
673
+ :host,
674
+ * {
675
+ touch-action: manipulation;
676
+ }
571
677
  :host {
572
678
  display: contents;
573
679
  }
@@ -588,6 +694,10 @@
588
694
 
589
695
  <custom-element name="ui-avatar-group" role="group">
590
696
  <style>
697
+ :host,
698
+ * {
699
+ touch-action: manipulation;
700
+ }
591
701
  :host {
592
702
  display: flex;
593
703
  align-items: center;
@@ -605,6 +715,10 @@
605
715
 
606
716
  <custom-element name="ui-avatar-group-count">
607
717
  <style>
718
+ :host,
719
+ * {
720
+ touch-action: manipulation;
721
+ }
608
722
  :host {
609
723
  display: inline-flex;
610
724
  flex-shrink: 0;
@@ -631,6 +745,12 @@
631
745
  </script>
632
746
 
633
747
  <style>
748
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
749
+ touch-action does not reach shadow content in iOS Safari. */
750
+ :host,
751
+ * {
752
+ touch-action: manipulation;
753
+ }
634
754
  :host {
635
755
  display: inline-flex;
636
756
  align-items: center;
@@ -685,6 +805,12 @@
685
805
  </script>
686
806
 
687
807
  <style>
808
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
809
+ touch-action does not reach shadow content in iOS Safari. */
810
+ :host,
811
+ * {
812
+ touch-action: manipulation;
813
+ }
688
814
  :host {
689
815
  display: block;
690
816
  }
@@ -695,6 +821,10 @@
695
821
 
696
822
  <custom-element name="ui-breadcrumb-list">
697
823
  <style>
824
+ :host,
825
+ * {
826
+ touch-action: manipulation;
827
+ }
698
828
  :host {
699
829
  display: block;
700
830
  }
@@ -717,6 +847,10 @@
717
847
 
718
848
  <custom-element name="ui-breadcrumb-item" role="listitem">
719
849
  <style>
850
+ :host,
851
+ * {
852
+ touch-action: manipulation;
853
+ }
720
854
  :host {
721
855
  display: inline-flex;
722
856
  align-items: center;
@@ -733,6 +867,10 @@
733
867
  </script>
734
868
 
735
869
  <style>
870
+ :host,
871
+ * {
872
+ touch-action: manipulation;
873
+ }
736
874
  a {
737
875
  color: inherit;
738
876
  text-decoration: none;
@@ -753,6 +891,10 @@
753
891
 
754
892
  <custom-element name="ui-breadcrumb-page">
755
893
  <style>
894
+ :host,
895
+ * {
896
+ touch-action: manipulation;
897
+ }
756
898
  span {
757
899
  font-weight: var(--font-weight-normal);
758
900
  color: var(--foreground);
@@ -768,6 +910,10 @@
768
910
  </script>
769
911
 
770
912
  <style>
913
+ :host,
914
+ * {
915
+ touch-action: manipulation;
916
+ }
771
917
  :host {
772
918
  display: inline-flex;
773
919
  align-items: center;
@@ -784,6 +930,10 @@
784
930
 
785
931
  <custom-element name="ui-breadcrumb-ellipsis">
786
932
  <style>
933
+ :host,
934
+ * {
935
+ touch-action: manipulation;
936
+ }
787
937
  :host {
788
938
  display: inline-flex;
789
939
  align-items: center;
@@ -818,6 +968,12 @@
818
968
  </script>
819
969
 
820
970
  <style>
971
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
972
+ touch-action does not reach shadow content in iOS Safari. */
973
+ :host,
974
+ * {
975
+ touch-action: manipulation;
976
+ }
821
977
  :host {
822
978
  display: flex;
823
979
  flex-direction: column;
@@ -867,6 +1023,10 @@
867
1023
 
868
1024
  <custom-element name="ui-bubble-reactions" slot="reactions">
869
1025
  <style>
1026
+ :host,
1027
+ * {
1028
+ touch-action: manipulation;
1029
+ }
870
1030
  :host {
871
1031
  display: flex;
872
1032
  flex-wrap: wrap;
@@ -883,6 +1043,12 @@
883
1043
  </script>
884
1044
 
885
1045
  <style>
1046
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
1047
+ touch-action does not reach shadow content in iOS Safari. */
1048
+ :host,
1049
+ * {
1050
+ touch-action: manipulation;
1051
+ }
886
1052
  :host {
887
1053
  display: inline-flex;
888
1054
  align-items: stretch;
@@ -912,6 +1078,10 @@
912
1078
 
913
1079
  <custom-element name="ui-button-group-text">
914
1080
  <style>
1081
+ :host,
1082
+ * {
1083
+ touch-action: manipulation;
1084
+ }
915
1085
  :host {
916
1086
  display: flex;
917
1087
  align-items: center;
@@ -948,6 +1118,10 @@
948
1118
  </script>
949
1119
 
950
1120
  <style>
1121
+ :host,
1122
+ * {
1123
+ touch-action: manipulation;
1124
+ }
951
1125
  :host {
952
1126
  position: relative;
953
1127
  z-index: 1;
@@ -1026,6 +1200,12 @@
1026
1200
  </script>
1027
1201
 
1028
1202
  <style>
1203
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
1204
+ touch-action does not reach shadow content in iOS Safari. */
1205
+ :host,
1206
+ * {
1207
+ touch-action: manipulation;
1208
+ }
1029
1209
  :host {
1030
1210
  display: inline-flex;
1031
1211
  vertical-align: middle;
@@ -1231,6 +1411,12 @@
1231
1411
  </script>
1232
1412
 
1233
1413
  <style>
1414
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
1415
+ touch-action does not reach shadow content in iOS Safari. */
1416
+ :host,
1417
+ * {
1418
+ touch-action: manipulation;
1419
+ }
1234
1420
  :host {
1235
1421
  display: inline-block;
1236
1422
  padding: calc(var(--spacing) * 3);
@@ -1322,6 +1508,12 @@
1322
1508
 
1323
1509
  <custom-element name="ui-card">
1324
1510
  <style>
1511
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
1512
+ touch-action does not reach shadow content in iOS Safari. */
1513
+ :host,
1514
+ * {
1515
+ touch-action: manipulation;
1516
+ }
1325
1517
  :host {
1326
1518
  display: flex;
1327
1519
  flex-direction: column;
@@ -1340,6 +1532,10 @@
1340
1532
 
1341
1533
  <custom-element name="ui-card-header">
1342
1534
  <style>
1535
+ :host,
1536
+ * {
1537
+ touch-action: manipulation;
1538
+ }
1343
1539
  :host {
1344
1540
  display: grid;
1345
1541
  grid-auto-rows: min-content;
@@ -1361,6 +1557,10 @@
1361
1557
  </script>
1362
1558
 
1363
1559
  <style>
1560
+ :host,
1561
+ * {
1562
+ touch-action: manipulation;
1563
+ }
1364
1564
  :host {
1365
1565
  display: block;
1366
1566
  }
@@ -1377,6 +1577,10 @@
1377
1577
 
1378
1578
  <custom-element name="ui-card-description">
1379
1579
  <style>
1580
+ :host,
1581
+ * {
1582
+ touch-action: manipulation;
1583
+ }
1380
1584
  :host {
1381
1585
  display: block;
1382
1586
  font-size: var(--text-sm);
@@ -1389,6 +1593,10 @@
1389
1593
 
1390
1594
  <custom-element name="ui-card-action">
1391
1595
  <style>
1596
+ :host,
1597
+ * {
1598
+ touch-action: manipulation;
1599
+ }
1392
1600
  :host {
1393
1601
  display: block;
1394
1602
  grid-column: 2;
@@ -1402,6 +1610,10 @@
1402
1610
 
1403
1611
  <custom-element name="ui-card-content">
1404
1612
  <style>
1613
+ :host,
1614
+ * {
1615
+ touch-action: manipulation;
1616
+ }
1405
1617
  :host {
1406
1618
  display: block;
1407
1619
  padding: 0 calc(var(--spacing) * 6);
@@ -1413,6 +1625,10 @@
1413
1625
 
1414
1626
  <custom-element name="ui-card-footer">
1415
1627
  <style>
1628
+ :host,
1629
+ * {
1630
+ touch-action: manipulation;
1631
+ }
1416
1632
  :host {
1417
1633
  display: flex;
1418
1634
  align-items: center;
@@ -1499,6 +1715,12 @@
1499
1715
  </script>
1500
1716
 
1501
1717
  <style>
1718
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
1719
+ touch-action does not reach shadow content in iOS Safari. */
1720
+ :host,
1721
+ * {
1722
+ touch-action: manipulation;
1723
+ }
1502
1724
  :host {
1503
1725
  --carousel-direction: row;
1504
1726
  --carousel-axis: x;
@@ -1554,6 +1776,10 @@
1554
1776
 
1555
1777
  <custom-element name="ui-carousel-content">
1556
1778
  <style>
1779
+ :host,
1780
+ * {
1781
+ touch-action: manipulation;
1782
+ }
1557
1783
  :host {
1558
1784
  display: flex;
1559
1785
  min-width: 0;
@@ -1586,6 +1812,10 @@
1586
1812
  </script>
1587
1813
 
1588
1814
  <style>
1815
+ :host,
1816
+ * {
1817
+ touch-action: manipulation;
1818
+ }
1589
1819
  :host {
1590
1820
  display: block;
1591
1821
  box-sizing: border-box;
@@ -1601,6 +1831,10 @@
1601
1831
 
1602
1832
  <custom-element name="ui-carousel-previous">
1603
1833
  <style>
1834
+ :host,
1835
+ * {
1836
+ touch-action: manipulation;
1837
+ }
1604
1838
  :host {
1605
1839
  display: inline-flex;
1606
1840
  }
@@ -1611,6 +1845,10 @@
1611
1845
 
1612
1846
  <custom-element name="ui-carousel-next">
1613
1847
  <style>
1848
+ :host,
1849
+ * {
1850
+ touch-action: manipulation;
1851
+ }
1614
1852
  :host {
1615
1853
  display: inline-flex;
1616
1854
  }
@@ -1705,6 +1943,12 @@
1705
1943
  </script>
1706
1944
 
1707
1945
  <style>
1946
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
1947
+ touch-action does not reach shadow content in iOS Safari. */
1948
+ :host,
1949
+ * {
1950
+ touch-action: manipulation;
1951
+ }
1708
1952
  :host {
1709
1953
  display: block;
1710
1954
  width: 100%;
@@ -1799,6 +2043,12 @@
1799
2043
  </script>
1800
2044
 
1801
2045
  <style>
2046
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
2047
+ touch-action does not reach shadow content in iOS Safari. */
2048
+ :host,
2049
+ * {
2050
+ touch-action: manipulation;
2051
+ }
1802
2052
  :host(:state(attr-checked)) label {
1803
2053
  color: var(--foreground);
1804
2054
  }
@@ -1890,6 +2140,12 @@
1890
2140
  </script>
1891
2141
 
1892
2142
  <style>
2143
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
2144
+ touch-action does not reach shadow content in iOS Safari. */
2145
+ :host,
2146
+ * {
2147
+ touch-action: manipulation;
2148
+ }
1893
2149
  :host {
1894
2150
  position: relative;
1895
2151
  display: block;
@@ -1949,6 +2205,12 @@
1949
2205
  </script>
1950
2206
 
1951
2207
  <style>
2208
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
2209
+ touch-action does not reach shadow content in iOS Safari. */
2210
+ :host,
2211
+ * {
2212
+ touch-action: manipulation;
2213
+ }
1952
2214
  :host {
1953
2215
  display: block;
1954
2216
  }
@@ -1978,6 +2240,10 @@
1978
2240
 
1979
2241
  <custom-element name="ui-collapsible-trigger" slot="trigger">
1980
2242
  <style>
2243
+ :host,
2244
+ * {
2245
+ touch-action: manipulation;
2246
+ }
1981
2247
  :host {
1982
2248
  display: flex;
1983
2249
  align-items: center;
@@ -1998,6 +2264,10 @@
1998
2264
 
1999
2265
  <custom-element name="ui-collapsible-content">
2000
2266
  <style>
2267
+ :host,
2268
+ * {
2269
+ touch-action: manipulation;
2270
+ }
2001
2271
  :host {
2002
2272
  display: flex;
2003
2273
  flex-direction: column;
@@ -2101,6 +2371,12 @@
2101
2371
  </script>
2102
2372
 
2103
2373
  <style>
2374
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
2375
+ touch-action does not reach shadow content in iOS Safari. */
2376
+ :host,
2377
+ * {
2378
+ touch-action: manipulation;
2379
+ }
2104
2380
  :host {
2105
2381
  display: block;
2106
2382
  min-width: calc(var(--spacing) * 48);
@@ -2134,6 +2410,12 @@
2134
2410
  font-size: var(--text-sm);
2135
2411
  outline: none;
2136
2412
  }
2413
+ /* iOS Safari zooms in on a focused field whose text is under 16px. */
2414
+ @media (pointer: coarse) {
2415
+ input {
2416
+ font-size: var(--text-base);
2417
+ }
2418
+ }
2137
2419
  .chevron {
2138
2420
  width: calc(var(--spacing) * 4);
2139
2421
  height: calc(var(--spacing) * 4);
@@ -2155,6 +2437,7 @@
2155
2437
  box-shadow: var(--shadow-md);
2156
2438
  inset: auto;
2157
2439
  position-anchor: --combobox;
2440
+ height: fit-content;
2158
2441
  position-area: bottom span-right;
2159
2442
  position-try-fallbacks: flip-block;
2160
2443
  }
@@ -2309,6 +2592,12 @@
2309
2592
  </script>
2310
2593
 
2311
2594
  <style>
2595
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
2596
+ touch-action does not reach shadow content in iOS Safari. */
2597
+ :host,
2598
+ * {
2599
+ touch-action: manipulation;
2600
+ }
2312
2601
  :host {
2313
2602
  display: flex;
2314
2603
  flex-direction: column;
@@ -2340,6 +2629,12 @@
2340
2629
  font-size: var(--text-sm);
2341
2630
  outline: none;
2342
2631
  }
2632
+ /* iOS Safari zooms in on a focused field whose text is under 16px. */
2633
+ @media (pointer: coarse) {
2634
+ input {
2635
+ font-size: var(--text-base);
2636
+ }
2637
+ }
2343
2638
  input::placeholder {
2344
2639
  color: var(--muted-foreground);
2345
2640
  }
@@ -2437,6 +2732,12 @@
2437
2732
  </script>
2438
2733
 
2439
2734
  <style>
2735
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
2736
+ touch-action does not reach shadow content in iOS Safari. */
2737
+ :host,
2738
+ * {
2739
+ touch-action: manipulation;
2740
+ }
2440
2741
  :host {
2441
2742
  display: contents;
2442
2743
  }
@@ -2447,6 +2748,10 @@
2447
2748
 
2448
2749
  <custom-element name="ui-context-menu-trigger">
2449
2750
  <style>
2751
+ :host,
2752
+ * {
2753
+ touch-action: manipulation;
2754
+ }
2450
2755
  :host {
2451
2756
  display: block;
2452
2757
  }
@@ -2475,6 +2780,10 @@
2475
2780
  </script>
2476
2781
 
2477
2782
  <style>
2783
+ :host,
2784
+ * {
2785
+ touch-action: manipulation;
2786
+ }
2478
2787
  :host {
2479
2788
  position: fixed;
2480
2789
  box-sizing: border-box;
@@ -2569,12 +2878,21 @@
2569
2878
  observe(() => {
2570
2879
  const dialog = refs.dialog;
2571
2880
  if (!dialog || props.open === dialog.open) return;
2572
- if (props.open) dialog.showModal();
2573
- else dialog.close();
2881
+ if (!props.open) return dialog.close();
2882
+ dialog.showModal();
2883
+ // Left to the browser, focus lands on the first button (often close) with a focus ring after a
2884
+ // tap, and Firefox and WebKit ignore autofocus on slotted content.
2885
+ (host.querySelector("[autofocus]") ?? dialog).focus();
2574
2886
  });
2575
2887
  </script>
2576
2888
 
2577
2889
  <style>
2890
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
2891
+ touch-action does not reach shadow content in iOS Safari. */
2892
+ :host,
2893
+ * {
2894
+ touch-action: manipulation;
2895
+ }
2578
2896
  :host {
2579
2897
  display: contents;
2580
2898
  }
@@ -2582,7 +2900,10 @@
2582
2900
  box-sizing: border-box;
2583
2901
  width: 100%;
2584
2902
  max-width: min(calc(var(--spacing) * 128), calc(100% - calc(var(--spacing) * 8)));
2585
- max-height: calc(100% - calc(var(--spacing) * 8));
2903
+ /* Without an explicit height, a dialog pinned to both edges of the screen can stretch to
2904
+ full height. svh stays the same while a phone's address bar shows and hides. */
2905
+ height: fit-content;
2906
+ max-height: calc(100svh - calc(var(--spacing) * 8));
2586
2907
  padding: calc(var(--spacing) * 6);
2587
2908
  border: 1px solid var(--border);
2588
2909
  border-radius: var(--radius-lg);
@@ -2591,8 +2912,13 @@
2591
2912
  box-shadow: var(--shadow-lg);
2592
2913
  overflow: auto;
2593
2914
  }
2915
+ dialog:focus {
2916
+ outline: none;
2917
+ }
2594
2918
  dialog[open] {
2595
2919
  display: grid;
2920
+ /* Safari stretches a grid overlay to its max-height unless the rows are packed at the start. */
2921
+ align-content: start;
2596
2922
  gap: calc(var(--spacing) * 4);
2597
2923
  animation: zoom 0.2s ease-out;
2598
2924
  }
@@ -2611,7 +2937,11 @@
2611
2937
  display: flex;
2612
2938
  flex-direction: column;
2613
2939
  }
2940
+ [part="body"] {
2941
+ display: contents;
2942
+ }
2614
2943
  :host(:is(:state(attr-side-is-left), :state(attr-side-is-right))) [part="body"] {
2944
+ display: block;
2615
2945
  flex: 1;
2616
2946
  }
2617
2947
  :host(:state(attr-side-is-right)) dialog {
@@ -2680,6 +3010,7 @@
2680
3010
  <dialog
2681
3011
  ref="dialog"
2682
3012
  part="dialog"
3013
+ tabindex="-1"
2683
3014
  _aria-label="#dialog.label"
2684
3015
  _aria-description="#dialog.description"
2685
3016
  onclose="closed()"
@@ -2696,6 +3027,10 @@
2696
3027
 
2697
3028
  <custom-element name="ui-dialog-trigger" slot="trigger">
2698
3029
  <style>
3030
+ :host,
3031
+ * {
3032
+ touch-action: manipulation;
3033
+ }
2699
3034
  :host,
2700
3035
  span {
2701
3036
  display: contents;
@@ -2711,6 +3046,10 @@
2711
3046
  </script>
2712
3047
 
2713
3048
  <style>
3049
+ :host,
3050
+ * {
3051
+ touch-action: manipulation;
3052
+ }
2714
3053
  :host,
2715
3054
  span {
2716
3055
  display: contents;
@@ -2722,6 +3061,10 @@
2722
3061
 
2723
3062
  <custom-element name="ui-dialog-header" slot="header">
2724
3063
  <style>
3064
+ :host,
3065
+ * {
3066
+ touch-action: manipulation;
3067
+ }
2725
3068
  :host {
2726
3069
  display: grid;
2727
3070
  gap: calc(var(--spacing) * 2);
@@ -2733,6 +3076,10 @@
2733
3076
 
2734
3077
  <custom-element name="ui-dialog-title">
2735
3078
  <style>
3079
+ :host,
3080
+ * {
3081
+ touch-action: manipulation;
3082
+ }
2736
3083
  :host {
2737
3084
  display: block;
2738
3085
  }
@@ -2749,6 +3096,10 @@
2749
3096
 
2750
3097
  <custom-element name="ui-dialog-description">
2751
3098
  <style>
3099
+ :host,
3100
+ * {
3101
+ touch-action: manipulation;
3102
+ }
2752
3103
  :host {
2753
3104
  display: block;
2754
3105
  }
@@ -2764,6 +3115,10 @@
2764
3115
 
2765
3116
  <custom-element name="ui-dialog-footer" slot="footer">
2766
3117
  <style>
3118
+ :host,
3119
+ * {
3120
+ touch-action: manipulation;
3121
+ }
2767
3122
  :host {
2768
3123
  display: flex;
2769
3124
  flex-wrap: wrap;
@@ -2785,6 +3140,12 @@
2785
3140
  </script>
2786
3141
 
2787
3142
  <style>
3143
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
3144
+ touch-action does not reach shadow content in iOS Safari. */
3145
+ :host,
3146
+ * {
3147
+ touch-action: manipulation;
3148
+ }
2788
3149
  :host {
2789
3150
  display: contents;
2790
3151
  }
@@ -2859,20 +3220,33 @@
2859
3220
  observe(() => {
2860
3221
  const dialog = refs.dialog;
2861
3222
  if (!dialog || props.open === dialog.open) return;
2862
- if (props.open) dialog.showModal();
2863
- else dialog.close();
3223
+ if (!props.open) return dialog.close();
3224
+ dialog.showModal();
3225
+ // Left to the browser, focus lands on the first button (often close) with a focus ring after a
3226
+ // tap, and Firefox and WebKit ignore autofocus on slotted content.
3227
+ (host.querySelector("[autofocus]") ?? dialog).focus();
2864
3228
  });
2865
3229
  </script>
2866
3230
 
2867
3231
  <style>
3232
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
3233
+ touch-action does not reach shadow content in iOS Safari. */
3234
+ :host,
3235
+ * {
3236
+ touch-action: manipulation;
3237
+ }
2868
3238
  :host {
2869
3239
  display: contents;
2870
3240
  }
3241
+ dialog:focus {
3242
+ outline: none;
3243
+ }
2871
3244
  dialog {
2872
3245
  box-sizing: border-box;
2873
3246
  width: 100%;
2874
3247
  max-width: none;
2875
- max-height: 80dvh;
3248
+ height: fit-content;
3249
+ max-height: 80svh;
2876
3250
  margin: auto 0 0;
2877
3251
  padding: calc(var(--spacing) * 4) calc(var(--spacing) * 6) calc(var(--spacing) * 6);
2878
3252
  border: 1px solid var(--border);
@@ -2898,9 +3272,14 @@
2898
3272
  }
2899
3273
  dialog[open] {
2900
3274
  display: grid;
3275
+ /* Safari stretches a grid overlay to its max-height unless the rows are packed at the start. */
3276
+ align-content: start;
2901
3277
  gap: calc(var(--spacing) * 4);
2902
3278
  animation: slide 0.25s ease-out;
2903
3279
  }
3280
+ [part="body"] {
3281
+ display: contents;
3282
+ }
2904
3283
  dialog::backdrop {
2905
3284
  background: rgb(0 0 0 / 0.5);
2906
3285
  }
@@ -2933,6 +3312,7 @@
2933
3312
  <dialog
2934
3313
  ref="dialog"
2935
3314
  part="dialog"
3315
+ tabindex="-1"
2936
3316
  _aria-label="#drawer.label"
2937
3317
  _aria-description="#drawer.description"
2938
3318
  onclose="closed()"
@@ -2946,6 +3326,10 @@
2946
3326
 
2947
3327
  <custom-element name="ui-drawer-trigger" slot="trigger">
2948
3328
  <style>
3329
+ :host,
3330
+ * {
3331
+ touch-action: manipulation;
3332
+ }
2949
3333
  :host,
2950
3334
  span {
2951
3335
  display: contents;
@@ -2957,6 +3341,10 @@
2957
3341
 
2958
3342
  <custom-element name="ui-drawer-close">
2959
3343
  <style>
3344
+ :host,
3345
+ * {
3346
+ touch-action: manipulation;
3347
+ }
2960
3348
  :host,
2961
3349
  span {
2962
3350
  display: contents;
@@ -2968,6 +3356,10 @@
2968
3356
 
2969
3357
  <custom-element name="ui-drawer-header" slot="header">
2970
3358
  <style>
3359
+ :host,
3360
+ * {
3361
+ touch-action: manipulation;
3362
+ }
2971
3363
  :host {
2972
3364
  display: grid;
2973
3365
  gap: calc(var(--spacing) * 1.5);
@@ -2979,6 +3371,10 @@
2979
3371
 
2980
3372
  <custom-element name="ui-drawer-title">
2981
3373
  <style>
3374
+ :host,
3375
+ * {
3376
+ touch-action: manipulation;
3377
+ }
2982
3378
  :host {
2983
3379
  display: block;
2984
3380
  }
@@ -2994,6 +3390,10 @@
2994
3390
 
2995
3391
  <custom-element name="ui-drawer-description">
2996
3392
  <style>
3393
+ :host,
3394
+ * {
3395
+ touch-action: manipulation;
3396
+ }
2997
3397
  :host {
2998
3398
  display: block;
2999
3399
  }
@@ -3009,6 +3409,10 @@
3009
3409
 
3010
3410
  <custom-element name="ui-drawer-footer" slot="footer">
3011
3411
  <style>
3412
+ :host,
3413
+ * {
3414
+ touch-action: manipulation;
3415
+ }
3012
3416
  :host {
3013
3417
  display: grid;
3014
3418
  gap: calc(var(--spacing) * 2);
@@ -3039,6 +3443,12 @@
3039
3443
  </script>
3040
3444
 
3041
3445
  <style>
3446
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
3447
+ touch-action does not reach shadow content in iOS Safari. */
3448
+ :host,
3449
+ * {
3450
+ touch-action: manipulation;
3451
+ }
3042
3452
  :host {
3043
3453
  display: contents;
3044
3454
  }
@@ -3049,6 +3459,10 @@
3049
3459
 
3050
3460
  <custom-element name="ui-dropdown-menu-trigger">
3051
3461
  <style>
3462
+ :host,
3463
+ * {
3464
+ touch-action: manipulation;
3465
+ }
3052
3466
  :host {
3053
3467
  display: inline-block;
3054
3468
  vertical-align: middle;
@@ -3082,6 +3496,10 @@
3082
3496
  </script>
3083
3497
 
3084
3498
  <style>
3499
+ :host,
3500
+ * {
3501
+ touch-action: manipulation;
3502
+ }
3085
3503
  :host {
3086
3504
  box-sizing: border-box;
3087
3505
  min-width: calc(var(--spacing) * 32);
@@ -3093,6 +3511,9 @@
3093
3511
  color: var(--popover-foreground);
3094
3512
  box-shadow: var(--shadow-md);
3095
3513
  inset: auto;
3514
+ height: fit-content;
3515
+ max-height: calc(100svh - calc(var(--spacing) * 8));
3516
+ overflow-y: auto;
3096
3517
  position-area: bottom span-right;
3097
3518
  position-try-fallbacks: flip-block, flip-inline;
3098
3519
  }
@@ -3143,6 +3564,10 @@
3143
3564
  </script>
3144
3565
 
3145
3566
  <style>
3567
+ :host,
3568
+ * {
3569
+ touch-action: manipulation;
3570
+ }
3146
3571
  :host {
3147
3572
  display: flex;
3148
3573
  align-items: center;
@@ -3210,6 +3635,10 @@
3210
3635
  </script>
3211
3636
 
3212
3637
  <style>
3638
+ :host,
3639
+ * {
3640
+ touch-action: manipulation;
3641
+ }
3213
3642
  :host {
3214
3643
  display: flex;
3215
3644
  align-items: center;
@@ -3265,6 +3694,10 @@
3265
3694
  </script>
3266
3695
 
3267
3696
  <style>
3697
+ :host,
3698
+ * {
3699
+ touch-action: manipulation;
3700
+ }
3268
3701
  :host {
3269
3702
  display: block;
3270
3703
  }
@@ -3305,6 +3738,10 @@
3305
3738
  </script>
3306
3739
 
3307
3740
  <style>
3741
+ :host,
3742
+ * {
3743
+ touch-action: manipulation;
3744
+ }
3308
3745
  :host {
3309
3746
  display: flex;
3310
3747
  align-items: center;
@@ -3346,6 +3783,10 @@
3346
3783
 
3347
3784
  <custom-element name="ui-menu-label">
3348
3785
  <style>
3786
+ :host,
3787
+ * {
3788
+ touch-action: manipulation;
3789
+ }
3349
3790
  :host {
3350
3791
  display: block;
3351
3792
  padding: calc(var(--spacing) * 1.5) calc(var(--spacing) * 2);
@@ -3359,6 +3800,10 @@
3359
3800
 
3360
3801
  <custom-element name="ui-menu-group" role="group">
3361
3802
  <style>
3803
+ :host,
3804
+ * {
3805
+ touch-action: manipulation;
3806
+ }
3362
3807
  :host {
3363
3808
  display: block;
3364
3809
  }
@@ -3369,6 +3814,10 @@
3369
3814
 
3370
3815
  <custom-element name="ui-menu-separator" role="separator">
3371
3816
  <style>
3817
+ :host,
3818
+ * {
3819
+ touch-action: manipulation;
3820
+ }
3372
3821
  :host {
3373
3822
  display: block;
3374
3823
  height: 1px;
@@ -3380,6 +3829,10 @@
3380
3829
 
3381
3830
  <custom-element name="ui-menu-shortcut">
3382
3831
  <style>
3832
+ :host,
3833
+ * {
3834
+ touch-action: manipulation;
3835
+ }
3383
3836
  :host {
3384
3837
  margin-inline-start: auto;
3385
3838
  font-size: var(--text-xs);
@@ -3393,6 +3846,12 @@
3393
3846
 
3394
3847
  <custom-element name="ui-empty">
3395
3848
  <style>
3849
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
3850
+ touch-action does not reach shadow content in iOS Safari. */
3851
+ :host,
3852
+ * {
3853
+ touch-action: manipulation;
3854
+ }
3396
3855
  :host {
3397
3856
  display: flex;
3398
3857
  flex-direction: column;
@@ -3413,6 +3872,10 @@
3413
3872
 
3414
3873
  <custom-element name="ui-empty-header">
3415
3874
  <style>
3875
+ :host,
3876
+ * {
3877
+ touch-action: manipulation;
3878
+ }
3416
3879
  :host {
3417
3880
  display: flex;
3418
3881
  flex-direction: column;
@@ -3427,6 +3890,10 @@
3427
3890
 
3428
3891
  <custom-element name="ui-empty-media">
3429
3892
  <style>
3893
+ :host,
3894
+ * {
3895
+ touch-action: manipulation;
3896
+ }
3430
3897
  :host {
3431
3898
  display: flex;
3432
3899
  flex-shrink: 0;
@@ -3456,6 +3923,10 @@
3456
3923
  </script>
3457
3924
 
3458
3925
  <style>
3926
+ :host,
3927
+ * {
3928
+ touch-action: manipulation;
3929
+ }
3459
3930
  :host {
3460
3931
  display: block;
3461
3932
  }
@@ -3472,6 +3943,10 @@
3472
3943
 
3473
3944
  <custom-element name="ui-empty-description">
3474
3945
  <style>
3946
+ :host,
3947
+ * {
3948
+ touch-action: manipulation;
3949
+ }
3475
3950
  :host {
3476
3951
  display: block;
3477
3952
  font-size: var(--text-sm);
@@ -3484,6 +3959,10 @@
3484
3959
 
3485
3960
  <custom-element name="ui-empty-content">
3486
3961
  <style>
3962
+ :host,
3963
+ * {
3964
+ touch-action: manipulation;
3965
+ }
3487
3966
  :host {
3488
3967
  display: flex;
3489
3968
  flex-direction: column;
@@ -3508,6 +3987,12 @@
3508
3987
  </script>
3509
3988
 
3510
3989
  <style>
3990
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
3991
+ touch-action does not reach shadow content in iOS Safari. */
3992
+ :host,
3993
+ * {
3994
+ touch-action: manipulation;
3995
+ }
3511
3996
  :host {
3512
3997
  display: flex;
3513
3998
  flex-direction: column;
@@ -3541,6 +4026,10 @@
3541
4026
 
3542
4027
  <custom-element name="ui-field-content">
3543
4028
  <style>
4029
+ :host,
4030
+ * {
4031
+ touch-action: manipulation;
4032
+ }
3544
4033
  :host {
3545
4034
  display: flex;
3546
4035
  flex: 1;
@@ -3555,6 +4044,10 @@
3555
4044
 
3556
4045
  <custom-element name="ui-field-description">
3557
4046
  <style>
4047
+ :host,
4048
+ * {
4049
+ touch-action: manipulation;
4050
+ }
3558
4051
  :host {
3559
4052
  display: block;
3560
4053
  font-size: var(--text-sm);
@@ -3568,6 +4061,10 @@
3568
4061
 
3569
4062
  <custom-element name="ui-field-group">
3570
4063
  <style>
4064
+ :host,
4065
+ * {
4066
+ touch-action: manipulation;
4067
+ }
3571
4068
  :host {
3572
4069
  display: flex;
3573
4070
  flex-direction: column;
@@ -3587,6 +4084,10 @@
3587
4084
  </script>
3588
4085
 
3589
4086
  <style>
4087
+ :host,
4088
+ * {
4089
+ touch-action: manipulation;
4090
+ }
3590
4091
  :host {
3591
4092
  display: flex;
3592
4093
  flex-direction: column;
@@ -3603,6 +4104,10 @@
3603
4104
 
3604
4105
  <custom-element name="ui-field-legend" slot="legend">
3605
4106
  <style>
4107
+ :host,
4108
+ * {
4109
+ touch-action: manipulation;
4110
+ }
3606
4111
  :host {
3607
4112
  display: block;
3608
4113
  font-size: var(--text-base);
@@ -3649,6 +4154,12 @@
3649
4154
  </script>
3650
4155
 
3651
4156
  <style>
4157
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
4158
+ touch-action does not reach shadow content in iOS Safari. */
4159
+ :host,
4160
+ * {
4161
+ touch-action: manipulation;
4162
+ }
3652
4163
  :host {
3653
4164
  display: contents;
3654
4165
  }
@@ -3659,6 +4170,10 @@
3659
4170
 
3660
4171
  <custom-element name="ui-hover-card-trigger">
3661
4172
  <style>
4173
+ :host,
4174
+ * {
4175
+ touch-action: manipulation;
4176
+ }
3662
4177
  :host {
3663
4178
  display: inline-block;
3664
4179
  }
@@ -3677,6 +4192,10 @@
3677
4192
  </script>
3678
4193
 
3679
4194
  <style>
4195
+ :host,
4196
+ * {
4197
+ touch-action: manipulation;
4198
+ }
3680
4199
  :host {
3681
4200
  box-sizing: border-box;
3682
4201
  width: calc(var(--spacing) * 64);
@@ -3688,6 +4207,9 @@
3688
4207
  color: var(--popover-foreground);
3689
4208
  box-shadow: var(--shadow-md);
3690
4209
  inset: auto;
4210
+ height: fit-content;
4211
+ max-height: calc(100svh - calc(var(--spacing) * 8));
4212
+ overflow-y: auto;
3691
4213
  position-area: bottom;
3692
4214
  position-try-fallbacks: flip-block, flip-inline;
3693
4215
  }
@@ -3724,6 +4246,12 @@
3724
4246
  </script>
3725
4247
 
3726
4248
  <style>
4249
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
4250
+ touch-action does not reach shadow content in iOS Safari. */
4251
+ :host,
4252
+ * {
4253
+ touch-action: manipulation;
4254
+ }
3727
4255
  :host {
3728
4256
  display: flex;
3729
4257
  align-items: center;
@@ -3751,6 +4279,12 @@
3751
4279
  font-size: var(--text-sm);
3752
4280
  outline: none;
3753
4281
  }
4282
+ /* iOS Safari zooms in on a focused field whose text is under 16px. */
4283
+ @media (pointer: coarse) {
4284
+ input {
4285
+ font-size: var(--text-base);
4286
+ }
4287
+ }
3754
4288
  input::placeholder {
3755
4289
  color: var(--muted-foreground);
3756
4290
  }
@@ -3762,6 +4296,10 @@
3762
4296
 
3763
4297
  <custom-element name="ui-input-group-addon">
3764
4298
  <style>
4299
+ :host,
4300
+ * {
4301
+ touch-action: manipulation;
4302
+ }
3765
4303
  :host {
3766
4304
  display: flex;
3767
4305
  order: -1;
@@ -3866,6 +4404,12 @@
3866
4404
  </script>
3867
4405
 
3868
4406
  <style>
4407
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
4408
+ touch-action does not reach shadow content in iOS Safari. */
4409
+ :host,
4410
+ * {
4411
+ touch-action: manipulation;
4412
+ }
3869
4413
  :host {
3870
4414
  display: inline-flex;
3871
4415
  }
@@ -3886,6 +4430,12 @@
3886
4430
  text-align: center;
3887
4431
  outline: none;
3888
4432
  }
4433
+ /* iOS Safari zooms in on a focused field whose text is under 16px. */
4434
+ @media (pointer: coarse) {
4435
+ input {
4436
+ font-size: var(--text-base);
4437
+ }
4438
+ }
3889
4439
  input:first-child,
3890
4440
  input[data-gap] {
3891
4441
  margin-left: 0;
@@ -3952,6 +4502,12 @@
3952
4502
  </script>
3953
4503
 
3954
4504
  <style>
4505
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
4506
+ touch-action does not reach shadow content in iOS Safari. */
4507
+ :host,
4508
+ * {
4509
+ touch-action: manipulation;
4510
+ }
3955
4511
  :host {
3956
4512
  display: block;
3957
4513
  min-width: 0;
@@ -3971,6 +4527,12 @@
3971
4527
  outline: none;
3972
4528
  transition: color var(--default-transition-duration), box-shadow var(--default-transition-duration);
3973
4529
  }
4530
+ /* iOS Safari zooms in on a focused field whose text is under 16px. */
4531
+ @media (pointer: coarse) {
4532
+ input {
4533
+ font-size: var(--text-base);
4534
+ }
4535
+ }
3974
4536
  input::placeholder {
3975
4537
  color: var(--muted-foreground);
3976
4538
  }
@@ -4023,6 +4585,12 @@
4023
4585
  </script>
4024
4586
 
4025
4587
  <style>
4588
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
4589
+ touch-action does not reach shadow content in iOS Safari. */
4590
+ :host,
4591
+ * {
4592
+ touch-action: manipulation;
4593
+ }
4026
4594
  :host {
4027
4595
  display: flex;
4028
4596
  flex-wrap: wrap;
@@ -4051,6 +4619,10 @@
4051
4619
 
4052
4620
  <custom-element name="ui-item-group" role="list">
4053
4621
  <style>
4622
+ :host,
4623
+ * {
4624
+ touch-action: manipulation;
4625
+ }
4054
4626
  :host {
4055
4627
  display: flex;
4056
4628
  flex-direction: column;
@@ -4062,6 +4634,10 @@
4062
4634
 
4063
4635
  <custom-element name="ui-item-media">
4064
4636
  <style>
4637
+ :host,
4638
+ * {
4639
+ touch-action: manipulation;
4640
+ }
4065
4641
  :host {
4066
4642
  display: flex;
4067
4643
  flex-shrink: 0;
@@ -4099,6 +4675,10 @@
4099
4675
 
4100
4676
  <custom-element name="ui-item-content">
4101
4677
  <style>
4678
+ :host,
4679
+ * {
4680
+ touch-action: manipulation;
4681
+ }
4102
4682
  :host {
4103
4683
  display: flex;
4104
4684
  flex: 1;
@@ -4113,6 +4693,10 @@
4113
4693
 
4114
4694
  <custom-element name="ui-item-title">
4115
4695
  <style>
4696
+ :host,
4697
+ * {
4698
+ touch-action: manipulation;
4699
+ }
4116
4700
  :host {
4117
4701
  display: flex;
4118
4702
  align-items: center;
@@ -4127,6 +4711,10 @@
4127
4711
 
4128
4712
  <custom-element name="ui-item-description">
4129
4713
  <style>
4714
+ :host,
4715
+ * {
4716
+ touch-action: manipulation;
4717
+ }
4130
4718
  :host {
4131
4719
  display: -webkit-box;
4132
4720
  overflow: hidden;
@@ -4143,6 +4731,10 @@
4143
4731
 
4144
4732
  <custom-element name="ui-item-actions">
4145
4733
  <style>
4734
+ :host,
4735
+ * {
4736
+ touch-action: manipulation;
4737
+ }
4146
4738
  :host {
4147
4739
  display: flex;
4148
4740
  align-items: center;
@@ -4155,6 +4747,10 @@
4155
4747
 
4156
4748
  <custom-element name="ui-item-header">
4157
4749
  <style>
4750
+ :host,
4751
+ * {
4752
+ touch-action: manipulation;
4753
+ }
4158
4754
  :host {
4159
4755
  display: flex;
4160
4756
  flex-basis: 100%;
@@ -4169,6 +4765,10 @@
4169
4765
 
4170
4766
  <custom-element name="ui-item-footer">
4171
4767
  <style>
4768
+ :host,
4769
+ * {
4770
+ touch-action: manipulation;
4771
+ }
4172
4772
  :host {
4173
4773
  display: flex;
4174
4774
  flex-basis: 100%;
@@ -4183,6 +4783,12 @@
4183
4783
 
4184
4784
  <custom-element name="ui-kbd">
4185
4785
  <style>
4786
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
4787
+ touch-action does not reach shadow content in iOS Safari. */
4788
+ :host,
4789
+ * {
4790
+ touch-action: manipulation;
4791
+ }
4186
4792
  :host {
4187
4793
  display: inline-flex;
4188
4794
  align-items: center;
@@ -4207,6 +4813,10 @@
4207
4813
 
4208
4814
  <custom-element name="ui-kbd-group">
4209
4815
  <style>
4816
+ :host,
4817
+ * {
4818
+ touch-action: manipulation;
4819
+ }
4210
4820
  :host {
4211
4821
  display: inline-flex;
4212
4822
  align-items: center;
@@ -4241,6 +4851,12 @@
4241
4851
  </script>
4242
4852
 
4243
4853
  <style>
4854
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
4855
+ touch-action does not reach shadow content in iOS Safari. */
4856
+ :host,
4857
+ * {
4858
+ touch-action: manipulation;
4859
+ }
4244
4860
  :host {
4245
4861
  display: inline-flex;
4246
4862
  align-items: center;
@@ -4264,6 +4880,12 @@
4264
4880
  </script>
4265
4881
 
4266
4882
  <style>
4883
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
4884
+ touch-action does not reach shadow content in iOS Safari. */
4885
+ :host,
4886
+ * {
4887
+ touch-action: manipulation;
4888
+ }
4267
4889
  :host {
4268
4890
  display: flex;
4269
4891
  align-items: center;
@@ -4296,6 +4918,12 @@
4296
4918
 
4297
4919
  <custom-element name="ui-menubar" role="menubar">
4298
4920
  <style>
4921
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
4922
+ touch-action does not reach shadow content in iOS Safari. */
4923
+ :host,
4924
+ * {
4925
+ touch-action: manipulation;
4926
+ }
4299
4927
  :host {
4300
4928
  display: flex;
4301
4929
  align-items: center;
@@ -4338,6 +4966,10 @@
4338
4966
  </script>
4339
4967
 
4340
4968
  <style>
4969
+ :host,
4970
+ * {
4971
+ touch-action: manipulation;
4972
+ }
4341
4973
  :host {
4342
4974
  display: contents;
4343
4975
  }
@@ -4348,6 +4980,10 @@
4348
4980
 
4349
4981
  <custom-element name="ui-menubar-trigger">
4350
4982
  <style>
4983
+ :host,
4984
+ * {
4985
+ touch-action: manipulation;
4986
+ }
4351
4987
  :host {
4352
4988
  display: inline-flex;
4353
4989
  }
@@ -4392,6 +5028,10 @@
4392
5028
  </script>
4393
5029
 
4394
5030
  <style>
5031
+ :host,
5032
+ * {
5033
+ touch-action: manipulation;
5034
+ }
4395
5035
  :host {
4396
5036
  box-sizing: border-box;
4397
5037
  min-width: calc(var(--spacing) * 48);
@@ -4403,6 +5043,9 @@
4403
5043
  color: var(--popover-foreground);
4404
5044
  box-shadow: var(--shadow-md);
4405
5045
  inset: auto;
5046
+ height: fit-content;
5047
+ max-height: calc(100svh - calc(var(--spacing) * 8));
5048
+ overflow-y: auto;
4406
5049
  position-area: bottom span-right;
4407
5050
  position-try-fallbacks: flip-block, flip-inline;
4408
5051
  }
@@ -4440,6 +5083,12 @@
4440
5083
  </script>
4441
5084
 
4442
5085
  <style>
5086
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
5087
+ touch-action does not reach shadow content in iOS Safari. */
5088
+ :host,
5089
+ * {
5090
+ touch-action: manipulation;
5091
+ }
4443
5092
  :host {
4444
5093
  position: relative;
4445
5094
  display: block;
@@ -4478,6 +5127,12 @@
4478
5127
  </script>
4479
5128
 
4480
5129
  <style>
5130
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
5131
+ touch-action does not reach shadow content in iOS Safari. */
5132
+ :host,
5133
+ * {
5134
+ touch-action: manipulation;
5135
+ }
4481
5136
  :host {
4482
5137
  display: flex;
4483
5138
  gap: calc(var(--spacing) * 2);
@@ -4510,6 +5165,10 @@
4510
5165
 
4511
5166
  <custom-element name="ui-message-avatar" slot="avatar">
4512
5167
  <style>
5168
+ :host,
5169
+ * {
5170
+ touch-action: manipulation;
5171
+ }
4513
5172
  :host {
4514
5173
  display: flex;
4515
5174
  align-self: flex-end;
@@ -4522,6 +5181,10 @@
4522
5181
 
4523
5182
  <custom-element name="ui-message-header" slot="header">
4524
5183
  <style>
5184
+ :host,
5185
+ * {
5186
+ touch-action: manipulation;
5187
+ }
4525
5188
  :host {
4526
5189
  display: flex;
4527
5190
  align-items: center;
@@ -4537,6 +5200,10 @@
4537
5200
 
4538
5201
  <custom-element name="ui-message-footer" slot="footer">
4539
5202
  <style>
5203
+ :host,
5204
+ * {
5205
+ touch-action: manipulation;
5206
+ }
4540
5207
  :host {
4541
5208
  display: flex;
4542
5209
  align-items: center;
@@ -4556,6 +5223,12 @@
4556
5223
  </script>
4557
5224
 
4558
5225
  <style>
5226
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
5227
+ touch-action does not reach shadow content in iOS Safari. */
5228
+ :host,
5229
+ * {
5230
+ touch-action: manipulation;
5231
+ }
4559
5232
  :host {
4560
5233
  display: block;
4561
5234
  }
@@ -4566,6 +5239,10 @@
4566
5239
 
4567
5240
  <custom-element name="ui-navigation-menu-list">
4568
5241
  <style>
5242
+ :host,
5243
+ * {
5244
+ touch-action: manipulation;
5245
+ }
4569
5246
  :host {
4570
5247
  display: block;
4571
5248
  }
@@ -4609,6 +5286,10 @@
4609
5286
  </script>
4610
5287
 
4611
5288
  <style>
5289
+ :host,
5290
+ * {
5291
+ touch-action: manipulation;
5292
+ }
4612
5293
  :host {
4613
5294
  position: relative;
4614
5295
  display: block;
@@ -4629,6 +5310,9 @@
4629
5310
  box-shadow: var(--shadow-md);
4630
5311
  inset: auto;
4631
5312
  position-anchor: --navigation-trigger;
5313
+ height: fit-content;
5314
+ max-height: calc(100svh - calc(var(--spacing) * 8));
5315
+ overflow-y: auto;
4632
5316
  position-area: bottom span-right;
4633
5317
  }
4634
5318
  </style>
@@ -4639,6 +5323,10 @@
4639
5323
 
4640
5324
  <custom-element name="ui-navigation-menu-trigger" delegates-focus>
4641
5325
  <style>
5326
+ :host,
5327
+ * {
5328
+ touch-action: manipulation;
5329
+ }
4642
5330
  :host {
4643
5331
  display: inline-flex;
4644
5332
  }
@@ -4681,6 +5369,10 @@
4681
5369
 
4682
5370
  <custom-element name="ui-navigation-menu-content" slot="content">
4683
5371
  <style>
5372
+ :host,
5373
+ * {
5374
+ touch-action: manipulation;
5375
+ }
4684
5376
  :host {
4685
5377
  display: grid;
4686
5378
  gap: calc(var(--spacing) * 1);
@@ -4713,6 +5405,10 @@
4713
5405
  </script>
4714
5406
 
4715
5407
  <style>
5408
+ :host,
5409
+ * {
5410
+ touch-action: manipulation;
5411
+ }
4716
5412
  :host {
4717
5413
  display: var(--ui-navigation-link-display, inline-flex);
4718
5414
  }
@@ -4813,6 +5509,12 @@
4813
5509
  </script>
4814
5510
 
4815
5511
  <style>
5512
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
5513
+ touch-action does not reach shadow content in iOS Safari. */
5514
+ :host,
5515
+ * {
5516
+ touch-action: manipulation;
5517
+ }
4816
5518
  :host {
4817
5519
  display: flex;
4818
5520
  justify-content: center;
@@ -4931,6 +5633,12 @@
4931
5633
  </script>
4932
5634
 
4933
5635
  <style>
5636
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
5637
+ touch-action does not reach shadow content in iOS Safari. */
5638
+ :host,
5639
+ * {
5640
+ touch-action: manipulation;
5641
+ }
4934
5642
  :host {
4935
5643
  display: contents;
4936
5644
  }
@@ -4941,6 +5649,10 @@
4941
5649
 
4942
5650
  <custom-element name="ui-popover-trigger">
4943
5651
  <style>
5652
+ :host,
5653
+ * {
5654
+ touch-action: manipulation;
5655
+ }
4944
5656
  :host {
4945
5657
  display: inline-block;
4946
5658
  vertical-align: middle;
@@ -4960,6 +5672,10 @@
4960
5672
  </script>
4961
5673
 
4962
5674
  <style>
5675
+ :host,
5676
+ * {
5677
+ touch-action: manipulation;
5678
+ }
4963
5679
  :host {
4964
5680
  box-sizing: border-box;
4965
5681
  width: calc(var(--spacing) * 72);
@@ -4971,11 +5687,16 @@
4971
5687
  color: var(--popover-foreground);
4972
5688
  box-shadow: var(--shadow-md);
4973
5689
  inset: auto;
5690
+ height: fit-content;
5691
+ max-height: calc(100svh - calc(var(--spacing) * 8));
5692
+ overflow-y: auto;
4974
5693
  position-area: bottom;
4975
5694
  position-try-fallbacks: flip-block, flip-inline;
4976
5695
  }
4977
5696
  :host(:popover-open) {
4978
5697
  display: grid;
5698
+ /* Safari stretches a grid overlay to its max-height unless the rows are packed at the start. */
5699
+ align-content: start;
4979
5700
  gap: calc(var(--spacing) * 4);
4980
5701
  }
4981
5702
  :host(:state(attr-width)) {
@@ -5004,6 +5725,10 @@
5004
5725
 
5005
5726
  <custom-element name="ui-popover-header">
5006
5727
  <style>
5728
+ :host,
5729
+ * {
5730
+ touch-action: manipulation;
5731
+ }
5007
5732
  :host {
5008
5733
  display: grid;
5009
5734
  gap: calc(var(--spacing) * 1);
@@ -5015,6 +5740,10 @@
5015
5740
 
5016
5741
  <custom-element name="ui-popover-title">
5017
5742
  <style>
5743
+ :host,
5744
+ * {
5745
+ touch-action: manipulation;
5746
+ }
5018
5747
  :host {
5019
5748
  display: block;
5020
5749
  }
@@ -5031,6 +5760,10 @@
5031
5760
 
5032
5761
  <custom-element name="ui-popover-description">
5033
5762
  <style>
5763
+ :host,
5764
+ * {
5765
+ touch-action: manipulation;
5766
+ }
5034
5767
  :host {
5035
5768
  display: block;
5036
5769
  }
@@ -5054,6 +5787,12 @@
5054
5787
  </script>
5055
5788
 
5056
5789
  <style>
5790
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
5791
+ touch-action does not reach shadow content in iOS Safari. */
5792
+ :host,
5793
+ * {
5794
+ touch-action: manipulation;
5795
+ }
5057
5796
  :host {
5058
5797
  display: block;
5059
5798
  width: 100%;
@@ -5123,6 +5862,12 @@
5123
5862
  </script>
5124
5863
 
5125
5864
  <style>
5865
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
5866
+ touch-action does not reach shadow content in iOS Safari. */
5867
+ :host,
5868
+ * {
5869
+ touch-action: manipulation;
5870
+ }
5126
5871
  :host {
5127
5872
  display: grid;
5128
5873
  gap: calc(var(--spacing) * 3);
@@ -5208,6 +5953,12 @@
5208
5953
  </script>
5209
5954
 
5210
5955
  <style>
5956
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
5957
+ touch-action does not reach shadow content in iOS Safari. */
5958
+ :host,
5959
+ * {
5960
+ touch-action: manipulation;
5961
+ }
5211
5962
  :host {
5212
5963
  display: flex;
5213
5964
  width: 100%;
@@ -5236,6 +5987,10 @@
5236
5987
  </script>
5237
5988
 
5238
5989
  <style>
5990
+ :host,
5991
+ * {
5992
+ touch-action: manipulation;
5993
+ }
5239
5994
  :host {
5240
5995
  display: block;
5241
5996
  flex: var(--attr-size) 1 0;
@@ -5311,6 +6066,10 @@
5311
6066
  </script>
5312
6067
 
5313
6068
  <style>
6069
+ :host,
6070
+ * {
6071
+ touch-action: manipulation;
6072
+ }
5314
6073
  :host {
5315
6074
  position: relative;
5316
6075
  display: flex;
@@ -5365,6 +6124,12 @@
5365
6124
  </script>
5366
6125
 
5367
6126
  <style>
6127
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
6128
+ touch-action does not reach shadow content in iOS Safari. */
6129
+ :host,
6130
+ * {
6131
+ touch-action: manipulation;
6132
+ }
5368
6133
  :host {
5369
6134
  display: block;
5370
6135
  position: relative;
@@ -5441,6 +6206,12 @@
5441
6206
  </script>
5442
6207
 
5443
6208
  <style>
6209
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
6210
+ touch-action does not reach shadow content in iOS Safari. */
6211
+ :host,
6212
+ * {
6213
+ touch-action: manipulation;
6214
+ }
5444
6215
  :host {
5445
6216
  display: block;
5446
6217
  min-width: calc(var(--spacing) * 32);
@@ -5466,6 +6237,12 @@
5466
6237
  outline: none;
5467
6238
  cursor: pointer;
5468
6239
  }
6240
+ /* iOS Safari zooms in on a focused field whose text is under 16px. */
6241
+ @media (pointer: coarse) {
6242
+ select {
6243
+ font-size: var(--text-base);
6244
+ }
6245
+ }
5469
6246
  :host(:state(attr-size-is-sm)) select {
5470
6247
  height: calc(var(--spacing) * 8);
5471
6248
  }
@@ -5510,6 +6287,12 @@
5510
6287
  </script>
5511
6288
 
5512
6289
  <style>
6290
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
6291
+ touch-action does not reach shadow content in iOS Safari. */
6292
+ :host,
6293
+ * {
6294
+ touch-action: manipulation;
6295
+ }
5513
6296
  :host {
5514
6297
  display: block;
5515
6298
  flex-shrink: 0;
@@ -5577,6 +6360,12 @@
5577
6360
  </script>
5578
6361
 
5579
6362
  <style>
6363
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
6364
+ touch-action does not reach shadow content in iOS Safari. */
6365
+ :host,
6366
+ * {
6367
+ touch-action: manipulation;
6368
+ }
5580
6369
  :host {
5581
6370
  display: contents;
5582
6371
  }
@@ -5592,6 +6381,10 @@
5592
6381
 
5593
6382
  <custom-element name="ui-sheet-trigger" slot="trigger">
5594
6383
  <style>
6384
+ :host,
6385
+ * {
6386
+ touch-action: manipulation;
6387
+ }
5595
6388
  :host,
5596
6389
  span {
5597
6390
  display: contents;
@@ -5603,6 +6396,10 @@
5603
6396
 
5604
6397
  <custom-element name="ui-sheet-close">
5605
6398
  <style>
6399
+ :host,
6400
+ * {
6401
+ touch-action: manipulation;
6402
+ }
5606
6403
  :host,
5607
6404
  span {
5608
6405
  display: contents;
@@ -5614,6 +6411,10 @@
5614
6411
 
5615
6412
  <custom-element name="ui-sheet-header" slot="header">
5616
6413
  <style>
6414
+ :host,
6415
+ * {
6416
+ touch-action: manipulation;
6417
+ }
5617
6418
  :host {
5618
6419
  display: grid;
5619
6420
  gap: calc(var(--spacing) * 2);
@@ -5625,6 +6426,10 @@
5625
6426
 
5626
6427
  <custom-element name="ui-sheet-title">
5627
6428
  <style>
6429
+ :host,
6430
+ * {
6431
+ touch-action: manipulation;
6432
+ }
5628
6433
  :host {
5629
6434
  display: block;
5630
6435
  }
@@ -5641,6 +6446,10 @@
5641
6446
 
5642
6447
  <custom-element name="ui-sheet-description">
5643
6448
  <style>
6449
+ :host,
6450
+ * {
6451
+ touch-action: manipulation;
6452
+ }
5644
6453
  :host {
5645
6454
  display: block;
5646
6455
  }
@@ -5656,6 +6465,10 @@
5656
6465
 
5657
6466
  <custom-element name="ui-sheet-footer" slot="footer">
5658
6467
  <style>
6468
+ :host,
6469
+ * {
6470
+ touch-action: manipulation;
6471
+ }
5659
6472
  :host {
5660
6473
  display: flex;
5661
6474
  flex-wrap: wrap;
@@ -5706,11 +6519,17 @@
5706
6519
  </script>
5707
6520
 
5708
6521
  <style>
6522
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
6523
+ touch-action does not reach shadow content in iOS Safari. */
6524
+ :host,
6525
+ * {
6526
+ touch-action: manipulation;
6527
+ }
5709
6528
  :host {
5710
6529
  --ui-sidebar-width: calc(var(--spacing) * 64);
5711
6530
  --ui-sidebar-label: block;
5712
6531
  display: flex;
5713
- min-height: 100dvh;
6532
+ min-height: 100svh;
5714
6533
  background: var(--sidebar);
5715
6534
  }
5716
6535
  :host(:state(attr-collapsed)) {
@@ -5721,7 +6540,7 @@
5721
6540
  position: sticky;
5722
6541
  top: 0;
5723
6542
  width: var(--ui-sidebar-width);
5724
- height: 100dvh;
6543
+ height: 100svh;
5725
6544
  flex-shrink: 0;
5726
6545
  transition: width 0.2s ease;
5727
6546
  }
@@ -5760,6 +6579,10 @@
5760
6579
 
5761
6580
  <custom-element name="ui-sidebar" slot="sidebar">
5762
6581
  <style>
6582
+ :host,
6583
+ * {
6584
+ touch-action: manipulation;
6585
+ }
5763
6586
  :host {
5764
6587
  display: flex;
5765
6588
  flex-direction: column;
@@ -5778,6 +6601,10 @@
5778
6601
 
5779
6602
  <custom-element name="ui-sidebar-header" slot="header">
5780
6603
  <style>
6604
+ :host,
6605
+ * {
6606
+ touch-action: manipulation;
6607
+ }
5781
6608
  :host {
5782
6609
  display: flex;
5783
6610
  flex-direction: column;
@@ -5791,6 +6618,10 @@
5791
6618
 
5792
6619
  <custom-element name="ui-sidebar-footer" slot="footer">
5793
6620
  <style>
6621
+ :host,
6622
+ * {
6623
+ touch-action: manipulation;
6624
+ }
5794
6625
  :host {
5795
6626
  display: flex;
5796
6627
  flex-direction: column;
@@ -5804,6 +6635,10 @@
5804
6635
 
5805
6636
  <custom-element name="ui-sidebar-content">
5806
6637
  <style>
6638
+ :host,
6639
+ * {
6640
+ touch-action: manipulation;
6641
+ }
5807
6642
  :host {
5808
6643
  display: block;
5809
6644
  flex: 1;
@@ -5830,6 +6665,10 @@
5830
6665
  </script>
5831
6666
 
5832
6667
  <style>
6668
+ :host,
6669
+ * {
6670
+ touch-action: manipulation;
6671
+ }
5833
6672
  :host {
5834
6673
  display: flex;
5835
6674
  flex-direction: column;
@@ -5842,6 +6681,10 @@
5842
6681
 
5843
6682
  <custom-element name="ui-sidebar-group-label">
5844
6683
  <style>
6684
+ :host,
6685
+ * {
6686
+ touch-action: manipulation;
6687
+ }
5845
6688
  :host {
5846
6689
  display: var(--ui-sidebar-label, block);
5847
6690
  height: calc(var(--spacing) * 8);
@@ -5859,6 +6702,10 @@
5859
6702
 
5860
6703
  <custom-element name="ui-sidebar-menu">
5861
6704
  <style>
6705
+ :host,
6706
+ * {
6707
+ touch-action: manipulation;
6708
+ }
5862
6709
  :host {
5863
6710
  display: block;
5864
6711
  }
@@ -5877,6 +6724,10 @@
5877
6724
 
5878
6725
  <custom-element name="ui-sidebar-menu-item" role="listitem">
5879
6726
  <style>
6727
+ :host,
6728
+ * {
6729
+ touch-action: manipulation;
6730
+ }
5880
6731
  :host {
5881
6732
  position: relative;
5882
6733
  display: block;
@@ -5917,6 +6768,10 @@
5917
6768
  </script>
5918
6769
 
5919
6770
  <style>
6771
+ :host,
6772
+ * {
6773
+ touch-action: manipulation;
6774
+ }
5920
6775
  :host {
5921
6776
  display: block;
5922
6777
  }
@@ -5958,6 +6813,10 @@
5958
6813
 
5959
6814
  <custom-element name="ui-sidebar-menu-badge">
5960
6815
  <style>
6816
+ :host,
6817
+ * {
6818
+ touch-action: manipulation;
6819
+ }
5961
6820
  :host {
5962
6821
  display: var(--ui-sidebar-label, block);
5963
6822
  position: absolute;
@@ -5989,6 +6848,10 @@
5989
6848
 
5990
6849
  <custom-element name="ui-sidebar-inset">
5991
6850
  <style>
6851
+ :host,
6852
+ * {
6853
+ touch-action: manipulation;
6854
+ }
5992
6855
  :host {
5993
6856
  display: flex;
5994
6857
  flex: 1;
@@ -6011,6 +6874,12 @@
6011
6874
 
6012
6875
  <custom-element name="ui-skeleton">
6013
6876
  <style>
6877
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
6878
+ touch-action does not reach shadow content in iOS Safari. */
6879
+ :host,
6880
+ * {
6881
+ touch-action: manipulation;
6882
+ }
6014
6883
  :host {
6015
6884
  display: block;
6016
6885
  border-radius: var(--radius-md);
@@ -6056,9 +6925,21 @@
6056
6925
  return `${((props.value - props.min) / (props.max - props.min || 1)) * 100}%`;
6057
6926
  },
6058
6927
  });
6928
+
6929
+ // Writing the value Safari just set, during a finger drag, makes the thumb jump.
6930
+ observe(() => {
6931
+ const value = String(props.value);
6932
+ if (refs.control && refs.control.value !== value) refs.control.value = value;
6933
+ });
6059
6934
  </script>
6060
6935
 
6061
6936
  <style>
6937
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
6938
+ touch-action does not reach shadow content in iOS Safari. */
6939
+ :host,
6940
+ * {
6941
+ touch-action: manipulation;
6942
+ }
6062
6943
  :host {
6063
6944
  display: block;
6064
6945
  min-width: calc(var(--spacing) * 32);
@@ -6072,6 +6953,8 @@
6072
6953
  background: transparent;
6073
6954
  cursor: pointer;
6074
6955
  outline: none;
6956
+ /* The slider owns the whole gesture, so the browser never turns a drag into a page pan. */
6957
+ touch-action: none;
6075
6958
  }
6076
6959
  input::-webkit-slider-runnable-track {
6077
6960
  height: calc(var(--spacing) * 1.5);
@@ -6103,6 +6986,20 @@
6103
6986
  input:focus-visible::-webkit-slider-thumb {
6104
6987
  box-shadow: 0 0 0 4px color-mix(in oklab, var(--ring) 50%, transparent);
6105
6988
  }
6989
+ @media (pointer: coarse) {
6990
+ input {
6991
+ height: calc(var(--spacing) * 6);
6992
+ }
6993
+ input::-webkit-slider-thumb {
6994
+ width: calc(var(--spacing) * 6);
6995
+ height: calc(var(--spacing) * 6);
6996
+ margin-top: calc(var(--spacing) * -2.25);
6997
+ }
6998
+ input::-moz-range-thumb {
6999
+ width: calc(var(--spacing) * 6);
7000
+ height: calc(var(--spacing) * 6);
7001
+ }
7002
+ }
6106
7003
  input:disabled {
6107
7004
  cursor: not-allowed;
6108
7005
  opacity: 0.5;
@@ -6116,7 +7013,6 @@
6116
7013
  _min="@min"
6117
7014
  _max="@max"
6118
7015
  _step="@step"
6119
- _value="@value"
6120
7016
  _disabled="@disabled"
6121
7017
  _aria-label="@label"
6122
7018
  >
@@ -6136,6 +7032,12 @@
6136
7032
  </script>
6137
7033
 
6138
7034
  <style>
7035
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
7036
+ touch-action does not reach shadow content in iOS Safari. */
7037
+ :host,
7038
+ * {
7039
+ touch-action: manipulation;
7040
+ }
6139
7041
  :host {
6140
7042
  display: inline-flex;
6141
7043
  width: calc(var(--attr-size) * 1px);
@@ -6182,6 +7084,12 @@
6182
7084
  </script>
6183
7085
 
6184
7086
  <style>
7087
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
7088
+ touch-action does not reach shadow content in iOS Safari. */
7089
+ :host,
7090
+ * {
7091
+ touch-action: manipulation;
7092
+ }
6185
7093
  :host(:state(attr-checked)) label {
6186
7094
  color: var(--foreground);
6187
7095
  }
@@ -6282,6 +7190,12 @@
6282
7190
  </script>
6283
7191
 
6284
7192
  <style>
7193
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
7194
+ touch-action does not reach shadow content in iOS Safari. */
7195
+ :host,
7196
+ * {
7197
+ touch-action: manipulation;
7198
+ }
6285
7199
  :host {
6286
7200
  display: block;
6287
7201
  width: 100%;
@@ -6376,6 +7290,12 @@
6376
7290
  </script>
6377
7291
 
6378
7292
  <style>
7293
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
7294
+ touch-action does not reach shadow content in iOS Safari. */
7295
+ :host,
7296
+ * {
7297
+ touch-action: manipulation;
7298
+ }
6379
7299
  :host {
6380
7300
  display: flex;
6381
7301
  flex-direction: column;
@@ -6393,6 +7313,10 @@
6393
7313
 
6394
7314
  <custom-element name="ui-tabs-list">
6395
7315
  <style>
7316
+ :host,
7317
+ * {
7318
+ touch-action: manipulation;
7319
+ }
6396
7320
  :host {
6397
7321
  display: block;
6398
7322
  width: fit-content;
@@ -6429,6 +7353,10 @@
6429
7353
  </script>
6430
7354
 
6431
7355
  <style>
7356
+ :host,
7357
+ * {
7358
+ touch-action: manipulation;
7359
+ }
6432
7360
  :host {
6433
7361
  display: flex;
6434
7362
  flex: 1;
@@ -6488,6 +7416,10 @@
6488
7416
 
6489
7417
  <custom-element name="ui-tabs-content" role="tabpanel">
6490
7418
  <style>
7419
+ :host,
7420
+ * {
7421
+ touch-action: manipulation;
7422
+ }
6491
7423
  :host {
6492
7424
  display: block;
6493
7425
  flex: 1;
@@ -6518,6 +7450,12 @@
6518
7450
  </script>
6519
7451
 
6520
7452
  <style>
7453
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
7454
+ touch-action does not reach shadow content in iOS Safari. */
7455
+ :host,
7456
+ * {
7457
+ touch-action: manipulation;
7458
+ }
6521
7459
  :host {
6522
7460
  display: block;
6523
7461
  }
@@ -6538,6 +7476,12 @@
6538
7476
  field-sizing: content;
6539
7477
  resize: vertical;
6540
7478
  }
7479
+ /* iOS Safari zooms in on a focused field whose text is under 16px. */
7480
+ @media (pointer: coarse) {
7481
+ textarea {
7482
+ font-size: var(--text-base);
7483
+ }
7484
+ }
6541
7485
  textarea::placeholder {
6542
7486
  color: var(--muted-foreground);
6543
7487
  }
@@ -6615,6 +7559,12 @@
6615
7559
  </script>
6616
7560
 
6617
7561
  <style>
7562
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
7563
+ touch-action does not reach shadow content in iOS Safari. */
7564
+ :host,
7565
+ * {
7566
+ touch-action: manipulation;
7567
+ }
6618
7568
  ol {
6619
7569
  position: fixed;
6620
7570
  inset: auto calc(var(--spacing) * 4) calc(var(--spacing) * 4) auto;
@@ -6736,6 +7686,12 @@
6736
7686
  </script>
6737
7687
 
6738
7688
  <style>
7689
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
7690
+ touch-action does not reach shadow content in iOS Safari. */
7691
+ :host,
7692
+ * {
7693
+ touch-action: manipulation;
7694
+ }
6739
7695
  :host {
6740
7696
  display: inline-flex;
6741
7697
  align-items: center;
@@ -6781,6 +7737,12 @@
6781
7737
  </script>
6782
7738
 
6783
7739
  <style>
7740
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
7741
+ touch-action does not reach shadow content in iOS Safari. */
7742
+ :host,
7743
+ * {
7744
+ touch-action: manipulation;
7745
+ }
6784
7746
  :host {
6785
7747
  display: inline-flex;
6786
7748
  }
@@ -6885,6 +7847,12 @@
6885
7847
  </script>
6886
7848
 
6887
7849
  <style>
7850
+ /* A double tap must not zoom the page. Set inside the shadow root, because a page-level
7851
+ touch-action does not reach shadow content in iOS Safari. */
7852
+ :host,
7853
+ * {
7854
+ touch-action: manipulation;
7855
+ }
6888
7856
  :host {
6889
7857
  display: contents;
6890
7858
  }
@@ -6895,6 +7863,10 @@
6895
7863
 
6896
7864
  <custom-element name="ui-tooltip-trigger">
6897
7865
  <style>
7866
+ :host,
7867
+ * {
7868
+ touch-action: manipulation;
7869
+ }
6898
7870
  :host {
6899
7871
  display: inline-block;
6900
7872
  vertical-align: middle;
@@ -6914,6 +7886,10 @@
6914
7886
  </script>
6915
7887
 
6916
7888
  <style>
7889
+ :host,
7890
+ * {
7891
+ touch-action: manipulation;
7892
+ }
6917
7893
  :host {
6918
7894
  margin: 0 0 calc(var(--spacing) * 1);
6919
7895
  padding: calc(var(--spacing) * 1.5) calc(var(--spacing) * 3);
@@ -6923,6 +7899,9 @@
6923
7899
  color: var(--background);
6924
7900
  font-size: var(--text-xs);
6925
7901
  inset: auto;
7902
+ height: fit-content;
7903
+ max-height: calc(100svh - calc(var(--spacing) * 8));
7904
+ overflow-y: auto;
6926
7905
  position-area: top;
6927
7906
  position-try-fallbacks: flip-block;
6928
7907
  }