@threadlabs/looma 0.10.9 → 0.10.10

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 (45) hide show
  1. package/components/ui-dialog/ui-dialog.html +17 -0
  2. package/components/ui-editor-mention-menu/ui-editor-mention-menu.html +17 -0
  3. package/components/ui-editor-slash-menu/ui-editor-slash-menu.html +17 -0
  4. package/components/ui-editor-toolbar/ui-editor-toolbar.html +24 -43
  5. package/components/ui-reel/ui-reel.html +24 -0
  6. package/components/ui-scroll-area/ui-scroll-area.html +56 -0
  7. package/components/ui-search-shell/ui-search-shell.html +17 -0
  8. package/components/ui-sidebar/ui-sidebar.html +18 -0
  9. package/dist/index.js +19 -20
  10. package/package.json +1 -1
  11. package/styles/ui-dialog.css +17 -0
  12. package/styles/ui-editor-mention-menu.css +17 -0
  13. package/styles/ui-editor-slash-menu.css +17 -0
  14. package/styles/ui-editor-toolbar.css +25 -42
  15. package/styles/ui-reel.css +27 -1
  16. package/styles/ui-scroll-area.css +57 -0
  17. package/styles/ui-search-shell.css +17 -0
  18. package/styles/ui-sidebar.css +22 -1
  19. package/tokens.css +44 -0
  20. package/vanilla/UiEditorToolbar.js +1 -3
  21. package/vanilla/UiScrollArea.d.ts +14 -0
  22. package/vanilla/UiScrollArea.js +28 -0
  23. package/vanilla/index.js +1 -0
  24. package/vue/UiDialog.vue +21 -0
  25. package/vue/UiEditorMentionMenu.vue +21 -0
  26. package/vue/UiEditorSlashMenu.vue +21 -0
  27. package/vue/UiEditorToolbar.vue +26 -57
  28. package/vue/UiReel.vue +28 -0
  29. package/vue/UiScrollArea.d.ts +18 -0
  30. package/vue/UiScrollArea.js +2 -0
  31. package/vue/UiScrollArea.vue +85 -0
  32. package/vue/UiSearchShell.vue +21 -0
  33. package/vue/UiSidebar.vue +22 -0
  34. package/vue/chunks/UiDialog.js +1 -1
  35. package/vue/chunks/UiEditorMentionMenu.js +1 -1
  36. package/vue/chunks/UiEditorSlashMenu.js +1 -1
  37. package/vue/chunks/UiEditorToolbar.js +5 -29
  38. package/vue/chunks/UiReel.js +1 -1
  39. package/vue/chunks/UiScrollArea.js +21 -0
  40. package/vue/chunks/UiSearchShell.js +1 -1
  41. package/vue/chunks/UiSidebar.js +1 -1
  42. package/vue/components.css +335 -161
  43. package/vue/index.d.ts +1 -0
  44. package/vue/index.js +2 -1
  45. package/components/ui-editor-toolbar/ui-editor-toolbar.js +0 -24
@@ -1131,7 +1131,7 @@ button[data-v-0bd7ecc4] {
1131
1131
  display: none;
1132
1132
  }
1133
1133
 
