Skip to content
palmoni5 edited this page Jul 17, 2026 · 1 revision

רכיבי UI משותפים

כל הרכיבים המשותפים יושבים ב־lib/widgets/, מאורגנים בתיקיות לפי תפקיד, עם barrel export ב־widgets_exports.dart. שימוש ברכיבים אלה הוא חובה — אין ליצור כפתורים/דיאלוגים/שדות טקסט חלופיים.

טקסט ו־RTL

RtlTextField — ‏widgets/text/rtl_text_field.dart

שדה הטקסט היחיד המותר בפרויקט. מתקן שורת באגים של Flutter Desktop ב־RTL: מקשי חיצים הפוכים, ‏collapse של בחירה, נראות סמן, תפריט הקשר, ‏autofocus באנדרואיד. מנהל את הבהוב הסמן בעצמו (חצי־מחזור 500ms, ‏timeout ‏8 שניות) — לכן main.dart קובע EditableText.debugDeterministicCursor = true.

RtlIcon — ‏widgets/misc/rtl_icon.dart

אייקון מודע־RTL: אייקונים כיווניים (חיצים, שברונים, פאנלים) מתהפכים אוטומטית כשהכיוון RTL. שלושה מנגנונים:

  • _fluentMirrorMap — החלפה לוריאנט הנגדי של FluentUI (‏chevron_right ← ‏chevron_left).
  • _materialMirrorMap — אותו דבר לאייקוני Material בודדים מותרים.
  • _flippableIcons — היפוך גאומטרי לאייקונים ללא וריאנט נגדי (book_24_filled וכו').

אייקון שאינו רשום — משתמשים ב־Icon רגיל. אסור Transform.flip ידני — רושמים במפות במקום.

smart_text/

רינדור תוכן הספרים: ‏SmartText, ‏SimpleInlineHtml, ‏TextRendererService, ‏RenderSettings — המרת HTML/טקסט של ספרים לתצוגה עם הגדרות (גופן, גודל, ניקוד).

פקדים — widgets/controls/

ActionButton — ‏action_buttons.dart

כפתור אחיד עם בנאים ממוינים לפי תפקיד:

בנאי סגנון שימוש
.recommended FilledButton (primary) פעולה מומלצת
.neutral FilledButton.tonal פעולה ניטרלית/מסוכנת
.ghost TextButton שקוף פעולת משנה (ביטול, סגירה)
.warning TextButton בצבע error אישור הרסני (מחיקה)

תומך ב־icon, ‏isLoading (מחוון טעינה), ‏focusNode/autofocus. באותו קובץ גם SecondaryIconButton, ‏PrimaryIconButton, ‏ToolbarActionButton.

נוספים

CustomSwitch, ‏AppSegmentedControl + ‏SegmentOption (בורר מקוטע ל־2–4 אפשרויות).

דיאלוגים — widgets/dialogs/

AppDialog — ‏app_dialogs.dart

דיאלוג Material 3 עם ניווט מקלדת מלא (חיצים/Enter/Escape) והדגשת פוקוס. בנאים: .singleAction (אישור בלבד), .twoActions (ביטול+אישור), .warning (פעולה מסוכנת — כפתור הביטול הוא המומלץ). ה־onConfirm יכול לעצור סגירה לצורך ולידציה. פונקציות נוחות: showSingleActionDialog, ‏showTwoActionsDialog, ‏showWarningDialog.

דיאלוגים ייעודיים נוספים: קלט (input_dialog), אישור, סיסמה, בחירה, שליחת דוא"ל לדיווח שגיאה, התקדמות חילוץ ZIP.

הודעות למשתמש — UiSnack

lib/core/ui_snack.dart — מערכת ההתראות היחידה (לא SnackBar של Flutter!). מבוססת OverlayEntry על navigatorKey הגלובלי:

  • ‏API: ‏show, ‏showError, ‏showSuccess, ‏showWarning, ‏showQuick, ‏showWithAction, ‏hide.
  • עיצוב: אפקט זכוכית (blur), אנימציית scale+fade, החלקה לסגירה, haptic feedback.
  • כל הטקסטים מרוכזים ב־lib/core/messages/ — תשעה קטלוגים לפי תחום (CommonMessages, ‏LibraryMessages, ‏TextBookMessages, ‏PdfMessages, ‏SettingsMessages, ‏NotesMessages, ‏PluginMessages, ‏ReportMessages, ‏ToolsMessages). אסור להעביר מחרוזת קשיחה ל־UiSnack — מוסיפים לקטלוג המתאים.

כרטיסי הגדרות

lib/settings/widgets/settings_card.dart:

  • SettingsCard — כרטיס הגדרות עם title, ‏subtitle, ‏children (מפרידים אוטומטיים ביניהם), ו־cardId המשמש עוגן לחיפוש בהגדרות (גלילה + הבהוב).
  • SettingsActionTile — שורות הגדרה: ‏switchTile / ‏dropdownTile / ‏segmentedTile (בורר מקוטע בתוך שורה).

פריסה, רשימות ומשוב

  • layout/ — ‏AppCard, ‏ExpandableCard, ‏AdaptiveSidePane, ‏DualAdaptiveReaderPane (זוג חלוניות קורא אדפטיבי), ‏ReaderSidePanelShell, ‏ResizableDragHandle, ‏FloatingPanel, ‏ContextOverlayPanel (חלונית תצוגה מקדימה), ‏CommentatorsFilterScreen.
  • feedback/ — ‏AppFutureBuilder, ‏LoadingIndicator, ‏IndexingStatusOverlay, ‏ToolEmptyState, ‏ScrollablePositionedListScrollbar (סקרולבר לרשימות ממוקמות).
  • lists/ — ‏ItemsListView, ‏NavigationTreeTile, ‏FilterChipsWidget, ‏CommentatorsSelectionPanel.
  • navigation/ — ‏AppTopBar, ‏NavRailItem, ‏BookViewActions, ‏ResponsiveActionBar (סרגל פעולות שמתקפל לפי רוחב), ‏ReaderNavCenter, ‏SearchPaneBase.
  • misc/ — ‏RestartWidget (אתחול מחדש של ה־runtime בלי לסגור את התהליך), ‏AppContextMenu, ‏AppPopupMenu, ‏AppDropdownField, ‏LinkPreviewOverlay, ‏KeyboardDialogNavigation, ‏ProgressiveScrolling.

דפים קשורים

Clone this wiki locally