feat(notes): גופן כתב-יד ללוח, בהגדרה פר-לוח - #3279
Conversation
הבקשה הייתה שלוח מסוים — "רשימות ביד" — יציג את הפתקים בכתב יד. **המימוש הוא הגדרה ולא לוח קשיח:** למודאל הגדרות הלוח כבר יש שני מתגים פר-לוח, והשלישי נכנס לאותה תבנית בדיוק, עם ``'board-handwriting:' + BOARD_ID`` לצד ``board-markdown:`` ו-``board-infinite:``. כך שם הלוח נשאר בידי המשתמש ואינו כתוב בקוד. **המחלקה יושבת על ``<body>`` ולא על מכל הפתקים.** פתק במצב ``screen`` מרונדר תחת ``document.body`` ולא בתוך המכל, ומחלקה על המכל הייתה מדלגת עליו בשקט — פתק אחד בלוח שנשאר בגופן אחר בלי שום סימן. **קוד נשאר מונוספייס.** הסלקטור עם ``.board-handwriting`` ספציפי יותר מהכללים הקיימים של ``.sticky-md-code`` ו-``.sticky-md-pre``, ובלי החרגה מפורשת הוא היה גובר עליהם דרך הירושה. נתיב קובץ בכתב-יד אינו קריא. מה שנבדק מראש: ה-CSP כבר מתיר את שני המארחים — ``style-src`` את ``fonts.googleapis.com`` ו-``font-src`` את ``fonts.gstatic.com`` — ולכן אין בו שינוי. ``base.html`` כבר טוען Heebo מגוגל עם ``preconnect``, ו-``note_board.html`` יורש ממנו, כך שהגופן נוסף באותה תבנית. הגופן אומת מול המקור ולא מהסניפט: ``curl`` החזיר HTTP 200, שם המשפחה הוא ``'Gveret Levin'``, והוא מכסה עברית (``U+0590-05FF``), ``U+20AA`` ולטינית. יש לו משקל 400 בלבד, ולכן מודגש מסונתז — נבדק בצילום ונמצא קריא כהדגשה. אימות בדפדפן, שלוש טענות שנמדדו ולא הונחו: - **הגופן באמת מרונדר** — רוחב אותה מחרוזת עברית עבר מ-136 ל-160 פיקסלים עם הדלקת המחלקה. ``getComputedStyle`` לבדו אינו ראיה: הוא מציג את מה שהוצהר ב-CSS, לא את מה שרונדר. - **קובץ הגופן יורד רק כשהוא בשימוש** — אפס בקשות woff2 לפני ההדלקה, ושתיים אחריה. זו הטענה על העלות, ולכן היא נמדדה. - **הקוד נשאר מונוספייס** בשני המצבים. לא אימתתי שהגיליון מגוגל נטען בפרודקשן, כי Chromium בסביבה הזו חסום מ-Google Fonts (``net::ERR_CONNECTION_RESET``); לצורך האימות הגשתי את קובצי ה-woff2 מקומית תחת אותו שם משפחה. ה-CSP מתיר, ו-Heebo כבר נטען באותה דרך. שני טסטים חדשים, ושניהם נופלים בלי השינוי: שהמפתח נושא את מזהה הלוח (מפתח גלובלי היה מדליק את כל הלוחות יחד — כשל שנראה זהה בבדיקה ידנית על לוח יחיד), ושהגופן אכן נטען. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019YULCppaQRPYN1RgeY6NBu
|
ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing |
There was a problem hiding this comment.
Sorry @amirbiron, you've used your own review budget of 250,000 diff characters for the last 7 days.
You can request another review in 1 day and 8 hours by commenting @sourcery-ai review. Upgrade to get a review now.
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
🧯 Dangerous deletes guard reportPolicy: see .cursorrules — dangerous deletions are blocked unless wrapped safely. Summary:
Flagged findings (file:line:snippet): Excluded matches (by path pattern) |
Reviewer's GuideIntroduces an opt-in, per-board handwriting presentation mode using the Gveret Levin web font, persisted via board-scoped localStorage, applied at the document body level for all note rendering paths, with code blocks explicitly kept monospace and backed by unit tests and user documentation. Sequence diagram for per-board handwriting modesequenceDiagram
participant User
participant NoteBoard
participant LocalStorage
participant DocumentBody
participant Browser
NoteBoard->>LocalStorage: readHandwriting()
LocalStorage-->>NoteBoard: board-handwriting:BOARD_ID
NoteBoard->>DocumentBody: applyHandwriting(on)
DocumentBody->>Browser: toggle board-handwriting
Browser->>Browser: Apply Gveret Levin to note content
Browser->>Browser: Keep sticky-md-code and sticky-md-pre monospace
User->>NoteBoard: change handwritingToggle
NoteBoard->>LocalStorage: writeHandwriting(on)
NoteBoard->>DocumentBody: applyHandwriting(on)
DocumentBody->>Browser: toggle board-handwriting
Browser->>Browser: Load Gveret Levin when used
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (6)
💤 Files with no reviewable changes (1)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughנוסף מתג כתב יד לכל לוח פתקים. ההעדפה נשמרת לפי מזהה הלוח, הגופן נטען רק בעת הצורך, וגושי קוד נשארים בגופן מונוספייס. נוספו סגנונות, בדיקות ותיעוד. Changesמצב כתב יד
Estimated code review effort: 3 (Moderate) | ~20 minutes Merge Risk: ⚪ Minimal · up to The PR adds an optional per-board handwriting font setting without introducing an actionable merge-blocking risk; it is merge-ready after normal checks and review. Sequence Diagram(s)sequenceDiagram
actor משתמש
participant note_board.html
participant localStorage
participant GoogleFonts
participant document.body
משתמש->>note_board.html: פתיחת לוח או שינוי המתג
note_board.html->>localStorage: קריאה או שמירת ההעדפה לפי מזהה הלוח
note_board.html->>GoogleFonts: טעינת הגופן כאשר ההעדפה פעילה
note_board.html->>document.body: החלה או הסרה של board-handwriting
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
Full details: Description checkExplanation התיאור ברובו מלא ומכסה את המטרה, השינויים, הבדיקות, הסיכונים, התיעוד ותוכנית החזרה לאחור. התיאור המפורט של Claude Code מספק הקשר טכני שימושי. חלק מסעיפי הצ'קליסט, כגון Required Checks וקישורים, נשארו ללא סימון או ללא מידע. Full details: Docstring CoverageExplanation Docstring coverage is 80.00% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 10 functions across 2 files. (3 skipped: 3 unsupported.) ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
⏱️ Performance report(No performance test durations collected. Mark tests with |
📖 Documentation PreviewThe documentation has been built successfully!
To view locally:
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
All reported issues were addressed across 5 files
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
חמישה ממצאי ריוויו על #3279, כולם אומתו בהרצה. אחד מהם התברר עמוק יותר ממה שדווח, ואזהרת CodeQL אינה בעיית אבטחה. **היקף — הגופן נטען בכל 48 התבניות.** ה-``<link>`` ישב ב-``base.html``, שכל התבניות יורשות ממנו, ולכן כל עמוד באפליקציה שילם בקשת CSS חוסמת-רינדור לגופן שמשמש בלוחות בלבד. ההערה שכתבתי ספרה 736 בתים והחמיצה את הלוך-ושוב. הועבר ל-``extra_css`` של ``note_board.html``. **גודל הקוד — הממצא היה תסמין, והמדידה מצאה את השורש.** דווח שהבלוק מציב ``.92em`` גם ל-``.sticky-md-pre`` שהוא ``.88em``. נכון, אבל הקפיצה העיקרית הגיעה מ-``font-size: 1.08em`` על המכל: ``em`` הוא יחסי ומתרבה פנימה, ובלוק קוד קפץ מ-12.32px ל-15.21px. ואבחון נוסף הפך את התיקון: **ב-``font-size``, ``em`` נפתר מול ההורה ולא מול הבסיס של האלמנט.** ``1.08em`` לא הגדיל את ``font-size: 14px`` של המכל ב-8% — הוא **החליף** אותו ב-``16px × 1.08 = 17.28px``, כלומר 23%. ההגדלה מעולם לא עשתה את מה שהיא נועדה לעשות. **ההגדלה הוסרה כליל**, ולא תוקנה. הנימוק שלה היה שהגופן "צר ונמוך"; מדידה הראתה שבאותו ``font-size`` הגובה **זהה** והגופן רק צר יותר, כלומר היא פיצתה על רוחב בכלי שמשנה גובה. בלי ההגדלה, גודל הטקסט וגודל הקוד זהים בדיוק למצב הרגיל — נמדד — ואין מה לנטרל. **ההערה על ההחרגה תיארה מנגנון שגוי.** כתבתי שבלעדיה הגופן "היה גובר על הקוד דרך הירושה, כי הסלקטור ספציפי יותר". הצהרה על האלמנט עצמו תמיד גוברת על ערך שעובר בירושה, וספציפיות האב אינה נכנסת למשוואה. הוכח בדפדפן בנטרול הכלל בזמן ריצה. הכלל נשאר כהגנה עתידית, וההערה נכתבה מחדש. **ההערה על השמירה משקרה.** "רק הדלקה מפורשת נשמרת" בזמן ש- ``writeHandwriting`` שומר גם ``'1'`` וגם ``'0'``. אין באג, אבל ההערה מבטיחה צורה שאינה קיימת. תוקנה לפי הקוד ולא הפוך. **כיסוי — הטסטים בדקו HTML ולא התנהגות.** נוסף ``tests/board-handwriting.test.js``: מחלץ את שלוש הפונקציות מהסקריפט המוטבע בתבנית ומריץ אותן מול ``localStorage`` ו-``document`` מדומים. חמש בדיקות — המפתח נושא את מזהה הלוח, המחלקה מתווספת ומוסרת, הלוך-ושוב מלא של ההעדפה, אי-דליפה בין לוחות, ואחסון חסום שאינו מפיל את הלוח. שלוש מוטציות נבדקו וכל אחת מפילה לפחות טסט אחד. **CodeQL אינו בעיית אבטחה.** הוא יורה על ``assert 'https://fonts.gstatic.com' in html`` — טסט על תבנית מרונדרת, לא אימות URL, ושום החלטת אבטחה אינה נגזרת ממנו. האסרשן עוגן בכל זאת לתגית ה-``preconnect`` המלאה, כי בדיקת הכלה עוברת גם כשההקשר שגוי. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019YULCppaQRPYN1RgeY6NBu
There was a problem hiding this comment.
All reported issues were addressed across 5 files (changes from recent commits).
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
ה-<link> לגופן היה נטען בכל עמוד לוח, גם למי שלא הדליק את ההגדרה מעולם. ההחלטה עוברת לסקריפט inline ב-extra_head שקורא את ההעדפה מ-localStorage בזמן פרסור ה-head: כבוי - אפס בקשות, דלוק - מוקדם בדיוק כמו קישור סטטי. זה אותו דפוס שבו base.html קובע data-theme לפני טעינת ה-CSS, ומאותה סיבה: העדפה שהשרת אינו יכול לדעת, שחייבת להיסגר לפני שהעמוד מצויר. הזרקה בטעינה בלבד אינה מספיקה - הדלקת המתג באמצע הסשן הייתה מחילה את המחלקה על גופן שמעולם לא נטען, והטקסט היה נופל ל-cursive הגנרי. לכן ensureHandwritingFont אידמפוטנטית ונקראת גם מ-applyHandwriting. מפתח ה-localStorage מוגדר פעם אחת בסקריפט הראש ונקרא משם, כדי ששתי מחרוזות נפרדות לא ייסחפו בשקט. וההערה שהוסרה טענה שהמעבר מ-base.html חסך הלוך-ושוב - הוא לא היה קיים מלכתחילה, כי base.html כבר עושה preconnect ומושך את Heebo מאותו מקור. אימות: 12 טסטי התנהגות חדשים, ארבע מוטציות שכל אחת מפילה את הטסט הנכון, ומדידה בדפדפן - כבוי 0 בקשות, דלוק בקשה אחת, הדלקה באמצע הסשן טוענת ומרנדרת (רוחב טקסט 156.5 ← 122.1), וטעינה חוזרת נשארת בקישור אחד. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019YULCppaQRPYN1RgeY6NBu
✨ תיאור קצר
מתג חדש במודאל הגדרות הלוח — כתב יד — שמציג את הפתקים בלוח בגופן כתב-יד עברי (
Gveret Levin). ההגדרה היא לכל לוח בנפרד, כך שאפשר להחזיק לוח אחד ל"רשימות ביד" ולוחות אחרים כרגיל.📦 שינויים עיקריים
הגדרה, לא לוח קשיח
השאלה הפתוחה הייתה אם לייצר לוח מיוחד. התשובה היא הגדרה, כי למודאל כבר יש שני מתגים פר-לוח והשלישי נכנס לאותה תבנית בדיוק:
'board-handwriting:' + BOARD_IDלצדboard-markdown:ו-board-infinite:. כך שם הלוח נשאר בידי המשתמש ואינו כתוב בקוד.שתי החלטות שאינן קוסמטיות
המחלקה יושבת על
<body>ולא על מכל הפתקים. פתק במצבscreenמרונדר תחתdocument.bodyולא בתוך המכל, ומחלקה על המכל הייתה מדלגת עליו בשקט — פתק אחד בלוח שנשאר בגופן אחר בלי שום סימן שמשהו לא עבד.קוד נשאר מונוספייס. הסלקטור עם
.board-handwritingספציפי יותר מהכללים הקיימים של.sticky-md-codeו-.sticky-md-pre, ובלי החרגה מפורשת הוא היה גובר עליהם דרך הירושה מהמכל. נתיב קובץ בכתב-יד אינו קריא.מה שנבדק מראש והסיר סיכון
style-srcאתfonts.googleapis.com, ו-font-srcאתfonts.gstatic.com. זה היה החשש הגדול.base.htmlכבר טוען Heebo מגוגל עםpreconnect, ו-note_board.htmlיורש ממנו.curlהחזיר HTTP 200, שם המשפחה הוא בדיוק'Gveret Levin', והוא מכסה עברית (U+0590-05FF),U+20AAולטינית.ALLOWED_VARIABLES_WHITELISTנוגע לטוקני ערכת נושא, וגופן על מחלקה אינו טוקן. לכן גם לא הוסף משתנה CSS חדש.🧪 בדיקות
שני טסטים חדשים ב-
tests/test_note_boards_ui.py, שניהם נופלים בלי השינוי — נבדק בהרצה:אימות בדפדפן — שלוש טענות שנמדדו
ui-monospaceבשני המצביםהשורה הראשונה חשובה במיוחד:
getComputedStyle().fontFamilyלבדו אינו ראיה — הוא מציג את מה שהוצהר ב-CSS, לא את מה שרונדר. בבדיקה ראשונה הוא הראה"Gveret Levin"בזמן שהגופן כלל לא נטען. רוחב הטקסט הוא מה שמבדיל.לא אימתתי שהגיליון מגוגל נטען בפרודקשן, כי Chromium בסביבה הזו חסום מ-Google Fonts (
net::ERR_CONNECTION_RESET); לצורך האימות הגשתי את קובצי ה-woff2 מקומית תחת אותו שם משפחה. ה-CSP מתיר, ו-Heebo כבר נטען באותה דרך.📝 סוג שינוי
✅ צ'קליסט
docs/user/sticky_notes.rst, לפי הכלל שנוסף ב-feat(notes): מארקדאון מרונדר כברירת מחדל בכל שלושת יעדי הפתקים #3277docs/dev/sticky_notes_extending.rst| המשפט: הכלל "התיעוד למשתמש הוא חלק מהפיצ'ר" חייב את עדכון עמוד המשתמש באותו PR, והכלל עלinnerHTMLנבדק ונמצא לא רלוונטי כאן (CSS ומתג, בלי רינדור טקסט משתמש).🧩 השפעות/סיכונים
🔗 ממצא נלווה (לא תוקן כאן)
בקריאת
sticky_notes_extending.rstהתגלה שהפסקה תחת "רוחב" התיישנה: היא טוענת ש-max-width: 100%על טבלה "דוחסת את העמודות במקום להיגלל, נמדד בדפדפן". המדידה שמאחוריה נעשתה על פתק צר שנבנה לצורך הבדיקה ואינו מייצג את הרוחב שבו הפתקים בשימוש. תיאור הקוד עצמו עדיין מדויק — רק הנימוק חלש. לא צורף לכאן כדי לא לערבב נושאים.🧯 סיכון / החזרה לאחור
תבניות ו-CSS בלבד, בלי מיגרציה ובלי שינוי סכימה. חזרה לאחור היא
git revertשל הקומיט.Generated by Claude Code
Summary by Sourcery
Add an optional per-board handwriting style for sticky notes while preserving existing board preferences and code readability.
New Features:
Enhancements:
Documentation:
Tests: