@lilydesignsystem/themes 0.3.0 → 0.4.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 (46) hide show
  1. package/dist/abyss.css +80 -4
  2. package/dist/acid.css +80 -4
  3. package/dist/adobe-spectrum.css +80 -4
  4. package/dist/aqua.css +80 -4
  5. package/dist/autumn.css +80 -4
  6. package/dist/black.css +80 -4
  7. package/dist/bumblebee.css +80 -4
  8. package/dist/business.css +80 -4
  9. package/dist/caramellatte.css +80 -4
  10. package/dist/cmyk.css +80 -4
  11. package/dist/coffee.css +80 -4
  12. package/dist/corporate.css +80 -4
  13. package/dist/cupcake.css +80 -4
  14. package/dist/cyberpunk.css +80 -4
  15. package/dist/dark.css +80 -4
  16. package/dist/dim.css +80 -4
  17. package/dist/dracula.css +80 -4
  18. package/dist/emerald.css +80 -4
  19. package/dist/fantasy.css +80 -4
  20. package/dist/forest.css +80 -4
  21. package/dist/garden.css +80 -4
  22. package/dist/halloween.css +80 -4
  23. package/dist/lemonade.css +80 -4
  24. package/dist/light.css +80 -4
  25. package/dist/lofi.css +80 -4
  26. package/dist/luxury.css +80 -4
  27. package/dist/mozilla-protocol.css +80 -4
  28. package/dist/night.css +80 -4
  29. package/dist/nord.css +80 -4
  30. package/dist/pastel.css +80 -4
  31. package/dist/retro.css +80 -4
  32. package/dist/silk.css +80 -4
  33. package/dist/sunset.css +80 -4
  34. package/dist/synthwave.css +80 -4
  35. package/dist/united-kingdom-government-digital-service.css +80 -4
  36. package/dist/united-kingdom-national-health-service-england-for-patients.css +80 -4
  37. package/dist/united-kingdom-national-health-service-england-for-practitioners.css +80 -4
  38. package/dist/united-kingdom-national-health-service-scotland-for-patients.css +80 -4
  39. package/dist/united-kingdom-national-health-service-scotland-for-practitioners.css +80 -4
  40. package/dist/united-kingdom-national-health-service-wales-for-patients.css +80 -4
  41. package/dist/united-kingdom-national-health-service-wales-for-practitioners.css +80 -4
  42. package/dist/united-states-web-design-system.css +80 -4
  43. package/dist/valentine.css +80 -4
  44. package/dist/winter.css +80 -4
  45. package/dist/wireframe.css +80 -4
  46. package/package.json +1 -1
package/dist/lofi.css CHANGED
@@ -2078,6 +2078,7 @@
2078
2078
  .locale-picker,
2079
2079
  .text-size-picker,
2080
2080
  .search-picker,
2081
+ .link-picker,
2081
2082
  .share-picker,
2082
2083
  .date-time-picker
2083
2084
  ) {
@@ -2090,6 +2091,7 @@
2090
2091
  .locale-picker-button,
2091
2092
  .text-size-picker-button,
2092
2093
  .search-picker-button,
2094
+ .link-picker-button,
2093
2095
  .share-picker-button,
2094
2096
  .date-time-picker-button
2095
2097
  ) {
@@ -2125,6 +2127,7 @@
2125
2127
  .locale-picker-icon,
2126
2128
  .text-size-picker-icon,
2127
2129
  .motion-picker-icon,
2130
+ .link-picker-icon,
2128
2131
  .share-picker-icon,
2129
2132
  .search-picker-icon
2130
2133
  ) {
@@ -2183,6 +2186,31 @@
2183
2186
  background-color: var(--lily-surface-alt);
2184
2187
  }
2185
2188
 
