/**
 * AppShell — Sidebar גלובלי לכל מסכי YBP
 * - ניווט גלובלי + סקציית פרויקט (כשרלוונטי)
 * - Collapse ל-52px (אייקונים בלבד) + tooltip
 * - Mobile drawer (< 768px) עם hamburger
 */
(function () {

const { useState, useEffect, useCallback } = React;

const SIDEBAR_KEY = 'ybp_sidebar_collapsed';
const SIDEBAR_WIDTH = 240;
const SIDEBAR_COLLAPSED = 52;

// ── Nav items גלובליים ────────────────────────────────────────────────────────
const NAV_MAIN = [
  { k: 'dashboard', icon: 'grid',   label: 'לוח בקרה' },
  { k: 'list',      icon: 'folder', label: 'פרויקטים' },
];
// מוקפא — נשמר לשימוש עתידי, אל תמחק:
//   { k: 'tenders',   icon: 'inbox',     label: 'מכרזים' },
//   { k: 'protocols', icon: 'file_text', label: 'פרוטוקולים' },  // עובר לעמוד הדוחות בשם "סיכום פגישה"
const NAV_FEATURES = [
  { k: 'contacts',  icon: 'users',  label: 'אנשי קשר' },
];
const NAV_BOTTOM = [
  { k: 'settings',  icon: 'settings', label: 'הגדרות' },
];

// ── Tooltip ───────────────────────────────────────────────────────────────────
function Tooltip({ label, show }) {
  if (!show) return null;
  return (
    <div style={{
      position: 'absolute', right: 'calc(100% + 8px)', top: '50%',
      transform: 'translateY(-50%)',
      background: 'var(--ybp-navy)', color: '#e8edf5',
      padding: '5px 10px', borderRadius: 6, fontSize: 12, fontWeight: 600,
      whiteSpace: 'nowrap', pointerEvents: 'none',
      boxShadow: '0 2px 8px rgba(0,0,0,0.3)',
      border: '1px solid rgba(255,255,255,0.08)',
      zIndex: 99999,
    }}>
      {label}
      <div style={{
        position: 'absolute', right: -5, top: '50%', transform: 'translateY(-50%)',
        width: 0, height: 0,
        borderTop: '5px solid transparent', borderBottom: '5px solid transparent',
        borderLeft: '5px solid var(--ybp-navy)',
      }} />
    </div>
  );
}

// ── NavItem ───────────────────────────────────────────────────────────────────
function NavItem({ item, active, collapsed, onClick }) {
  const [hover, setHover] = useState(false);
  const isActive = active === item.k;
  return (
    <div style={{ position: 'relative' }}
      onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}>
      <button onClick={() => onClick(item.k)} style={{
        display: 'flex', alignItems: 'center', gap: collapsed ? 0 : 11,
        padding: collapsed ? '9px' : '9px 14px',
        justifyContent: collapsed ? 'center' : 'flex-start', width: '100%',
        background: isActive ? 'var(--ybp-sb-active-bg)' : hover ? 'var(--ybp-sb-hover)' : 'transparent',
        color: isActive ? 'var(--ybp-sb-active-ink)' : 'var(--ybp-sb-ink)',
        border: '1px solid transparent', borderRadius: 'var(--ybp-radius-pill)',
        cursor: 'pointer', fontFamily: 'Assistant, sans-serif',
        fontSize: 13.5, fontWeight: isActive ? 600 : 400,
        textAlign: 'right', transition: 'all 0.12s', minHeight: 40, boxSizing: 'border-box',
      }}>
        <DSIcon name={item.icon} size={collapsed ? 21 : 19}
          color={isActive ? 'var(--ybp-sb-active-ink)' : 'var(--ybp-sb-ink-soft)'} />
        {!collapsed && <span style={{ flex: 1 }}>{item.label}</span>}
      </button>
      {collapsed && <Tooltip label={item.label} show={hover} />}
    </div>
  );
}

// ── SidebarNavItem — פריט ניווט בסיידבר עם hover state משלו ──────────────────
function SidebarNavItem({ item, isActive, collapsed, isMobile, onClose }) {
  const [hover, setHover] = useState(false);
  return (
    <div style={{ position: 'relative' }}
      onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}>
      <button onClick={() => { item.onClick && item.onClick(); if (isMobile) onClose(); }} style={{
        display: 'flex', alignItems: 'center', gap: collapsed ? 0 : 11,
        padding: collapsed ? '9px' : '9px 14px',
        justifyContent: collapsed ? 'center' : 'flex-start', width: '100%',
        background: isActive ? 'var(--ybp-sb-active-bg)' : hover ? 'var(--ybp-sb-hover)' : 'transparent',
        color: isActive ? 'var(--ybp-sb-active-ink)' : 'var(--ybp-sb-ink)',
        border: '1px solid transparent', borderRadius: 'var(--ybp-radius-pill)',
        cursor: 'pointer', fontFamily: 'Assistant, sans-serif',
        fontSize: 13.5, fontWeight: isActive ? 600 : 400,
        textAlign: 'right', transition: 'all 0.12s', minHeight: 40, boxSizing: 'border-box',
      }}>
        <DSIcon name={item.icon} size={collapsed ? 21 : 19}
          color={isActive ? 'var(--ybp-sb-active-ink)' : 'var(--ybp-sb-ink-soft)'} />
        {!collapsed && <span style={{ flex: 1 }}>{item.label}</span>}
      </button>
      {collapsed && <Tooltip label={item.label} show={hover} />}
    </div>
  );
}

