|
75 | 75 | let triggerElement: HTMLElement | null = null; |
76 | 76 | let contentElement: HTMLElement | null = null; |
77 | 77 | let dropdownPosition = { top: 0, left: 0, maxHeight: undefined as number | undefined }; |
78 | | - let isSmallViewport = false; |
79 | 78 | let positionFrame: number | undefined; |
80 | 79 | let settleTimers: number[] = []; |
81 | 80 |
|
|
98 | 97 | }; |
99 | 98 | }; |
100 | 99 |
|
101 | | - const updateViewportSize = () => { |
102 | | - isSmallViewport = (window.visualViewport?.width ?? window.innerWidth) < 640; |
103 | | - }; |
104 | | -
|
105 | 100 | const updatePosition = () => { |
106 | 101 | if (!show || !triggerElement) return; |
107 | 102 | const rect = triggerElement.getBoundingClientRect(); |
|
152 | 147 | }; |
153 | 148 |
|
154 | 149 | const scheduleSettledPositionUpdates = () => { |
155 | | - updateViewportSize(); |
156 | 150 | for (const timer of settleTimers) window.clearTimeout(timer); |
157 | 151 | settleTimers = []; |
158 | 152 | schedulePositionUpdate(); |
|
556 | 550 | tags = Array.from(new Set(tags)).sort((a, b) => a.localeCompare(b)); |
557 | 551 | } |
558 | 552 |
|
559 | | - updateViewportSize(); |
560 | 553 | window.addEventListener('scroll', schedulePositionUpdate, true); |
561 | 554 | window.visualViewport?.addEventListener('resize', scheduleSettledPositionUpdates); |
562 | 555 | window.visualViewport?.addEventListener('scroll', schedulePositionUpdate); |
|
649 | 642 |
|
650 | 643 | let listScrollTop = 0; |
651 | 644 | let listContainer; |
652 | | - $: listViewportHeight = isSmallViewport ? 240 : 288; |
| 645 | + $: listViewportHeight = Math.min(288, Math.max(96, (dropdownPosition.maxHeight ?? 352) - 64)); |
653 | 646 |
|
654 | 647 | $: visibleStart = Math.max(0, Math.floor(listScrollTop / ITEM_HEIGHT) - OVERSCAN); |
655 | 648 | $: visibleEnd = Math.min( |
|
0 commit comments