1134
- [data-component~="ui-dialog"][data-v-d43d3a22] {
1134
+ [data-component~="ui-dialog"][data-v-0fd6654c] {
1135
1135
  position: fixed;
1136
1136
  inset: 0;
1137
1137
  box-sizing: border-box;
@@ -1160,17 +1160,17 @@ button[data-v-0bd7ecc4] {
1160
1160
  display var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
1161
1161
  overlay var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
1162
1162
  }
1163
- [data-component~="ui-dialog"][open][data-v-d43d3a22] {
1163
+ [data-component~="ui-dialog"][open][data-v-0fd6654c] {
1164
1164
  display: flex;
1165
1165
  visibility: visible;
1166
1166
  pointer-events: auto;
1167
1167
  opacity: 1;
1168
1168
  transform: scale(1);
1169
- animation: ui-dialog-enter-d43d3a22 var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
1169
+ animation: ui-dialog-enter-0fd6654c var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease);
1170
1170
  }
1171
1171
 
1172
1172
  /* Header and actions stay pinned; only the body scrolls when content is long. */
1173
- header[data-v-d43d3a22] {
1173
+ header[data-v-0fd6654c] {
1174
1174
  display: flex;
1175
1175
  align-items: center;
1176
1176
  gap: var(--ui-space-3);
@@ -1180,7 +1180,7 @@ header[data-v-d43d3a22] {
1180
1180
  }
1181
1181
 
1182
1182
  /* :host-qualified so page heading rules that reach in cannot outrank the dialog chrome. */
1183
- [data-component~="ui-dialog"] .title[data-v-d43d3a22] {
1183
+ [data-component~="ui-dialog"] .title[data-v-0fd6654c] {
1184
1184
  flex: 1;
1185
1185
  min-inline-size: 0;
1186
1186
  margin: 0;
@@ -1192,7 +1192,7 @@ header[data-v-d43d3a22] {
1192
1192
  font-weight: var(--ui-font-semibold);
1193
1193
  line-height: var(--ui-line-height-tight);
1194
1194
  }
1195
- .close[data-v-d43d3a22] {
1195
+ .close[data-v-0fd6654c] {
1196
1196
  display: inline-grid;
1197
1197
  place-items: center;
1198
1198
  flex: none;
@@ -1211,8 +1211,8 @@ header[data-v-d43d3a22] {
1211
1211
  }
1212
1212
 
1213
1213
  /* A CSS-drawn X. */
1214
- .close[data-v-d43d3a22]::before,
1215
- .close[data-v-d43d3a22]::after {
1214
+ .close[data-v-0fd6654c]::before,
1215
+ .close[data-v-0fd6654c]::after {
1216
1216
  content: "";
1217
1217
  grid-area: 1 / 1;
1218
1218
  inline-size: 0.875rem;
@@ -1221,37 +1221,58 @@ header[data-v-d43d3a22] {
1221
1221
  background: currentColor;
1222
1222
  transform: rotate(45deg);
1223
1223
  }
1224
- .close[data-v-d43d3a22]::after {
1224
+ .close[data-v-0fd6654c]::after {
1225
1225
  transform: rotate(-45deg);
1226
1226
  }
1227
- .close[data-v-d43d3a22]:hover {
1227
+ .close[data-v-0fd6654c]:hover {
1228
1228
  background: var(--ui-surface-muted);
1229
1229
  color: var(--ui-text-primary);
1230
1230
  }
1231
- .close[data-v-d43d3a22]:focus-visible {
1231
+ .close[data-v-0fd6654c]:focus-visible {
1232
1232
  outline: 2px solid var(--ui-focus-ring);
1233
1233
  outline-offset: 2px;
1234
1234
  }
1235
1235
 
1236
1236
  /* A touch target, like Button on coarse pointers. */
1237
1237
  @media (pointer: coarse) {
1238
- .close[data-v-d43d3a22] {
1238
+ .close[data-v-0fd6654c] {
1239
1239
  inline-size: var(--ui-control-min-block-size);
1240
1240
  block-size: var(--ui-control-min-block-size);
1241
1241
  }
1242
1242
  }
1243
- html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v-d43d3a22] {
1243
+ html[data-ui-input-modality="touch"] [data-component~="ui-dialog"] .close[data-v-0fd6654c] {
1244
1244
  inline-size: var(--ui-control-min-block-size);
1245
1245
  block-size: var(--ui-control-min-block-size);
1246
1246
  }
1247
- .body[data-v-d43d3a22] {
1247
+ .body[data-v-0fd6654c] {
1248
1248
  flex: 1 1 auto;
1249
1249
  min-block-size: 0;
1250
1250
  overflow: auto;
1251
1251
  overscroll-behavior: contain;
1252
1252
  padding: var(--ui-space-5);
1253
- }
1254
- footer[data-v-d43d3a22] {
1253
+ /* Each edge that hides content fades: the scroll fade every Looma scroller uses (see ui-scroll-area). */
1254
+ --_ui-scroll-fade-direction: to bottom;
1255
+ --_ui-scroll-fade-size: var(--ui-scroll-fade-size, 24px);
1256
+ mask-image: linear-gradient(
1257
+ var(--_ui-scroll-fade-direction),
1258
+ transparent,
1259
+ #000 var(--_ui-scroll-fade-start),
1260
+ #000 calc(100% - var(--_ui-scroll-fade-end)),
1261
+ transparent
1262
+ );
1263
+ animation:
1264
+ ui-scroll-fade-start linear,
1265
+ ui-scroll-fade-start-hold linear,
1266
+ ui-scroll-fade-end-hold linear,
1267
+ ui-scroll-fade-end linear;
1268
+ animation-timeline: scroll(self block);
1269
+ animation-range:
1270
+ 0 var(--_ui-scroll-fade-size),
1271
+ var(--_ui-scroll-fade-size) calc(100% + 1px),
1272
+ -1px calc(100% - var(--_ui-scroll-fade-size)),
1273
+ calc(100% - var(--_ui-scroll-fade-size)) 100%;
1274
+ }
1275
+ footer[data-v-0fd6654c] {
1255
1276
  display: flex;
1256
1277
  flex: none;
1257
1278
  flex-wrap: wrap;
@@ -1260,28 +1281,28 @@ footer[data-v-d43d3a22] {
1260
1281
  padding: var(--ui-space-3) var(--ui-space-5);
1261
1282
  border-block-start: 1px solid var(--ui-border-default);
1262
1283
  }
1263
- footer[data-v-d43d3a22]:empty {
1284
+ footer[data-v-0fd6654c]:empty {
1264
1285
  display: none;
1265
1286
  }
1266
- @keyframes ui-dialog-enter-d43d3a22 {
1287
+ @keyframes ui-dialog-enter-0fd6654c {
1267
1288
  from {
1268
1289
  opacity: 0;
1269
1290
  transform: scale(0.96);
1270
1291
  }
1271
1292
  }
1272
- [data-component~="ui-dialog"][data-v-d43d3a22]::backdrop {
1293
+ [data-component~="ui-dialog"][data-v-0fd6654c]::backdrop {
1273
1294
  background-color: transparent;
1274
1295
  transition:
1275
1296
  background-color var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease),
1276
1297
  display var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete,
1277
1298
  overlay var(--ui-dialog-duration, var(--ui-motion-base)) var(--ui-motion-ease) allow-discrete;
1278
1299
  }
1279
- [data-component~="ui-dialog"][open][data-v-d43d3a22]::backdrop {
1300
+ [data-component~="ui-dialog"][open][data-v-0fd6654c]::backdrop {
1280
1301
  background-color: var(--ui-overlay-backdrop);
1281
- animation: ui-dialog-backdrop-enter-d43d3a22 var(--ui-dialog-duration, var(--ui-motion-base))
1302
+ animation: ui-dialog-backdrop-enter-0fd6654c var(--ui-dialog-duration, var(--ui-motion-base))
1282
1303
  var(--ui-motion-ease);
1283
1304
  }
1284
- @keyframes ui-dialog-backdrop-enter-d43d3a22 {
1305
+ @keyframes ui-dialog-backdrop-enter-0fd6654c {
1285
1306
  from {
1286
1307
  background-color: transparent;
1287
1308
  }
@@ -1549,10 +1570,10 @@ from {
1549
1570
  display: none;
1550
1571
  }
1551
1572
 
1552
- [data-component~="ui-editor-mention-menu"][data-v-9c76e661] {
1573
+ [data-component~="ui-editor-mention-menu"][data-v-a6db8e19] {
1553
1574
  user-select: none;
1554
1575
  }
1555
- [data-component~="ui-editor-mention-menu"][data-v-9c76e661] {
1576
+ [data-component~="ui-editor-mention-menu"][data-v-a6db8e19] {
1556
1577
  display: flex;
1557
1578
  overflow: hidden;
1558
1579
  flex-direction: column;
@@ -1561,7 +1582,7 @@ from {
1561
1582
  border-radius: var(--ui-radius-dialog);
1562
1583
  box-shadow: var(--ui-shadow-lg, 0 8px 24px rgb(0 0 0 / 0.12));
1563
1584
  }
1564
- .header[data-v-9c76e661] {
1585
+ .header[data-v-a6db8e19] {
1565
1586
  display: flex;
1566
1587
  align-items: center;
1567
1588
  justify-content: space-between;
@@ -1572,22 +1593,43 @@ from {
1572
1593
  font-size: var(--ui-font-size-xs);
1573
1594
  font-weight: var(--ui-font-semibold);
1574
1595
  }
1575
- .hint[data-v-9c76e661] {
1596
+ .hint[data-v-a6db8e19] {
1576
1597
  overflow: hidden;
1577
1598
  color: var(--ui-text-muted);
1578
1599
  font-weight: var(--ui-font-normal);
1579
1600
  text-overflow: ellipsis;
1580
1601
  white-space: nowrap;
1581
1602
  }
1582
- .list[data-v-9c76e661] {
1603
+ .list[data-v-a6db8e19] {
1583
1604
  max-height: 280px;
1584
1605
  padding: var(--ui-space-1) 0;
1585
1606
  margin: 0;
1586
1607
  overflow-y: auto;
1587
1608
  overscroll-behavior: contain;
1588
1609
  list-style: none;
1589
- }
1590
- .item[data-v-9c76e661] {
1610
+ /* Each edge that hides content fades: the scroll fade every Looma scroller uses (see ui-scroll-area). */
1611
+ --_ui-scroll-fade-direction: to bottom;
1612
+ --_ui-scroll-fade-size: var(--ui-scroll-fade-size, 24px);
1613
+ mask-image: linear-gradient(
1614
+ var(--_ui-scroll-fade-direction),
1615
+ transparent,
1616
+ #000 var(--_ui-scroll-fade-start),
1617
+ #000 calc(100% - var(--_ui-scroll-fade-end)),
1618
+ transparent
1619
+ );
1620
+ animation:
1621
+ ui-scroll-fade-start linear,
1622
+ ui-scroll-fade-start-hold linear,
1623
+ ui-scroll-fade-end-hold linear,
1624
+ ui-scroll-fade-end linear;
1625
+ animation-timeline: scroll(self block);
1626
+ animation-range:
1627
+ 0 var(--_ui-scroll-fade-size),
1628
+ var(--_ui-scroll-fade-size) calc(100% + 1px),
1629
+ -1px calc(100% - var(--_ui-scroll-fade-size)),
1630
+ calc(100% - var(--_ui-scroll-fade-size)) 100%;
1631
+ }
1632
+ .item[data-v-a6db8e19] {
1591
1633
  display: flex;
1592
1634
  align-items: center;
1593
1635
  min-height: 44px;
@@ -1595,10 +1637,10 @@ from {
1595
1637
  gap: var(--ui-space-3);
1596
1638
  cursor: pointer;
1597
1639
  }
1598
- .item.active[data-v-9c76e661] {
1640
+ .item.active[data-v-a6db8e19] {
1599
1641
  background: var(--ui-accent-subtle, rgb(59 130 246 / 0.1));
1600
1642
  }
1601
- .avatar[data-v-9c76e661] {
1643
+ .avatar[data-v-a6db8e19] {
1602
1644
  display: inline-flex;
1603
1645
  align-items: center;
1604
1646
  justify-content: center;
@@ -1611,41 +1653,41 @@ from {
1611
1653
  font-size: var(--ui-font-size-xs);
1612
1654
  font-weight: var(--ui-font-semibold);
1613
1655
  }
1614
- .body[data-v-9c76e661] {
1656
+ .body[data-v-a6db8e19] {
1615
1657
  display: flex;
1616
1658
  min-width: 0;
1617
1659
  flex-direction: column;
1618
1660
  }
1619
- .label[data-v-9c76e661],
1620
- .detail[data-v-9c76e661] {
1661
+ .label[data-v-a6db8e19],
1662
+ .detail[data-v-a6db8e19] {
1621
1663
  overflow: hidden;
1622
1664
  text-overflow: ellipsis;
1623
1665
  white-space: nowrap;
1624
1666
  }
1625
- .label[data-v-9c76e661] {
1667
+ .label[data-v-a6db8e19] {
1626
1668
  color: var(--ui-text-primary);
1627
1669
  font-size: var(--ui-font-size-sm);
1628
1670
  font-weight: var(--ui-font-medium);
1629
1671
  }
1630
- .detail[data-v-9c76e661],
1631
- .loading[data-v-9c76e661] {
1672
+ .detail[data-v-a6db8e19],
1673
+ .loading[data-v-a6db8e19] {
1632
1674
  color: var(--ui-text-muted);
1633
1675
  font-size: var(--ui-font-size-xs);
1634
1676
  }
1635
- .loading[data-v-9c76e661] {
1677
+ .loading[data-v-a6db8e19] {
1636
1678
  min-height: 44px;
1637
1679
  padding: var(--ui-space-3);
1638
1680
  }
1639
1681
  @media (max-width: 767px) {
1640
- [data-component~="ui-editor-mention-menu"][data-v-9c76e661] {
1682
+ [data-component~="ui-editor-mention-menu"][data-v-a6db8e19] {
1641
1683
  border-bottom: 0;
1642
1684
  border-radius: var(--ui-radius-dialog) var(--ui-radius-dialog) 0 0;
1643
1685
  }
1644
- .list[data-v-9c76e661] {
1686
+ .list[data-v-a6db8e19] {
1645
1687
  max-height: calc(60dvh - 48px);
1646
1688
  }
1647
1689
  }
1648
- [data-component~="ui-editor-mention-menu"][hidden][data-v-9c76e661] {
1690
+ [data-component~="ui-editor-mention-menu"][hidden][data-v-a6db8e19] {
1649
1691
  display: none;
1650
1692
  }
1651
1693
 
@@ -1666,10 +1708,10 @@ svg[data-v-3d48bd86] {
1666
1708
  display: none;
1667
1709
  }
1668
1710
 
1669
- [data-component~="ui-editor-slash-menu"][data-v-afcbaee6] {
1711
+ [data-component~="ui-editor-slash-menu"][data-v-dcc1f07d] {
1670
1712
  user-select: none;
1671
1713
  }
1672
- [data-component~="ui-editor-slash-menu"][data-v-afcbaee6] {
1714
+ [data-component~="ui-editor-slash-menu"][data-v-dcc1f07d] {
1673
1715
  background: var(--ui-surface);
1674
1716
  border: 1px solid var(--ui-border);
1675
1717
  border-radius: var(--ui-radius-dialog);
@@ -1679,12 +1721,12 @@ svg[data-v-3d48bd86] {
1679
1721
  flex-direction: column;
1680
1722
  }
1681
1723
  @media (max-width: 767px) {
1682
- [data-component~="ui-editor-slash-menu"][data-v-afcbaee6] {
1724
+ [data-component~="ui-editor-slash-menu"][data-v-dcc1f07d] {
1683
1725
  border-radius: var(--ui-radius-dialog) var(--ui-radius-dialog) 0 0;
1684
1726
  border-bottom: none;
1685
1727
  }
1686
1728
  }
1687
- .header[data-v-afcbaee6] {
1729
+ .header[data-v-dcc1f07d] {
1688
1730
  display: none;
1689
1731
  align-items: center;
1690
1732
  gap: var(--ui-space-2);
@@ -1697,11 +1739,11 @@ svg[data-v-3d48bd86] {
1697
1739
  letter-spacing: 0.05em;
1698
1740
  }
1699
1741
  @media (max-width: 767px) {
1700
- .header[data-v-afcbaee6] {
1742
+ .header[data-v-dcc1f07d] {
1701
1743
  display: flex;
1702
1744
  }
1703
1745
  }
1704
- .header-query[data-v-afcbaee6] {
1746
+ .header-query[data-v-dcc1f07d] {
1705
1747
  background: var(--ui-surface-hover);
1706
1748
  border-radius: var(--ui-radius-sm);
1707
1749
  padding: 0.1em 0.4em;
@@ -1711,21 +1753,42 @@ svg[data-v-3d48bd86] {
1711
1753
  text-transform: none;
1712
1754
  letter-spacing: 0;
1713
1755
  }
1714
- .list[data-v-afcbaee6] {
1756
+ .list[data-v-dcc1f07d] {
1715
1757
  list-style: none;
1716
1758
  margin: 0;
1717
1759
  padding: var(--ui-space-1) 0;
1718
1760
  overflow-y: auto;
1719
1761
  max-height: 280px;
1720
1762
  overscroll-behavior: contain;
1763
+ /* Each edge that hides content fades: the scroll fade every Looma scroller uses (see ui-scroll-area). */
1764
+ --_ui-scroll-fade-direction: to bottom;
1765
+ --_ui-scroll-fade-size: var(--ui-scroll-fade-size, 24px);
1766
+ mask-image: linear-gradient(
1767
+ var(--_ui-scroll-fade-direction),
1768
+ transparent,
1769
+ #000 var(--_ui-scroll-fade-start),
1770
+ #000 calc(100% - var(--_ui-scroll-fade-end)),
1771
+ transparent
1772
+ );
1773
+ animation:
1774
+ ui-scroll-fade-start linear,
1775
+ ui-scroll-fade-start-hold linear,
1776
+ ui-scroll-fade-end-hold linear,
1777
+ ui-scroll-fade-end linear;
1778
+ animation-timeline: scroll(self block);
1779
+ animation-range:
1780
+ 0 var(--_ui-scroll-fade-size),
1781
+ var(--_ui-scroll-fade-size) calc(100% + 1px),
1782
+ -1px calc(100% - var(--_ui-scroll-fade-size)),
1783
+ calc(100% - var(--_ui-scroll-fade-size)) 100%;
1721
1784
  }
1722
1785
  @media (max-width: 767px) {
1723
- .list[data-v-afcbaee6] {
1786
+ .list[data-v-dcc1f07d] {
1724
1787
  max-height: calc(60dvh - 80px);
1725
1788
  padding: var(--ui-space-1) 0 var(--ui-space-2);
1726
1789
  }
1727
1790
  }
1728
- .item[data-v-afcbaee6] {
1791
+ .item[data-v-dcc1f07d] {
1729
1792
  display: flex;
1730
1793
  align-items: center;
1731
1794
  gap: var(--ui-space-3);
@@ -1734,10 +1797,10 @@ svg[data-v-3d48bd86] {
1734
1797
  cursor: pointer;
1735
1798
  transition: background-color 120ms ease;
1736
1799
  }
1737
- .item.active[data-v-afcbaee6] {
1800
+ .item.active[data-v-dcc1f07d] {
1738
1801
  background: var(--ui-accent-subtle, rgb(59 130 246 / 0.1));
1739
1802
  }
1740
- .icon[data-v-afcbaee6] {
1803
+ .icon[data-v-dcc1f07d] {
1741
1804
  display: flex;
1742
1805
  align-items: center;
1743
1806
  justify-content: center;
@@ -1753,22 +1816,22 @@ svg[data-v-3d48bd86] {
1753
1816
  flex-shrink: 0;
1754
1817
  line-height: 1;
1755
1818
  }
1756
- .item.active .icon[data-v-afcbaee6] {
1819
+ .item.active .icon[data-v-dcc1f07d] {
1757
1820
  background: var(--ui-accent);
1758
1821
  border-color: var(--ui-accent);
1759
1822
  color: var(--ui-accent-contrast);
1760
1823
  }
1761
- .icon[data-v-afcbaee6] {
1824
+ .icon[data-v-dcc1f07d] {
1762
1825
  --ui-icon-size: 1rem;
1763
1826
  --ui-icon-stroke-width: var(--ui-editor-toolbar-icon-stroke-width, 1.75);
1764
1827
  }
1765
- .body[data-v-afcbaee6] {
1828
+ .body[data-v-dcc1f07d] {
1766
1829
  display: flex;
1767
1830
  min-width: 0;
1768
1831
  flex-direction: column;
1769
1832
  gap: 1px;
1770
1833
  }
1771
- .title[data-v-afcbaee6] {
1834
+ .title[data-v-dcc1f07d] {
1772
1835
  font-size: var(--ui-font-size-sm);
1773
1836
  font-weight: var(--ui-font-medium);
1774
1837
  color: var(--ui-text);
@@ -1776,14 +1839,14 @@ svg[data-v-3d48bd86] {
1776
1839
  overflow: hidden;
1777
1840
  text-overflow: ellipsis;
1778
1841
  }
1779
- .description[data-v-afcbaee6] {
1842
+ .description[data-v-dcc1f07d] {
1780
1843
  font-size: var(--ui-font-size-xs);
1781
1844
  color: var(--ui-text-muted);
1782
1845
  white-space: nowrap;
1783
1846
  overflow: hidden;
1784
1847
  text-overflow: ellipsis;
1785
1848
  }
1786
- .footer[data-v-afcbaee6] {
1849
+ .footer[data-v-dcc1f07d] {
1787
1850
  display: none;
1788
1851
  padding: var(--ui-space-2) var(--ui-space-3);
1789
1852
  border-top: 1px solid var(--ui-border);
@@ -1791,11 +1854,11 @@ svg[data-v-3d48bd86] {
1791
1854
  color: var(--ui-text-muted);
1792
1855
  }
1793
1856
  @media (min-width: 768px) {
1794
- .footer[data-v-afcbaee6] {
1857
+ .footer[data-v-dcc1f07d] {
1795
1858
  display: block;
1796
1859
  }
1797
1860
  }
1798
- [data-component~="ui-editor-slash-menu"] kbd[data-v-afcbaee6] {
1861
+ [data-component~="ui-editor-slash-menu"] kbd[data-v-dcc1f07d] {
1799
1862
  display: inline-flex;
1800
1863
  align-items: center;
1801
1864
  justify-content: center;
@@ -1807,7 +1870,7 @@ svg[data-v-3d48bd86] {
1807
1870
  padding: 0 3px;
1808
1871
  color: var(--ui-text-secondary);
1809
1872
  }
1810
- [data-component~="ui-editor-slash-menu"][hidden][data-v-afcbaee6] {
1873
+ [data-component~="ui-editor-slash-menu"][hidden][data-v-dcc1f07d] {
1811
1874
  display: none;
1812
1875
  }
1813
1876
 
@@ -2349,10 +2412,7 @@ svg[data-v-3d48bd86] {
2349
2412
  display: none;
2350
2413
  }
2351
2414
 
2352
- [data-component~="ui-editor-toolbar"][data-v-8f7cefb2] {
2353
- /* The colour the edge fades blend into: whatever the toolbar is painted with. */
2354
- --_matte: var(--ui-editor-toolbar-surface, var(--ui-surface));
2355
-
2415
+ [data-component~="ui-editor-toolbar"][data-v-3076bb8c] {
2356
2416
  position: sticky;
2357
2417
  top: 0;
2358
2418
  z-index: var(--ui-editor-toolbar-z-index, 10);
@@ -2367,7 +2427,7 @@ svg[data-v-3d48bd86] {
2367
2427
 
2368
2428
  /* One row, always. When the controls outgrow the space, the row scrolls sideways rather than
2369
2429
  wrapping into several lines, and a fade at each edge that has more to show says so. */
2370
- .strip[data-v-8f7cefb2] {
2430
+ .strip[data-v-3076bb8c] {
2371
2431
  display: flex;
2372
2432
  flex: 1 1 auto;
2373
2433
  align-items: center;
@@ -2379,52 +2439,48 @@ svg[data-v-3d48bd86] {
2379
2439
  overscroll-behavior-inline: contain;
2380
2440
  scrollbar-width: none;
2381
2441
  }
2382
- .strip[data-v-8f7cefb2]::-webkit-scrollbar {
2442
+ .strip[data-v-3076bb8c]::-webkit-scrollbar {
2383
2443
  display: none;
2384
2444
  }
2385
- .strip > [data-v-8f7cefb2-s] {
2445
+ .strip > [data-v-3076bb8c-s] {
2386
2446
  flex: 0 0 auto;
2387
2447
  }
2388
2448
 
2389
- /* The fades are mattes laid over the strip in the toolbar's own colour, not a mask, so a floating
2390
- toolbar's border and shadow stay whole. Each appears only while that edge hides controls. */
2391
- [data-component~="ui-editor-toolbar"][data-v-8f7cefb2]::before,
2392
- [data-component~="ui-editor-toolbar"][data-v-8f7cefb2]::after {
2393
- position: absolute;
2394
- z-index: 1;
2395
- inset-block: 0;
2396
- inline-size: var(--ui-editor-toolbar-fade-size, 32px);
2397
- content: "";
2398
- opacity: 0;
2399
- pointer-events: none;
2400
- transition: opacity var(--ui-motion-fast, 120ms) var(--ui-motion-ease, ease);
2401
- }
2402
- [data-component~="ui-editor-toolbar"][data-v-8f7cefb2]::before {
2403
- inset-inline-start: 0;
2404
- background: linear-gradient(to right, var(--_matte), transparent);
2405
- }
2406
- [data-component~="ui-editor-toolbar"][data-v-8f7cefb2]::after {
2407
- inset-inline-end: 0;
2408
- background: linear-gradient(to left, var(--_matte), transparent);
2409
- }
2410
- [data-component~="ui-editor-toolbar"][data-v-8f7cefb2]:dir(rtl)::before {
2411
- background: linear-gradient(to left, var(--_matte), transparent);
2412
- }
2413
- [data-component~="ui-editor-toolbar"][data-v-8f7cefb2]:dir(rtl)::after {
2414
- background: linear-gradient(to right, var(--_matte), transparent);
2415
- }
2416
- [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="overflowStart"][data-v-8f7cefb2]::before,
2417
- [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="overflowEnd"][data-v-8f7cefb2]::after {
2418
- opacity: 1;
2419
- }
2420
- .divider[data-v-8f7cefb2-s] {
2449
+ /* The edge fades are the scroll fade every Looma scroller uses (see ui-scroll-area), a mask on the
2450
+ strip, so a floating toolbar's border and shadow stay whole. */
2451
+ .strip[data-v-3076bb8c] {
2452
+ --_ui-scroll-fade-direction: to right;
2453
+ --_ui-scroll-fade-size: var(--ui-editor-toolbar-fade-size, var(--ui-scroll-fade-size, 24px));
2454
+ mask-image: linear-gradient(
2455
+ var(--_ui-scroll-fade-direction),
2456
+ transparent,
2457
+ #000 var(--_ui-scroll-fade-start),
2458
+ #000 calc(100% - var(--_ui-scroll-fade-end)),
2459
+ transparent
2460
+ );
2461
+ animation:
2462
+ ui-scroll-fade-start linear,
2463
+ ui-scroll-fade-start-hold linear,
2464
+ ui-scroll-fade-end-hold linear,
2465
+ ui-scroll-fade-end linear;
2466
+ animation-timeline: scroll(self inline);
2467
+ animation-range:
2468
+ 0 var(--_ui-scroll-fade-size),
2469
+ var(--_ui-scroll-fade-size) calc(100% + 1px),
2470
+ -1px calc(100% - var(--_ui-scroll-fade-size)),
2471
+ calc(100% - var(--_ui-scroll-fade-size)) 100%;
2472
+ }
2473
+ [data-component~="ui-editor-toolbar"]:dir(rtl) .strip[data-v-3076bb8c] {
2474
+ --_ui-scroll-fade-direction: to left;
2475
+ }
2476
+ .divider[data-v-3076bb8c-s] {
2421
2477
  width: 1px;
2422
2478
  height: 20px;
2423
2479
  background: var(--ui-editor-toolbar-divider, var(--ui-border));
2424
2480
  flex-shrink: 0;
2425
2481
  margin: 0 var(--ui-editor-toolbar-divider-margin, 4px);
2426
2482
  }
2427
- [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-8f7cefb2] {
2483
+ [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-3076bb8c] {
2428
2484
  position: relative;
2429
2485
  top: auto;
2430
2486
  width: max-content;
@@ -2445,7 +2501,7 @@ svg[data-v-3d48bd86] {
2445
2501
  backdrop-filter: blur(10px);
2446
2502
  }
2447
2503
  @media (max-width: 767px) {
2448
- [data-component~="ui-editor-toolbar"][data-v-8f7cefb2] {
2504
+ [data-component~="ui-editor-toolbar"][data-v-3076bb8c] {
2449
2505
  position: fixed;
2450
2506
  top: auto;
2451
2507
  bottom: env(safe-area-inset-bottom);
@@ -2456,7 +2512,7 @@ svg[data-v-3d48bd86] {
2456
2512
  border-bottom: none;
2457
2513
  box-shadow: var(--ui-editor-toolbar-mobile-shadow, 0 -2px 8px rgb(0 0 0 / 0.06));
2458
2514
  }
2459
- [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-8f7cefb2] {
2515
+ [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-3076bb8c] {
2460
2516
  position: relative;
2461
2517
  inset: auto;
2462
2518
  min-height: auto;
@@ -2470,9 +2526,7 @@ svg[data-v-3d48bd86] {
2470
2526
  }
2471
2527
 
2472
2528
  /* Inside LoomaEditor's sticky shell, the shell is the sticky surface. */
2473
- .looma-editor__sticky-toolbar-shell [data-component~="ui-editor-toolbar"][data-v-8f7cefb2] {
2474
- --_matte: var(--ui-editor-toolbar-surface, var(--ui-surface));
2475
-
2529
+ .looma-editor__sticky-toolbar-shell [data-component~="ui-editor-toolbar"][data-v-3076bb8c] {
2476
2530
  position: relative;
2477
2531
  min-height: var(--ui-editor-toolbar-min-height, 48px);
2478
2532
  background: transparent;
@@ -2482,7 +2536,7 @@ svg[data-v-3d48bd86] {
2482
2536
 
2483
2537
  /* Inside LoomaEditor's mobile shell, the toolbar is a scroll-snapping strip. */
2484
2538
  .looma-editor__mobile-toolbar-shell
2485
- [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-8f7cefb2] {
2539
+ [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"][data-v-3076bb8c] {
2486
2540
  width: 100%;
2487
2541
  max-width: none;
2488
2542
  min-height: 100%;
@@ -2495,12 +2549,12 @@ svg[data-v-3d48bd86] {
2495
2549
  }
2496
2550
  .looma-editor__mobile-toolbar-shell
2497
2551
  [data-component~="ui-editor-toolbar"][data-ui-editor-toolbar-state~="floating"]
2498
- .strip[data-v-8f7cefb2] {
2552
+ .strip[data-v-3076bb8c] {
2499
2553
  scroll-snap-type: x mandatory;
2500
2554
  }
2501
2555
 
2502
2556
  /* A component that sets its display still honours the hidden attribute on its root. */
2503
- [data-component~="ui-editor-toolbar"][hidden][data-v-8f7cefb2] {
2557
+ [data-component~="ui-editor-toolbar"][hidden][data-v-3076bb8c] {
2504
2558
  display: none;
2505
2559
  }
2506
2560
 
@@ -3134,7 +3188,7 @@ legend[data-v-b97195d1] + * {
3134
3188
  display: none;
3135
3189
  }
3136
3190
 
3137
- [data-component~="ui-reel"][data-v-b373e396] {
3191
+ [data-component~="ui-reel"][data-v-eb18d6be] {
3138
3192
  --_reel-gap: var(--ui-space-4);
3139
3193
  --_reel-item-width: auto;
3140
3194
  display: flex;
@@ -3147,46 +3201,122 @@ legend[data-v-b97195d1] + * {
3147
3201
  overflow-y: hidden;
3148
3202
  overscroll-behavior-inline: contain;
3149
3203
  }
3150
- [data-component~="ui-reel"] > [data-v-b373e396-s] {
3204
+
3205
+ /* Each end that hides items fades: the scroll fade every Looma scroller uses (see ui-scroll-area). */
3206
+ [data-component~="ui-reel"][data-v-eb18d6be] {
3207
+ --_ui-scroll-fade-direction: to right;
3208
+ --_ui-scroll-fade-size: var(--ui-scroll-fade-size, 24px);
3209
+ mask-image: linear-gradient(
3210
+ var(--_ui-scroll-fade-direction),
3211
+ transparent,
3212
+ #000 var(--_ui-scroll-fade-start),
3213
+ #000 calc(100% - var(--_ui-scroll-fade-end)),
3214
+ transparent
3215
+ );
3216
+ animation:
3217
+ ui-scroll-fade-start linear,
3218
+ ui-scroll-fade-start-hold linear,
3219
+ ui-scroll-fade-end-hold linear,
3220
+ ui-scroll-fade-end linear;
3221
+ animation-timeline: scroll(self inline);
3222
+ animation-range:
3223
+ 0 var(--_ui-scroll-fade-size),
3224
+ var(--_ui-scroll-fade-size) calc(100% + 1px),
3225
+ -1px calc(100% - var(--_ui-scroll-fade-size)),
3226
+ calc(100% - var(--_ui-scroll-fade-size)) 100%;
3227
+ }
3228
+ [data-component~="ui-reel"][data-v-eb18d6be]:dir(rtl) {
3229
+ --_ui-scroll-fade-direction: to left;
3230
+ }
3231
+ [data-component~="ui-reel"] > [data-v-eb18d6be-s] {
3151
3232
  min-inline-size: 0;
3152
3233
  flex: 0 0 var(--ui-reel-item-width, var(--_reel-item-width));
3153
3234
  }
3154
- [data-component~="ui-reel"][data-ui-reel-state~="gap=xs"][data-v-b373e396] {
3235
+ [data-component~="ui-reel"][data-ui-reel-state~="gap=xs"][data-v-eb18d6be] {
3155
3236
  --_reel-gap: var(--ui-space-2);
3156
3237
  }
3157
- [data-component~="ui-reel"][data-ui-reel-state~="gap=s"][data-v-b373e396] {
3238
+ [data-component~="ui-reel"][data-ui-reel-state~="gap=s"][data-v-eb18d6be] {
3158
3239
  --_reel-gap: var(--ui-space-3);
3159
3240
  }
3160
- [data-component~="ui-reel"][data-ui-reel-state~="gap=m"][data-v-b373e396] {
3241
+ [data-component~="ui-reel"][data-ui-reel-state~="gap=m"][data-v-eb18d6be] {
3161
3242
  --_reel-gap: var(--ui-space-4);
3162
3243
  }
3163
- [data-component~="ui-reel"][data-ui-reel-state~="gap=l"][data-v-b373e396] {
3244
+ [data-component~="ui-reel"][data-ui-reel-state~="gap=l"][data-v-eb18d6be] {
3164
3245
  --_reel-gap: var(--ui-space-5);
3165
3246
  }
3166
- [data-component~="ui-reel"][data-ui-reel-state~="gap=xl"][data-v-b373e396] {
3247
+ [data-component~="ui-reel"][data-ui-reel-state~="gap=xl"][data-v-eb18d6be] {
3167
3248
  --_reel-gap: var(--ui-space-6);
3168
3249
  }
3169
- [data-component~="ui-reel"][data-ui-reel-state~="itemWidth=sm"][data-v-b373e396] {
3250
+ [data-component~="ui-reel"][data-ui-reel-state~="itemWidth=sm"][data-v-eb18d6be] {
3170
3251
  --_reel-item-width: 12rem;
3171
3252
  }
3172
- [data-component~="ui-reel"][data-ui-reel-state~="itemWidth=md"][data-v-b373e396] {
3253
+ [data-component~="ui-reel"][data-ui-reel-state~="itemWidth=md"][data-v-eb18d6be] {
3173
3254
  --_reel-item-width: 16rem;
3174
3255
  }
3175
- [data-component~="ui-reel"][data-ui-reel-state~="itemWidth=lg"][data-v-b373e396] {
3256
+ [data-component~="ui-reel"][data-ui-reel-state~="itemWidth=lg"][data-v-eb18d6be] {
3176
3257
  --_reel-item-width: 20rem;
3177
3258
  }
3178
- [data-component~="ui-reel"][data-ui-reel-state~="snap"][data-v-b373e396] {
3259
+ [data-component~="ui-reel"][data-ui-reel-state~="snap"][data-v-eb18d6be] {
3179
3260
  scroll-snap-type: inline mandatory;
3180
3261
  }
3181
- [data-component~="ui-reel"][data-ui-reel-state~="snap=start"] > [data-v-b373e396-s] {
3262
+ [data-component~="ui-reel"][data-ui-reel-state~="snap=start"] > [data-v-eb18d6be-s] {
3182
3263
  scroll-snap-align: start;
3183
3264
  }
3184
- [data-component~="ui-reel"][data-ui-reel-state~="snap=center"] > [data-v-b373e396-s] {
3265
+ [data-component~="ui-reel"][data-ui-reel-state~="snap=center"] > [data-v-eb18d6be-s] {
3185
3266
  scroll-snap-align: center;
3186
3267
  }
3187
3268
 
3188
3269
  /* A component that sets its display still honours the hidden attribute on its root. */
3189
- [data-component~="ui-reel"][hidden][data-v-b373e396] {
3270
+ [data-component~="ui-reel"][hidden][data-v-eb18d6be] {
3271
+ display: none;
3272
+ }
3273
+
3274
+ /* A region that scrolls when its content outgrows it. Each edge that hides content fades, growing
3275
+ in as the content leaves that edge (the scroll fade in tokens.css), so the reader can tell there
3276
+ is more; an edge with nothing past it stays crisp, and content that fits shows no fade. The
3277
+ fade is a mask, so it blends into whatever is behind the area without knowing its colour. */
3278
+ [data-component~="ui-scroll-area"][data-v-858d7508] {
3279
+ display: block;
3280
+ box-sizing: border-box;
3281
+ min-block-size: 0;
3282
+ min-inline-size: 0;
3283
+ overflow-x: hidden;
3284
+ overflow-y: auto;
3285
+ overscroll-behavior: contain;
3286
+ --_ui-scroll-fade-direction: to bottom;
3287
+ --_ui-scroll-fade-inline: to right;
3288
+ --_ui-scroll-fade-size: var(--ui-scroll-fade-size, 24px);
3289
+ mask-image: linear-gradient(
3290
+ var(--_ui-scroll-fade-direction),
3291
+ transparent,
3292
+ #000 var(--_ui-scroll-fade-start),
3293
+ #000 calc(100% - var(--_ui-scroll-fade-end)),
3294
+ transparent
3295
+ );
3296
+ animation:
3297
+ ui-scroll-fade-start linear,
3298
+ ui-scroll-fade-start-hold linear,
3299
+ ui-scroll-fade-end-hold linear,
3300
+ ui-scroll-fade-end linear;
3301
+ animation-timeline: scroll(self block);
3302
+ animation-range:
3303
+ 0 var(--_ui-scroll-fade-size),
3304
+ var(--_ui-scroll-fade-size) calc(100% + 1px),
3305
+ -1px calc(100% - var(--_ui-scroll-fade-size)),
3306
+ calc(100% - var(--_ui-scroll-fade-size)) 100%;
3307
+ }
3308
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="orientation=horizontal"][data-v-858d7508] {
3309
+ overflow-x: auto;
3310
+ overflow-y: hidden;
3311
+ --_ui-scroll-fade-direction: var(--_ui-scroll-fade-inline);
3312
+ animation-timeline: scroll(self inline);
3313
+ }
3314
+ [data-component~="ui-scroll-area"][data-v-858d7508]:dir(rtl) {
3315
+ --_ui-scroll-fade-inline: to left;
3316
+ }
3317
+
3318
+ /* A component that sets its display still honours the hidden attribute on its root. */
3319
+ [data-component~="ui-scroll-area"][hidden][data-v-858d7508] {
3190
3320
  display: none;
3191
3321
  }
3192
3322
 
@@ -3267,10 +3397,10 @@ legend[data-v-b97195d1] + * {
3267
3397
  display: none;
3268
3398
  }
3269
3399
 
3270
- [data-component~="ui-search-shell"][data-v-d749a869] {
3400
+ [data-component~="ui-search-shell"][data-v-2ba71171] {
3271
3401
  display: contents;
3272
3402
  }
3273
- dialog[data-v-d749a869] {
3403
+ dialog[data-v-2ba71171] {
3274
3404
  position: fixed;
3275
3405
  inset: 0;
3276
3406
  z-index: var(--ui-search-shell-z-index, 400);
@@ -3288,10 +3418,10 @@ dialog[data-v-d749a869] {
3288
3418
  background: var(--ui-overlay-backdrop);
3289
3419
  color: var(--ui-text-primary);
3290
3420
  }
3291
- dialog[data-v-d749a869]::backdrop {
3421
+ dialog[data-v-2ba71171]::backdrop {
3292
3422
  background: var(--ui-overlay-backdrop);
3293
3423
  }
3294
- .panel[data-v-d749a869] {
3424
+ .panel[data-v-2ba71171] {
3295
3425
  position: relative;
3296
3426
  display: flex;
3297
3427
  flex-direction: column;
@@ -3304,7 +3434,7 @@ dialog[data-v-d749a869]::backdrop {
3304
3434
  border-radius: var(--ui-search-shell-radius, var(--ui-radius-dialog));
3305
3435
  box-shadow: var(--ui-search-shell-shadow, var(--ui-elevation-dialog, var(--ui-shadow-xl)));
3306
3436
  }
3307
- .search[data-v-d749a869] {
3437
+ .search[data-v-2ba71171] {
3308
3438
  padding: var(--ui-space-3);
3309
3439
  border-block-end: 1px solid var(--ui-border-default);
3310
3440
  transition:
@@ -3313,11 +3443,11 @@ dialog[data-v-d749a869]::backdrop {
3313
3443
  }
3314
3444
 
3315
3445
  /* The search region shows where typing goes, whatever the author put in it. */
3316
- .search[data-v-d749a869]:focus-within {
3446
+ .search[data-v-2ba71171]:focus-within {
3317
3447
  border-block-end-color: var(--ui-search-shell-focus-color, var(--ui-control-focus));
3318
3448
  box-shadow: inset 0 -1px 0 var(--ui-search-shell-focus-color, var(--ui-control-focus));
3319
3449
  }
3320
- input[slot="search"][data-v-d749a869-s] {
3450
+ input[slot="search"][data-v-2ba71171-s] {
3321
3451
  box-sizing: border-box;
3322
3452
  inline-size: 100%;
3323
3453
  min-block-size: var(--ui-control-min-block-size);
@@ -3329,24 +3459,24 @@ input[slot="search"][data-v-d749a869-s] {
3329
3459
  font: inherit;
3330
3460
  box-shadow: var(--ui-shadow-xs);
3331
3461
  }
3332
- input[slot="search"][data-v-d749a869-s]:focus-visible {
3462
+ input[slot="search"][data-v-2ba71171-s]:focus-visible {
3333
3463
  border-color: var(--ui-control-focus);
3334
3464
  outline: 2px solid var(--ui-focus-ring);
3335
3465
  outline-offset: 2px;
3336
3466
  }
3337
- .status[data-v-d749a869],
3338
- .footer[data-v-d749a869] {
3467
+ .status[data-v-2ba71171],
3468
+ .footer[data-v-2ba71171] {
3339
3469
  flex-shrink: 0;
3340
3470
  padding: var(--ui-space-2) var(--ui-space-4);
3341
3471
  color: var(--ui-text-secondary);
3342
3472
  font-size: var(--ui-font-size-sm);
3343
3473
  }
3344
- .status[data-v-d749a869] {
3474
+ .status[data-v-2ba71171] {
3345
3475
  border-block-end: 1px solid var(--ui-border-default);
3346
3476
  }
3347
3477
 
3348
3478
  /* Laid out like the dialog's action row: actions right-aligned, spaced as buttons, no fill. */
3349
- .footer[data-v-d749a869] {
3479
+ .footer[data-v-2ba71171] {
3350
3480
  display: flex;
3351
3481
  flex-wrap: wrap;
3352
3482
  align-items: center;
@@ -3355,21 +3485,42 @@ input[slot="search"][data-v-d749a869-s]:focus-visible {
3355
3485
  padding: var(--ui-space-3) var(--ui-space-4);
3356
3486
  border-block-start: 1px solid var(--ui-border-default);
3357
3487
  }
3358
- .status[data-v-d749a869]:empty,
3359
- .footer[data-v-d749a869]:empty {
3488
+ .status[data-v-2ba71171]:empty,
3489
+ .footer[data-v-2ba71171]:empty {
3360
3490
  display: none;
3361
3491
  }
3362
- .body[data-v-d749a869] {
3492
+ .body[data-v-2ba71171] {
3363
3493
  flex: 1;
3364
3494
  min-block-size: 0;
3365
3495
  overflow: auto;
3366
3496
  padding: var(--ui-space-2);
3497
+ /* Each edge that hides content fades: the scroll fade every Looma scroller uses (see ui-scroll-area). */
3498
+ --_ui-scroll-fade-direction: to bottom;
3499
+ --_ui-scroll-fade-size: var(--ui-scroll-fade-size, 24px);
3500
+ mask-image: linear-gradient(
3501
+ var(--_ui-scroll-fade-direction),
3502
+ transparent,
3503
+ #000 var(--_ui-scroll-fade-start),
3504
+ #000 calc(100% - var(--_ui-scroll-fade-end)),
3505
+ transparent
3506
+ );
3507
+ animation:
3508
+ ui-scroll-fade-start linear,
3509
+ ui-scroll-fade-start-hold linear,
3510
+ ui-scroll-fade-end-hold linear,
3511
+ ui-scroll-fade-end linear;
3512
+ animation-timeline: scroll(self block);
3513
+ animation-range:
3514
+ 0 var(--_ui-scroll-fade-size),
3515
+ var(--_ui-scroll-fade-size) calc(100% + 1px),
3516
+ -1px calc(100% - var(--_ui-scroll-fade-size)),
3517
+ calc(100% - var(--_ui-scroll-fade-size)) 100%;
3367
3518
  }
3368
3519
  @media (max-width: 47.9375rem) {
3369
- dialog[data-v-d749a869] {
3520
+ dialog[data-v-2ba71171] {
3370
3521
  padding: 0;
3371
3522
  }
3372
- .panel[data-v-d749a869] {
3523
+ .panel[data-v-2ba71171] {
3373
3524
  inline-size: 100%;
3374
3525
  min-block-size: 100dvh;
3375
3526
  max-block-size: none;
@@ -3379,7 +3530,7 @@ dialog[data-v-d749a869] {
3379
3530
  }
3380
3531
 
3381
3532
  /* A component that sets its display still honours the hidden attribute on its root. */
3382
- [data-component~="ui-search-shell"][hidden][data-v-d749a869] {
3533
+ [data-component~="ui-search-shell"][hidden][data-v-2ba71171] {
3383
3534
  display: none;
3384
3535
  }
3385
3536
 
@@ -3470,7 +3621,7 @@ hr[aria-orientation="vertical"][data-v-357ad177] {
3470
3621
  border-inline-start: 1px solid var(--ui-separator-color, var(--ui-border-default));
3471
3622
  }
3472
3623
 
3473
- [data-component~="ui-sidebar"][data-v-d5bc9278] {
3624
+ [data-component~="ui-sidebar"][data-v-20117052] {
3474
3625
  position: relative;
3475
3626
  box-sizing: border-box;
3476
3627
  display: flex;
@@ -3482,21 +3633,44 @@ hr[aria-orientation="vertical"][data-v-357ad177] {
3482
3633
  background: var(--ui-sidebar-surface, var(--ui-surface-default));
3483
3634
  border-inline-end: 1px solid var(--ui-sidebar-border, var(--ui-border-default));
3484
3635
  }
3485
- [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"][data-v-d5bc9278] {
3636
+ [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"][data-v-20117052] {
3486
3637
  border-inline-end: 0;
3487
3638
  border-inline-start: 1px solid var(--ui-sidebar-border, var(--ui-border-default));
3488
3639
  }
3489
- .content[data-v-d5bc9278] {
3640
+
3641
+ /* The panel's content scrolls, and each edge that hides content fades: the scroll fade every
3642
+ Looma scroller uses (see ui-scroll-area). */
3643
+ .content[data-v-20117052] {
3490
3644
  flex: 1;
3491
3645
  min-block-size: 0;
3492
3646
  overflow: auto;
3647
+ --_ui-scroll-fade-direction: to bottom;
3648
+ --_ui-scroll-fade-size: var(--ui-scroll-fade-size, 24px);
3649
+ mask-image: linear-gradient(
3650
+ var(--_ui-scroll-fade-direction),
3651
+ transparent,
3652
+ #000 var(--_ui-scroll-fade-start),
3653
+ #000 calc(100% - var(--_ui-scroll-fade-end)),
3654
+ transparent
3655
+ );
3656
+ animation:
3657
+ ui-scroll-fade-start linear,
3658
+ ui-scroll-fade-start-hold linear,
3659
+ ui-scroll-fade-end-hold linear,
3660
+ ui-scroll-fade-end linear;
3661
+ animation-timeline: scroll(self block);
3662
+ animation-range:
3663
+ 0 var(--_ui-scroll-fade-size),
3664
+ var(--_ui-scroll-fade-size) calc(100% + 1px),
3665
+ -1px calc(100% - var(--_ui-scroll-fade-size)),
3666
+ calc(100% - var(--_ui-scroll-fade-size)) 100%;
3493
3667
  }
3494
3668
 
3495
3669
  /* Collapsed while docked. */
3496
- [data-component~="ui-sidebar"][data-ui-sidebar-state~="internalCollapsed"][data-v-d5bc9278]:not([popover]) {
3670
+ [data-component~="ui-sidebar"][data-ui-sidebar-state~="internalCollapsed"][data-v-20117052]:not([popover]) {
3497
3671
  display: none;
3498
3672
  }
3499
- .resizer[data-v-d5bc9278] {
3673
+ .resizer[data-v-20117052] {
3500
3674
  position: absolute;
3501
3675
  z-index: 1;
3502
3676
  inset-block: 0;
@@ -3509,15 +3683,15 @@ hr[aria-orientation="vertical"][data-v-357ad177] {
3509
3683
  touch-action: none;
3510
3684
  outline: none;
3511
3685
  }
3512
- .resizer[hidden][data-v-d5bc9278] {
3686
+ .resizer[hidden][data-v-20117052] {
3513
3687
  display: none;
3514
3688
  }
3515
- [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"] .resizer[data-v-d5bc9278] {
3689
+ [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"] .resizer[data-v-20117052] {
3516
3690
  inset-inline-end: auto;
3517
3691
  inset-inline-start: 0;
3518
3692
  transform: translateX(-50%);
3519
3693
  }
3520
- .resizer[data-v-d5bc9278]::after {
3694
+ .resizer[data-v-20117052]::after {
3521
3695
  content: "";
3522
3696
  position: absolute;
3523
3697
  inset-block: 0;
@@ -3533,7 +3707,7 @@ hr[aria-orientation="vertical"][data-v-357ad177] {
3533
3707
  background-color var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease),
3534
3708
  opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
3535
3709
  }
3536
- .guide[data-v-d5bc9278] {
3710
+ .guide[data-v-20117052] {
3537
3711
  position: absolute;
3538
3712
  inset-block-start: 50%;
3539
3713
  inset-inline-start: 50%;
@@ -3547,16 +3721,16 @@ hr[aria-orientation="vertical"][data-v-357ad177] {
3547
3721
  transition: opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
3548
3722
  pointer-events: none;
3549
3723
  }
3550
- .resizer[data-v-d5bc9278]:is(:hover, :focus-visible)::after {
3724
+ .resizer[data-v-20117052]:is(:hover, :focus-visible)::after {
3551
3725
  background: var(--ui-affordance-direct-color, var(--ui-accent-solid, var(--ui-focus-ring)));
3552
3726
  opacity: 1;
3553
3727
  }
3554
- .resizer:is(:hover, :focus-visible) > .guide[data-v-d5bc9278] {
3728
+ .resizer:is(:hover, :focus-visible) > .guide[data-v-20117052] {
3555
3729
  opacity: 1;
3556
3730
  }
3557
3731
 
3558
3732
  /* Drawer: a popover in the top layer, sliding in from its edge. Closed popovers are hidden by the UA. */
3559
- [data-component~="ui-sidebar"][popover][data-v-d5bc9278] {
3733
+ [data-component~="ui-sidebar"][popover][data-v-20117052] {
3560
3734
  position: fixed;
3561
3735
  inset-block: 0;
3562
3736
  inset-inline-start: 0;
@@ -3576,36 +3750,36 @@ hr[aria-orientation="vertical"][data-v-357ad177] {
3576
3750
  }
3577
3751
 
3578
3752
  /* The author display above would otherwise override the UA rule that hides a closed popover. */
3579
- [data-component~="ui-sidebar"][popover][data-v-d5bc9278]:not(:popover-open) {
3753
+ [data-component~="ui-sidebar"][popover][data-v-20117052]:not(:popover-open) {
3580
3754
  display: none;
3581
3755
  transform: translateX(-100%);
3582
3756
  }
3583
- [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"][popover][data-v-d5bc9278] {
3757
+ [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"][popover][data-v-20117052] {
3584
3758
  inset-inline-start: auto;
3585
3759
  inset-inline-end: 0;
3586
3760
  }
3587
- [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"][popover][data-v-d5bc9278]:not(:popover-open) {
3761
+ [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"][popover][data-v-20117052]:not(:popover-open) {
3588
3762
  transform: translateX(100%);
3589
3763
  }
3590
3764
  @starting-style {
3591
- [data-component~="ui-sidebar"][popover][data-v-d5bc9278]:popover-open {
3765
+ [data-component~="ui-sidebar"][popover][data-v-20117052]:popover-open {
3592
3766
  transform: translateX(-100%);
3593
3767
  }
3594
- [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"][popover][data-v-d5bc9278]:popover-open {
3768
+ [data-component~="ui-sidebar"][data-ui-sidebar-state~="side=end"][popover][data-v-20117052]:popover-open {
3595
3769
  transform: translateX(100%);
3596
3770
  }
3597
3771
  }
3598
- [data-component~="ui-sidebar"][popover][data-v-d5bc9278]::backdrop {
3772
+ [data-component~="ui-sidebar"][popover][data-v-20117052]::backdrop {
3599
3773
  background: var(--ui-sidebar-backdrop, rgb(0 0 0 / 0.32));
3600
3774
  }
3601
3775
  @media (prefers-reduced-motion: reduce) {
3602
- [data-component~="ui-sidebar"][popover][data-v-d5bc9278] {
3776
+ [data-component~="ui-sidebar"][popover][data-v-20117052] {
3603
3777
  transition: none;
3604
3778
  }
3605
3779
  }
3606
3780
 
3607
3781
  /* A component that sets its display still honours the hidden attribute on its root. */
3608
- [data-component~="ui-sidebar"][hidden][data-v-d5bc9278] {
3782
+ [data-component~="ui-sidebar"][hidden][data-v-20117052] {
3609
3783
  display: none;
3610
3784
  }
3611
3785