@surflane/ui 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +8 -8
  2. package/dist/advanced-forms.d.ts +2 -2
  3. package/dist/advanced-forms.js +39 -39
  4. package/dist/app-shell.d.ts +3 -2
  5. package/dist/app-shell.js +29 -13
  6. package/dist/button.d.ts +5 -5
  7. package/dist/button.js +12 -12
  8. package/dist/chart.d.ts +3 -3
  9. package/dist/chart.js +36 -34
  10. package/dist/commands.d.ts +5 -5
  11. package/dist/commands.js +17 -17
  12. package/dist/content.d.ts +2 -2
  13. package/dist/content.js +66 -28
  14. package/dist/context-overlays.d.ts +3 -3
  15. package/dist/context-overlays.js +11 -11
  16. package/dist/data.d.ts +58 -13
  17. package/dist/data.js +63 -21
  18. package/dist/date-picker.d.ts +8 -8
  19. package/dist/date-picker.js +18 -18
  20. package/dist/dialog-focus.js +7 -7
  21. package/dist/dialog.d.ts +5 -5
  22. package/dist/dialog.js +16 -16
  23. package/dist/feedback.d.ts +5 -5
  24. package/dist/feedback.js +20 -20
  25. package/dist/file-upload.d.ts +9 -9
  26. package/dist/file-upload.js +64 -63
  27. package/dist/filter-bar.d.ts +1 -1
  28. package/dist/filter-bar.js +9 -9
  29. package/dist/form-state.d.ts +1 -1
  30. package/dist/form-state.js +11 -11
  31. package/dist/forms.d.ts +5 -5
  32. package/dist/forms.js +32 -32
  33. package/dist/foundations.d.ts +10 -10
  34. package/dist/foundations.js +26 -26
  35. package/dist/icon.d.ts +8 -7
  36. package/dist/icon.js +23 -22
  37. package/dist/index.d.ts +38 -37
  38. package/dist/index.js +39 -38
  39. package/dist/input-extensions.d.ts +3 -3
  40. package/dist/input-extensions.js +21 -21
  41. package/dist/input.d.ts +2 -2
  42. package/dist/input.js +7 -7
  43. package/dist/markdown.d.ts +2 -2
  44. package/dist/markdown.js +38 -38
  45. package/dist/menu.d.ts +2 -2
  46. package/dist/menu.js +19 -19
  47. package/dist/messages.d.ts +2 -2
  48. package/dist/messages.js +18 -18
  49. package/dist/navigation-menu.d.ts +2 -2
  50. package/dist/navigation-menu.js +16 -16
  51. package/dist/navigation.d.ts +5 -5
  52. package/dist/navigation.js +40 -40
  53. package/dist/otp-field.d.ts +1 -1
  54. package/dist/otp-field.js +14 -14
  55. package/dist/pagination.d.ts +2 -2
  56. package/dist/pagination.js +12 -12
  57. package/dist/panels.d.ts +8 -8
  58. package/dist/panels.js +39 -39
  59. package/dist/parts.d.ts +2 -2
  60. package/dist/parts.js +8 -8
  61. package/dist/popover.d.ts +3 -3
  62. package/dist/popover.js +6 -6
  63. package/dist/scroll-area.d.ts +1 -1
  64. package/dist/scroll-area.js +20 -20
  65. package/dist/select.d.ts +8 -8
  66. package/dist/select.js +21 -21
  67. package/dist/sizing.d.ts +3 -3
  68. package/dist/sizing.js +9 -9
  69. package/dist/slot.d.ts +1 -1
  70. package/dist/slot.js +4 -4
  71. package/dist/status.d.ts +4 -4
  72. package/dist/status.js +8 -8
  73. package/dist/syntax-engine.js +43 -43
  74. package/dist/syntax-highlighter.d.ts +2 -2
  75. package/dist/syntax-highlighter.js +32 -32
  76. package/dist/table-selection.d.ts +31 -0
  77. package/dist/table-selection.js +50 -0
  78. package/dist/toast.d.ts +4 -4
  79. package/dist/toast.js +33 -33
  80. package/dist/tone-transition.d.ts +1 -1
  81. package/dist/tone-transition.js +17 -17
  82. package/dist/tooltip.d.ts +1 -1
  83. package/dist/tooltip.js +4 -4
  84. package/dist/tree.d.ts +4 -4
  85. package/dist/tree.js +60 -60
  86. package/package.json +2 -2
  87. package/src/styles.css +266 -142
package/src/styles.css CHANGED
@@ -1,5 +1,5 @@
1
- @import "@surflane/design-tokens/foundations.css";
2
- @import "@surflane/design-tokens/presentation.css";
1
+ @import '@surflane/design-tokens/foundations.css';
2
+ @import '@surflane/design-tokens/presentation.css';
3
3
 
4
4
  /* Explicit component classes: no utility framework or application-wide reset. */
5
5
  .pui-control,
@@ -33,10 +33,10 @@
33
33
  color: var(--control-placeholder);
34
34
  opacity: 1;
35
35
  }
36
- .pui-input:hover:not(:disabled, [aria-disabled="true"], [readonly], :focus),
36
+ .pui-input:hover:not(:disabled, [aria-disabled='true'], [readonly], :focus),
37
37
  .pui-select-trigger:hover:not(
38
38
  :disabled,
39
- [aria-disabled="true"],
39
+ [aria-disabled='true'],
40
40
  :focus-visible
41
41
  ) {
42
42
  background: var(--control-hover-background);
@@ -55,8 +55,8 @@
55
55
  cursor: not-allowed;
56
56
  background: var(--control-disabled-background);
57
57
  }