// ── ProjectSection — סקציית פרויקט נוכחי ────────────────────────────────────
function ProjectSection({ projectNav, collapsed, onClose, isMobile, activeSubView }) {
  if (!projectNav) return null;
  const items = projectNav.items || [];
  return (
    <>
      {/* שם הפרויקט — כותרת גדולה וכהה */}
      <div style={{ margin: '6px 10px 2px', flexShrink: 0 }}>
        {!collapsed ? (
          <div style={{
            fontSize: 15, fontWeight: 600, color: 'var(--ybp-ink)',
            padding: '12px 6px 8px',
            borderTop: '1px solid var(--ybp-sb-divider)',
            overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap',
          }}>
            {projectNav.projectName || 'פרויקט נוכחי'}
          </div>
        ) : (
          <div style={{ height: 1, background: 'var(--ybp-sb-divider)', margin: '6px 0' }} />
        )}
      </div>
      {/* רשימת הפריטים — שטוחה, בלי כותרות קבוצה */}
      <div style={{ padding: '0 8px', display: 'flex', flexDirection: 'column', gap: 2, flexShrink: 0 }}>
        {items.map((item, i) => (
          <SidebarNavItem key={i} item={item}
            isActive={!!item.subView && activeSubView === item.subView}
            collapsed={collapsed} isMobile={isMobile} onClose={onClose} />
        ))}
        {/* Drive — מוצג רק אם חובר handler (לא בשלב 1). אל תמציא ניווט. */}
        {projectNav.onOpenDrive && (
          <>
            <div style={{ height: 1, background: 'var(--ybp-sb-divider)', margin: '8px 8px' }} />
            <SidebarNavItem item={{ icon: 'cloud', label: 'Drive', onClick: projectNav.onOpenDrive }}
              isActive={false} collapsed={collapsed} isMobile={isMobile} onClose={onClose} />
          </>
        )}
      </div>
    </>
  );
}

// ── AppSidebar ────────────────────────────────────────────────────────────────
function AppSidebar({ active, onNav, collapsed, onToggleCollapse, onClose, isMobile, projectNav, activeSubView, adminViewAll, onToggleViewAll, isAdmin }) {
  const session = window.YBP_AUTH ? window.YBP_AUTH.getSession() : null;

  return (
    <aside style={{
      width: collapsed ? SIDEBAR_COLLAPSED : SIDEBAR_WIDTH,
      background: 'var(--ybp-sb-bg)',
      display: 'flex', flexDirection: 'column',
      height: '100%',
      transition: 'width 0.2s ease',
      overflow: 'hidden',
      flexShrink: 0,
      borderLeft: '1px solid var(--ybp-sb-divider)',
      direction: 'rtl',
    }}>
      {/* Header */}
      <div style={{
        padding: collapsed ? '12px 8px' : '12px 14px',
        borderBottom: '1px solid var(--ybp-sb-divider)',
        display: 'flex', alignItems: 'center',
        justifyContent: collapsed ? 'center' : 'space-between',
        minHeight: 52, flexShrink: 0,
      }}>
        {!collapsed && (
          <div style={{ fontSize: 11, fontWeight: 700, color: 'var(--ybp-sb-ink-soft)', letterSpacing: 1, textTransform: 'uppercase' }}>
            תפריט
          </div>
        )}
        {isMobile ? (
          <button onClick={onClose} style={{
            background: 'transparent', border: 'none', color: 'var(--ybp-sb-ink-soft)',
            cursor: 'pointer', padding: 6, borderRadius: 6, fontSize: 18, lineHeight: 1,
          }}>✕</button>
        ) : (
          <button onClick={onToggleCollapse} title={collapsed ? 'הרחב תפריט' : 'כווץ תפריט'} style={{
            background: 'var(--ybp-sb-hover)', border: '1px solid var(--ybp-sb-divider)',
            color: 'var(--ybp-sb-ink-soft)', cursor: 'pointer',
            padding: '4px 8px', borderRadius: 6, fontSize: 11, fontWeight: 700,
            fontFamily: 'Assistant, sans-serif', transition: 'all .15s', lineHeight: 1,
          }}>
            {collapsed ? '›' : '‹'}
          </button>
        )}
      </div>

      {/* Scrollable nav area */}
      <div style={{ flex: 1, overflowY: 'auto', display: 'flex', flexDirection: 'column' }}>

        {/* Nav — main */}
        <div style={{ padding: '8px', display: 'flex', flexDirection: 'column', gap: 2, flexShrink: 0 }}>
          {NAV_MAIN.map(item => (
            <NavItem key={item.k} item={item} active={active} collapsed={collapsed}
              onClick={(k) => { onNav(k); if (isMobile) onClose(); }} />
          ))}
        </div>

        {/* Project section */}
        <ProjectSection
          projectNav={projectNav}
          collapsed={collapsed}
          onClose={onClose}
          isMobile={isMobile}
          activeSubView={activeSubView}
        />

        {/* Divider + NAV_FEATURES — רק כשלא בתוך פרויקט */}
        {!projectNav && (
          <>
            <div style={{ height: 1, background: 'var(--ybp-sb-divider)', margin: '6px 12px', flexShrink: 0 }} />
            <div style={{ padding: '8px', display: 'flex', flexDirection: 'column', gap: 2, flexShrink: 0 }}>
              {NAV_FEATURES.map(item => (
                <NavItem key={item.k} item={item} active={active} collapsed={collapsed}
                  onClick={(k) => { onNav(k); if (isMobile) onClose(); }} />
              ))}
            </div>
          </>
        )}
      </div>

      {/* Bottom */}
      <div style={{ padding: '8px', borderTop: '1px solid var(--ybp-sb-divider)', flexShrink: 0 }}>
        {NAV_BOTTOM.map(item => (
          <NavItem key={item.k} item={item} active={active} collapsed={collapsed}
            onClick={(k) => { onNav(k); if (isMobile) onClose(); }} />
        ))}
        {/* User info */}
        {!collapsed && session && (
          <div style={{
            display: 'flex', alignItems: 'center', gap: 8,
            padding: '10px 12px', marginTop: 4,
            borderTop: '1px solid var(--ybp-sb-divider)',
          }}>
            <div style={{
              width: 30, height: 30, borderRadius: '50%', flexShrink: 0,
              background: 'var(--ybp-navy)',
              display: 'flex', alignItems: 'center', justifyContent: 'center',
              fontSize: 11, fontWeight: 700, color: '#fff',
            }}>
              {(session.name || '?').split(' ').map(w => w[0]).join('').slice(0,2)}
            </div>
            <div style={{ flex: 1, minWidth: 0 }}>
              <div style={{ fontSize: 12, fontWeight: 600, color: 'var(--ybp-ink)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{session.name}</div>
              <div style={{ fontSize: 10, color: 'var(--ybp-sb-ink-soft)' }}>
                {session?.role === 'admin' ? 'מנהל ראשי' : session?.role === 'pm' ? 'מנהל פרויקט' : 'צופה'}
              </div>
            </div>
          </div>
        )}
        {collapsed && session && (
          <div style={{ display: 'flex', justifyContent: 'center', padding: '8px 0' }}>
            <div style={{
              width: 30, height: 30, borderRadius: '50%',
              background: 'var(--ybp-navy)',
              display: 'flex', alignItems: 'center', justifyContent: 'center',
              fontSize: 11, fontWeight: 700, color: '#fff',
            }}>
              {(session.name || '?').split(' ').map(w => w[0]).join('').slice(0,2)}
            </div>
          </div>
        )}
        {/* v70 — בורר תצוגה אדמין (הועבר מהבאנר העליון). מכווץ/לא-אדמין → לא מוצג */}
        {!collapsed && isAdmin && (
          <div style={{ borderTop:'1px solid var(--ybp-sb-divider)', paddingTop:8, marginTop:4 }}>
            <div style={{ fontSize:10, opacity:0.6, marginBottom:4, color:'var(--ybp-sb-ink-soft)' }}>תצוגה</div>
            <button onClick={onToggleViewAll}
              style={{ width:'100%', textAlign:'right', background:'var(--ybp-input-bg)', border:'1px solid var(--ybp-sb-divider)', borderRadius:6, padding:'6px 10px', fontSize:12, cursor:'pointer', fontWeight:600, color:'var(--ybp-ink)', fontFamily:'inherit' }}>
              {adminViewAll ? '🌐 כל הפרויקטים' : '👤 הפרויקטים שלי'}
            </button>
          </div>
        )}
      </div>
    </aside>
  );
}

// ── AppShell ──────────────────────────────────────────────────────────────────
function AppShell({ children, active, onNav, crumbs, actions, title, subtitle, onBack, projectNav, activeSubView, projectId, adminViewAll, onToggleViewAll, isAdmin }) {
  const [collapsed, setCollapsed] = useState(() => {
    try { return localStorage.getItem(SIDEBAR_KEY) === 'true'; } catch { return false; }
  });
  const [mobileOpen, setMobileOpen] = useState(false);
  const [versionBanner, setVersionBanner] = useState(null);
  const [emergencySaves, setEmergencySaves] = useState([]);
  const { isMobile, isLandscape } = useViewport();

  // v65 #4 — מסך מלא לגאנט במובייל-landscape: הגאנט מדליק window.YBP_FULLSCREEN, וכאן מסתירים הדר/פוטר.
  const [fullscreen, setFullscreen] = useState(() => !!window.YBP_FULLSCREEN);
  useEffect(() => {
    const onFs = () => setFullscreen(!!window.YBP_FULLSCREEN);
    window.addEventListener('ybp-fullscreen', onFs);
    return () => window.removeEventListener('ybp-fullscreen', onFs);
  }, []);
  const chromeHidden = isMobile && fullscreen;

  useEffect(() => {
    window.showVersionBanner = (payload) => {
      if (typeof payload === 'string') setVersionBanner({ msg: payload, urgent: false });
      else setVersionBanner({ msg: payload.msg, urgent: !!payload.urgent });
    };
    return () => { delete window.showVersionBanner; };
  }, []);

  // Emergency save — מאזין ל-SW takeover
  useEffect(() => {
    if (!('serviceWorker' in navigator)) return;
    const handler = () => {
      try {
        if (window.YBP_FORM_DIRTY && window.YBP_FORM_STATE_SNAPSHOT) {
          const k = 'ybp_emergency_' + Date.now();
          localStorage.setItem(k, JSON.stringify({
            savedAt: Date.now(),
            snapshot: window.YBP_FORM_STATE_SNAPSHOT,
            screen: window.YBP_CURRENT_SCREEN || null,
          }));
          console.warn('[YBP] Emergency save:', k);
        }
      } catch {}
    };
    navigator.serviceWorker.addEventListener('controllerchange', handler);
    return () => navigator.serviceWorker.removeEventListener('controllerchange', handler);
  }, []);

  // בדיקת emergency saves מהפעלה קודמת
  useEffect(() => {
    const keys = [];
    for (let i = 0; i < localStorage.length; i++) {
      const k = localStorage.key(i);
      if (k && k.startsWith('ybp_emergency_')) keys.push(k);
    }
    if (keys.length > 0) {
      const saves = [];
      for (const k of keys) {
        try { saves.push({ key: k, ...JSON.parse(localStorage.getItem(k)) }); } catch {}
      }
      if (saves.length > 0) setEmergencySaves(saves);
    }
  }, []);

  const toggleCollapse = useCallback(() => {
    setCollapsed(c => {
      const next = !c;
      try { localStorage.setItem(SIDEBAR_KEY, next); } catch {}
      return next;
    });
  }, []);

  const BOTTOM_NAV = [
    { k: 'dashboard', icon: 'grid',     label: 'בקרה' },
    { k: 'list',      icon: 'folder',   label: 'פרויקטים' },
    { k: 'contacts',  icon: 'users',    label: 'אנשי קשר' },
    { k: 'settings',  icon: 'settings', label: 'הגדרות' },
  ];

  return (
    <>
    {versionBanner && (
      <div style={{
        position: 'fixed', top: 0, left: 0, right: 0, zIndex: 99999,
        background: versionBanner.urgent ? '#dc2626' : '#1a2c4a',
        color: '#fff', padding: '10px 16px',
        textAlign: 'center', fontSize: 13, fontWeight: 700,
        fontFamily: 'Assistant, sans-serif', direction: 'rtl',
      }}>
        {versionBanner.urgent ? (
          <span>{versionBanner.msg}</span>
        ) : (
          <>
            גרסה חדשה זמינה —{' '}
            <button
              onClick={() => window.YBPVersionCheck?.force()}
              style={{
                background: '#fff', color: '#1a2c4a', border: 'none',
                padding: '4px 12px', borderRadius: 6, cursor: 'pointer',
                fontWeight: 700, fontFamily: 'inherit', marginLeft: 8,
              }}>
              רענן עכשיו
            </button>
            <span style={{ marginRight: 10, opacity: 0.7 }}>{versionBanner.msg}</span>
          </>
        )}
      </div>
    )}
    {emergencySaves.length > 0 && (
      <div style={{
        position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, zIndex: 199999,
        background: 'rgba(0,0,0,0.6)', display: 'flex', alignItems: 'center', justifyContent: 'center',
        fontFamily: 'Assistant, sans-serif', direction: 'rtl',
      }}>
        <div style={{
          background: '#fff', borderRadius: 12, padding: 24, maxWidth: 360, width: '90%',
          boxShadow: '0 8px 32px rgba(0,0,0,0.3)',
        }}>
          <div style={{ fontSize: 18, fontWeight: 800, color: '#1a2c4a', marginBottom: 8 }}>
            ⚠️ נמצאו {emergencySaves.length} שינוי{emergencySaves.length > 1 ? 'ם' : ''} לא שמור{emergencySaves.length > 1 ? 'ים' : ''}
          </div>
          <div style={{ fontSize: 13, color: '#6b7280', marginBottom: 16 }}>
            האפליקציה עודכנה בזמן שמילאת טופס. הנתונים נשמרו אוטומטית.
          </div>
          {emergencySaves.map(s => (
            <div key={s.key} style={{ background: '#fef3c7', borderRadius: 8, padding: '10px 12px', marginBottom: 8, fontSize: 13 }}>
              <div style={{ fontWeight: 700, color: '#92400e' }}>
                {s.screen || 'טופס'} · {s.savedAt ? new Date(s.savedAt).toLocaleTimeString('he-IL', { hour: '2-digit', minute: '2-digit' }) : ''}
              </div>
              <div style={{ color: '#78350f', marginTop: 2, fontSize: 12 }}>
                {Object.keys(s.snapshot || {}).length} שדות נשמרו
              </div>
            </div>
          ))}
          <div style={{ display: 'flex', gap: 8, marginTop: 16 }}>
            <button
              onClick={() => {
                emergencySaves.forEach(s => { try { localStorage.removeItem(s.key); } catch {} });
                setEmergencySaves([]);
              }}
              style={{ flex: 1, padding: '10px 0', borderRadius: 8, border: 'none', background: '#fee2e2', color: '#dc2626', fontWeight: 700, cursor: 'pointer', fontFamily: 'inherit', fontSize: 14 }}>
              מחק
            </button>
            <button
              onClick={() => setEmergencySaves([])}
              style={{ flex: 2, padding: '10px 0', borderRadius: 8, border: 'none', background: '#1a2c4a', color: '#fff', fontWeight: 700, cursor: 'pointer', fontFamily: 'inherit', fontSize: 14 }}>
              השאר לאחר כך
            </button>
          </div>
        </div>
      </div>
    )}
    <div style={{
      display: 'flex', height: '100%', direction: 'rtl',
      fontFamily: 'Assistant, sans-serif',
      background: 'var(--ybp-outer-bg, var(--ybp-bg, #f6f7f9))',
      position: 'relative', overflow: 'hidden',
      marginTop: versionBanner ? 41 : 0,
    }}>
      {/* Mobile overlay (for "more" drawer) */}
      {isMobile && mobileOpen && (
        <div onClick={() => setMobileOpen(false)} style={{
          position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.5)',
          zIndex: 7900, backdropFilter: 'blur(2px)',
        }} />
      )}

      {/* Sidebar — desktop always, mobile only when mobileOpen (drawer for "more") */}
      {(!isMobile || mobileOpen) && (
        <div style={{
          position: isMobile ? 'fixed' : 'relative',
          top: isMobile ? (isLandscape ? 40 : 48) : 0,
          right: isMobile ? 0 : undefined,
          bottom: isMobile ? (isLandscape ? 48 : 60) : undefined,
          zIndex: isMobile ? 7950 : undefined,
          height: isMobile ? 'auto' : '100%',
          flexShrink: 0,
        }}>
          <AppSidebar
            active={active}
            onNav={onNav}
            collapsed={isMobile ? false : collapsed}
            onToggleCollapse={toggleCollapse}
            onClose={() => setMobileOpen(false)}
            isMobile={isMobile}
            projectNav={projectNav}
            activeSubView={activeSubView}
            adminViewAll={adminViewAll}
            onToggleViewAll={onToggleViewAll}
            isAdmin={isAdmin}
          />
        </div>
      )}

      {/* Main */}
      <main style={{ flex: 1, display: 'flex', flexDirection: 'column', overflow: 'hidden', minWidth: 0 }}>

        {/* Mobile top bar — כותרת + חזרה */}
        {isMobile && !chromeHidden && (
          <div style={{
            background: 'var(--ybp-panel, #fff)',
            borderBottom: '1px solid var(--ybp-border, #e5e7eb)',
            padding: '0 14px', height: isLandscape ? 40 : 48,
            display: 'flex', alignItems: 'center', gap: 10,
            flexShrink: 0,
          }}>
            {onBack ? (
              <button onClick={onBack} style={{
                background: 'none', border: '1px solid var(--ybp-border,#e5e7eb)',
                borderRadius: 8, height: 36, padding: '0 14px', cursor: 'pointer',
                display: 'flex', alignItems: 'center', gap: 5,
                fontSize: 14, fontWeight: 700, color: 'var(--ybp-ink,#111827)',
                fontFamily: 'Assistant, sans-serif', flexShrink: 0,
              }}>‹ חזרה</button>
            ) : null}
            <div style={{ flex: 1, minWidth: 0 }}>
              {title && <div style={{ fontSize: 15, fontWeight: 700, color: 'var(--ybp-ink,#111827)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{title}</div>}
              {subtitle && !onBack && <div style={{ fontSize: 11, color: 'var(--ybp-ink-soft,#6b7280)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{subtitle}</div>}
            </div>
            {projectId && typeof DriveButton !== 'undefined' && (
              <DriveButton projectId={projectId} style={{ border: '1px solid var(--ybp-border,#e5e7eb)', background: 'var(--ybp-panel,#f9fafb)', color: 'var(--ybp-ink-soft,#374151)', flexShrink: 0 }} />
            )}
          </div>
        )}

        {/* Page content */}
        <div style={{ flex: 1, overflow: 'auto', paddingBottom: (isMobile && !chromeHidden) ? (isLandscape ? 48 : 60) : 0 }}>
          {children}
        </div>
      </main>

      {/* ── Bottom Navigation Bar (mobile only) ── */}
      {isMobile && !chromeHidden && (
        <nav style={{
          position: 'fixed', bottom: 0, left: 0, right: 0,
          height: isLandscape ? 48 : 60, background: 'var(--ybp-panel)',
          borderTop: '1px solid var(--ybp-border)',
          display: 'flex', zIndex: 8200, direction: 'rtl',
          paddingBottom: 'env(safe-area-inset-bottom, 0px)',
        }}>
          {(() => {
            const iconSz = isLandscape ? 19 : 22;
            const lblSz  = isLandscape ? 9  : 10;
            const gap    = isLandscape ? 1  : 3;
            const navBtn = (onClick, color, active, children) => (
              <button onClick={onClick} style={{
                flex: 1, display: 'flex', flexDirection: 'column',
                alignItems: 'center', justifyContent: 'center', gap,
                background: active ? 'var(--ybp-sb-active-bg)' : 'transparent',
                border: 'none', cursor: 'pointer',
                fontFamily: 'Assistant, sans-serif', color, position: 'relative',
              }}>{children}</button>
            );
            const dot = () => (
              <div style={{ position: 'absolute', top: 0, left: '20%', right: '20%', height: 2, background: 'var(--ybp-accent)', borderRadius: '0 0 2px 2px' }} />
            );
            if (projectNav) return (
              <>
                {navBtn(onBack, 'var(--ybp-ink-faint)', false, <>
                  <span style={{ fontSize: iconSz, lineHeight: 1 }}>‹</span>
                  {!isLandscape && <span style={{ fontSize: lblSz, fontWeight: 500 }}>חזרה</span>}
                </>)}
                {(projectNav.items || []).filter(it => it.label === 'משימות' || it.label === 'דוחות').map(item => {
                  const on = activeSubView === item.subView;
                  return navBtn(() => { item.onClick?.(); setMobileOpen(false); }, on ? 'var(--ybp-accent)' : 'var(--ybp-ink-faint)', on,
                    <>
                      {on && dot()}
                      <DSIcon name={item.icon} size={iconSz} color={on ? 'var(--ybp-accent)' : 'var(--ybp-ink-faint)'} />
                      {!isLandscape && <span style={{ fontSize: lblSz, fontWeight: 500, textAlign: 'center', lineHeight: 1.2 }}>{item.label}</span>}
                    </>
                  );
                })}
                {navBtn(() => onNav('list'), 'var(--ybp-ink-faint)', false, <>
                  <DSIcon name="folder" size={iconSz} color="var(--ybp-ink-faint)" />
                  {!isLandscape && <span style={{ fontSize: lblSz, fontWeight: 500 }}>פרויקטים</span>}
                </>)}
                {navBtn(() => setMobileOpen(o => !o), mobileOpen ? 'var(--ybp-accent)' : 'var(--ybp-ink-faint)', mobileOpen, <>
                  <span style={{ fontSize: iconSz, lineHeight: 1 }}>☰</span>
                  {!isLandscape && <span style={{ fontSize: lblSz, fontWeight: 500 }}>עוד</span>}
                </>)}
              </>
            );
            return (
              <>
                {BOTTOM_NAV.map(item => {
                  const on = active === item.k;
                  return <React.Fragment key={item.k}>{navBtn(() => { onNav(item.k); setMobileOpen(false); }, on ? 'var(--ybp-accent)' : 'var(--ybp-ink-faint)', false,
                    <>
                      {on && dot()}
                      <DSIcon name={item.icon} size={iconSz} color={on ? 'var(--ybp-accent)' : 'var(--ybp-ink-faint)'} />
                      {!isLandscape && <span style={{ fontSize: lblSz, fontWeight: on ? 700 : 500 }}>{item.label}</span>}
                    </>
                  )}</React.Fragment>;
                })}
                {navBtn(() => setMobileOpen(o => !o), mobileOpen ? 'var(--ybp-accent)' : 'var(--ybp-ink-faint)', mobileOpen, <>
                  <span style={{ fontSize: iconSz, lineHeight: 1 }}>☰</span>
                  {!isLandscape && <span style={{ fontSize: lblSz, fontWeight: 500 }}>עוד</span>}
                </>)}
              </>
            );
          })()}
        </nav>
      )}
    </div>
    </>
  );
}

Object.assign(window, { AppShell, AppSidebar });

})();
