Skip to content

MSA-I/SHON-APP

Repository files navigation

שון בלאיש — אפליקציית תכנון אירועים

אפליקציית דסקטופ מקומית למעצב האירועים שון בלאיש — פגישות לקוחות, בחירת עיצובים, חתימה דיגיטלית, ייצוא DOCX יוקרתי בעימוד עריכתי דו-מותגי (שון בלאיש · גאמוס), ושיתוף ישיר עם הזוג בוואטסאפ / אימייל.

Stack: Tauri 2 · React 19 · TypeScript · Vite 7 · Tailwind v4 · IndexedDB · docx@8 · Framer Motion 12

Local-first. אין שרת, אין ענן, אין התחברות. הכל נשמר במכונה של שון. Hebrew RTL מכל קצה לקצה. תמונות לא מועתקות — האפליקציה קוראת מהתיקיות הקיימות בלבד.


דרישות מקדימות

כלי גרסה
Node.js 20+ (מומלץ 22)
Rust + Cargo latest stable (winget install Rustlang.Rustup)
Windows 10/11 x64
WebView2 מותקן ברירת מחדל ב-Windows 11

התקנה ראשונה

# 1. קלון לתיקייה הקבועה (עם תיקיות התמונות לידה)
git clone https://github.com/MSA-I/SHON-APP.git "F:/MyFiles/העסק שלי/שון בלאיש"
cd "F:/MyFiles/העסק שלי/שון בלאיש/app"

# 2. התקנת תלויות
npm install

# 3. בנייה ל-installer (.exe)
npm run tauri:build

ה-bundle target ב-tauri.conf.json נעול ל-nsis (WiX/MSI נכשל בנתיבים עם עברית). ה-installer יווצר ב:

app/src-tauri/target/release/bundle/nsis/Shon Blaish_<version>_x64-setup.exe

הרצת ה-installer פעם אחת — והאפליקציה זמינה כקיצור דרך רגיל.

אם בילד נתקע / האייקון לא מתעדכן: הרץ cd app/src-tauri && cargo clean ואז npm run tauri:build שוב. tauri-winres מטביע את האייקון לתוך ה-exe רק על קומפילציה מלאה של ה-crate.


פיתוח (dev mode)

cd app
npm run tauri:dev    # פותח את האפליקציה עם hot reload

טסטים:

npx vitest run       # ~189 טסטים (12 test files)
npx tsc --noEmit     # type check

מבנה התיקיות הצפוי

F:/MyFiles/העסק שלי/שון בלאיש/
├── app/                            # קוד האפליקציה (Tauri + React)
│   ├── public/
│   │   ├── logo.svg                # SB monogram (שחור על לבן — הפונט הקנוני)
│   │   └── assets/
│   │       └── gamos-logo.png      # לוגו גאמוס (לכריכה דו-מותגית ב-DOCX)
│   └── src-tauri/                  # Rust backend
├── architecture/                   # SOPs (16 מסמכים)
├── assets/                         # לוגואים מקור (SVG)
├── claude.md                       # חוקה: סכמות נתונים, חוקי התנהגות
├── task_plan.md                    # שלבי הפרויקט
├── progress.md                     # יומן התקדמות
├── findings.md                     # תובנות והחלטות עיצוב
│
├── events/                         # ⚙️ נוצר אוטומטית — DOCXים מיוצאים
│   └── <couple-names>_<yyyy-mm-dd>_<id8>/plan.docx
├── backups/                        # ⚙️ נוצר אוטומטית — JSON גיבויים (rolling 30)
├── .trash/<timestamp>/             # ⚙️ קבצים שנמחקו ידנית בתחזוקה (reversible)
│
└── [תיקיות תמונות — לא בריפו, נמצאות מקומית]
    ├── אולם עיצוב בסיס 2026/
    ├── חופות אולם גדול גאמוס/
    ├── חופות ריזורט/
    ├── חופות שידרוג/
    ├── מפות מפיות/                  # ~157 תמונות (אחרי סינון 231 כפילויות + 51 תמונות לא-מפיות)
    ├── עיצובים שידרוג/
    ├── ריזורט בסיס/
    ├── לא מתוייגים/                 # 🆕 קטגוריה-הסגר לתמונות שזמנית לא משויכות (2026-06-03)
    ├── כסא כלה בחוץ בסיס.jpg
    └── כסא כלה בתוך האולם.jpg

חשוב: הריפו לא מכיל את התמונות. הן חיות מקומית בנפרד וצריכות להיות באותה תיקיית-אם של הפרויקט (F:/MyFiles/העסק שלי/שון בלאיש/). שורש הפרויקט מתגלה בריצה: lib/config.ts:getProjectRoot() בודק ערך שמור ב-IndexedDB, ואחר־כך מנסה רשימה של נתיבים מועמדים על מספר כוננים; אם אף אחד לא תואם — תיפתח בחירת תיקייה.