58
- .pui-input[aria-invalid="true"],
59
- .pui-select-trigger[aria-invalid="true"] {
58
+ .pui-input[aria-invalid='true'],
59
+ .pui-select-trigger[aria-invalid='true'] {
60
60
  border-color: var(--status-danger-fg);
61
61
  }
62
62
  .pui-control-icon {
@@ -187,27 +187,38 @@
187
187
  text-decoration: none;
188
188
  cursor: pointer;
189
189
  }
190
- .pui-button:is([data-variant="default"], [data-variant="primary"]) {
190
+ .pui-button:is([data-variant='default'], [data-variant='primary']) {
191
+ /* On the brand fill the layer is its ink: light ink barely moves bright cyan. */
192
+ --interaction-hover-bg: oklch(from var(--on-brand) l c h / 0.08);
193
+ --interaction-active-bg: oklch(from var(--on-brand) l c h / 0.14);
191
194
  background: var(--brand);
192
195
  border-color: transparent;
193
196
  color: var(--on-brand);
194
197
  }
195
- .pui-button[data-variant="outline"] {
198
+ .pui-button[data-variant='outline'] {
196
199
  border-color: var(--line);
197
200
  background: transparent;
198
201
  }
199
- .pui-button[data-variant="ghost"] {
202
+ .pui-button[data-variant='ghost'] {
200
203
  border-color: transparent;
201
204
  background: transparent;
202
205
  }
203
- .pui-button:hover:not(:disabled):not([data-disabled]) {
204
- filter: brightness(0.97);
206
+ /* Hover adds the state layer over the variant's own fill, so a primary, a
207
+ pressed toggle and a transparent toolbar button all step by the same amount. */
208
+ .pui-button:hover:not(:disabled, [data-disabled], [data-variant='link']) {
209
+ background-image: linear-gradient(
210
+ var(--interaction-hover-bg),
211
+ var(--interaction-hover-bg)
212
+ );
213
+ }
214
+ .pui-button[data-variant='link']:hover:not(:disabled, [data-disabled]) {
215
+ text-decoration-thickness: 2px;
205
216
  }
206
217
  .pui-button:focus-visible {
207
218
  outline: 2px solid var(--interaction-focus);
208
219
  outline-offset: 2px;
209
220
  }
210
- .pui-button:is(:disabled, [data-disabled], [aria-disabled="true"]) {
221
+ .pui-button:is(:disabled, [data-disabled], [aria-disabled='true']) {
211
222
  opacity: var(--control-disabled-opacity);
212
223
  cursor: not-allowed;
213
224
  }
@@ -224,6 +235,24 @@
224
235
  .pui-scroll-viewport::-webkit-scrollbar {
225
236
  display: none;
226
237
  }
238
+ /* A horizontal scroller fades the edge that hides more content, so a cut-off table
239
+ * or code line reads as scrollable before its scrollbar appears, on touch too. */
240
+ .pui-scroll-root[data-overflow-x-end] > .pui-scroll-viewport {
241
+ mask-image: linear-gradient(to left, transparent, #000 var(--space-6));
242
+ }
243
+ .pui-scroll-root[data-overflow-x-start] > .pui-scroll-viewport {
244
+ mask-image: linear-gradient(to right, transparent, #000 var(--space-6));
245
+ }
246
+ .pui-scroll-root[data-overflow-x-start][data-overflow-x-end]
247
+ > .pui-scroll-viewport {
248
+ mask-image: linear-gradient(
249
+ to right,
250
+ transparent,
251
+ #000 var(--space-6),
252
+ #000 calc(100% - var(--space-6)),
253
+ transparent
254
+ );
255
+ }
227
256
  .pui-scrollbar {
228
257
  display: flex;
229
258
  user-select: none;
@@ -237,24 +266,24 @@
237
266
  .pui-scrollbar[data-scrolling],
238
267
  .pui-scrollbar:hover,
239
268
  .pui-scroll-root[data-scroll-near-x]
240
- > .pui-scrollbar[data-orientation="horizontal"],
269
+ > .pui-scrollbar[data-orientation='horizontal'],
241
270
  .pui-scroll-root[data-scroll-near-y]
242
- > .pui-scrollbar[data-orientation="vertical"],
243
- .pui-scroll-root[data-scroll-dragging="horizontal"]
244
- > .pui-scrollbar[data-orientation="horizontal"],
245
- .pui-scroll-root[data-scroll-dragging="vertical"]
246
- > .pui-scrollbar[data-orientation="vertical"],
271
+ > .pui-scrollbar[data-orientation='vertical'],
272
+ .pui-scroll-root[data-scroll-dragging='horizontal']
273
+ > .pui-scrollbar[data-orientation='horizontal'],
274
+ .pui-scroll-root[data-scroll-dragging='vertical']
275
+ > .pui-scrollbar[data-orientation='vertical'],
247
276
  .pui-scroll-root:has(> .pui-scroll-viewport:focus-visible) > .pui-scrollbar {
248
277
  opacity: 1;
249
278
  }
250
- .pui-scrollbar[data-orientation="horizontal"] {
279
+ .pui-scrollbar[data-orientation='horizontal'] {
251
280
  height: 10px;
252
281
  position: absolute;
253
282
  bottom: 0;
254
283
  left: 0;
255
284
  right: 0;
256
285
  }
257
- .pui-scrollbar[data-orientation="vertical"] {
286
+ .pui-scrollbar[data-orientation='vertical'] {
258
287
  flex-direction: column;
259
288
  width: 10px;
260
289
  position: absolute;
@@ -271,6 +300,14 @@
271
300
  .pui-scrollbar:hover .pui-scroll-thumb {
272
301
  opacity: 0.8;
273
302
  }
303
+ /* On touch-only screens a scrollbar is a position indicator, as native mobile
304
+ * scrollbars are: content scrolls by swiping, so the bar overlaying its edge
305
+ * never takes a tap meant for the link or control beneath it. */
306
+ @media (hover: none) and (pointer: coarse) {
307
+ .pui-scrollbar {
308
+ pointer-events: none;
309
+ }
310
+ }
274
311
  @media (forced-colors: active) {
275
312
  .pui-scrollbar {
276
313
  opacity: 1;
@@ -333,24 +370,24 @@
333
370
  }
334
371
  }
335
372
 
336
- .pui-button[data-size="xs"] {
373
+ .pui-button[data-size='xs'] {
337
374
  height: 24px;
338
375
  min-height: 24px;
339
376
  padding-inline: 8px;
340
377
  font-size: 12px;
341
378
  gap: 4px;
342
379
  }
343
- .pui-button[data-size="sm"] {
380
+ .pui-button[data-size='sm'] {
344
381
  height: 32px;
345
382
  min-height: 32px;
346
383
  padding-inline: 10px;
347
384
  }
348
- .pui-button[data-size="lg"] {
385
+ .pui-button[data-size='lg'] {
349
386
  height: var(--size-control-height-large);
350
387
  min-height: var(--size-control-height-large);
351
388
  padding-inline: var(--size-button-padding-large);
352
389
  }
353
- .pui-button[data-size^="icon"] {
390
+ .pui-button[data-size^='icon'] {
354
391
  width: var(--control-height);
355
392
  padding: 0;
356
393
  }
@@ -360,24 +397,21 @@
360
397
  }
361
398
  }
362
399
 
363
- .pui-button[data-variant="secondary"] {
400
+ .pui-button[data-variant='secondary'] {
364
401
  background: var(--selected);
365
402
  color: var(--ink);
366
403
  }
367
- .pui-button[data-variant="destructive"] {
404
+ .pui-button[data-variant='destructive'] {
368
405
  background: var(--status-danger-bg);
369
406
  color: var(--status-danger-fg);
370
407
  border-color: transparent;
371
408
  }
372
- .pui-button[data-variant="link"] {
409
+ .pui-button[data-variant='link'] {
373
410
  background: transparent;
374
411
  color: var(--brand-ink);
375
412
  border-color: transparent;
376
413
  text-decoration: underline;
377
414
  }
378
- .pui-button[data-variant="ghost"]:hover:not(:disabled) {
379
- background: var(--interaction-hover-bg);
380
- }
381
415
 
382
416
  /* Edge panels share surfaces and layers; only Drawer adds native Base UI gestures. */
383
417
  .pui-panel-layer {
@@ -409,17 +443,17 @@
409
443
  padding: 12px;
410
444
  pointer-events: none;
411
445
  }
412
- .pui-panel-viewport[data-side="right"] {
446
+ .pui-panel-viewport[data-side='right'] {
413
447
  justify-content: flex-end;
414
448
  }
415
- .pui-panel-viewport[data-side="left"] {
449
+ .pui-panel-viewport[data-side='left'] {
416
450
  justify-content: flex-start;
417
451
  }
418
- .pui-panel-viewport[data-side="top"] {
452
+ .pui-panel-viewport[data-side='top'] {
419
453
  align-items: flex-start;
420
454
  justify-content: center;
421
455
  }
422
- .pui-panel-viewport[data-side="bottom"] {
456
+ .pui-panel-viewport[data-side='bottom'] {
423
457
  align-items: flex-end;
424
458
  justify-content: center;
425
459
  }
@@ -449,25 +483,25 @@
449
483
  );
450
484
  transition: transform var(--duration-base) var(--ease-out);
451
485
  }
452
- .pui-panel[data-size="sm"] {
486
+ .pui-panel[data-size='sm'] {
453
487
  --panel-width: 320px;
454
488
  }
455
- .pui-panel[data-size="lg"] {
489
+ .pui-panel[data-size='lg'] {
456
490
  --panel-width: 640px;
457
491
  }
458
- .pui-panel[data-side="right"] {
492
+ .pui-panel[data-side='right'] {
459
493
  --panel-enter-x: calc(100% + 12px);
460
494
  height: 100%;
461
495
  }
462
- .pui-panel[data-side="left"] {
496
+ .pui-panel[data-side='left'] {
463
497
  --panel-enter-x: calc(-100% - 12px);
464
498
  height: 100%;
465
499
  }
466
- .pui-panel[data-side="top"] {
500
+ .pui-panel[data-side='top'] {
467
501
  --panel-enter-y: calc(-100% - 12px);
468
502
  max-height: min(85dvh, 100%);
469
503
  }
470
- .pui-panel[data-side="bottom"] {
504
+ .pui-panel[data-side='bottom'] {
471
505
  --panel-enter-y: calc(100% + 12px);
472
506
  max-height: min(85dvh, 100%);
473
507
  }
@@ -542,8 +576,8 @@
542
576
  border-radius: var(--radius-full);
543
577
  background: var(--line);
544
578
  }
545
- .pui-drawer[data-side="left"] > .pui-drawer-handle,
546
- .pui-drawer[data-side="right"] > .pui-drawer-handle {
579
+ .pui-drawer[data-side='left'] > .pui-drawer-handle,
580
+ .pui-drawer[data-side='right'] > .pui-drawer-handle {
547
581
  display: none;
548
582
  }
549
583
  @media (prefers-reduced-motion: reduce) {
@@ -561,7 +595,7 @@
561
595
  .pui-panel-footer {
562
596
  box-sizing: border-box;
563
597
  }
564
- .pui-panel-viewport[data-side="bottom"] {
598
+ .pui-panel-viewport[data-side='bottom'] {
565
599
  bottom: var(--drawer-keyboard-inset, 0px);
566
600
  }
567
601
 
@@ -953,6 +987,9 @@
953
987
  color: var(--ink);
954
988
  background: var(--interaction-hover-bg);
955
989
  }
990
+ .pui-tabs-tab:active:not(:disabled):not([data-disabled]) {
991
+ background: var(--interaction-active-bg);
992
+ }
956
993
  .pui-tabs-tab[data-active] {
957
994
  background: var(--canvas);
958
995
  color: var(--ink);
@@ -993,19 +1030,19 @@
993
1030
  background: transparent;
994
1031
  border-color: transparent;
995
1032
  }
996
- .pui-tabs[data-orientation="vertical"] {
1033
+ .pui-tabs[data-orientation='vertical'] {
997
1034
  display: grid;
998
1035
  grid-template-columns: minmax(0, 180px) minmax(0, 1fr);
999
1036
  gap: var(--space-6);
1000
1037
  align-items: start;
1001
1038
  }
1002
- .pui-tabs-list[data-orientation="vertical"] {
1039
+ .pui-tabs-list[data-orientation='vertical'] {
1003
1040
  flex-direction: column;
1004
1041
  }
1005
- .pui-tabs-list[data-orientation="vertical"] .pui-tabs-tab {
1042
+ .pui-tabs-list[data-orientation='vertical'] .pui-tabs-tab {
1006
1043
  text-align: start;
1007
1044
  }
1008
- .pui-tabs[data-orientation="vertical"] > .pui-tabs-panel {
1045
+ .pui-tabs[data-orientation='vertical'] > .pui-tabs-panel {
1009
1046
  padding-block: var(--space-1);
1010
1047
  }
1011
1048
  .pui-accordion {
@@ -1050,6 +1087,9 @@
1050
1087
  .pui-disclosure-trigger:hover:not(:disabled) {
1051
1088
  background: var(--interaction-hover-bg);
1052
1089
  }
1090
+ .pui-disclosure-trigger:active:not(:disabled) {
1091
+ background: var(--interaction-active-bg);
1092
+ }
1053
1093
  .pui-disclosure-trigger:focus-visible {
1054
1094
  outline: 2px solid var(--interaction-focus);
1055
1095
  outline-offset: -2px;
@@ -1113,7 +1153,7 @@
1113
1153
  margin-bottom: 0;
1114
1154
  }
1115
1155
  @media (max-width: 760px) {
1116
- .pui-tabs[data-orientation="vertical"] {
1156
+ .pui-tabs[data-orientation='vertical'] {
1117
1157
  grid-template-columns: minmax(0, 1fr);
1118
1158
  gap: var(--space-3);
1119
1159
  }
@@ -1184,11 +1224,11 @@
1184
1224
  height: 20px;
1185
1225
  vertical-align: middle;
1186
1226
  }
1187
- .pui-spinner[data-size="sm"] {
1227
+ .pui-spinner[data-size='sm'] {
1188
1228
  width: 16px;
1189
1229
  height: 16px;
1190
1230
  }
1191
- .pui-spinner[data-size="lg"] {
1231
+ .pui-spinner[data-size='lg'] {
1192
1232
  width: 28px;
1193
1233
  height: 28px;
1194
1234
  }
@@ -1207,11 +1247,11 @@
1207
1247
  background: var(--surface);
1208
1248
  animation: pui-progress-pulse 1.4s ease-in-out infinite;
1209
1249
  }
1210
- .pui-skeleton[data-shape="block"] {
1250
+ .pui-skeleton[data-shape='block'] {
1211
1251
  height: 96px;
1212
1252
  border-radius: var(--radius-md);
1213
1253
  }
1214
- .pui-skeleton[data-shape="circle"] {
1254
+ .pui-skeleton[data-shape='circle'] {
1215
1255
  width: 36px;
1216
1256
  height: 36px;
1217
1257
  border-radius: 50%;
@@ -1555,18 +1595,18 @@
1555
1595
  .pui-slider-thumb[data-disabled] {
1556
1596
  cursor: not-allowed;
1557
1597
  }
1558
- .pui-slider[data-orientation="vertical"] {
1598
+ .pui-slider[data-orientation='vertical'] {
1559
1599
  width: max-content;
1560
1600
  min-width: 120px;
1561
1601
  }
1562
- .pui-slider-control[data-orientation="vertical"] {
1602
+ .pui-slider-control[data-orientation='vertical'] {
1563
1603
  width: 44px;
1564
1604
  height: 192px;
1565
1605
  justify-content: center;
1566
1606
  justify-self: center;
1567
1607
  touch-action: pan-x;
1568
1608
  }
1569
- .pui-slider-track[data-orientation="vertical"] {
1609
+ .pui-slider-track[data-orientation='vertical'] {
1570
1610
  width: 6px;
1571
1611
  height: 100%;
1572
1612
  }
@@ -1595,7 +1635,7 @@
1595
1635
  border-color: var(--line);
1596
1636
  }
1597
1637
  .pui-toggle[data-pressed],
1598
- .pui-toolbar-button[aria-pressed="true"] {
1638
+ .pui-toolbar-button[aria-pressed='true'] {
1599
1639
  background: var(--selected);
1600
1640
  border-color: var(--control-border);
1601
1641
  color: var(--ink);
@@ -1615,9 +1655,9 @@
1615
1655
  gap: var(--space-1);
1616
1656
  min-width: 0;
1617
1657
  }
1618
- .pui-toggle-group[data-orientation="vertical"],
1619
- .pui-toolbar[data-orientation="vertical"],
1620
- .pui-menubar[data-orientation="vertical"] {
1658
+ .pui-toggle-group[data-orientation='vertical'],
1659
+ .pui-toolbar[data-orientation='vertical'],
1660
+ .pui-menubar[data-orientation='vertical'] {
1621
1661
  flex-direction: column;
1622
1662
  align-items: flex-start;
1623
1663
  width: fit-content;
@@ -1643,10 +1683,6 @@
1643
1683
  border-radius: max(0px, calc(var(--radius-md) - var(--space-1)));
1644
1684
  text-decoration: none;
1645
1685
  }
1646
- .pui-toolbar-button:hover:not([data-disabled]),
1647
- .pui-toolbar-link:hover {
1648
- background: var(--interaction-hover-bg);
1649
- }
1650
1686
  .pui-toolbar-input {
1651
1687
  width: 160px;
1652
1688
  max-width: 100%;
@@ -1658,17 +1694,17 @@
1658
1694
  flex: none;
1659
1695
  background: transparent;
1660
1696
  }
1661
- .pui-toolbar-separator[data-orientation="vertical"] {
1697
+ .pui-toolbar-separator[data-orientation='vertical'] {
1662
1698
  width: 1px;
1663
1699
  height: 24px;
1664
1700
  margin-inline: var(--space-1);
1665
1701
  }
1666
- .pui-toolbar-separator[data-orientation="horizontal"] {
1702
+ .pui-toolbar-separator[data-orientation='horizontal'] {
1667
1703
  height: 1px;
1668
1704
  width: 100%;
1669
1705
  margin-block: var(--space-1);
1670
1706
  }
1671
- .pui-toolbar[data-orientation="vertical"] .pui-toolbar-group {
1707
+ .pui-toolbar[data-orientation='vertical'] .pui-toolbar-group {
1672
1708
  flex-direction: column;
1673
1709
  align-items: stretch;
1674
1710
  width: 100%;
@@ -1707,7 +1743,7 @@
1707
1743
  display: inline-flex;
1708
1744
  width: 16px;
1709
1745
  }
1710
- .pui-menu-check-item[aria-checked="false"] > .pui-menu-indicator {
1746
+ .pui-menu-check-item[aria-checked='false'] > .pui-menu-indicator {
1711
1747
  visibility: hidden;
1712
1748
  }
1713
1749
  .pui-menu-group-label {
@@ -1747,9 +1783,6 @@
1747
1783
  scrollbar-width: thin;
1748
1784
  scrollbar-color: var(--scrollbar-thumb) transparent;
1749
1785
  }
1750
- .pui-toolbar-button[data-disabled]:hover {
1751
- filter: none;
1752
- }
1753
1786
  .pui-menu-trigger[data-disabled] {
1754
1787
  opacity: var(--control-disabled-opacity);
1755
1788
  cursor: not-allowed;
@@ -1772,8 +1805,8 @@
1772
1805
  }
1773
1806
  @media (forced-colors: active) {
1774
1807
  .pui-toggle[data-pressed]::after,
1775
- .pui-toolbar-button[aria-pressed="true"]::after {
1776
- content: "";
1808
+ .pui-toolbar-button[aria-pressed='true']::after {
1809
+ content: '';
1777
1810
  position: absolute;
1778
1811
  inset: 3px;
1779
1812
  border: 1px solid CanvasText;
@@ -1850,7 +1883,7 @@
1850
1883
  padding: 0;
1851
1884
  list-style: none;
1852
1885
  }
1853
- .pui-navigation-menu[data-orientation="vertical"] > .pui-navigation-list {
1886
+ .pui-navigation-menu[data-orientation='vertical'] > .pui-navigation-list {
1854
1887
  flex-direction: column;
1855
1888
  align-items: stretch;
1856
1889
  }
@@ -1891,7 +1924,7 @@
1891
1924
  .pui-navigation-link[data-highlighted] {
1892
1925
  background: var(--menu-hover-background);
1893
1926
  }
1894
- .pui-navigation-link[aria-current="page"] {
1927
+ .pui-navigation-link[aria-current='page'] {
1895
1928
  background: var(--selected);
1896
1929
  color: var(--ink);
1897
1930
  font-weight: 500;
@@ -1964,7 +1997,7 @@
1964
1997
  color: CanvasText;
1965
1998
  border-color: CanvasText;
1966
1999
  }
1967
- .pui-navigation-link[aria-current="page"] {
2000
+ .pui-navigation-link[aria-current='page'] {
1968
2001
  border-color: Highlight;
1969
2002
  }
1970
2003
  }
@@ -2025,7 +2058,7 @@
2025
2058
  outline: 2px solid Highlight;
2026
2059
  outline-offset: 2px;
2027
2060
  }
2028
- .pui-otp-input[aria-invalid="true"] {
2061
+ .pui-otp-input[aria-invalid='true'] {
2029
2062
  border-color: LinkText;
2030
2063
  }
2031
2064
  .pui-otp-separator {
@@ -2073,16 +2106,16 @@
2073
2106
  opacity var(--dialog-enter-duration) var(--motion-ease),
2074
2107
  translate var(--dialog-enter-duration) var(--motion-spatial-ease);
2075
2108
  }
2076
- .pui-toast[data-tone="success"] {
2109
+ .pui-toast[data-tone='success'] {
2077
2110
  --_toast-icon: var(--status-success-fg);
2078
2111
  }
2079
- .pui-toast[data-tone="danger"] {
2112
+ .pui-toast[data-tone='danger'] {
2080
2113
  --_toast-icon: var(--status-danger-fg);
2081
2114
  }
2082
- .pui-toast[data-tone="caution"] {
2115
+ .pui-toast[data-tone='caution'] {
2083
2116
  --_toast-icon: var(--status-caution-fg);
2084
2117
  }
2085
- .pui-toast[data-tone="progress"] {
2118
+ .pui-toast[data-tone='progress'] {
2086
2119
  --_toast-icon: var(--status-progress-fg);
2087
2120
  }
2088
2121
  .pui-toast[data-starting-style] {
@@ -2154,12 +2187,12 @@
2154
2187
  }
2155
2188
  }
2156
2189
 
2157
- .pui-toast-viewport[data-layout="stack"]:focus-visible {
2190
+ .pui-toast-viewport[data-layout='stack']:focus-visible {
2158
2191
  border-radius: var(--radius-lg);
2159
2192
  outline: 2px solid var(--interaction-focus);
2160
2193
  outline-offset: -2px;
2161
2194
  }
2162
- .pui-toast-viewport[data-layout="anchored"] {
2195
+ .pui-toast-viewport[data-layout='anchored'] {
2163
2196
  inset: 0;
2164
2197
  display: block;
2165
2198
  width: auto;
@@ -2168,7 +2201,7 @@
2168
2201
  padding: 0;
2169
2202
  overflow: visible;
2170
2203
  }
2171
- .pui-toast-viewport[data-layout="anchored"] .pui-toast {
2204
+ .pui-toast-viewport[data-layout='anchored'] .pui-toast {
2172
2205
  width: 320px;
2173
2206
  max-width: min(calc(100vw - 24px), var(--available-width));
2174
2207
  max-height: var(--available-height);
@@ -2176,7 +2209,7 @@
2176
2209
  scrollbar-width: thin;
2177
2210
  }
2178
2211
 
2179
- .pui-toast-viewport[data-layout="anchored"]:focus-visible .pui-toast {
2212
+ .pui-toast-viewport[data-layout='anchored']:focus-visible .pui-toast {
2180
2213
  outline: 2px solid var(--interaction-focus);
2181
2214
  outline-offset: 2px;
2182
2215
  }
@@ -2224,7 +2257,7 @@
2224
2257
  outline: 2px solid var(--interaction-focus);
2225
2258
  outline-offset: 2px;
2226
2259
  }
2227
- .pui-file-upload:has(.pui-file-native[aria-invalid="true"]) .pui-file-dropzone {
2260
+ .pui-file-upload:has(.pui-file-native[aria-invalid='true']) .pui-file-dropzone {
2228
2261
  border-color: var(--status-danger-fg);
2229
2262
  }
2230
2263
  .pui-file-drop-hint {
@@ -2320,15 +2353,15 @@
2320
2353
  stroke-width: var(--icon-stroke-width);
2321
2354
  pointer-events: none;
2322
2355
  }
2323
- .pui-icon[data-size="md"] {
2356
+ .pui-icon[data-size='md'] {
2324
2357
  width: var(--icon-size-md);
2325
2358
  height: var(--icon-size-md);
2326
2359
  }
2327
- .pui-icon[data-size="lg"] {
2360
+ .pui-icon[data-size='lg'] {
2328
2361
  width: var(--icon-size-lg);
2329
2362
  height: var(--icon-size-lg);
2330
2363
  }
2331
- .pui-icon[data-directional="true"]:dir(rtl) {
2364
+ .pui-icon[data-directional='true']:dir(rtl) {
2332
2365
  transform: scaleX(-1);
2333
2366
  }
2334
2367
 
@@ -2389,7 +2422,7 @@
2389
2422
  }
2390
2423
 
2391
2424
  /* Base UI owns hover/focus expansion, announcements, timers and gestures. */
2392
- .pui-toast-viewport[data-layout="stack"] {
2425
+ .pui-toast-viewport[data-layout='stack'] {
2393
2426
  display: grid;
2394
2427
  /* An auto row adopts the tallest card while its height transitions, moving
2395
2428
  the bottom anchor during collapse when a behind-card has an action. */
@@ -2398,7 +2431,7 @@
2398
2431
  height: calc(var(--toast-frontmost-height, 80px) + 48px);
2399
2432
  overflow: visible;
2400
2433
  }
2401
- .pui-toast-viewport[data-layout="stack"] > .pui-toast {
2434
+ .pui-toast-viewport[data-layout='stack'] > .pui-toast {
2402
2435
  grid-area: 1 / 1;
2403
2436
  z-index: calc(100 - var(--toast-index));
2404
2437
  height: var(--toast-frontmost-height, var(--toast-height, auto));
@@ -2413,29 +2446,29 @@
2413
2446
  opacity var(--toast-enter-duration) var(--motion-ease),
2414
2447
  translate var(--toast-enter-duration) var(--toast-stack-ease);
2415
2448
  }
2416
- .pui-toast-viewport[data-layout="stack"]:not([data-expanded])
2449
+ .pui-toast-viewport[data-layout='stack']:not([data-expanded])
2417
2450
  .pui-toast-content[data-behind] {
2418
2451
  opacity: 0;
2419
2452
  pointer-events: none;
2420
2453
  }
2421
- .pui-toast-viewport[data-layout="stack"][data-expanded] {
2454
+ .pui-toast-viewport[data-layout='stack'][data-expanded] {
2422
2455
  pointer-events: auto;
2423
2456
  height: min(calc(var(--toast-stack-height, 240px) + 48px), 100dvh);
2424
2457
  grid-template-rows: var(--toast-stack-height, auto);
2425
2458
  padding-top: 24px;
2426
2459
  overflow: visible;
2427
2460
  }
2428
- .pui-toast-viewport[data-layout="stack"][data-expanded][data-stack-overflow] {
2461
+ .pui-toast-viewport[data-layout='stack'][data-expanded][data-stack-overflow] {
2429
2462
  overflow-y: auto;
2430
2463
  overflow-x: hidden;
2431
2464
  }
2432
- .pui-toast-viewport[data-layout="stack"][data-expanded] > .pui-toast {
2465
+ .pui-toast-viewport[data-layout='stack'][data-expanded] > .pui-toast {
2433
2466
  height: var(--toast-height, auto);
2434
2467
  transform: translateY(
2435
2468
  calc(-1 * (var(--toast-offset-y) + var(--toast-index) * var(--space-2)))
2436
2469
  );
2437
2470
  }
2438
- .pui-toast-viewport[data-layout="stack"] > .pui-toast[data-ending-style] {
2471
+ .pui-toast-viewport[data-layout='stack'] > .pui-toast[data-ending-style] {
2439
2472
  transition-duration: 0s;
2440
2473
  }
2441
2474
  @media (max-width: 760px) {
@@ -2452,8 +2485,8 @@
2452
2485
  }
2453
2486
  @media (prefers-reduced-motion: reduce) {
2454
2487
  .pui-toast-content,
2455
- .pui-toast-viewport[data-layout="stack"],
2456
- .pui-toast-viewport[data-layout="stack"] > .pui-toast {
2488
+ .pui-toast-viewport[data-layout='stack'],
2489
+ .pui-toast-viewport[data-layout='stack'] > .pui-toast {
2457
2490
  transition: none;
2458
2491
  }
2459
2492
  }
@@ -2468,10 +2501,13 @@
2468
2501
  }
2469
2502
 
2470
2503
  /* Active feedback is transient; persistent selection belongs to Toggle. */
2471
- .pui-button:active:not(:disabled):not([data-disabled]) {
2472
- filter: brightness(0.94);
2504
+ .pui-button:active:not(:disabled, [data-disabled], [data-variant='link']) {
2505
+ background-image: linear-gradient(
2506
+ var(--interaction-active-bg),
2507
+ var(--interaction-active-bg)
2508
+ );
2473
2509
  }
2474
- .pui-button[aria-busy="true"] {
2510
+ .pui-button[aria-busy='true'] {
2475
2511
  cursor: progress;
2476
2512
  }
2477
2513
  @media (forced-colors: active) {
@@ -2479,7 +2515,7 @@
2479
2515
  border-color: ButtonText;
2480
2516
  }
2481
2517
  .pui-button:active {
2482
- filter: none;
2518
+ background-image: none;
2483
2519
  }
2484
2520
  }
2485
2521
 
@@ -2510,7 +2546,7 @@
2510
2546
  min-inline-size: 0;
2511
2547
  max-inline-size: 100%;
2512
2548
  }
2513
- .pui-filter-bar-field[data-width="search"] {
2549
+ .pui-filter-bar-field[data-width='search'] {
2514
2550
  flex: 2 1 20rem;
2515
2551
  }
2516
2552
  .pui-filter-bar-field > :is(.pui-control, .pui-select-trigger) {
@@ -2551,7 +2587,7 @@
2551
2587
  background: var(--chrome);
2552
2588
  border-radius: var(--app-shell-radius);
2553
2589
  }
2554
- .pui-app-shell[data-sidebar="collapsed"] {
2590
+ .pui-app-shell[data-sidebar='collapsed'] {
2555
2591
  --app-shell-sidebar-width: 64px;
2556
2592
  }
2557
2593
  .pui-app-shell-header {
@@ -2598,7 +2634,10 @@
2598
2634
  .pui-app-shell-link:hover {
2599
2635
  background: var(--interaction-hover-bg);
2600
2636
  }
2601
- .pui-app-shell-link[aria-current="page"] {
2637
+ .pui-app-shell-link:active:not([aria-current='page']) {
2638
+ background: var(--interaction-active-bg);
2639
+ }
2640
+ .pui-app-shell-link[aria-current='page'] {
2602
2641
  background: var(--selected);
2603
2642
  color: var(--ink);
2604
2643
  font-weight: 500;
@@ -2619,7 +2658,7 @@
2619
2658
  white-space: nowrap;
2620
2659
  padding-inline-end: var(--space-2);
2621
2660
  }
2622
- .pui-app-shell[data-sidebar="collapsed"] .pui-app-shell-label {
2661
+ .pui-app-shell[data-sidebar='collapsed'] .pui-app-shell-label {
2623
2662
  position: absolute;
2624
2663
  inline-size: 1px;
2625
2664
  block-size: 1px;
@@ -2648,23 +2687,23 @@
2648
2687
  }
2649
2688
  }
2650
2689
  @media (forced-colors: active) {
2651
- .pui-app-shell-link[aria-current="page"] {
2690
+ .pui-app-shell-link[aria-current='page'] {
2652
2691
  outline: 1px solid Highlight;
2653
2692
  }
2654
2693
  }
2655
2694
 
2656
2695
  /* Workspace variant: product sidebar owns the brand; the content scrollport is caller-provided. */
2657
- .pui-app-shell[data-layout="workspace"] {
2696
+ .pui-app-shell[data-layout='workspace'] {
2658
2697
  --app-shell-sidebar-width: 224px;
2659
2698
  grid-template-rows: minmax(0, 1fr);
2660
2699
  gap: 0;
2661
2700
  padding: 0;
2662
2701
  transition: grid-template-columns var(--duration-base) var(--ease-out);
2663
2702
  }
2664
- .pui-app-shell[data-layout="workspace"][data-sidebar="collapsed"] {
2703
+ .pui-app-shell[data-layout='workspace'][data-sidebar='collapsed'] {
2665
2704
  --app-shell-sidebar-width: 72px;
2666
2705
  }
2667
- .pui-app-shell[data-layout="workspace"] > .pui-app-shell-sidebar {
2706
+ .pui-app-shell[data-layout='workspace'] > .pui-app-shell-sidebar {
2668
2707
  position: relative;
2669
2708
  grid-row: 1;
2670
2709
  grid-column: 1;
@@ -2672,7 +2711,7 @@
2672
2711
  padding: 0;
2673
2712
  z-index: 1;
2674
2713
  }
2675
- .pui-app-shell[data-layout="workspace"] > .pui-app-shell-content {
2714
+ .pui-app-shell[data-layout='workspace'] > .pui-app-shell-content {
2676
2715
  grid-row: 1;
2677
2716
  grid-column: 2;
2678
2717
  margin: 0;
@@ -2680,42 +2719,67 @@
2680
2719
  background: transparent;
2681
2720
  border-radius: 0;
2682
2721
  }
2683
- .pui-app-shell[data-layout="workspace"] .pui-app-shell-footer {
2722
+ /* The page surface: concentric with the shell, inset on every side but the
2723
+ * sidebar's. Stretch or size it from its container: a percentage height here
2724
+ * would resolve against a scroll content that sizes from the page itself. */
2725
+ .pui-app-shell-page {
2726
+ box-sizing: border-box;
2727
+ min-inline-size: 0;
2728
+ margin: var(--app-shell-inset);
2729
+ margin-inline-start: 0;
2730
+ padding: var(--space-6);
2731
+ background: var(--canvas);
2732
+ border-radius: max(
2733
+ 0px,
2734
+ calc(var(--app-shell-radius) - var(--app-shell-inset))
2735
+ );
2736
+ }
2737
+ /* Without the sidebar the page insets evenly. Below a mobile header it starts flush. */
2738
+ @media (max-width: 760px) {
2739
+ .pui-app-shell-page {
2740
+ margin: var(--app-shell-inset);
2741
+ padding: var(--space-4);
2742
+ }
2743
+ .pui-app-shell:has(> .pui-app-shell-header) .pui-app-shell-page {
2744
+ margin-block-start: 0;
2745
+ }
2746
+ }
2747
+ .pui-app-shell[data-layout='workspace'] .pui-app-shell-footer {
2684
2748
  padding: var(--space-4);
2685
2749
  }
2686
- .pui-app-shell[data-layout="workspace"] .pui-app-shell-label {
2750
+ .pui-app-shell[data-layout='workspace'] .pui-app-shell-label {
2687
2751
  transition:
2688
2752
  opacity 80ms var(--ease-out) 160ms,
2689
2753
  visibility 0s 160ms;
2690
2754
  }
2691
- .pui-app-shell[data-layout="workspace"][data-sidebar="collapsed"]
2755
+ .pui-app-shell[data-layout='workspace'][data-sidebar='collapsed']
2692
2756
  .pui-app-shell-label {
2693
2757
  opacity: 0;
2694
2758
  visibility: hidden;
2695
2759
  transition: none;
2696
2760
  }
2697
2761
  @media (min-width: 761px) {
2698
- .pui-app-shell[data-layout="workspace"] > .pui-app-shell-header {
2762
+ .pui-app-shell[data-layout='workspace'] > .pui-app-shell-header {
2699
2763
  display: none;
2700
2764
  }
2701
2765
  }
2702
2766
  @media (max-width: 760px) {
2703
- .pui-app-shell[data-layout="workspace"] {
2767
+ .pui-app-shell[data-layout='workspace'] {
2704
2768
  grid-template-columns: minmax(0, 1fr);
2705
2769
  grid-template-rows: auto minmax(0, 1fr);
2706
2770
  }
2707
- .pui-app-shell[data-layout="workspace"] > .pui-app-shell-header {
2771
+ .pui-app-shell[data-layout='workspace'] > .pui-app-shell-header {
2708
2772
  padding: var(--space-3);
2709
2773
  }
2710
- .pui-app-shell[data-layout="workspace"] > .pui-app-shell-content {
2774
+ .pui-app-shell[data-layout='workspace'] > .pui-app-shell-content {
2711
2775
  grid-column: 1;
2712
2776
  grid-row: 2;
2713
2777
  margin: 0;
2714
2778
  }
2715
2779
  }
2716
2780
  @media (prefers-reduced-motion: reduce) {
2717
- .pui-app-shell[data-layout="workspace"],
2718
- .pui-app-shell[data-layout="workspace"] .pui-app-shell-label {
2781
+ .pui-app-shell[data-layout='workspace'],
2782
+ .pui-app-shell[data-layout='workspace'] .pui-app-shell-label {
2719
2783
  transition: none;
2720
2784
  }
2721
2785
  }
@@ -2744,13 +2808,13 @@
2744
2808
  .pui-tree-item:hover {
2745
2809
  background: var(--interaction-hover-bg);
2746
2810
  }
2747
- .pui-tree-item[aria-selected="true"] {
2811
+ .pui-tree-item[aria-selected='true'] {
2748
2812
  background: var(--selected);
2749
2813
  }
2750
2814
  .pui-tree-item:focus-visible {
2751
2815
  outline: 2px solid var(--control-focus);
2752
2816
  }
2753
- .pui-tree-item[aria-disabled="true"] {
2817
+ .pui-tree-item[aria-disabled='true'] {
2754
2818
  color: var(--ink-muted);
2755
2819
  }
2756
2820
  .pui-tree-toggle,
@@ -2771,6 +2835,9 @@
2771
2835
  .pui-tree-toggle:hover:not(:disabled) {
2772
2836
  background: var(--interaction-hover-bg);
2773
2837
  }
2838
+ .pui-tree-toggle:active:not(:disabled) {
2839
+ background: var(--interaction-active-bg);
2840
+ }
2774
2841
  .pui-tree-toggle svg[data-expanded] {
2775
2842
  rotate: 90deg;
2776
2843
  }
@@ -2793,11 +2860,11 @@
2793
2860
  }
2794
2861
  }
2795
2862
  @media (forced-colors: active) {
2796
- .pui-tree-item[aria-selected="true"] {
2863
+ .pui-tree-item[aria-selected='true'] {
2797
2864
  background: Highlight;
2798
2865
  color: HighlightText;
2799
2866
  }
2800
- .pui-tree-item[aria-disabled="true"] {
2867
+ .pui-tree-item[aria-disabled='true'] {
2801
2868
  color: GrayText;
2802
2869
  }
2803
2870
  .pui-tree-item:focus-visible {
@@ -2868,7 +2935,7 @@
2868
2935
  padding: 1px;
2869
2936
  outline: none;
2870
2937
  }
2871
- .pui-date-segment[data-type="literal"] {
2938
+ .pui-date-segment[data-type='literal'] {
2872
2939
  padding: 0;
2873
2940
  white-space: pre;
2874
2941
  }
@@ -3121,7 +3188,10 @@
3121
3188
  .pui-chart-legend-button:hover {
3122
3189
  background: var(--interaction-hover-bg);
3123
3190
  }
3124
- .pui-chart-legend-button[aria-pressed="false"] span {
3191
+ .pui-chart-legend-button:active {
3192
+ background: var(--interaction-active-bg);
3193
+ }
3194
+ .pui-chart-legend-button[aria-pressed='false'] span {
3125
3195
  text-decoration: line-through;
3126
3196
  color: var(--ink-muted);
3127
3197
  }
@@ -3235,7 +3305,7 @@
3235
3305
  display: contents;
3236
3306
  }
3237
3307
 
3238
- [data-ui-size="small"] {
3308
+ [data-ui-size='small'] {
3239
3309
  --ui-slider-track: var(--size-slider-track-small);
3240
3310
  --ui-file-padding: var(--size-file-padding-small);
3241
3311
  --ui-content-gap: var(--size-content-gap-small);
@@ -3276,7 +3346,7 @@
3276
3346
  --control-switch-thumb: var(--ui-switch-thumb);
3277
3347
  }
3278
3348
 
3279
- [data-ui-size="default"] {
3349
+ [data-ui-size='default'] {
3280
3350
  --ui-slider-track: var(--size-slider-track-default);
3281
3351
  --ui-file-padding: var(--size-file-padding-default);
3282
3352
  --ui-content-gap: var(--size-content-gap-default);
@@ -3317,7 +3387,7 @@
3317
3387
  --control-switch-thumb: var(--ui-switch-thumb);
3318
3388
  }
3319
3389
 
3320
- [data-ui-size="large"] {
3390
+ [data-ui-size='large'] {
3321
3391
  --ui-slider-track: var(--size-slider-track-large);
3322
3392
  --ui-file-padding: var(--size-file-padding-large);
3323
3393
  --ui-content-gap: var(--size-content-gap-large);
@@ -3365,7 +3435,7 @@
3365
3435
  font-size: var(--ui-font);
3366
3436
  line-height: var(--ui-leading);
3367
3437
  }
3368
- :where([data-ui-size], [data-ui-size] *).pui-button[data-size^="icon"] {
3438
+ :where([data-ui-size], [data-ui-size] *).pui-button[data-size^='icon'] {
3369
3439
  inline-size: var(--control-height);
3370
3440
  block-size: var(--control-height);
3371
3441
  padding: 0;
@@ -3488,7 +3558,7 @@
3488
3558
  :where([data-ui-size], [data-ui-size] *).pui-code-text {
3489
3559
  padding: var(--ui-surface-padding);
3490
3560
  }
3491
- :where([data-ui-size], [data-ui-size] *).pui-skeleton[data-shape="text"] {
3561
+ :where([data-ui-size], [data-ui-size] *).pui-skeleton[data-shape='text'] {
3492
3562
  height: var(--ui-leading);
3493
3563
  }
3494
3564
  :where([data-ui-size], [data-ui-size] *).pui-radio-indicator {
@@ -3497,7 +3567,7 @@
3497
3567
  }
3498
3568
 
3499
3569
  /* Explicit legacy button dimensions stay supported. */
3500
- .pui-button[data-size="xs"] {
3570
+ .pui-button[data-size='xs'] {
3501
3571
  height: 24px;
3502
3572
  min-height: 24px;
3503
3573
  padding-inline: 8px;
@@ -3564,14 +3634,14 @@
3564
3634
  min-inline-size: 0;
3565
3635
  }
3566
3636
  :where([data-ui-size], [data-ui-size] *).pui-slider-track:not(
3567
- [data-orientation="vertical"]
3637
+ [data-orientation='vertical']
3568
3638
  ) {
3569
3639
  height: var(--ui-gauge);
3570
3640
  }
3571
3641
  :where(
3572
3642
  [data-ui-size],
3573
3643
  [data-ui-size] *
3574
- ).pui-slider-track[data-orientation="vertical"] {
3644
+ ).pui-slider-track[data-orientation='vertical'] {
3575
3645
  width: var(--ui-slider-track);
3576
3646
  }
3577
3647
  :where([data-ui-size], [data-ui-size] *):is(.pui-link, .pui-breadcrumbs) {
@@ -3600,31 +3670,31 @@
3600
3670
  font: inherit;
3601
3671
  letter-spacing: inherit;
3602
3672
  }
3603
- .pui-syntax [data-syntax="plain"] {
3673
+ .pui-syntax [data-syntax='plain'] {
3604
3674
  color: var(--syntax-plain);
3605
3675
  }
3606
- .pui-syntax [data-syntax="comment"] {
3676
+ .pui-syntax [data-syntax='comment'] {
3607
3677
  color: var(--syntax-comment);
3608
3678
  }
3609
- .pui-syntax [data-syntax="keyword"] {
3679
+ .pui-syntax [data-syntax='keyword'] {
3610
3680
  color: var(--syntax-keyword);
3611
3681
  }
3612
- .pui-syntax [data-syntax="string"] {
3682
+ .pui-syntax [data-syntax='string'] {
3613
3683
  color: var(--syntax-string);
3614
3684
  }
3615
- .pui-syntax [data-syntax="number"] {
3685
+ .pui-syntax [data-syntax='number'] {
3616
3686
  color: var(--syntax-number);
3617
3687
  }
3618
- .pui-syntax [data-syntax="function"] {
3688
+ .pui-syntax [data-syntax='function'] {
3619
3689
  color: var(--syntax-function);
3620
3690
  }
3621
- .pui-syntax [data-syntax="tag"] {
3691
+ .pui-syntax [data-syntax='tag'] {
3622
3692
  color: var(--syntax-tag);
3623
3693
  }
3624
- .pui-syntax [data-syntax="attribute"] {
3694
+ .pui-syntax [data-syntax='attribute'] {
3625
3695
  color: var(--syntax-attribute);
3626
3696
  }
3627
- .pui-syntax [data-syntax="punctuation"] {
3697
+ .pui-syntax [data-syntax='punctuation'] {
3628
3698
  color: var(--syntax-punctuation);
3629
3699
  }
3630
3700
 
@@ -3636,10 +3706,26 @@
3636
3706
  background: var(--code-bg);
3637
3707
  border-radius: var(--radius-md);
3638
3708
  font: 400 13px/20px var(--font-code);
3709
+ /* Code shows the characters as typed, like the other code text: no === or => ligatures. */
3710
+ font-variant-ligatures: none;
3639
3711
  letter-spacing: 0;
3640
3712
  tab-size: 2;
3641
3713
  white-space: pre;
3642
3714
  }
3715
+ /* The visible box keeps its background and corners while long lines scroll inside it. */
3716
+ .pui-syntax-scroll {
3717
+ border-radius: var(--radius-md);
3718
+ background: var(--code-bg);
3719
+ overflow: hidden;
3720
+ }
3721
+ .pui-syntax-scroll .pui-syntax-pre {
3722
+ min-inline-size: max-content;
3723
+ border-radius: 0;
3724
+ background: none;
3725
+ }
3726
+ .pui-syntax-scroll .pui-syntax-pre[data-wrap] {
3727
+ min-inline-size: 0;
3728
+ }
3643
3729
  .pui-syntax-pre[data-wrap] {
3644
3730
  white-space: pre-wrap;
3645
3731
  overflow-wrap: anywhere;
@@ -3706,3 +3792,41 @@
3706
3792
  color: CanvasText;
3707
3793
  }
3708
3794
  }
3795
+
3796
+ /* Touch feedback is each control's own hover and pressed layer, drawn in its own
3797
+ shape. The browser's tap highlight is a rectangle over the box, so it is off. */
3798
+ :where(
3799
+ .pui-button,
3800
+ .pui-tabs-tab,
3801
+ .pui-disclosure-trigger,
3802
+ .pui-accordion-trigger,
3803
+ .pui-collapsible-trigger,
3804
+ .pui-app-shell-link,
3805
+ .pui-tree-item,
3806
+ .pui-tree-toggle,
3807
+ .pui-chart-legend-button,
3808
+ .pui-checkbox,
3809
+ .pui-radio,
3810
+ .pui-switch,
3811
+ .pui-choice-label,
3812
+ .pui-select-trigger,
3813
+ .pui-select-item,
3814
+ .pui-combobox-item,
3815
+ .pui-combobox-action,
3816
+ .pui-combobox-chip-remove,
3817
+ .pui-menu-item,
3818
+ .pui-navigation-trigger,
3819
+ .pui-navigation-link,
3820
+ .pui-link,
3821
+ .pui-breadcrumb-item a,
3822
+ .pui-calendar-day,
3823
+ .pui-calendar-nav,
3824
+ .pui-date-trigger,
3825
+ .pui-file-trigger,
3826
+ .pui-number-step,
3827
+ .pui-slider-control,
3828
+ .pui-toast-action,
3829
+ .pui-toast-close
3830
+ ) {
3831
+ -webkit-tap-highlight-color: transparent;
3832
+ }