2189
+ /* link-picker's list holds real page links (a disclosure, not a menu),
2190
+ so its items get the share list's treatment; the current page is
2191
+ marked by aria-current and shown in bold. */
2192
+ :where(.link-picker-list) > :where(.link-picker-list-item) {
2193
+ list-style: none;
2194
+ }
2195
+
2196
+ :where(.link-picker-link) {
2197
+ display: block;
2198
+ padding: var(--lily-space-xs) var(--lily-space-sm);
2199
+ color: var(--lily-text);
2200
+ text-decoration: none;
2201
+ border-radius: var(--lily-radius-sm);
2202
+ cursor: pointer;
2203
+ }
2204
+
2205
+ :where(.link-picker-link:hover) {
2206
+ background-color: var(--lily-surface-alt);
2207
+ }
2208
+
2209
+ :where(.link-picker-link[aria-current="page"]) {
2210
+ font-weight: 600;
2211
+ background-color: var(--lily-surface-sunken);
2212
+ }
2213
+
2186
2214
  /* Copy feedback. Never display:none this — that silences the live
2187
2215
  region for screen-reader users. */
2188
2216
  :where(.share-picker-status) {
@@ -2464,6 +2492,7 @@
2464
2492
  .locale-picker-tooltip,
2465
2493
  .text-size-picker-tooltip,
2466
2494
  .motion-picker-tooltip,
2495
+ .link-picker-tooltip,
2467
2496
  .share-picker-tooltip,
2468
2497
  .search-picker-tooltip,
2469
2498
  .date-time-picker-tooltip
@@ -2488,6 +2517,7 @@
2488
2517
  .locale-picker-tooltip,
2489
2518
  .text-size-picker-tooltip,
2490
2519
  .motion-picker-tooltip,
2520
+ .link-picker-tooltip,
2491
2521
  .share-picker-tooltip,
2492
2522
  .search-picker-tooltip,
2493
2523
  .date-time-picker-tooltip
@@ -2504,6 +2534,7 @@
2504
2534
  .locale-picker-tooltip,
2505
2535
  .text-size-picker-tooltip,
2506
2536
  .motion-picker-tooltip,
2537
+ .link-picker-tooltip,
2507
2538
  .share-picker-tooltip,
2508
2539
  .search-picker-tooltip,
2509
2540
  .date-time-picker-tooltip
@@ -2556,6 +2587,8 @@
2556
2587
  .theme-picker-list,
2557
2588
  .locale-picker-list,
2558
2589
  .text-size-picker-list,
2590
+ .motion-picker-list,
2591
+ .link-picker-list,
2559
2592
  .share-picker-list,
2560
2593
  .search-picker-panel
2561
2594
  ) {
@@ -2581,17 +2614,60 @@
2581
2614
  .theme-picker-list,
2582
2615
  .locale-picker-list,
2583
2616
  .text-size-picker-list,
2617
+ .motion-picker-list,
2618
+ .link-picker-list,
2584
2619
  .share-picker-list,
2585
2620
  .search-picker-panel
2586
2621
  )[hidden] {
2587
2622
  display: none;
2588
2623
  }
2589
2624
 
2590
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2625
+ /* Popups open under their button, aligned to its start edge, and flip to
2626
+ its end edge (or above it) when they would run off the viewport. A header
2627
+ picker near the right edge otherwise overflows, and focusing the popup
2628
+ scrolls the whole page sideways. `position: fixed` makes the viewport the
2629
+ containing block that the flip fallbacks are checked against; browsers
2630
+ without anchor positioning keep the absolute placement above. */
2631
+ @supports (position-area: block-end) {
2632
+ :where(.theme-picker) { anchor-name: --lily-theme-picker; }
2633
+ :where(.locale-picker) { anchor-name: --lily-locale-picker; }
2634
+ :where(.text-size-picker) { anchor-name: --lily-text-size-picker; }
2635
+ :where(.motion-picker) { anchor-name: --lily-motion-picker; }
2636
+ :where(.link-picker) { anchor-name: --lily-link-picker; }
2637
+ :where(.share-picker) { anchor-name: --lily-share-picker; }
2638
+ :where(.search-picker) { anchor-name: --lily-search-picker; }
2639
+ :where(.theme-picker-list) { position-anchor: --lily-theme-picker; }
2640
+ :where(.locale-picker-list) { position-anchor: --lily-locale-picker; }
2641
+ :where(.text-size-picker-list) { position-anchor: --lily-text-size-picker; }
2642
+ :where(.motion-picker-list) { position-anchor: --lily-motion-picker; }
2643
+ :where(.link-picker-list) { position-anchor: --lily-link-picker; }
2644
+ :where(.share-picker-list) { position-anchor: --lily-share-picker; }
2645
+ :where(.search-picker-panel) { position-anchor: --lily-search-picker; }
2646
+ :where(
2647
+ .theme-picker-list,
2648
+ .locale-picker-list,
2649
+ .text-size-picker-list,
2650
+ .motion-picker-list,
2651
+ .link-picker-list,
2652
+ .share-picker-list,
2653
+ .search-picker-panel
2654
+ ) {
2655
+ position: fixed;
2656
+ inset: auto;
2657
+ position-area: block-end span-inline-end;
2658
+ position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;
2659
+ min-width: 0;
2660
+ width: max-content;
2661
+ max-width: calc(100vw - 1rem);
2662
+ }
2663
+ }
2664
+
2665
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2591
2666
  > :where(
2592
2667
  .theme-picker-option,
2593
2668
  .locale-picker-option,
2594
- .text-size-picker-option
2669
+ .text-size-picker-option,
2670
+ .motion-picker-option
2595
2671
  ) {
2596
2672
  padding: var(--lily-space-xs) var(--lily-space-sm);
2597
2673
  border-radius: var(--lily-radius-sm);
@@ -2600,7 +2676,7 @@
2600
2676
 
2601
2677
  /* data-active is the keyboard cursor (aria-activedescendant); focus
2602
2678
  stays on the listbox, so this is the only visible cue for it. */
2603
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2679
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2604
2680
  > :where([data-active]) {
2605
2681
  background-color: var(--lily-surface-alt);
2606
2682
  outline: var(--lily-focus-ring);
@@ -2609,7 +2685,7 @@
2609
2685
 
2610
2686
  /* aria-selected marks the applied theme/locale, which is not the
2611
2687
  same thing as the keyboard cursor. Both can be visible at once. */
2612
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2688
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2613
2689
  > :where([aria-selected="true"]) {
2614
2690
  font-weight: 600;
2615
2691
  background-color: var(--lily-surface-sunken);
package/dist/luxury.css CHANGED
@@ -2078,6 +2078,7 @@
2078
2078
  .locale-picker,
2079
2079
  .text-size-picker,
2080
2080
  .search-picker,
2081
+ .link-picker,
2081
2082
  .share-picker,
2082
2083
  .date-time-picker
2083
2084
  ) {
@@ -2090,6 +2091,7 @@
2090
2091
  .locale-picker-button,
2091
2092
  .text-size-picker-button,
2092
2093
  .search-picker-button,
2094
+ .link-picker-button,
2093
2095
  .share-picker-button,
2094
2096
  .date-time-picker-button
2095
2097
  ) {
@@ -2125,6 +2127,7 @@
2125
2127
  .locale-picker-icon,
2126
2128
  .text-size-picker-icon,
2127
2129
  .motion-picker-icon,
2130
+ .link-picker-icon,
2128
2131
  .share-picker-icon,
2129
2132
  .search-picker-icon
2130
2133
  ) {
@@ -2183,6 +2186,31 @@
2183
2186
  background-color: var(--lily-surface-alt);
2184
2187
  }
2185
2188
 
2189
+ /* link-picker's list holds real page links (a disclosure, not a menu),
2190
+ so its items get the share list's treatment; the current page is
2191
+ marked by aria-current and shown in bold. */
2192
+ :where(.link-picker-list) > :where(.link-picker-list-item) {
2193
+ list-style: none;
2194
+ }
2195
+
2196
+ :where(.link-picker-link) {
2197
+ display: block;
2198
+ padding: var(--lily-space-xs) var(--lily-space-sm);
2199
+ color: var(--lily-text);
2200
+ text-decoration: none;
2201
+ border-radius: var(--lily-radius-sm);
2202
+ cursor: pointer;
2203
+ }
2204
+
2205
+ :where(.link-picker-link:hover) {
2206
+ background-color: var(--lily-surface-alt);
2207
+ }
2208
+
2209
+ :where(.link-picker-link[aria-current="page"]) {
2210
+ font-weight: 600;
2211
+ background-color: var(--lily-surface-sunken);
2212
+ }
2213
+
2186
2214
  /* Copy feedback. Never display:none this — that silences the live
2187
2215
  region for screen-reader users. */
2188
2216
  :where(.share-picker-status) {
@@ -2464,6 +2492,7 @@
2464
2492
  .locale-picker-tooltip,
2465
2493
  .text-size-picker-tooltip,
2466
2494
  .motion-picker-tooltip,
2495
+ .link-picker-tooltip,
2467
2496
  .share-picker-tooltip,
2468
2497
  .search-picker-tooltip,
2469
2498
  .date-time-picker-tooltip
@@ -2488,6 +2517,7 @@
2488
2517
  .locale-picker-tooltip,
2489
2518
  .text-size-picker-tooltip,
2490
2519
  .motion-picker-tooltip,
2520
+ .link-picker-tooltip,
2491
2521
  .share-picker-tooltip,
2492
2522
  .search-picker-tooltip,
2493
2523
  .date-time-picker-tooltip
@@ -2504,6 +2534,7 @@
2504
2534
  .locale-picker-tooltip,
2505
2535
  .text-size-picker-tooltip,
2506
2536
  .motion-picker-tooltip,
2537
+ .link-picker-tooltip,
2507
2538
  .share-picker-tooltip,
2508
2539
  .search-picker-tooltip,
2509
2540
  .date-time-picker-tooltip
@@ -2556,6 +2587,8 @@
2556
2587
  .theme-picker-list,
2557
2588
  .locale-picker-list,
2558
2589
  .text-size-picker-list,
2590
+ .motion-picker-list,
2591
+ .link-picker-list,
2559
2592
  .share-picker-list,
2560
2593
  .search-picker-panel
2561
2594
  ) {
@@ -2581,17 +2614,60 @@
2581
2614
  .theme-picker-list,
2582
2615
  .locale-picker-list,
2583
2616
  .text-size-picker-list,
2617
+ .motion-picker-list,
2618
+ .link-picker-list,
2584
2619
  .share-picker-list,
2585
2620
  .search-picker-panel
2586
2621
  )[hidden] {
2587
2622
  display: none;
2588
2623
  }
2589
2624
 
2590
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2625
+ /* Popups open under their button, aligned to its start edge, and flip to
2626
+ its end edge (or above it) when they would run off the viewport. A header
2627
+ picker near the right edge otherwise overflows, and focusing the popup
2628
+ scrolls the whole page sideways. `position: fixed` makes the viewport the
2629
+ containing block that the flip fallbacks are checked against; browsers
2630
+ without anchor positioning keep the absolute placement above. */
2631
+ @supports (position-area: block-end) {
2632
+ :where(.theme-picker) { anchor-name: --lily-theme-picker; }
2633
+ :where(.locale-picker) { anchor-name: --lily-locale-picker; }
2634
+ :where(.text-size-picker) { anchor-name: --lily-text-size-picker; }
2635
+ :where(.motion-picker) { anchor-name: --lily-motion-picker; }
2636
+ :where(.link-picker) { anchor-name: --lily-link-picker; }
2637
+ :where(.share-picker) { anchor-name: --lily-share-picker; }
2638
+ :where(.search-picker) { anchor-name: --lily-search-picker; }
2639
+ :where(.theme-picker-list) { position-anchor: --lily-theme-picker; }
2640
+ :where(.locale-picker-list) { position-anchor: --lily-locale-picker; }
2641
+ :where(.text-size-picker-list) { position-anchor: --lily-text-size-picker; }
2642
+ :where(.motion-picker-list) { position-anchor: --lily-motion-picker; }
2643
+ :where(.link-picker-list) { position-anchor: --lily-link-picker; }
2644
+ :where(.share-picker-list) { position-anchor: --lily-share-picker; }
2645
+ :where(.search-picker-panel) { position-anchor: --lily-search-picker; }
2646
+ :where(
2647
+ .theme-picker-list,
2648
+ .locale-picker-list,
2649
+ .text-size-picker-list,
2650
+ .motion-picker-list,
2651
+ .link-picker-list,
2652
+ .share-picker-list,
2653
+ .search-picker-panel
2654
+ ) {
2655
+ position: fixed;
2656
+ inset: auto;
2657
+ position-area: block-end span-inline-end;
2658
+ position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;
2659
+ min-width: 0;
2660
+ width: max-content;
2661
+ max-width: calc(100vw - 1rem);
2662
+ }
2663
+ }
2664
+
2665
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2591
2666
  > :where(
2592
2667
  .theme-picker-option,
2593
2668
  .locale-picker-option,
2594
- .text-size-picker-option
2669
+ .text-size-picker-option,
2670
+ .motion-picker-option
2595
2671
  ) {
2596
2672
  padding: var(--lily-space-xs) var(--lily-space-sm);
2597
2673
  border-radius: var(--lily-radius-sm);
@@ -2600,7 +2676,7 @@
2600
2676
 
2601
2677
  /* data-active is the keyboard cursor (aria-activedescendant); focus
2602
2678
  stays on the listbox, so this is the only visible cue for it. */
2603
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2679
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2604
2680
  > :where([data-active]) {
2605
2681
  background-color: var(--lily-surface-alt);
2606
2682
  outline: var(--lily-focus-ring);
@@ -2609,7 +2685,7 @@
2609
2685
 
2610
2686
  /* aria-selected marks the applied theme/locale, which is not the
2611
2687
  same thing as the keyboard cursor. Both can be visible at once. */
2612
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2688
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2613
2689
  > :where([aria-selected="true"]) {
2614
2690
  font-weight: 600;
2615
2691
  background-color: var(--lily-surface-sunken);
@@ -2078,6 +2078,7 @@
2078
2078
  .locale-picker,
2079
2079
  .text-size-picker,
2080
2080
  .search-picker,
2081
+ .link-picker,
2081
2082
  .share-picker,
2082
2083
  .date-time-picker
2083
2084
  ) {
@@ -2090,6 +2091,7 @@
2090
2091
  .locale-picker-button,
2091
2092
  .text-size-picker-button,
2092
2093
  .search-picker-button,
2094
+ .link-picker-button,
2093
2095
  .share-picker-button,
2094
2096
  .date-time-picker-button
2095
2097
  ) {
@@ -2125,6 +2127,7 @@
2125
2127
  .locale-picker-icon,
2126
2128
  .text-size-picker-icon,
2127
2129
  .motion-picker-icon,
2130
+ .link-picker-icon,
2128
2131
  .share-picker-icon,
2129
2132
  .search-picker-icon
2130
2133
  ) {
@@ -2183,6 +2186,31 @@
2183
2186
  background-color: var(--lily-surface-alt);
2184
2187
  }
2185
2188
 
2189
+ /* link-picker's list holds real page links (a disclosure, not a menu),
2190
+ so its items get the share list's treatment; the current page is
2191
+ marked by aria-current and shown in bold. */
2192
+ :where(.link-picker-list) > :where(.link-picker-list-item) {
2193
+ list-style: none;
2194
+ }
2195
+
2196
+ :where(.link-picker-link) {
2197
+ display: block;
2198
+ padding: var(--lily-space-xs) var(--lily-space-sm);
2199
+ color: var(--lily-text);
2200
+ text-decoration: none;
2201
+ border-radius: var(--lily-radius-sm);
2202
+ cursor: pointer;
2203
+ }
2204
+
2205
+ :where(.link-picker-link:hover) {
2206
+ background-color: var(--lily-surface-alt);
2207
+ }
2208
+
2209
+ :where(.link-picker-link[aria-current="page"]) {
2210
+ font-weight: 600;
2211
+ background-color: var(--lily-surface-sunken);
2212
+ }
2213
+
2186
2214
  /* Copy feedback. Never display:none this — that silences the live
2187
2215
  region for screen-reader users. */
2188
2216
  :where(.share-picker-status) {
@@ -2464,6 +2492,7 @@
2464
2492
  .locale-picker-tooltip,
2465
2493
  .text-size-picker-tooltip,
2466
2494
  .motion-picker-tooltip,
2495
+ .link-picker-tooltip,
2467
2496
  .share-picker-tooltip,
2468
2497
  .search-picker-tooltip,
2469
2498
  .date-time-picker-tooltip
@@ -2488,6 +2517,7 @@
2488
2517
  .locale-picker-tooltip,
2489
2518
  .text-size-picker-tooltip,
2490
2519
  .motion-picker-tooltip,
2520
+ .link-picker-tooltip,
2491
2521
  .share-picker-tooltip,
2492
2522
  .search-picker-tooltip,
2493
2523
  .date-time-picker-tooltip
@@ -2504,6 +2534,7 @@
2504
2534
  .locale-picker-tooltip,
2505
2535
  .text-size-picker-tooltip,
2506
2536
  .motion-picker-tooltip,
2537
+ .link-picker-tooltip,
2507
2538
  .share-picker-tooltip,
2508
2539
  .search-picker-tooltip,
2509
2540
  .date-time-picker-tooltip
@@ -2556,6 +2587,8 @@
2556
2587
  .theme-picker-list,
2557
2588
  .locale-picker-list,
2558
2589
  .text-size-picker-list,
2590
+ .motion-picker-list,
2591
+ .link-picker-list,
2559
2592
  .share-picker-list,
2560
2593
  .search-picker-panel
2561
2594
  ) {
@@ -2581,17 +2614,60 @@
2581
2614
  .theme-picker-list,
2582
2615
  .locale-picker-list,
2583
2616
  .text-size-picker-list,
2617
+ .motion-picker-list,
2618
+ .link-picker-list,
2584
2619
  .share-picker-list,
2585
2620
  .search-picker-panel
2586
2621
  )[hidden] {
2587
2622
  display: none;
2588
2623
  }
2589
2624
 
2590
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2625
+ /* Popups open under their button, aligned to its start edge, and flip to
2626
+ its end edge (or above it) when they would run off the viewport. A header
2627
+ picker near the right edge otherwise overflows, and focusing the popup
2628
+ scrolls the whole page sideways. `position: fixed` makes the viewport the
2629
+ containing block that the flip fallbacks are checked against; browsers
2630
+ without anchor positioning keep the absolute placement above. */
2631
+ @supports (position-area: block-end) {
2632
+ :where(.theme-picker) { anchor-name: --lily-theme-picker; }
2633
+ :where(.locale-picker) { anchor-name: --lily-locale-picker; }
2634
+ :where(.text-size-picker) { anchor-name: --lily-text-size-picker; }
2635
+ :where(.motion-picker) { anchor-name: --lily-motion-picker; }
2636
+ :where(.link-picker) { anchor-name: --lily-link-picker; }
2637
+ :where(.share-picker) { anchor-name: --lily-share-picker; }
2638
+ :where(.search-picker) { anchor-name: --lily-search-picker; }
2639
+ :where(.theme-picker-list) { position-anchor: --lily-theme-picker; }
2640
+ :where(.locale-picker-list) { position-anchor: --lily-locale-picker; }
2641
+ :where(.text-size-picker-list) { position-anchor: --lily-text-size-picker; }
2642
+ :where(.motion-picker-list) { position-anchor: --lily-motion-picker; }
2643
+ :where(.link-picker-list) { position-anchor: --lily-link-picker; }
2644
+ :where(.share-picker-list) { position-anchor: --lily-share-picker; }
2645
+ :where(.search-picker-panel) { position-anchor: --lily-search-picker; }
2646
+ :where(
2647
+ .theme-picker-list,
2648
+ .locale-picker-list,
2649
+ .text-size-picker-list,
2650
+ .motion-picker-list,
2651
+ .link-picker-list,
2652
+ .share-picker-list,
2653
+ .search-picker-panel
2654
+ ) {
2655
+ position: fixed;
2656
+ inset: auto;
2657
+ position-area: block-end span-inline-end;
2658
+ position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;
2659
+ min-width: 0;
2660
+ width: max-content;
2661
+ max-width: calc(100vw - 1rem);
2662
+ }
2663
+ }
2664
+
2665
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2591
2666
  > :where(
2592
2667
  .theme-picker-option,
2593
2668
  .locale-picker-option,
2594
- .text-size-picker-option
2669
+ .text-size-picker-option,
2670
+ .motion-picker-option
2595
2671
  ) {
2596
2672
  padding: var(--lily-space-xs) var(--lily-space-sm);
2597
2673
  border-radius: var(--lily-radius-sm);
@@ -2600,7 +2676,7 @@
2600
2676
 
2601
2677
  /* data-active is the keyboard cursor (aria-activedescendant); focus
2602
2678
  stays on the listbox, so this is the only visible cue for it. */
2603
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2679
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2604
2680
  > :where([data-active]) {
2605
2681
  background-color: var(--lily-surface-alt);
2606
2682
  outline: var(--lily-focus-ring);
@@ -2609,7 +2685,7 @@
2609
2685
 
2610
2686
  /* aria-selected marks the applied theme/locale, which is not the
2611
2687
  same thing as the keyboard cursor. Both can be visible at once. */
2612
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2688
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2613
2689
  > :where([aria-selected="true"]) {
2614
2690
  font-weight: 600;
2615
2691
  background-color: var(--lily-surface-sunken);
package/dist/night.css CHANGED
@@ -2078,6 +2078,7 @@
2078
2078
  .locale-picker,
2079
2079
  .text-size-picker,
2080
2080
  .search-picker,
2081
+ .link-picker,
2081
2082
  .share-picker,
2082
2083
  .date-time-picker
2083
2084
  ) {
@@ -2090,6 +2091,7 @@
2090
2091
  .locale-picker-button,
2091
2092
  .text-size-picker-button,
2092
2093
  .search-picker-button,
2094
+ .link-picker-button,
2093
2095
  .share-picker-button,
2094
2096
  .date-time-picker-button
2095
2097
  ) {
@@ -2125,6 +2127,7 @@
2125
2127
  .locale-picker-icon,
2126
2128
  .text-size-picker-icon,
2127
2129
  .motion-picker-icon,
2130
+ .link-picker-icon,
2128
2131
  .share-picker-icon,
2129
2132
  .search-picker-icon
2130
2133
  ) {
@@ -2183,6 +2186,31 @@
2183
2186
  background-color: var(--lily-surface-alt);
2184
2187
  }
2185
2188
 
2189
+ /* link-picker's list holds real page links (a disclosure, not a menu),
2190
+ so its items get the share list's treatment; the current page is
2191
+ marked by aria-current and shown in bold. */
2192
+ :where(.link-picker-list) > :where(.link-picker-list-item) {
2193
+ list-style: none;
2194
+ }
2195
+
2196
+ :where(.link-picker-link) {
2197
+ display: block;
2198
+ padding: var(--lily-space-xs) var(--lily-space-sm);
2199
+ color: var(--lily-text);
2200
+ text-decoration: none;
2201
+ border-radius: var(--lily-radius-sm);
2202
+ cursor: pointer;
2203
+ }
2204
+
2205
+ :where(.link-picker-link:hover) {
2206
+ background-color: var(--lily-surface-alt);
2207
+ }
2208
+
2209
+ :where(.link-picker-link[aria-current="page"]) {
2210
+ font-weight: 600;
2211
+ background-color: var(--lily-surface-sunken);
2212
+ }
2213
+
2186
2214
  /* Copy feedback. Never display:none this — that silences the live
2187
2215
  region for screen-reader users. */
2188
2216
  :where(.share-picker-status) {
@@ -2464,6 +2492,7 @@
2464
2492
  .locale-picker-tooltip,
2465
2493
  .text-size-picker-tooltip,
2466
2494
  .motion-picker-tooltip,
2495
+ .link-picker-tooltip,
2467
2496
  .share-picker-tooltip,
2468
2497
  .search-picker-tooltip,
2469
2498
  .date-time-picker-tooltip
@@ -2488,6 +2517,7 @@
2488
2517
  .locale-picker-tooltip,
2489
2518
  .text-size-picker-tooltip,
2490
2519
  .motion-picker-tooltip,
2520
+ .link-picker-tooltip,
2491
2521
  .share-picker-tooltip,
2492
2522
  .search-picker-tooltip,
2493
2523
  .date-time-picker-tooltip
@@ -2504,6 +2534,7 @@
2504
2534
  .locale-picker-tooltip,
2505
2535
  .text-size-picker-tooltip,
2506
2536
  .motion-picker-tooltip,
2537
+ .link-picker-tooltip,
2507
2538
  .share-picker-tooltip,
2508
2539
  .search-picker-tooltip,
2509
2540
  .date-time-picker-tooltip
@@ -2556,6 +2587,8 @@
2556
2587
  .theme-picker-list,
2557
2588
  .locale-picker-list,
2558
2589
  .text-size-picker-list,
2590
+ .motion-picker-list,
2591
+ .link-picker-list,
2559
2592
  .share-picker-list,
2560
2593
  .search-picker-panel
2561
2594
  ) {
@@ -2581,17 +2614,60 @@
2581
2614
  .theme-picker-list,
2582
2615
  .locale-picker-list,
2583
2616
  .text-size-picker-list,
2617
+ .motion-picker-list,
2618
+ .link-picker-list,
2584
2619
  .share-picker-list,
2585
2620
  .search-picker-panel
2586
2621
  )[hidden] {
2587
2622
  display: none;
2588
2623
  }
2589
2624
 
2590
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2625
+ /* Popups open under their button, aligned to its start edge, and flip to
2626
+ its end edge (or above it) when they would run off the viewport. A header
2627
+ picker near the right edge otherwise overflows, and focusing the popup
2628
+ scrolls the whole page sideways. `position: fixed` makes the viewport the
2629
+ containing block that the flip fallbacks are checked against; browsers
2630
+ without anchor positioning keep the absolute placement above. */
2631
+ @supports (position-area: block-end) {
2632
+ :where(.theme-picker) { anchor-name: --lily-theme-picker; }
2633
+ :where(.locale-picker) { anchor-name: --lily-locale-picker; }
2634
+ :where(.text-size-picker) { anchor-name: --lily-text-size-picker; }
2635
+ :where(.motion-picker) { anchor-name: --lily-motion-picker; }
2636
+ :where(.link-picker) { anchor-name: --lily-link-picker; }
2637
+ :where(.share-picker) { anchor-name: --lily-share-picker; }
2638
+ :where(.search-picker) { anchor-name: --lily-search-picker; }
2639
+ :where(.theme-picker-list) { position-anchor: --lily-theme-picker; }
2640
+ :where(.locale-picker-list) { position-anchor: --lily-locale-picker; }
2641
+ :where(.text-size-picker-list) { position-anchor: --lily-text-size-picker; }
2642
+ :where(.motion-picker-list) { position-anchor: --lily-motion-picker; }
2643
+ :where(.link-picker-list) { position-anchor: --lily-link-picker; }
2644
+ :where(.share-picker-list) { position-anchor: --lily-share-picker; }
2645
+ :where(.search-picker-panel) { position-anchor: --lily-search-picker; }
2646
+ :where(
2647
+ .theme-picker-list,
2648
+ .locale-picker-list,
2649
+ .text-size-picker-list,
2650
+ .motion-picker-list,
2651
+ .link-picker-list,
2652
+ .share-picker-list,
2653
+ .search-picker-panel
2654
+ ) {
2655
+ position: fixed;
2656
+ inset: auto;
2657
+ position-area: block-end span-inline-end;
2658
+ position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;
2659
+ min-width: 0;
2660
+ width: max-content;
2661
+ max-width: calc(100vw - 1rem);
2662
+ }
2663
+ }
2664
+
2665
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2591
2666
  > :where(
2592
2667
  .theme-picker-option,
2593
2668
  .locale-picker-option,
2594
- .text-size-picker-option
2669
+ .text-size-picker-option,
2670
+ .motion-picker-option
2595
2671
  ) {
2596
2672
  padding: var(--lily-space-xs) var(--lily-space-sm);
2597
2673
  border-radius: var(--lily-radius-sm);
@@ -2600,7 +2676,7 @@
2600
2676
 
2601
2677
  /* data-active is the keyboard cursor (aria-activedescendant); focus
2602
2678
  stays on the listbox, so this is the only visible cue for it. */
2603
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2679
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2604
2680
  > :where([data-active]) {
2605
2681
  background-color: var(--lily-surface-alt);
2606
2682
  outline: var(--lily-focus-ring);
@@ -2609,7 +2685,7 @@
2609
2685
 
2610
2686
  /* aria-selected marks the applied theme/locale, which is not the
2611
2687
  same thing as the keyboard cursor. Both can be visible at once. */
2612
- :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list)
2688
+ :where(.theme-picker-list, .locale-picker-list, .text-size-picker-list, .motion-picker-list)
2613
2689
  > :where([aria-selected="true"]) {
2614
2690
  font-weight: 600;
2615
2691
  background-color: var(--lily-surface-sunken);