הרצה ראשונה (First Boot)

  1. בהפעלה ראשונה תיפתח ה-Tagging Pass — סריקה אוטומטית של כל ספריית התמונות עם תיוג מבוסס שם־קובץ + טווחי-עריכה אוצרים + היסטוגרמה צבעונית, עם דירוג נושא ראשי משוקלל כך שלא נכנסות תוויות-אגב (לדוגמה: תמונת פרחים שמכילה גם מפית לא תקבל תווית "מפית"). מה שלא ברור — שון מתייג ידנית.
  2. תיוג הוא רך: תמונות שכבר נבחרו וזוהו לקטגוריה (לפי שם תיקייה) נשארות שם — התיוג מוסיף תוויות־משנה (צבע, סוג בד, סגנון) לשימוש בצ'יפי המשנה של הגלריה.
  3. בסיום הריצה (taggingComplete=true) ה-pass נסגר לתמיד — מסך הבית הופך זמין. אפשר לפתוח Re-tag מ-Settings → "תייג מחדש את כל הספרייה" אם משהו שנגוי.
  4. גיבוי אוטומטי נוצר ב-backups/ בכל חתימה / השלמת אירוע / סיום ה-Tagging Pass.

תזרים פגישת לקוח (End-to-End)

  1. לקוח חדש → שמות בני הזוג + טלפון (+ אימייל אופציונלי).
  2. אירוע חדש → 6 טאבים: פרטי אירוע · מפיות · עיצובי שולחן · חופה · שדרוגים · סיכום.
  3. בכל טאב עם תמונות יש כפתור "פתח גלריה" + תצוגת תגיות (מסונכרנות עם ה-Tagging Pass). כל בחירת תמונה מאפיית מראש thumbnail 256px לתוך IDB — כך שכשהזוג חוזר לפגישה הבאה, הסיכום מציג מיד את הבחירות גם בלי לעבור דרך הגלריה.
  4. במסך סיכום הזוג חותם דיגיטלית. החתימה נשמרת כקווי-וקטור (SignatureStroke[]) ונצבעת לפי ה-theme הפעיל — כהה במצב כהה, כהה־על־קרם במצב בהיר. ייצוא ל-DOCX תמיד מרסטר אותה לדיו שחור על רקע לבן (Behavioral Rule #13).
  5. לחיצה על "ייצוא Word" מייצרת events/<couple-names>_<yyyy-mm-dd>_<id8>/<...>.docx — שם תיקייה ושם קובץ קריאים בעברית NFC, עם 8 תווים ראשונים של ה-eventId לסילוק התנגשויות.
  6. כריכת DOCX דו-מותגית: עמוד 1 כולל את לוגו שון (110×110, ריבוע), לוגו גאמוס (150×93, יחס 1.6:1), והוורדמרק שלהם זה לצד זה ("שון בלאיש"/"הפקות" מימין, "גאמוס"/"אירועים" משמאל). מתחת — שמות הזוג, תאריך + יום, שעה, ❖, וכבר על אותו עמוד גם בלוק "פרטי האירוע" עם טבלת השדות.
  7. כל עמוד גוף נושא בכותרת רצה: לוגו מיני SB + "שון בלאיש · הפקות" + מתחת "גאמוס · אירועים" + קו זהב דק.
  8. שיתוף ישיר אחרי הייצוא:
    • שלח באימייל — פותח לקוח אימייל ברירת־מחדל עם נושא + body בעברית.
    • שלח בוואטסאפ — פותח wa.me עם הודעה מוכנה (טלפון מנורמל ל-972...).
    • פתח קובץ — פותח את ה-DOCX ב-Word ישירות (אם ננעל — fallback לחשיפה ב-Explorer).
    • בשני מקרי השיתוף תיקיית האירוע נפתחת אוטומטית ב-Explorer לגרירת הקובץ ידנית (אין attachment slot ב-mailto: או ב-wa.me).

עיצוב יוקרתי

  • Luxury Editorial — דיו עמוק, קרם, וזהב עתיק. כותרות ב-Frank Ruhl Libre, גוף ב-Heebo.
  • שני לוחות נושא — מצב כהה (ברירת מחדל) ובהיר. ה-curtain toggle ב-AppBar מתחלף בין "כהה ☾" ו"בהיר ☼" וערך זה נשמר ב-meta.theme.
  • לוגו ה-AppBar — מודפס על "פלטה" לבנה ייעודית (8px padding, 4px radius) כך שלוגו השחור־על־לבן הקנוני נשאר ברור גם על קנבס כהה.
  • ייצוא DOCX תמיד בהיר — גם אם המשתמש בחר theme כהה ב-UI. שני הלוגואים, החתימה, וכל הפלטות מוקבעים ל-Behavioral Rule #13.

ניהול תמונות לכל המשתמש

סימון כפילויות בסשן (X על תמונה)

כל תמונה בגלרייה מציגה כפתור × בריחוף. לחיצה מסתירה את התמונה מכל הגלרייה ומוסיפה אותה ל-backups/marked-duplicates.json. הקובץ נשמר על-פני סשנים, כך שאם המשתמש סוגר את האפליקציה ופותח שוב — הסימונים נשארים.

באנר עליון בגלרייה מציג "סומנו ככפילויות: N" + כפתור "החזר הכל" שמאפס גם את הזיכרון וגם את הקובץ. מפתח הריפו יכול לקרוא את הקובץ ולהסיר את הקבצים פיזית דרך .tmp/finish-marked.py (מעביר ל-.trash/<ts>-user-marked/, סורק גם את שאר 7 הקטגוריות לעותקים זהים לפי name+size+md5).

קטגוריית "לא מתוייגים" (Quarantine)

קטגוריה תשיעית סינתטית לתמונות שלא ממלאות את המסגרת או לא משויכות לאף קטגוריה אחרת. עובדת כך:

  1. על-ידי המפתח — סקריפט .tmp/classify-non-napkin.py מעביר אוטומטית תמונות "חשודות" ל-<root>/לא מתוייגים/ (דרך 4 פיצ'רים פרספטואליים, כלל "2-of-4 fires"). דווח: 51 תמונות הועברו מ-מפות מפיות/.
  2. על-ידי שון — בגלרייה (כשהוא נכנס דרך השדרוגים), הוא רואה את הקטגוריה 'לא מתוייגים' ויכול לתייג כל תמונה דרך ה-Tagging Pass עם userCategory נכון.
  3. אוטומטית בכל פתיחהlib/recategorize-untagged.ts:recategorizeUntaggedImages() רץ בתחילת כל פתיחת גלרייה. תמונות בקטגוריית ההסגר שקיבלו userCategory חוקי מועברות פיזית לתיקייה הנכונה (ב-safeMoveFile עם dual-assertInsideRoot). כשתיקיית ההסגר מתרוקנת — היא לא מוצגת בגלרייה.

הקטנת מקור (one-time)

ב-2026-06-03 רץ .tmp/redo-napkin-resize.py שהקטין את כל מקור תמונות המפיות מ-5472×3648 (4.5MB) ל-1500px JPEG q=92 (~150KB). חיסכון: 989MB → 46MB. המקורות שמורים ב-.trash/2026-06-03-*-napkin-originals/. התוצאה — איכות גלריה זהה לקטגוריות האחרות שהיו כבר בגודל מתאים מראש.

THUMBNAIL_GENERATION הוקפץ מ-2 ל-3 כדי לגרום ל-IDB cache של ה-thumbnails לאפות מחדש מהמקורות החדשים.


גיבוי ושחזור

פעולה מיקום
גיבוי ידני Settings → "ייצוא גיבוי"
שחזור Settings → "ייבוא גיבוי"
גיבויים אוטומטיים backups/backup_YYYY-MM-DD_HH-mm.json (rolling 30)
Schema version BACKUP_SCHEMA_VERSION = 2 (תומך גם ב-v1 עם migration)

חוקי הפרויקט

ראה claude.md לחוקה המלאה. הכי חשוב:

  1. אין רשת — שום API חיצוני, שום הרשאות, שום ענן. כפתורי השיתוף משתמשים ב-tauri-plugin-opener עם scope מצומצם (mailto:*, https://wa.me/*, https://api.whatsapp.com/* בלבד) שמעביר את ה-URL ל-OS — האפליקציה עצמה לא מבצעת fetch.
  2. תמונות נשארות במקום — האפליקציה לא מעתיקה אותן. (חריג חד-פעמי 2026-05-26: סינון כפילויות פיזיות הועברו ל-.trash/<timestamp>/, לא נמחקו, לפי הוראת המשתמש.)
  3. DOCX תמיד בהיר — גם אם המשתמש בחר theme כהה ב-UI.
  4. אין מחירים — שדרוגים הם טקסט תיאורי בלבד.
  5. אין mobile — desktop only.

רישוי

פרויקט פרטי עבור שון בלאיש הפקות.

About

Hebrew RTL local-first Tauri 2 + React 19 desktop app for premium wedding/Bar Mitzvah event design. Captures clients, events, image selections (520+ refs), signatures; exports DOCX. Install: cd app && npm install && npm run tauri:build -- --bundles nsis

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages