Full document, spreadsheet, slideshow, and diagram tooling
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request 'fix(calendar): month view rows always fit viewport without scrollbar' (#314) from fix/calendar-month-overflow into main

scott 24d8c19a 55efba81

+18 -34
+9
CHANGELOG.md
··· 8 8 ## [0.25.0] — 2026-04-08 9 9 10 10 ### Added 11 + - Add mouse wheel navigation to calendar views (#488) 12 + - Add iCal (.ics) import to calendar (#487) 13 + - Make calendar a singleton - one per user instead of creating new ones (#485) 14 + - Improve calendar visual polish and core features (#484) 11 15 - Wrap document encryption keys with user-derived passphrase (PBKDF2 + AES-256-GCM) before localStorage/server storage (#405) 12 16 - Passphrase modal UI for key setup and unlock, with auto-migration of legacy plaintext keys 13 17 - E2E tests for AI chat panel toggle and keyboard shortcut (#303) ··· 15 19 - E2E tests for daily notes creation and reopen (#303) 16 20 17 21 ### Fixed 22 + - Improve calendar scrolling behavior (#489) 23 + - Fix calendar view scrolling for overflow content (#483) 18 24 - CSS: add hex fallbacks for all 320 oklch() color declarations for older browser support (#408) 19 25 20 26 ## [0.24.0] — 2026-04-07 ··· 282 288 - Fix E2E test flakiness: replace page reload with addInitScript, add waitForURL before waitForSelector (#305) 283 289 284 290 ### Changed 291 + - Calendar: comprehensive tests and visual fixes (#482) 292 + - Debug: calendar document creation failing on production (#481) 293 + - Calendar polish: CSS/HTML class alignment, color fixes, tests (#480) 285 294 - Decompose docs/main.ts into focused modules (#464) 286 295 - Decompose diagrams/main.ts into focused modules (#463) 287 296 - Phase 5: extract toolbar, keyboard, cell-editing, grid-rendering from sheets main.ts (#462)
+4 -24
src/calendar/main.ts
··· 896 896 }); 897 897 898 898 // --------------------------------------------------------------------------- 899 - // Mouse wheel navigation — month view only, at scroll boundaries 899 + // Mouse wheel navigation — month view navigates between months 900 900 // --------------------------------------------------------------------------- 901 901 902 902 let wheelCooldown = false; 903 903 904 904 calendarGrid.addEventListener('wheel', (e) => { 905 - // Only navigate months with wheel — week/day/agenda use native scroll 906 905 if (state.view !== 'month') return; 907 - 908 - // Find the scrollable month grid 909 - const grid = calendarGrid.querySelector('.cal-month-grid') as HTMLElement | null; 910 - if (!grid) return; 911 - 912 - const atTop = grid.scrollTop <= 0; 913 - const atBottom = grid.scrollTop + grid.clientHeight >= grid.scrollHeight - 1; 914 - const canScroll = grid.scrollHeight > grid.clientHeight + 1; 915 - 916 - // If the grid has scrollable content, let native scroll work. 917 - // Only intercept when content is fully scrolled to the edge. 918 - if (canScroll) { 919 - if (e.deltaY > 0 && !atBottom) return; // scrolling down, not at bottom 920 - if (e.deltaY < 0 && !atTop) return; // scrolling up, not at top 921 - } 906 + if (wheelCooldown) return; 922 907 923 - // At a scroll boundary (or grid fits on screen) → navigate months 924 - if (wheelCooldown) return; 925 908 wheelCooldown = true; 926 909 setTimeout(() => { wheelCooldown = false; }, 400); 927 910 928 911 e.preventDefault(); 929 - if (e.deltaY > 0) { 930 - navigateNext(); 931 - } else if (e.deltaY < 0) { 932 - navigatePrev(); 933 - } 912 + if (e.deltaY > 0) navigateNext(); 913 + else if (e.deltaY < 0) navigatePrev(); 934 914 }, { passive: false }); 935 915 936 916 // ---------------------------------------------------------------------------
+5 -10
src/css/app.css
··· 9453 9453 .cal-month-grid { 9454 9454 display: grid; 9455 9455 grid-template-columns: repeat(7, 1fr); 9456 - grid-auto-rows: minmax(var(--cal-cell-min), 1fr); 9456 + /* Rows fill available height equally — never overflow, no scrollbar */ 9457 + grid-auto-rows: 1fr; 9457 9458 flex: 1; 9458 - overflow-y: auto; 9459 - scrollbar-width: thin; 9460 - scrollbar-color: var(--color-border) transparent; 9461 - scroll-behavior: smooth; 9459 + overflow: hidden; 9462 9460 } 9463 9461 9464 9462 .cal-month-header { ··· 9483 9481 } 9484 9482 9485 9483 .cal-day-cell { 9486 - min-height: var(--cal-cell-min); 9487 9484 border-right: 1px solid var(--color-border); 9488 9485 border-bottom: 1px solid var(--color-border); 9489 9486 padding: var(--space-xs); ··· 10181 10178 10182 10179 /* Month grid — smaller cells */ 10183 10180 .cal-month-grid { 10184 - grid-auto-rows: minmax(var(--cal-cell-min-tablet), 1fr); 10181 + grid-auto-rows: 1fr; 10185 10182 } 10186 10183 10187 10184 .cal-day-cell { 10188 - min-height: var(--cal-cell-min-tablet); 10189 10185 padding: 2px; 10190 10186 } 10191 10187 ··· 10261 10257 10262 10258 /* Month grid — compact: no pills, just dots */ 10263 10259 .cal-month-grid { 10264 - grid-auto-rows: minmax(var(--cal-cell-min-mobile), 1fr); 10260 + grid-auto-rows: 1fr; 10265 10261 } 10266 10262 10267 10263 .cal-day-cell { 10268 - min-height: var(--cal-cell-min-mobile); 10269 10264 padding: 1px; 10270 10265 } 10271 10266