/* ============================================================ VARIABLES APP 1 (HEURES / PROFIL / ADMIN) ============================================================ */ :root { color-scheme: dark; --bg: #09090b; --c1: #18181b; --c2: #27272a; --c3: #3f3f46; --c4: #52525b; --b1: rgba(255,255,255,0.05); --b2: rgba(255,255,255,0.1); --b3: rgba(255,255,255,0.15); --t1: #fafafa; --t2: #a1a1aa; --t3: #71717a; --or: #f97316; --or2: #ea580c; --org: rgba(249,115,22,0.15); --ors: rgba(249,115,22,0.08); --gn: #22c55e; --gns: rgba(34,197,94,0.15); --bl: #3b82f6; --bls: rgba(59,130,246,0.15); --rd: #ef4444; --rds: rgba(239,68,68,0.15); --f: 'Inter', sans-serif; --m: 'JetBrains Mono', monospace; --R: 16px; --R2: 10px; --R3: 8px; --TOP: 60px; --NAV: 70px; } body.light-mode { color-scheme: light; --bg: #f4f4f5; --c1: #ffffff; --c2: #f8f8f8; --c3: #e4e4e7; --c4: #d4d4d8; --b1: rgba(0,0,0,0.05); --b2: rgba(0,0,0,0.1); --b3: rgba(0,0,0,0.15); --t1: #09090b; --t2: #52525b; --t3: #71717a; } /* ============================================================ VARIABLES APP 2 (PLANNING) ============================================================ */ :root { --bg-app: #10111a; --p-bg: #14162080; --bg-cell: #181a28; --bg-surface: #1a1d2e; --bg-elevated: #1e2235; --bg-card: #222640; --border: #252a3f; --border-light: #2e3455; --border-glow: rgba(224,165,50,0.28); --text-main: #f5f5f7; --text-muted: #86868b; --text-dim: #8e94b5; --accent: #e0a532; --accent-soft: rgba(224,165,50,0.14); --accent-glow: rgba(224,165,50,0.24); --accent-text: #f5c460; --we-bg: #0f1220; --we-border: #1a1f35; --we-text: #5e6687; --tod: rgba(224,165,50,0.10); --tod-cell: rgba(224,165,50,0.08); --tod-col: rgba(224,165,50,0.40); --primary: #1a1d2e; --primary-light: #1a1d2e; --cell-w: 60px; --cell-h: 40px; --name-w: 42px; --fc: 10px; --emp-fs: 12px; --av-size: 20px; --av-marg: 6px; --name-disp: none; --full-disp: none; --short-disp: inline; --mrow-h: 26px; --drow-h: 38px; --f-main: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Inter", sans-serif; --f-display: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Inter", sans-serif; --f-mono: ui-monospace, SFMono-Regular, "JetBrains Mono", monospace; --radius-sm: 6px; --radius-md: 10px; --radius-lg: 14px; } body.light-mode { --bg-app: #f0f2f8; --p-bg: #ffffff; --bg-cell: #ffffff; --bg-surface: #f4f6fb; --bg-elevated: #eaecf5; --bg-card: #e2e5f2; --border: #d0d5e8; --border-light: #c0c8e0; --border-glow: rgba(224,165,50,0.2); --text-main: #1d1d1f; --text-muted: #86868b; --text-dim: #64748b; --we-bg: #ebedf7; --we-border: #d8daf0; --we-text: #64748b; --tod: rgba(224,165,50,0.10); --tod-cell: rgba(224,165,50,0.07); --tod-col: rgba(224,165,50,0.5); --primary: #e8eaf4; --primary-light:#f4f6fb; } /* ============================================================ STYLES GLOBAUX & APP 1 ============================================================ */ *,*::before,*::after { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; } html { height: 100%; font-size: 14px; -webkit-text-size-adjust: 100%; } body { font-family: var(--f); background: var(--bg); color: var(--t1); height: 100%; overflow: hidden; -webkit-font-smoothing: antialiased; transition: background 0.3s, color 0.3s; overscroll-behavior: none; } input, textarea, button { font-family: var(--f); } * { scrollbar-width: none; } *::-webkit-scrollbar { display: none; } input:disabled, textarea:disabled, button:disabled { opacity: 0.6; cursor: not-allowed !important; background: var(--c3) !important; color: var(--t2) !important; border-color: transparent !important; } input[type="checkbox"]:disabled, input[type="radio"]:disabled { opacity: 0.5; cursor: not-allowed; } #login-screen { position: fixed; inset: 0; background: var(--bg); z-index: 9999; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; transition: opacity 0.3s; overflow-y: auto; } .login-card { width: 100%; max-width: 360px; background: var(--c1); border: 1px solid var(--b2); border-radius: var(--R); padding: 32px 24px; box-shadow: 0 20px 40px rgba(0,0,0,0.2); text-align: center; } .login-logo { width: 60px; height: 60px; background: var(--or); border-radius: 16px; display: flex; align-items: center; justify-content: center; font-weight: 900; font-size: 20px; color: #fff; margin: 0 auto 20px; box-shadow: 0 0 0 4px var(--ors), 0 8px 20px var(--org); } .login-card h1 { font-size: 22px; font-weight: 800; color: var(--t1); margin-bottom: 8px; } .login-card p { font-size: 13px; color: var(--t3); margin-bottom: 32px; } .login-fld { margin-bottom: 16px; text-align: left; } .login-fld label { display: block; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; color: var(--t3); margin-bottom: 8px; } .login-fld input { width: 100%; background: var(--c2); border: 1px solid var(--b2); border-radius: 8px; padding: 14px; font-size: 15px; color: var(--t1); outline: none; transition: 0.2s; } .login-fld input:focus { border-color: var(--or); box-shadow: 0 0 0 3px var(--org); } .btn-login { width: 100%; background: var(--or); color: #fff; border: none; border-radius: 8px; padding: 14px; font-size: 15px; font-weight: 800; cursor: pointer; margin-top: 16px; transition: 0.2s; box-shadow: 0 4px 12px var(--org); } .btn-login:active { transform: scale(0.97); background: var(--or2); } #app { display: none; flex-direction: column; height: 100vh; height: 100dvh; overflow: hidden; padding-bottom: var(--NAV); } .safe { height: env(safe-area-inset-top, 0px); background: var(--c1); flex-shrink: 0; } .topbar { height: var(--TOP); background: var(--c1); display: flex; align-items: center; justify-content: space-between; padding: 0 16px; flex-shrink: 0; z-index: 200; border-bottom: 1px solid var(--b2); transition: 0.2s; } .logo { display: flex; align-items: center; gap: 12px; } .logo-sq { width: 36px; height: 36px; background: var(--or); border-radius: 10px; display: grid; place-items: center; font-weight: 800; font-size: 13px; color: #fff; box-shadow: 0 0 0 3px var(--ors); overflow: hidden; } .logo-txt b { display: block; font-size: 16px; font-weight: 800; color: var(--t1); letter-spacing: 0.5px; line-height: 1.1; } .logo-txt span { font-size: 9px; color: var(--t3); letter-spacing: 1px; text-transform: uppercase; } .top-r { display: flex; gap: 8px; } /* BOTTOM NAV */ .bottom-nav { position: fixed; bottom: 0; left: 0; right: 0; height: var(--NAV); background: var(--c1); border-top: 1px solid var(--b2); display: flex; align-items: center; justify-content: space-around; padding-bottom: env(safe-area-inset-bottom, 0px); z-index: 1000; box-shadow: 0 -4px 20px rgba(0,0,0,0.1); } .nav-item { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; color: var(--t3); font-size: 10px; font-weight: 700; width: 64px; cursor: pointer; transition: 0.2s; } .nav-item.active { color: var(--or); } .nav-icon { font-size: 20px; filter: grayscale(100%); opacity: 0.5; transition: 0.2s; margin-bottom: 2px; } .nav-item.active .nav-icon { filter: grayscale(0%); opacity: 1; transform: scale(1.1); } .screens { flex: 1; overflow: hidden; position: relative; } .screen { position: absolute; inset: 0; overflow-y: auto; overflow-x: hidden; display: none; padding-bottom: 24px; } .screen.on { display: block; animation: fadeUp 0.25s cubic-bezier(0.16, 1, 0.3, 1); } @keyframes fadeUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } /* Paramétrage Spécifique Ecran Planning pour Flexbox */ #s-planning { display: none; flex-direction: column; overflow: hidden; padding-bottom: 0; } #s-planning.on { display: flex; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 10px 16px; border: none; border-radius: var(--R3); cursor: pointer; font-weight: 700; font-size: 13px; transition: 0.15s; outline: none; white-space: nowrap; font-family: var(--f); } .btn:active { transform: scale(0.96); } .b-or { background: var(--or); color: #fff; box-shadow: 0 4px 12px var(--org); } .b-or:hover { background: var(--or2); } .b-dim { background: var(--c2); color: var(--t1); border: 1px solid var(--b2); } .b-dim:hover { background: var(--c3); } .b-gh { background: transparent; color: var(--t2); border: 1px solid var(--b2); } .b-gh:hover { background: var(--b1); } .b-gn { background: var(--gns); color: var(--gn); border: 1px solid rgba(34,197,94,0.3); } .b-rd { background: var(--rds); color: var(--rd); border: 1px solid rgba(239,68,68,0.3); } .b-w { width: 100%; justify-content: center; } .btn-sm { padding: 6px 12px; font-size: 12px; min-height: 32px; } .chips { display: flex; gap: 8px; overflow-x: auto; padding: 12px 16px; margin-bottom: 4px; } .chip { flex-shrink: 0; padding: 6px 14px; border-radius: 99px; font-size: 11px; font-weight: 600; cursor: pointer; background: var(--c2); color: var(--t2); border: 1px solid var(--b2); transition: 0.2s; user-select: none; } .chip.on { background: var(--or); color: #fff; border-color: var(--or); box-shadow: 0 4px 12px var(--org); } .chip.add { color: var(--t1); border-style: dashed; } .week-card { margin: 0 16px 12px; background: var(--c1); border: 1px solid var(--b2); border-radius: var(--R2); padding: 14px; display: flex; flex-direction: column; gap: 10px; box-shadow: 0 4px 20px rgba(0,0,0,0.05); } .week-card-header { display: flex; justify-content: space-between; align-items: flex-start; } .wbadge { background: var(--or); color: #fff; font-family: var(--m); font-size: 10px; font-weight: 700; padding: 4px 10px; border-radius: 99px; display: inline-block; } .wdates { font-size: 11px; color: var(--t2); font-weight: 500; margin-top: 6px; } .wstats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; margin-top: 6px; } .ws { background: var(--c2); border: 1px solid var(--b1); border-radius: 6px; padding: 8px; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; } .ws .v { font-family: var(--m); font-size: 15px; font-weight: 800; color: var(--t1); line-height: 1; margin-bottom: 4px; } .ws .l { font-size: 8.5px; color: var(--t3); font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; } .ws.ao .v { color: var(--or); } .ws.ag .v { color: var(--gn); } .day-card { margin: 0 16px 10px; background: var(--c1); border: 1px solid var(--b2); border-radius: var(--R2); overflow: hidden; transition: all 0.2s ease; box-shadow: 0 2px 10px rgba(0,0,0,0.02); } .day-header { padding: 12px 14px; display: flex; justify-content: space-between; align-items: center; cursor: pointer; user-select: none; transition: background 0.2s; } .day-header:active { background: var(--b1); } .day-header-left { display: flex; align-items: center; gap: 10px; } .day-chevron { font-size: 10px; color: var(--t3); transition: transform 0.3s ease; display: flex; align-items: center; justify-content: center; width: 16px; height: 16px; } .day-card.expanded .day-chevron { transform: rotate(180deg); color: var(--or); } .day-title { font-size: 14px; font-weight: 800; color: var(--t1); display: flex; align-items: center; gap: 8px; line-height: 1; } .day-date { font-family: var(--m); font-size: 9px; font-weight: 600; color: var(--t3); } .day-summary-text { font-size: 10px; color: var(--t3); font-weight: 500; margin-top: 4px; display: block; } .day-card.expanded .day-summary-text { display: none; } .day-total-badge { font-family: var(--m); font-size: 13px; font-weight: 800; color: var(--or); background: var(--org); padding: 4px 10px; border-radius: 99px; border: 1px solid var(--ors); transition: 0.2s; } .day-body { display: none; padding: 0 12px 14px 12px; flex-direction: column; gap: 12px; border-top: 1px solid var(--b1); margin-top: 2px; padding-top: 14px; animation: slideDown 0.2s ease-out; } .day-card.expanded .day-body { display: flex; } @keyframes slideDown { from { opacity: 0; transform: translateY(-5px); } to { opacity: 1; transform: translateY(0); } } .tip-wrap { position: relative; display: inline-flex; align-items: center; vertical-align: middle; margin-left: 4px; z-index: 50; outline: none; } .tip-btn { width: 14px; height: 14px; border-radius: 50%; background: var(--b2); border: 1px solid var(--b3); color: var(--t2); font-size: 9px; font-weight: 800; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; line-height: 1; transition: 0.2s; } .tip-wrap.active-tip .tip-btn { background: var(--or); color: #fff; border-color: var(--or); } .tip-box { position: absolute; bottom: calc(100% + 6px); left: 50%; transform: translateX(-50%) translateY(5px); background: var(--c3); border: 1px solid var(--b3); border-radius: 6px; padding: 6px 10px; font-size: 10px; font-weight: 500; color: #fff; line-height: 1.4; width: max-content; max-width: 180px; box-shadow: 0 6px 16px rgba(0,0,0,0.4); opacity: 0; pointer-events: none; transition: 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); text-align: center; white-space: normal; text-transform: none; letter-spacing: normal; z-index: 100; } .tip-box::after { content: ''; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); border: 4px solid transparent; border-top-color: var(--c3); } .tip-wrap.active-tip .tip-box { opacity: 1; pointer-events: all; transform: translateX(-50%) translateY(0); } .tip-box.left { left: auto; right: -8px; transform: translateY(5px); } .tip-box.left::after { left: auto; right: 10px; transform: none; } .tip-wrap.active-tip .tip-box.left { transform: translateY(0); } .custom-rb { display: flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; color: var(--t2); cursor: pointer; user-select: none; } .custom-rb input { display: none; } .custom-rb .box { width: 18px; height: 18px; border: 1px solid var(--b3); border-radius: 4px; display: grid; place-items: center; font-size: 12px; background: var(--c2); transition: 0.2s; } .custom-rb input:checked ~ .box { border-color: var(--or); background: var(--org); } .custom-rb input:checked ~ .box::after { content: '✅'; } .custom-rb input:disabled ~ .box { opacity: 0.5; cursor: not-allowed; } .time-row { display: flex; flex-direction: column; gap: 6px; } .time-row-header { display: flex; justify-content: space-between; align-items: center; } .time-label { font-size: 9px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.2px; color: var(--t3); display: flex; align-items: center; white-space: nowrap; } .time-dur { font-family: var(--m); font-size: 10px; font-weight: 700; color: var(--t1); } .time-inputs { display: flex; align-items: flex-end; gap: 2px; } .time-wrapper { position: relative; width: 100%; height: 40px; background: var(--bg); border: 1px solid var(--b2); border-radius: 6px; overflow: hidden; transition: 0.2s; display: flex; align-items: center; justify-content: center; box-shadow: inset 0 2px 4px rgba(0,0,0,0.05); } .time-wrapper:focus-within { border-color: var(--or); box-shadow: inset 0 0 0 1px var(--or); background: var(--org); } .time-input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0 !important; font-size: 16px !important; border: none !important; background: transparent !important; outline: none; cursor: pointer; z-index: 10; -webkit-appearance: none !important; appearance: none !important; color: rgba(0,0,0,0) !important; text-shadow: none !important; -webkit-text-fill-color: transparent !important; } .time-input::-webkit-date-and-time-value, .time-input::-webkit-datetime-edit, .time-input::-webkit-datetime-edit-fields-wrapper, .time-input::-webkit-datetime-edit-text, .time-input::-webkit-datetime-edit-minute, .time-input::-webkit-datetime-edit-hour-field { color: transparent !important; background: transparent !important; border: none !important; } .time-input::-webkit-calendar-picker-indicator { display: none !important; opacity: 0 !important; } .time-val { position: absolute; inset: 0; z-index: 2; display: flex; align-items: center; justify-content: center; font-size: 11px; font-family: var(--m); font-weight: 700; color: var(--t1); pointer-events: none; letter-spacing: 0; } .time-val.ap { color: var(--bl); } .time-ph { position: absolute; inset: 0; z-index: 1; display: flex; align-items: center; justify-content: center; font-size: 8.5px; font-weight: 600; color: var(--t3); pointer-events: none; transition: 0.2s; } .time-wrapper.has-val .time-ph { opacity: 0; } .time-wrapper.has-val .time-val { display: flex; } .time-sep { color: var(--t3); font-weight: 800; font-size: 9px; margin: 0 1px; margin-bottom: 14px;} .btn-now { background: var(--org); color: var(--or); border: 1px solid var(--or); border-radius: 4px; font-size: 8px; font-weight: 800; padding: 2px 6px; cursor: pointer; transition: 0.2s; display: inline-block; } .btn-now:active { background: var(--or); color: #fff; } .btn-auto { background: var(--gns); color: var(--gn); border: 1px solid rgba(34,197,94,0.3); font-size: 8px; font-weight: 800; padding: 2px 4px; border-radius: 4px; cursor: pointer; margin-left: 4px; display:inline-block;} .options-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; } .ck-card { background: var(--bg); border: 1px solid var(--b2); border-radius: 6px; padding: 8px 6px; display: flex; align-items: center; gap: 6px; cursor: pointer; transition: 0.2s; user-select: none; } .ck-card:active { transform: scale(0.98); } .ck-card:has(input:checked) { border-color: var(--or); background: var(--org); } .ck-card input { width: 14px; height: 14px; accent-color: var(--or); cursor: pointer; margin: 0; } .ck-card span { font-size: 11px; font-weight: 600; color: var(--t1); white-space: nowrap;} input.FI, textarea.FI, input.II { width: 100%; background: var(--bg); border: 1px solid var(--b2); border-radius: 6px; padding: 10px 12px; font-size: 13px; color: var(--t1); outline: none; transition: 0.2s; } input.FI:focus, textarea.FI:focus, input.II:focus { border-color: var(--or); box-shadow: 0 0 0 1px var(--org); } .psw { position: relative; width: 100%; margin-top: 4px; } textarea.PSI { width: 100%; background: var(--bg); border: 1px solid var(--b2); border-radius: 6px; padding: 8px 20px 8px 8px; font-size: 10px; font-weight: 700; color: var(--t1); outline: none; transition: 0.2s; cursor: pointer; resize: none; overflow: hidden; min-height: 42px; line-height: 1.2; font-family: var(--f); } textarea.PSI:focus { border-color: var(--or); } .divider { height: 1px; background: var(--b2); margin: 2px 0; } .day-0 { border-left: 3px solid #3b82f6; } .day-1 { border-left: 3px solid #ef4444; } .day-2 { border-left: 3px solid #f97316; } .day-3 { border-left: 3px solid #8b5cf6; } .day-4 { border-left: 3px solid #10b981; } .day-5 { border-left: 3px solid #71717a; opacity: 0.8; } .day-6 { border-left: 3px solid #71717a; opacity: 0.6; } .p-hero { margin: 16px; padding: 20px; background: var(--c2); border: 1px solid var(--b2); border-radius: var(--R); display: flex; align-items: center; gap: 16px; } .p-av { width: 60px; height: 60px; border-radius: 16px; background: var(--or); display: grid; place-items: center; font-size: 24px; font-weight: 800; color: #fff; flex-shrink: 0; box-shadow: 0 8px 20px var(--org); } .p-name { font-size: 18px; font-weight: 800; color: var(--t1); } .p-role { font-size: 13px; color: var(--t3); margin-top: 4px; } .pcard { margin: 0 16px 16px; background: var(--c1); border: 1px solid var(--b2); border-radius: var(--R); overflow: hidden; } .pc-h { display: flex; align-items: center; gap: 12px; padding: 14px 16px; background: var(--c2); border-bottom: 1px solid var(--b2); } .pc-h .ico { font-size: 18px; } .pc-h .ttl { font-size: 14px; font-weight: 700; color: var(--t1); } .pc-b { padding: 16px; display: flex; flex-direction: column; gap: 16px; } .admin-user-card { margin-bottom: 12px; background: var(--c2); border: 1px solid var(--b2); border-radius: var(--R2); padding: 16px; display: flex; justify-content: space-between; align-items: center; cursor: pointer; transition: 0.2s; } .admin-user-card:active { transform: scale(0.98); background: var(--c3); } .status-tag { font-size: 11px; padding: 6px 10px; border-radius: 6px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.5px; } .status-valide { background: var(--gns); color: var(--gn); border: 1px solid rgba(34,197,94,.3); } .mb { position: fixed; inset: 0; background: rgba(0,0,0,0.7); z-index: 9900; display: flex; align-items: flex-end; justify-content: center; opacity: 0; pointer-events: none; transition: 0.3s; } .mb.on { opacity: 1; pointer-events: all; } .mbox { background: var(--c1); border-radius: 24px 24px 0 0; padding: 20px 24px calc(20px + env(safe-area-inset-bottom, 0px)); width: 100%; max-width: 500px; border: 1px solid var(--b2); box-shadow: 0 -10px 40px rgba(0,0,0,0.5); transform: translateY(100%); transition: transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); max-height: 90vh; overflow-y: auto; } .mb.on .mbox { transform: translateY(0); } .mh { width: 40px; height: 5px; background: var(--c4); border-radius: 5px; margin: 0 auto 20px; } .mbox h3 { font-size: 18px; font-weight: 800; color: var(--t1); margin-bottom: 16px; display: flex; align-items: center; } .toast { position: fixed; bottom: calc(var(--NAV) + 20px + env(safe-area-inset-bottom, 0px)); left: 50%; transform: translateX(-50%) translateY(20px); background: var(--c2); color: var(--t1); border: 1px solid var(--b3); border-radius: 99px; padding: 12px 24px; font-size: 13px; font-weight: 600; box-shadow: 0 10px 30px rgba(0,0,0,0.5); z-index: 9999; opacity: 0; transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275); pointer-events: none; white-space: nowrap; text-align: center; } .toast.on { opacity: 1; transform: translateX(-50%) translateY(0); } .tok { background: var(--gn); color: #fff; border-color: var(--gn); } .terr { background: var(--rd); color: #fff; border-color: var(--rd); } .empty { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 60px 24px; text-align: center; gap: 16px; min-height: 50vh; } .empty-i { font-size: 56px; opacity: 0.5; } .empty h2 { font-size: 20px; font-weight: 800; color: var(--t1); } .empty p { font-size: 14px; color: var(--t3); line-height: 1.6; max-width: 300px; } @media print { body > *:not(#pdoc) { display: none !important; } #pdoc { display: block !important; } * { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; } @page { size: A4 landscape; margin: 8mm 9mm; } body { background: #fff; padding: 0; margin: 0; } #pdoc { font-family: Arial, sans-serif; font-size: 9px; color: #111; } .ph { display: flex; justify-content: space-between; align-items: center; padding-bottom: 7px; border-bottom: 3px solid #E8820C; margin-bottom: 7px; } .phl { display: flex; align-items: center; gap: 8px; } .phsq { width: 30px; height: 30px; background: #E8820C; border-radius: 5px; display: flex; align-items: center; justify-content: center; color: #fff; font-weight: 900; font-size: 10px; } .phb h1 { font-size: 15px; font-weight: 900; letter-spacing: 2px; color: #111; margin: 0; } .phb p { font-size: 7px; color: #E8820C; letter-spacing: 2px; text-transform: uppercase; margin: 0; } .phr .pm { font-size: 14px; font-weight: 900; color: #111; text-align: right; } .phr .ps { font-size: 8px; color: #666; text-align: right; margin-top: 1px; } .pep { display: grid; grid-template-columns: repeat(4, 1fr); gap: 5px; background: #F8F9FA; padding: 6px 9px; border-radius: 4px; border-left: 3px solid #E8820C; margin-bottom: 7px; } .pep dt { font-size: 7px; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; color: #9CA3AF; margin-bottom: 1px; } .pep dd { font-size: 9px; font-weight: 700; color: #111; } table.pt { width: 100%; border-collapse: collapse; font-size: 8px; } table.pt th { padding: 4px; font-size: 7px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px; border: 1px solid #D1D5DB; text-align: center; } .hdi { background: #111; color: #fff; } .hdw { background: #FFFBF0; color: #92400E; } .hdt { background: #E8820C; color: #fff; } .hdp { background: #F9FAFB; color: #6B7280; } .hdr { background: #EFF4FF; color: #1D4ED8; } .hdpj { background: #1F2937; color: #fff; } .hdcm { background: #FDF4FF; color: #6D28D9; } table.pt td { border: 1px solid #E5E7EB; padding: 3px 4px; vertical-align: middle; text-align: center; } .pmono { font-family: monospace; font-size: 8px; font-weight: 600; } .pbig { font-family: monospace; font-size: 12px; font-weight: 900; color: #E8820C; } .ptot td { background: #111 !important; color: #fff !important; font-weight: 700; padding: 5px 4px; } .pfoot { margin-top: 7px; text-align: center; font-size: 7px; color: #D1D5DB; border-top: 1px solid #F3F4F6; padding-top: 5px; } } /* ============================================================ STYLES SPECIFIQUES APP 2 (PLANNING) ============================================================ */ .top-header { display: none; } /* Remplacé par le topbar unifié */ /* Planning : compensation hauteur topbar */ #s-planning { padding-top: 0; } .main-content { flex:1; display:flex; flex-direction:column; min-width:0; background:var(--bg-app); user-select: none; -webkit-user-select: none; } input, textarea { user-select: auto; -webkit-user-select: auto; } .top-header { height:56px; display:flex; align-items:center; justify-content:space-between; padding:0 18px; background: linear-gradient(90deg, var(--bg-surface) 0%, var(--p-bg) 100%); border-bottom: 1px solid var(--border); flex-shrink:0; position:relative; } .top-header::after { content:''; position:absolute; bottom:0; left:0; right:0; height:1px; background: linear-gradient(90deg, var(--accent-glow) 0%, transparent 60%); } .header-left { display:flex; align-items:center; gap:12px; } .img-logo-entreprise { height: 32px; width: auto; max-width: 100px; border-radius: 6px; object-fit: contain; } .header-logo-fallback { height: 32px; width: 32px; background: linear-gradient(135deg, var(--accent) 0%, #c47800 100%); border-radius: 8px; display: flex; align-items: center; justify-content: center; color: #07090f; font-family: var(--f-display); font-weight: 800; font-size: 14px; letter-spacing: -0.5px; box-shadow: 0 2px 8px rgba(224,165,50,.3); } .top-header h1 { font-family: var(--f-display); font-size: 22px; font-weight: 700; letter-spacing: -0.5px; color: var(--text-main); display: flex; align-items: center; gap: 10px; margin: 0; } .btn-primary { background: linear-gradient(135deg, #e0a532 0%, #c47800 100%); color: #07090f; border:none; padding:8px 18px; border-radius: 20px; font-family: var(--f-main); font-weight:600; font-size:13px; cursor:pointer; letter-spacing: 0px; box-shadow: 0 2px 10px rgba(224,165,50,.35), inset 0 1px 0 rgba(255,255,255,.15); transition: all .2s; } .btn-primary:hover { transform:scale(1.02); box-shadow:0 4px 16px rgba(224,165,50,.45); } .btn-primary:active { transform:scale(0.98); } .sub-header { display:flex; flex-direction:column; border-bottom:1px solid var(--border); background:var(--bg-surface); flex-shrink:0; } .filters-container { display:flex; align-items:center; justify-content:space-between; padding:9px 16px; background:var(--bg-surface); flex-wrap:wrap; gap:8px; } .filter-group { display:flex; align-items:center; gap:7px; flex-wrap:wrap; } .btn-icon-outline { width:32px; height:32px; border:1px solid var(--border-light); border-radius:var(--radius-md); background:var(--bg-elevated); color:var(--text-muted); display:grid; place-items:center; font-size:16px; font-weight:500; cursor:pointer; transition:all .2s; } .btn-icon-outline:hover { border-color:var(--accent); color:var(--accent); background:var(--accent-soft); } .btn-filter { padding:6px 14px; border:1px solid var(--border-light); border-radius:20px; background:var(--bg-elevated); color:var(--text-main); font-family:var(--f-main); font-size:13px; font-weight:500; display:flex; align-items:center; gap:5px; cursor:pointer; transition:all .2s; } .btn-filter:hover { border-color:var(--accent); color:var(--accent); background:var(--accent-soft); } .btn-filter.active { background:var(--accent-soft); border-color:var(--accent); color:var(--accent-text); } .btn-group { display:flex; border:1px solid var(--border-light); border-radius:var(--radius-md); overflow:hidden; } .btn-group button { padding:6px 12px; border:none; border-right:1px solid var(--border-light); background:var(--bg-elevated); color:var(--text-main); font-family:var(--f-main); font-size:13px; font-weight:500; cursor:pointer; transition:all .2s; } .btn-group button:last-child { border-right:none; } .btn-group button:hover { background:var(--accent-soft); color:var(--accent); } .date-label { font-family:var(--f-main); font-size:13px; font-weight:600; color:var(--accent-text); min-width:86px; text-align:center; } @media (max-width:768px) { .top-header { height:50px; padding:0 12px; } .top-header h1 { font-size:18px; } .btn-primary { font-size:12px; padding:6px 14px; } .filters-container { padding:7px; gap:6px; justify-content:center; } } .plan-container { flex:1; overflow:auto; position:relative; -webkit-overflow-scrolling:touch; touch-action:pan-x pan-y; scrollbar-width:thin; scrollbar-color: var(--border-light) transparent; } .plan-container::-webkit-scrollbar { width:5px; height:5px; } .plan-container::-webkit-scrollbar-track { background:transparent; } .plan-container::-webkit-scrollbar-thumb { background:var(--border-light); border-radius:3px; } .plan-table { border-collapse:collapse; table-layout:fixed; min-width:100%; } .plan-table th, .plan-table td { border-right:1px solid var(--border); border-bottom:1px solid var(--border); text-align:center; vertical-align:middle; padding:0; } .th-corner { position:sticky; top:0; left:0; z-index:30; width:var(--name-w); min-width:var(--name-w); height:calc(var(--mrow-h) + var(--drow-h)); background:var(--bg-surface); border-right:1px solid var(--border) !important; border-bottom:1px solid var(--border) !important; overflow:hidden; transition:width .2s, min-width .2s; } .th-corner-inner { display:flex; align-items:center; justify-content:center; width:100%; height:100%; padding:4px; gap:4px; } .btn-expand-names { background:var(--bg-elevated); border:1px solid var(--border-light); border-radius:var(--radius-sm); color:var(--accent); font-weight:bold; cursor:pointer; width:26px; height:26px; display:grid; place-items:center; flex-shrink:0; font-size:14px; transition:all .2s; } .btn-expand-names:hover { background:var(--accent-soft); border-color:var(--accent); } .search-bar { width:100%; padding:6px 8px; border:1px solid var(--border-light); border-radius:var(--radius-sm); background:var(--bg-elevated); color:var(--text-main); font-size:12px; outline:none; display:var(--name-disp); } .th-month { position:sticky; top:0; z-index:11; height:var(--mrow-h); background: var(--bg-surface); font-family:var(--f-main); font-size:12px; font-weight:600; letter-spacing:0px; color:var(--text-muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; border-bottom:1px solid var(--border-light) !important; } .th-day { position:sticky; top:var(--mrow-h); z-index:10; height:var(--drow-h); width:var(--cell-w); min-width:var(--cell-w); max-width:var(--cell-w); background:var(--bg-surface); font-family:var(--f-main); font-size:11px; font-weight:500; overflow:hidden; padding:4px 0; transition:background .2s; } .th-day:hover { background:var(--bg-elevated); } .border-sat { border-right:2px solid var(--we-border, #1a1f35) !important; } .th-day.col-weekend, .th-day.col-ferie { background: var(--we-bg) !important; color: var(--we-text) !important; border-bottom: 1px solid var(--we-border) !important; } .th-day.col-weekend .d-day, .th-day.col-ferie .d-day { color: var(--we-text) !important; opacity:0.8; } .th-day.col-weekend .d-num, .th-day.col-ferie .d-num { color: var(--we-text) !important; } .th-day.th-today { color:var(--accent) !important; background:rgba(224,165,50,0.13) !important; border-bottom:3px solid var(--accent) !important; } .th-day.th-today .d-day, .th-day.th-today .d-num { color: var(--accent) !important; } .d-day { font-size:10px; color:var(--text-dim); font-weight:500; display:block; margin-bottom:2px; text-transform:capitalize; } .d-num { font-weight:600; display:block; font-size:14px; color: #ffffff; } body.light-mode .d-num { color: #1d1d1f; } .td-role { position:sticky; left:0; z-index:6; background: var(--bg-elevated) !important; border-right:1px solid var(--border) !important; text-align:left; padding:0 8px; height:24px !important; overflow:hidden; border-top: 1px solid var(--border-light) !important; } .role-badge-container { display:flex; align-items:center; gap:5px; } .role-icon { font-size:9px; color:var(--text-dim); font-weight:bold; } .role-badge { padding:2px 8px; border-radius:12px; font-family:var(--f-main); font-size:10px; font-weight:600; border:1px solid; text-transform:uppercase; letter-spacing: 0.2px; } .role-text-full { display:var(--full-disp); } .role-text-short { display:var(--short-disp); } .role-rest { background:var(--bg-elevated) !important; border-top: 1px solid var(--border-light) !important; } .td-name { position:sticky; left:0; z-index:5; width:var(--name-w); min-width:var(--name-w); background:var(--bg-surface); border-right:1px solid var(--border) !important; height:var(--cell-h); overflow:hidden; transition:width .2s, min-width .2s, background .15s; } .td-name.drag-over-row { border-top:3px solid var(--accent) !important; background:var(--accent-soft) !important; } .td-name-inner { display:flex; align-items:center; width:100%; height:100%; padding-left:3px; padding-right:4px; cursor:pointer; } .drag-handle { width:14px; height:100%; display:grid; place-items:center; font-size:12px; color:var(--text-dim); cursor:grab; opacity:.3; touch-action:none; transition:opacity .2s; } .drag-handle:hover { opacity:.8; color:var(--accent); } .drag-handle:active { cursor:grabbing; opacity:1; color:var(--accent); } .emp-profile-btn { display:flex; align-items:center; flex:1; height:100%; cursor:pointer; overflow:hidden; } .emp-tree { width:4px; height:50%; border-left:1px solid var(--border-light); border-bottom:1px solid var(--border-light); margin-top:-10%; margin-right:4px; border-bottom-left-radius:4px; opacity:.4; } .emp-avatar { width:var(--av-size); height:var(--av-size); border-radius:50%; color:rgba(255,255,255,.92); display:grid; place-items:center; font-family:var(--f-main); font-size:calc(var(--av-size) * 0.45); font-weight:600; margin-right:var(--av-marg); flex-shrink:0; box-shadow:0 2px 6px rgba(0,0,0,.25), inset 0 1px 0 rgba(255,255,255,.12); } .emp-name { font-size:var(--emp-fs); font-weight:500; font-family:var(--f-main); letter-spacing:0px; text-align:left; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; flex:1; display:var(--name-disp); color:var(--text-main); } .emp-edit-icon { font-size:10px; color:var(--text-dim); opacity:.5; display:var(--name-disp); margin-left:4px; } .td-add-user { position:sticky; left:0; z-index:5; width:var(--name-w); min-width:var(--name-w); background:var(--bg-surface); border-right:1px solid var(--border) !important; height:32px; overflow:hidden; color:var(--accent); font-weight:500; cursor:pointer; font-size:13px; transition:width .2s, min-width .2s, background .15s; } .td-add-user:hover { background:var(--accent-soft); } .td-add-user:active { background:var(--accent-glow); } .td-cell { width:var(--cell-w); min-width:var(--cell-w); max-width:var(--cell-w); height:var(--cell-h); max-height:var(--cell-h); padding:2px; position:relative; background:var(--bg-cell); transition:background .15s; overflow:hidden; vertical-align:top; } .td-cell.col-weekend, .td-cell.col-ferie { background: var(--we-bg) !important; border-right: 1px solid var(--we-border) !important; border-bottom: 1px solid var(--we-border) !important; background-image: repeating-linear-gradient(-45deg, transparent 0px, transparent 4px, rgba(255,255,255,.015) 4px, rgba(255,255,255,.015) 5px) !important; } .td-cell.col-today { background: var(--tod-cell) !important; border-left: 1px solid var(--tod-col) !important; border-right: 1px solid var(--tod-col) !important; } .cell-data { width:100%; height:var(--cell-h); max-height:var(--cell-h); display:flex; flex-direction:column; gap:1px; cursor:pointer; border-radius:var(--radius-sm); position:relative; transition:all .15s ease; overflow:hidden; } .cell-data:hover:not(:empty) { filter:brightness(1.1); } .cell-data.selected-cell { outline:2px solid var(--accent); outline-offset:-1px; box-shadow:0 0 0 3px var(--accent-glow); } .cell-data.drag-over { outline:2px dashed var(--accent); outline-offset:-1px; background:var(--accent-soft); } .cell-data.is-holding-cell { transform:scale(.9); opacity:.85; z-index:100; box-shadow:0 8px 24px rgba(0,0,0,.5); } .cell-chip { flex:1; display:flex; align-items:center; justify-content:center; padding:1px 3px; border-radius:4px; color:#fff; overflow:hidden; min-height:0; max-height:calc((var(--cell-h) - 6px) / 2); text-align:center; position:relative; background-image: linear-gradient(180deg, rgba(255,255,255,.12) 0%, rgba(255,255,255,.0) 100%); box-shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 3px rgba(0,0,0,.3); transition:filter .15s, transform .1s; } .cell-chip:hover { filter:brightness(1.15); } /* Badge "+N projets masqués" */ .cell-chip-more { display:flex; align-items:center; justify-content:center; font-family:var(--f-main); font-size:8px; font-weight:800; color:var(--text-muted); background:rgba(255,255,255,.08); border-radius:3px; padding:1px 3px; height:10px; flex-shrink:0; pointer-events:none; } .cell-chip span { font-family:var(--f-main); font-size:var(--fc); font-weight:600; line-height:1.1; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; display:block; width:100%; pointer-events:none; letter-spacing:0px; text-shadow:0 1px 2px rgba(0,0,0,.3); } .note-dot { position:absolute; top:2px; right:2px; width:6px; height:6px; background:#f59e0b; border-radius:50%; box-shadow:0 0 4px rgba(245,158,11,.7); z-index:10; } .bg-n1 span, .bg-n3 span { color:#1d1d1f !important; text-shadow:none !important; } body.is-dragging { cursor:grabbing !important; } .fab-bar { position:fixed; bottom:85px; left:50%; transform:translateX(-50%); background:rgba(26,29,46,.85); border:1px solid rgba(255,255,255,0.1); border-radius:99px; padding:10px 20px; display:none; align-items:center; gap:14px; z-index:4000; box-shadow: 0 16px 40px rgba(0,0,0,.4); white-space:nowrap; animation:fabIn .3s cubic-bezier(0.2, 0.8, 0.2, 1); user-select:none; } @keyframes fabIn { from { opacity:0; transform:translateX(-50%) translateY(20px) scale(.9); } to { opacity:1; transform:translateX(-50%) translateY(0) scale(1); } } .fab-lbl { font-family:var(--f-main); font-size:14px; font-weight:600; color:var(--text-main); } .fab-btn { padding:8px 18px; background:linear-gradient(135deg,#e0a532,#c47800); color:#07090f; border:none; border-radius:99px; font-weight:600; cursor:pointer; font-size:13px; transition:all .2s; } .fab-btn:active { transform:scale(0.95); } .fab-btn-del { padding:8px 18px; background:#ff3b30; color:#fff; border:none; border-radius:99px; font-weight:600; cursor:pointer; font-size:13px; transition:all .2s; } .fab-cancel { background:transparent; border:none; color:var(--text-muted); font-weight:500; cursor:pointer; font-size:14px; } .modal-overlay { position:fixed; inset:0; background:rgba(0,0,0,.4); z-index:6000; display:none; align-items:center; justify-content:center; } .modal { background:var(--bg-surface); border:1px solid var(--border-light); border-radius:var(--radius-lg); width:100%; max-width:440px; max-height:90vh; overflow-y:auto; padding:24px; box-shadow: 0 24px 60px rgba(0,0,0,.5); transform:scale(.95); opacity:0; transition:.3s cubic-bezier(0.2, 0.8, 0.2, 1); user-select:none; } .modal.open { transform:scale(1); opacity:1; } .modal-ttl { font-family:var(--f-display); font-size:22px; font-weight:600; letter-spacing:-0.5px; color:var(--text-main); margin-bottom:20px; text-align:center; } .form-group { margin-bottom:16px; } .form-lbl { font-family:var(--f-main); font-size:12px; font-weight:600; color:var(--text-muted); margin-bottom:6px; display:block; } .split-row { display:flex; gap:8px; } .btn-spl { flex:1; padding:8px; background:var(--bg-elevated); border:1px solid var(--border-light); border-radius:var(--radius-sm); cursor:pointer; font-weight:500; color:var(--text-main); font-family:var(--f-main); font-size:14px; transition:.15s; } .btn-spl.active { background:var(--accent-soft); border-color:var(--accent); color:var(--accent-text); } select.ms, input.ms, textarea.mt { width:100%; padding:10px 12px; border:1px solid var(--border-light); border-radius:var(--radius-sm); background:var(--bg-elevated); color:var(--text-main); font-family:var(--f-main); font-size:14px; outline:none; } select.ms:focus, input.ms:focus, textarea.mt:focus { border-color:var(--accent); } textarea.mt { resize:none; height:50px; } .cpicker { display:flex; flex-wrap:wrap; gap:8px; margin-top:8px; } .cdot { width:24px; height:24px; border-radius:50%; cursor:pointer; border:2px solid transparent; transition:all .15s; } .cdot:hover { transform:scale(1.1); } .cdot.selected { border-color:var(--text-main) !important; transform:scale(1.2); box-shadow:0 2px 8px rgba(0,0,0,.3); } .modal-acts { display:flex; gap:12px; margin-top:24px; } .btn-ok { flex:2; padding:12px; background:linear-gradient(135deg,#e0a532,#c47800); color:#07090f; border:none; border-radius:var(--radius-sm); font-weight:600; cursor:pointer; font-size:14px; } .btn-clr { flex:1; padding:12px; background:rgba(255,59,48,.1); color:#ff3b30; border:1px solid rgba(255,59,48,.2); border-radius:var(--radius-sm); font-weight:500; cursor:pointer; font-size:14px; } .btn-can { flex:1; padding:12px; background:var(--bg-elevated); border:1px solid var(--border-light); color:var(--text-main); border-radius:var(--radius-sm); font-weight:500; cursor:pointer; font-size:14px; } .proj-block { border-left:3px solid var(--accent); padding-left:12px; margin-bottom:16px; padding-top:4px; } .proj-hdr { display:flex; align-items:center; gap:8px; margin-bottom:8px; } .btn-clr-part { background:rgba(255,59,48,.1); color:#ff3b30; border:none; border-radius:5px; padding:8px; cursor:pointer; display:grid; place-items:center; } .projet-list-item { display:flex; align-items:center; justify-content:space-between; padding:12px; border-bottom:1px solid var(--border); } .projet-list-item.drag-over-row { border-top:2px solid var(--accent) !important; background:var(--accent-soft) !important; } .p-info { display:flex; align-items:center; gap:12px; flex:1; overflow:hidden; } .p-color { width:16px; height:16px; border-radius:50%; flex-shrink:0; } .p-name { font-size:14px; font-weight:500; color:var(--text-main); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .btn-edit-p { background:var(--bg-elevated); border:1px solid var(--border-light); border-radius:12px; font-size:12px; padding:6px 12px; font-weight:500; cursor:pointer; color:var(--text-main); } .contact-row { background:var(--bg-elevated); border:1px solid var(--border-light); padding:12px; border-radius:var(--radius-sm); margin-bottom:10px; position:relative; } .contact-row input { background:transparent; border:none; border-bottom:1px solid var(--border-light); color:var(--text-main); font-size:13px; width:100%; margin-bottom:8px; padding:6px 0; outline:none; } .contact-row input:last-child { margin-bottom:0; border-bottom:none; } .btn-del-contact { position:absolute; top:8px; right:8px; color:#ff3b30; font-weight:bold; cursor:pointer; border:none; background:transparent; font-size:18px; opacity:.7; } /* CHIP COLORS */ .bg-c1 { background:#ff3b30; } .bg-c2 { background:#ff9500; } .bg-c3 { background:#ffcc00; } .bg-c4 { background:#eab308; } .bg-c5 { background:#84cc16; } .bg-c6 { background:#34c759; } .bg-c7 { background:#10b981; } .bg-c8 { background:#14b8a6; } .bg-c9 { background:#06b6d4; } .bg-c10 { background:#32ade6; } .bg-c11 { background:#007aff; } .bg-c12 { background:#5856d6; } .bg-c13 { background:#af52de; } .bg-c14 { background:#a855f7; } .bg-c15 { background:#ff2d55; } .bg-c16 { background:#ec4899; } .bg-c17 { background:#dc2626; } .bg-c18 { background:#ea580c; } .bg-c19 { background:#d97706; } .bg-c20 { background:#ca8a04; } .bg-c21 { background:#65a30d; } .bg-c22 { background:#16a34a; } .bg-c23 { background:#059669; } .bg-c24 { background:#0d9488; } .bg-c25 { background:#0891b2; } .bg-c26 { background:#0284c7; } .bg-c27 { background:#2563eb; } .bg-c28 { background:#4f46e5; } .bg-c29 { background:#7c3aed; } .bg-c30 { background:#9333ea; } .bg-c31 { background:#c026d3; } .bg-c32 { background:#e11d48; } .bg-n1 { background:#8e8e93; color:#1d1d1f !important; } .bg-n2 { background:#636366; } .bg-n3 { background:#d1d1d6; color:#1d1d1f !important; } .bg-n4 { background:#3a3a3c; } /* ══ CHANTIERS MODULE — PRO DESIGN ══════════════════════════════ */ /* ─── LISTE DES CHANTIERS ─────────────────────────────────────── */ #chantiers-list-view { background:var(--bg); min-height:100%; } .chantiers-list-header { padding:20px 16px 12px; background:linear-gradient(135deg,var(--c1) 0%,var(--bg) 100%); border-bottom:1px solid var(--b2); } .chantiers-list-header h2 { font-size:22px; font-weight:800; color:var(--t1); letter-spacing:-.3px; } .chantiers-list-header p { font-size:12px; color:var(--t3); margin-top:4px; } .chantier-card-item { background:var(--c1); border:1px solid var(--b2); border-radius:16px; padding:16px; margin-bottom:10px; display:flex; align-items:center; gap:14px; cursor:pointer; transition:all .2s; box-shadow:0 2px 8px rgba(0,0,0,.06); position:relative; overflow:hidden; } .chantier-card-item::before { content:''; position:absolute; left:0; top:0; bottom:0; width:4px; background:var(--card-accent, var(--or)); border-radius:4px 0 0 4px; } .chantier-card-item:active { transform:scale(.98); box-shadow:0 1px 4px rgba(0,0,0,.1); } .chantier-card-icon { width:44px; height:44px; border-radius:12px; display:grid; place-items:center; font-size:22px; flex-shrink:0; background:var(--c2); } .chantier-card-body { flex:1; min-width:0; } .chantier-card-name { font-size:15px; font-weight:700; color:var(--t1); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .chantier-card-addr { font-size:11px; color:var(--t3); margin-top:3px; } .chantier-card-arrow { font-size:18px; color:var(--t3); flex-shrink:0; } .chantier-color-dot { width:12px; height:12px; border-radius:50%; flex-shrink:0; } /* ─── HEADER CHANTIER DÉTAIL ──────────────────────────────────── */ .chantier-detail-header { padding:10px 12px; background:var(--c1); border-bottom:1px solid var(--b2); display:flex; align-items:center; gap:10px; flex-shrink:0; box-shadow:0 2px 8px rgba(0,0,0,.06); } /* ─── SECTION TABS (Fil / Chat) ───────────────────────────────── */ .chantier-tabs { display:flex; background:var(--c2); border-bottom:1px solid var(--b2); flex-shrink:0; } .chantier-tab { flex:1; padding:12px; text-align:center; font-size:13px; font-weight:600; color:var(--t3); cursor:pointer; border-bottom:2px solid transparent; transition:.2s; } .chantier-tab.active { color:var(--or); border-bottom-color:var(--or); background:var(--c1); } /* ─── EMPTY STATE ─────────────────────────────────────────────── */ .chantier-empty { display:flex; flex-direction:column; align-items:center; justify-content:center; padding:48px 24px; text-align:center; gap:12px; } .chantier-empty-icon { font-size:48px; opacity:.4; } .chantier-empty-title { font-size:16px; font-weight:700; color:var(--t1); } .chantier-empty-sub { font-size:13px; color:var(--t3); line-height:1.5; } /* ─── POST CARD ───────────────────────────────────────────────── */ .post-card { background:var(--c1); border:1px solid var(--b2); border-radius:16px; margin-bottom:14px; overflow:hidden; box-shadow:0 2px 12px rgba(0,0,0,.06); transition:box-shadow .2s; } .post-header { padding:14px 14px 10px; display:flex; align-items:center; gap:10px; } .post-avatar { width:38px; height:38px; border-radius:50%; background:linear-gradient(135deg,var(--or),var(--or2)); display:grid; place-items:center; font-size:14px; font-weight:800; color:#fff; flex-shrink:0; box-shadow:0 3px 10px var(--org); } .post-meta { flex:1; } .post-author { font-size:13px; font-weight:700; color:var(--t1); } .post-date { font-size:10px; color:var(--t3); margin-top:2px; display:flex; align-items:center; gap:4px; } .post-badge { font-size:9px; font-weight:700; background:var(--org); color:var(--or); padding:2px 6px; border-radius:99px; } .post-text { padding:0 14px 14px; font-size:14px; color:var(--t1); line-height:1.6; } .post-photo-wrap { position:relative; background:#000; } .post-photo { width:100%; max-height:300px; object-fit:cover; display:block; cursor:pointer; transition:opacity .2s; } .post-photo:active { opacity:.85; } .post-annotate-btn { position:absolute; bottom:10px; right:10px; background:rgba(0,0,0,.7); color:#fff; border:none; border-radius:10px; padding:7px 14px; font-size:12px; font-weight:700; cursor:pointer; display:flex; align-items:center; gap:5px; box-shadow:0 2px 8px rgba(0,0,0,.3); } .post-stats { padding:8px 14px; display:flex; gap:16px; border-top:1px solid var(--b1); } .post-stat { font-size:11px; color:var(--t3); display:flex; align-items:center; gap:4px; } .post-comments { border-top:1px solid var(--b1); background:var(--c2); } .post-comment { padding:10px 14px; display:flex; gap:10px; align-items:flex-start; border-bottom:1px solid var(--b1); } .post-comment:last-of-type { border-bottom:none; } .comment-avatar { width:26px; height:26px; border-radius:50%; background:linear-gradient(135deg,var(--bl),#1d4ed8); display:grid; place-items:center; font-size:10px; font-weight:800; color:#fff; flex-shrink:0; margin-top:1px; } .comment-body { flex:1; } .comment-author { font-size:11px; font-weight:700; color:var(--t1); } .comment-text { font-size:13px; color:var(--t1); margin-top:2px; line-height:1.4; } .comment-time { font-size:9px; color:var(--t3); margin-top:3px; } .post-add-comment { padding:10px 12px; display:flex; gap:8px; align-items:center; background:var(--c1); } .post-add-comment input { flex:1; background:var(--c2); border:1px solid var(--b2); border-radius:22px; padding:9px 14px; font-size:13px; color:var(--t1); outline:none; font-family:var(--f); transition:.2s; } .post-add-comment input:focus { border-color:var(--or); background:var(--bg); } .post-add-comment button { width:36px; height:36px; background:var(--or); color:#fff; border:none; border-radius:50%; font-size:15px; font-weight:700; cursor:pointer; display:grid; place-items:center; flex-shrink:0; box-shadow:0 2px 8px var(--org); } /* ─── CHAT ────────────────────────────────────────────────────── */ .chat-wrap { display:flex; flex-direction:column; gap:2px; padding:10px 0; } .chat-day-sep { text-align:center; margin:10px 0 6px; font-size:10px; font-weight:600; color:var(--t3); } .chat-day-sep span { background:var(--c2); padding:3px 10px; border-radius:99px; border:1px solid var(--b2); } .chat-row { display:flex; gap:8px; align-items:flex-end; padding:2px 10px; } .chat-row.mine { flex-direction:row-reverse; } .chat-msg-avatar { width:28px; height:28px; border-radius:50%; background:linear-gradient(135deg,var(--bl),#1d4ed8); display:grid; place-items:center; font-size:10px; font-weight:800; color:#fff; flex-shrink:0; } .chat-col { display:flex; flex-direction:column; max-width:75%; } .chat-row.mine .chat-col { align-items:flex-end; } .chat-msg-name { font-size:9px; font-weight:700; color:var(--t3); margin-bottom:3px; padding:0 4px; } .chat-bubble { padding:9px 13px; border-radius:18px; font-size:13px; line-height:1.45; word-break:break-word; } .chat-row:not(.mine) .chat-bubble { background:var(--c2); border:1px solid var(--b2); border-bottom-left-radius:4px; color:var(--t1); } .chat-row.mine .chat-bubble { background:linear-gradient(135deg,var(--or),var(--or2)); color:#fff; border-bottom-right-radius:4px; box-shadow:0 3px 10px var(--org); } .chat-msg-photo { width:180px; border-radius:14px; cursor:pointer; display:block; box-shadow:0 2px 8px rgba(0,0,0,.2); } .chat-msg-time { font-size:9px; color:var(--t3); margin-top:3px; padding:0 4px; } .chat-row.mine .chat-msg-time { text-align:right; } /* ─── CHAT INPUT ──────────────────────────────────────────────── */ .chat-input-bar { display:flex; gap:8px; align-items:center; padding:10px 12px; background:var(--c1); border-top:1px solid var(--b2); flex-shrink:0; } .chat-input-bar button.cam-btn { width:40px; height:40px; background:var(--c2); border:1px solid var(--b2); border-radius:12px; cursor:pointer; font-size:18px; display:grid; place-items:center; flex-shrink:0; } .chat-input-bar input { flex:1; background:var(--c2); border:1px solid var(--b2); border-radius:22px; padding:10px 14px; font-size:13px; color:var(--t1); outline:none; font-family:var(--f); transition:.2s; } .chat-input-bar input:focus { border-color:var(--or); box-shadow:0 0 0 2px var(--org); } .chat-input-bar button.send-btn { width:40px; height:40px; background:linear-gradient(135deg,var(--or),var(--or2)); color:#fff; border:none; border-radius:50%; font-size:16px; cursor:pointer; display:grid; place-items:center; flex-shrink:0; box-shadow:0 3px 10px var(--org); } /* ─── ANNOTATION PRO ─────────────────────────────────────────── */ #modal-annotation { position:fixed; inset:0; background:#0a0a0a; z-index:9900; display:none; flex-direction:column; } /* Header annotation */ #annot-header { display:flex; align-items:center; justify-content:space-between; padding:10px 14px; background:rgba(18,18,18,.98); border-bottom:1px solid rgba(255,255,255,.08); flex-shrink:0; } #annot-header-title { color:#fff; font-size:14px; font-weight:700; } .annot-hbtn { padding:7px 16px; border-radius:10px; border:none; font-size:13px; font-weight:700; cursor:pointer; transition:.15s; } .annot-hbtn-close { background:rgba(255,59,48,.15); color:#ff453a; } .annot-hbtn-save { background:#f97316; color:#fff; box-shadow:0 2px 10px rgba(249,115,22,.35); } /* Canvas */ #annot-canvas-wrap { flex:1; overflow:hidden; display:flex; align-items:center; justify-content:center; background:#111; position:relative; } #annot-container { position:relative; display:inline-block; line-height:0; } #annot-base-img { display:block; } #annot-canvas { position:absolute; top:0; left:0; touch-action:none; cursor:crosshair; } #annot-text-input { position:absolute; background:transparent; border:none; outline:none; color:#fff; font-size:18px; font-weight:700; text-shadow:0 1px 4px rgba(0,0,0,.8); min-width:60px; z-index:10; display:none; padding:2px 4px; caret-color:#f97316; } /* Toolbar bas */ #annot-toolbar-wrap { background:rgba(18,18,18,.98); border-top:1px solid rgba(255,255,255,.08); flex-shrink:0; padding:8px 0 calc(8px + env(safe-area-inset-bottom,0px)); } #annot-tools-row { display:flex; align-items:center; justify-content:center; gap:6px; padding:0 12px 8px; } #annot-colors-row { display:flex; align-items:center; justify-content:center; gap:8px; padding:6px 12px 4px; border-top:1px solid rgba(255,255,255,.06); flex-wrap:wrap; } #annot-sizes-row { display:flex; align-items:center; justify-content:center; gap:12px; padding:6px 12px 2px; } .at-btn { width:44px; height:44px; border-radius:12px; border:1.5px solid rgba(255,255,255,.12); background:rgba(255,255,255,.06); color:#fff; font-size:18px; cursor:pointer; display:grid; place-items:center; transition:all .15s; flex-shrink:0; } .at-btn:active { transform:scale(.9); } .at-btn.active { background:#f97316; border-color:#f97316; box-shadow:0 2px 10px rgba(249,115,22,.4); } .at-btn span { font-size:11px; font-weight:700; line-height:1; } .ac-swatch { width:28px; height:28px; border-radius:50%; cursor:pointer; border:2.5px solid transparent; transition:all .15s; flex-shrink:0; box-shadow:0 1px 4px rgba(0,0,0,.4); } .ac-swatch.active { border-color:#fff; transform:scale(1.3); box-shadow:0 0 0 2px rgba(255,255,255,.3); } .as-btn { display:flex; align-items:center; justify-content:center; cursor:pointer; border:1.5px solid rgba(255,255,255,.12); border-radius:99px; background:rgba(255,255,255,.06); transition:all .15s; flex-shrink:0; } .as-btn.active { border-color:#f97316; background:rgba(249,115,22,.15); } .as-btn-dot { background:#fff; border-radius:50%; } /* Action sheet sauvegarde */ #annot-save-sheet { position:absolute; inset:0; background:rgba(0,0,0,.7); z-index:20; display:none; align-items:flex-end; justify-content:center; } #annot-save-sheet-inner { background:#1a1a1a; border-radius:20px 20px 0 0; width:100%; max-width:480px; padding:20px 20px calc(20px + env(safe-area-inset-bottom,0px)); border-top:1px solid rgba(255,255,255,.1); } .annot-save-btn { width:100%; padding:16px; margin-bottom:10px; border:none; border-radius:14px; font-size:15px; font-weight:700; cursor:pointer; display:flex; align-items:center; gap:12px; text-align:left; transition:.15s; } .annot-save-btn:active { transform:scale(.98); } .annot-save-btn-icon { font-size:22px; width:32px; text-align:center; } /* Photo plein écran */ #modal-photo-full { position:fixed; inset:0; background:rgba(0,0,0,.97); z-index:9800; display:none; flex-direction:column; } #photo-full-top-bar { display:flex; align-items:center; justify-content:space-between; padding:12px 14px; background:rgba(0,0,0,.6); flex-shrink:0; } #photo-full-top-bar button { background:rgba(255,255,255,.12); border:none; color:#fff; border-radius:10px; padding:8px 14px; font-size:13px; font-weight:700; cursor:pointer; } #photo-full-img-wrap { flex:1; display:flex; align-items:center; justify-content:center; overflow:hidden; } #photo-full-img { max-width:100%; max-height:100%; object-fit:contain; } #photo-full-bottom-bar { display:flex; align-items:center; justify-content:center; gap:12px; padding:14px 14px calc(14px + env(safe-area-inset-bottom,0px)); background:rgba(0,0,0,.6); flex-shrink:0; } #photo-full-bottom-bar button { flex:1; padding:13px; border:none; border-radius:14px; font-size:14px; font-weight:700; cursor:pointer; } #btn-annot-from-full { background:#f97316; color:#fff; box-shadow:0 3px 12px rgba(249,115,22,.4); } #btn-dl-from-full { background:rgba(255,255,255,.1); color:#fff; border:1px solid rgba(255,255,255,.2); } /* Documents dans le chat/feed */ .doc-bubble { display:flex; align-items:center; gap:10px; padding:10px 12px; background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.1); border-radius:12px; cursor:pointer; transition:.15s; max-width:220px; } .doc-bubble:active { opacity:.8; } .doc-icon { width:36px; height:36px; border-radius:8px; display:grid; place-items:center; font-size:18px; flex-shrink:0; } .doc-icon-pdf { background:rgba(255,59,48,.15); } .doc-icon-xl { background:rgba(52,199,89,.15); } .doc-icon-img { background:rgba(0,122,255,.15); } .doc-icon-file { background:rgba(142,142,147,.15); } .doc-name { font-size:12px; font-weight:600; color:#fff; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .doc-size { font-size:10px; color:rgba(255,255,255,.5); margin-top:2px; } /* Notification in-app */ .notif-popup { position:fixed; top:74px; left:12px; right:12px; background:var(--c1); border:1px solid var(--b2); border-radius:14px; padding:12px 14px; display:flex; gap:10px; align-items:center; box-shadow:0 8px 32px rgba(0,0,0,.35); z-index:9990; transform:translateY(-120px); transition:transform .4s cubic-bezier(.2,.8,.2,1); pointer-events:none; } .notif-popup.show { transform:translateY(0); pointer-events:all; } .notif-popup-icon { font-size:22px; flex-shrink:0; } .notif-popup-body { flex:1; min-width:0; } .notif-popup-title { font-size:13px; font-weight:700; color:var(--t1); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .notif-popup-text { font-size:12px; color:var(--t3); margin-top:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .notif-popup-close { background:none; border:none; color:var(--t3); font-size:16px; cursor:pointer; padding:4px; flex-shrink:0; } #notif-badge { position:absolute; top:6px; right:6px; width:8px; height:8px; background:var(--rd); border-radius:50%; display:none; pointer-events:none; } .nav-item { position:relative; } /* ════════════════════════════════════════════════════════════ v10 — Hamburger drawer + Accueil cards ════════════════════════════════════════════════════════════ */ /* Cacher l'ancienne bottom-nav si elle existe */ .bottom-nav { display:none !important; } /* Le layout principal n'a plus besoin de padding pour la bottom-nav */ .screens { padding-bottom:0 !important; } .screen { padding-bottom:20px; } /* ── Drawer (sidebar) ── */ #drawer-backdrop { position:fixed; inset:0; background:rgba(0,0,0,0.55); opacity:0; pointer-events:none; transition:opacity .25s; z-index:9500; } #drawer-backdrop.open { opacity:1; pointer-events:auto; } #drawer { position:fixed; top:0; left:0; bottom:0; width:82%; max-width:320px; background:var(--c1); border-right:1px solid var(--b2); box-shadow:4px 0 24px rgba(0,0,0,0.4); transform:translateX(-105%); transition:transform .28s cubic-bezier(.16,1,.3,1); z-index:9600; display:flex; flex-direction:column; padding-top:env(safe-area-inset-top,0px); padding-bottom:env(safe-area-inset-bottom,0px); } #drawer.open { transform:translateX(0); } .drawer-head { display:flex; align-items:center; gap:12px; padding:18px 16px; border-bottom:1px solid var(--b2); } .drawer-logo { width:44px; height:44px; border-radius:12px; background:var(--or); color:#fff; display:flex; align-items:center; justify-content:center; font-weight:900; font-size:14px; letter-spacing:.5px; box-shadow:0 4px 12px rgba(249,115,22,.35); } .drawer-close { background:var(--c2); border:1px solid var(--b2); color:var(--t1); border-radius:10px; width:36px; height:36px; font-size:16px; cursor:pointer; font-weight:700; flex-shrink:0; } .drawer-nav { flex:1; overflow-y:auto; padding:12px 8px; } .drawer-item { display:flex; align-items:center; gap:14px; padding:14px 14px; margin-bottom:4px; border-radius:12px; cursor:pointer; color:var(--t1); font-size:15px; font-weight:600; transition:background .15s; } .drawer-item:hover, .drawer-item:active { background:var(--c2); } .drawer-item.active { background:var(--org); color:var(--or); } .drawer-ico { font-size:22px; width:32px; text-align:center; flex-shrink:0; } .drawer-foot { padding:14px 16px; border-top:1px solid var(--b2); } /* ── Bouton hamburger dans la topbar ── */ #btn-hamburger:active { background:var(--c2) !important; border-radius:8px; } /* ── Écran d'accueil (cards style Alobees) ── */ .accueil-grid { display:grid; grid-template-columns:1fr 1fr; gap:14px; } .acc-card { position:relative; border-radius:18px; padding:20px 16px 18px; min-height:130px; cursor:pointer; color:#fff; display:flex; flex-direction:column; justify-content:space-between; box-shadow:0 6px 18px rgba(0,0,0,.25); transition:transform .15s, box-shadow .15s; overflow:hidden; } .acc-card:active { transform:scale(0.97); } .acc-card::before { content:""; position:absolute; top:-20px; right:-20px; width:90px; height:90px; border-radius:50%; background:rgba(255,255,255,0.12); } .acc-ico { font-size:34px; line-height:1; position:relative; z-index:1; filter:drop-shadow(0 2px 6px rgba(0,0,0,.3)); } .acc-title { font-size:15px; font-weight:800; line-height:1.25; margin-top:auto; position:relative; z-index:1; } .acc-sub { font-size:11px; opacity:0.85; font-weight:500; margin-top:2px; position:relative; z-index:1; } .acc-orange { background:linear-gradient(135deg, #f97316 0%, #ea580c 100%); } .acc-blue { background:linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%); } .acc-green { background:linear-gradient(135deg, #22c55e 0%, #15803d 100%); } .acc-purple { background:linear-gradient(135deg, #a855f7 0%, #7c3aed 100%); } .acc-dark { background:linear-gradient(135deg, #52525b 0%, #27272a 100%); grid-column:1/-1; min-height:90px; flex-direction:row; align-items:center; gap:16px; } .acc-dark .acc-ico { font-size:30px; } .acc-dark .acc-title { margin-top:0; } /* ════════════════════════════════════════════════════════════ v15 — Scroll fluide (CSS minimal) ════════════════════════════════════════════════════════════ */ .post-card { /* Rien de spécial — on laisse le navigateur gérer */ } #s-chantiers { -webkit-overflow-scrolling: touch; overscroll-behavior: contain; } .post-card img { transition: none !important; } /* Modal photo plein écran — couche indépendante pour éviter les repaints du fil */ #modal-photo-full { isolation: isolate; contain: strict; will-change: transform; } #photo-full-img { backface-visibility: hidden; -webkit-backface-visibility: hidden; } /* ════════════════════════════════════════════════════════════ v17 — Fil d'actualité style WhatsApp ════════════════════════════════════════════════════════════ */ /* Fond de l'écran chantiers plus doux */ #s-chantiers { background: var(--bg); } #chantier-feed { display: flex; flex-direction: column; gap: 14px; } /* ── Row (wrapper de chaque post) ── */ .post-row { display: flex; flex-direction: column; max-width: 92%; } .post-row-mine { align-self: flex-end; align-items: flex-end; } .post-row-other { align-self: flex-start; align-items: flex-start; } /* ── Bulle de post ── */ .post-card { background: var(--c1); border-radius: 18px; padding: 12px 14px 10px; box-shadow: 0 2px 10px rgba(0,0,0,.18); position: relative; max-width: 100%; word-wrap: break-word; } .post-card-other { background: var(--c1); border-top-left-radius: 4px; } .post-card-mine { background: linear-gradient(135deg, #27272a 0%, #1f1f23 100%); border: 1px solid rgba(249,115,22,.35); border-top-right-radius: 4px; } body.light-mode .post-card-mine { background: linear-gradient(135deg, #fff4ec 0%, #ffe8d8 100%); border-color: rgba(249,115,22,.4); } /* ── Header auteur ── */ .post-header { display: flex; align-items: center; gap: 10px; margin-bottom: 6px; } .post-avatar { width: 32px; height: 32px; border-radius: 50%; background: linear-gradient(135deg, var(--or), var(--or2)); color: #fff; font-weight: 800; font-size: 13px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; box-shadow: 0 2px 6px rgba(249,115,22,.35); } .post-meta { flex: 1; min-width: 0; } .post-author { font-size: 13px; font-weight: 800; color: var(--or); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .post-author-mine { color: var(--or); text-align: right; } .post-del-btn { background: transparent; border: none; color: rgba(239,68,68,.7); font-size: 16px; cursor: pointer; padding: 4px 6px; border-radius: 8px; flex-shrink: 0; } .post-del-btn:active { background: rgba(239,68,68,.15); } /* ── Texte du post ── */ .post-text { font-size: 14px; line-height: 1.5; color: var(--t1); margin: 4px 0 8px; white-space: pre-wrap; word-wrap: break-word; } /* ── Mosaïque de photos ── */ .photo-mosaic { display: grid; gap: 3px; border-radius: 12px; overflow: hidden; margin: 6px 0; max-width: 100%; } .photo-mosaic.photos-1 { grid-template-columns: 1fr; } .photo-mosaic.photos-1 .mosaic-cell { aspect-ratio: 4/3; max-height: 320px; } .photo-mosaic.photos-2 { grid-template-columns: 1fr 1fr; } .photo-mosaic.photos-2 .mosaic-cell { aspect-ratio: 1/1; } .photo-mosaic.photos-3 { grid-template-columns: 2fr 1fr; grid-template-rows: 1fr 1fr; aspect-ratio: 4/3; } .photo-mosaic.photos-3 .mosaic-cell:nth-child(1) { grid-row: 1 / 3; } .photo-mosaic.photos-4 { grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; aspect-ratio: 1/1; } .mosaic-cell { position: relative; background: var(--c2); overflow: hidden; cursor: pointer; } .mosaic-cell img { width: 100%; height: 100%; object-fit: cover; display: block; transition: none !important; } .mosaic-more { position: absolute; inset: 0; background: rgba(0,0,0,0.55); color: #fff; font-size: 28px; font-weight: 800; display: flex; align-items: center; justify-content: center; backdrop- -webkit-backdrop- } /* ── Document (PDF/Word/Excel...) dans un post ── */ .post-doc-link { display: flex; align-items: center; gap: 12px; margin-top: 8px; padding: 10px 12px; background: var(--c2); border: 1px solid var(--b2); border-radius: 12px; text-decoration: none; color: var(--t1); } .post-doc-ico { font-size: 26px; flex-shrink: 0; } .post-doc-body { flex: 1; min-width: 0; } .post-doc-name { font-size: 13px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .post-doc-size { font-size: 11px; color: var(--t3); margin-top: 2px; } .post-doc-dl { font-size: 18px; color: var(--or); } /* ── Footer date ── */ .post-footer { display: flex; justify-content: flex-end; margin-top: 6px; } .post-footer .post-date { font-size: 10px; color: var(--t3); font-weight: 500; } /* ── Réactions badges ── */ .post-reactions { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; } .post-reactions:empty { display: none; } .reaction-badge { display: inline-flex; align-items: center; gap: 3px; padding: 3px 8px; background: var(--c2); border: 1px solid var(--b2); border-radius: 99px; font-size: 12px; } .reaction-emoji { font-size: 13px; } .reaction-count { font-size: 11px; font-weight: 700; color: var(--t2); } /* ── Picker de réactions (appui long) ── */ .reaction-picker { display: flex; gap: 4px; padding: 8px 10px; background: var(--c1); border: 1px solid var(--b2); border-radius: 99px; box-shadow: 0 8px 24px rgba(0,0,0,.4); animation: pickerPop 0.2s cubic-bezier(.16,1,.3,1); } @keyframes pickerPop { from { transform: scale(0.7) translateY(10px); opacity: 0; } to { transform: scale(1) translateY(0); opacity: 1; } } .reaction-btn { width: 42px; height: 42px; border: none; background: transparent; font-size: 24px; cursor: pointer; border-radius: 50%; transition: transform 0.15s; } .reaction-btn:active { transform: scale(1.3); background: var(--c2); } /* ── Commentaires (à l'intérieur de la carte) ── */ .post-comments { margin-top: 4px; gap: 3px; padding: 4px 0 0; display: flex; flex-direction: column; } .post-comment { display: flex; gap: 6px; align-items: flex-start; } .comment-avatar { width: 22px; height: 22px; border-radius: 50%; background: var(--c3); color: var(--t1); font-size: 10px; font-weight: 800; display: flex; align-items: center; justify-content: center; flex-shrink: 0; margin-top: 2px; } .comment-body { background: var(--c2); padding: 5px 10px; border-radius: 12px; max-width: 100%; flex: 1; border: 1px solid var(--b1); } .comment-author { font-size: 10px; font-weight: 800; color: var(--or); margin-bottom: 1px; } .comment-text { font-size: 12px; color: var(--t1); line-height: 1.35; word-wrap: break-word; } .comment-time { font-size: 9px; color: var(--t3); margin-top: 2px; } /* ── Zone d'ajout de commentaire ── */ .post-add-comment { display: flex; gap: 6px; margin-top: 6px; width: 100%; max-width: 320px; } .post-add-comment input { flex: 1; background: var(--c2); border: 1px solid var(--b2); color: var(--t1); border-radius: 99px; padding: 8px 14px; font-size: 12px; font-family: var(--f); outline: none; } .post-add-comment input:focus { border-color: var(--or); } .post-add-comment button { width: 32px; height: 32px; border-radius: 50%; background: var(--or); color: #fff; border: none; font-size: 16px; font-weight: 800; cursor: pointer; flex-shrink: 0; } /* ── Upload loader moderne ── */ #upload-loader { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.75); z-index: 10500; align-items: center; justify-content: center; padding: 20px; } .ul-box { background: var(--c1); border: 1px solid var(--b2); border-radius: 20px; padding: 28px 24px; width: 100%; max-width: 320px; text-align: center; box-shadow: 0 20px 60px rgba(0,0,0,.6); } .ul-spinner { width: 56px; height: 56px; border: 4px solid var(--c3); border-top-color: var(--or); border-radius: 50%; animation: ul-spin 0.9s linear infinite; margin: 0 auto 18px; } @keyframes ul-spin { to { transform: rotate(360deg); } } .ul-title { font-size: 16px; font-weight: 800; color: var(--t1); margin-bottom: 6px; } .ul-sub { font-size: 12px; color: var(--t2); margin-bottom: 16px; min-height: 16px; word-wrap: break-word; } .ul-bar-wrap { height: 6px; background: var(--c3); border-radius: 99px; overflow: hidden; } .ul-bar { height: 100%; background: linear-gradient(90deg, var(--or), var(--or2)); border-radius: 99px; width: 0; transition: width 0.3s ease-out; } /* ════════════════════════════════════════════════════════════ v18 — Popup profil, vidéos, commentaires expand, réactions ════════════════════════════════════════════════════════════ */ /* Avatar cliquable */ .clickable-avatar { cursor: pointer; transition: transform 0.15s; } .clickable-avatar:active { transform: scale(0.92); } /* Popup infos utilisateur */ .user-popup-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.65); z-index: 10800; display: flex; align-items: center; justify-content: center; padding: 20px; animation: fadeIn 0.2s; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .user-popup-box { background: linear-gradient(180deg, var(--c1) 0%, var(--c2) 100%); border: 1px solid var(--b2); border-radius: 20px; padding: 32px 24px 24px; width: 100%; max-width: 320px; text-align: center; position: relative; box-shadow: 0 20px 60px rgba(0,0,0,.6); animation: popUp 0.25s cubic-bezier(.16,1,.3,1); } @keyframes popUp { from { transform: scale(0.85) translateY(20px); opacity: 0; } to { transform: scale(1) translateY(0); opacity: 1; } } .user-popup-close { position: absolute; top: 12px; right: 12px; background: var(--c2); border: 1px solid var(--b2); color: var(--t1); width: 32px; height: 32px; border-radius: 50%; font-size: 14px; cursor: pointer; font-weight: 700; } .user-popup-avatar { width: 86px; height: 86px; border-radius: 50%; background: linear-gradient(135deg, var(--or), var(--or2)); color: #fff; font-size: 34px; font-weight: 800; display: flex; align-items: center; justify-content: center; margin: 0 auto 14px; box-shadow: 0 6px 20px rgba(249,115,22,.35); overflow: hidden; } .user-popup-avatar img { width: 100%; height: 100%; object-fit: cover; display: block; } .user-popup-name { font-size: 18px; font-weight: 800; color: var(--t1); margin-bottom: 4px; } .user-popup-role { font-size: 12px; color: var(--or); font-weight: 700; margin-bottom: 12px; } .user-popup-email { display: inline-block; padding: 8px 16px; background: var(--c2); border: 1px solid var(--b2); border-radius: 99px; color: var(--t1); font-size: 12px; font-weight: 600; text-decoration: none; margin-top: 6px; } /* Vidéo dans un post */ .post-video-wrap { margin: 8px 0 4px; border-radius: 12px; overflow: hidden; } /* Bouton "Voir X commentaires précédents" */ .comments-expand-btn { align-self: flex-start; background: transparent; border: none; color: var(--or); font-size: 11px; font-weight: 700; cursor: pointer; padding: 4px 8px; border-radius: 6px; margin-bottom: 2px; font-family: var(--f); } .post-comments-mine .comments-expand-btn { align-self: flex-end; } .comments-expand-btn:active { background: var(--c2); } /* Réactions sur commentaires */ .comment-reactions { display: flex; flex-wrap: wrap; gap: 3px; margin-top: 3px; } .comment-reactions:empty { display: none; } .comment-reaction-badge { display: inline-flex; align-items: center; gap: 2px; padding: 1px 6px; background: var(--c1); border: 1px solid var(--b2); border-radius: 99px; font-size: 11px; line-height: 1.5; } .comment-reaction-badge span { font-size: 10px; font-weight: 700; color: var(--t2); margin-left: 2px; } /* ════════════════════════════════════════════════════════════ v19 — Commentaires plus compacts + popup contact list ════════════════════════════════════════════════════════════ */ /* Réduction de l'espacement des commentaires */ .post-comments { margin-top: 4px; gap: 3px; padding: 4px 0 0; display: flex; flex-direction: column; } .post-comment { display: flex; gap: 6px; align-items: flex-start; } .comment-body { background: var(--c2); padding: 5px 10px; border-radius: 12px; max-width: 100%; flex: 1; border: 1px solid var(--b1); } .comment-top-line { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; } .comment-author { font-size: 11px; font-weight: 800; color: var(--or); line-height: 1.2; } .comment-reactions-inline { display: inline-flex; gap: 3px; align-items: center; } .comment-reactions-inline:empty { display: none; } .cr-badge { font-size: 12px; background: var(--c1); border: 1px solid var(--b2); border-radius: 99px; padding: 0 5px; line-height: 1.6; } .comment-text { font-size: 13px; color: var(--t1); line-height: 1.35; margin: 2px 0 1px; word-wrap: break-word; } .comment-time { font-size: 9px; color: var(--t3); margin-top: 1px; } .comment-avatar { width: 24px; height: 24px; border-radius: 50%; background: var(--c3); color: var(--t1); font-size: 10px; font-weight: 800; display: flex; align-items: center; justify-content: center; flex-shrink: 0; margin-top: 2px; } .post-add-comment { display: flex; gap: 6px; margin-top: 6px; width: 100%; } .post-add-comment input { flex: 1; background: var(--c2); border: 1px solid var(--b2); color: var(--t1); border-radius: 99px; padding: 8px 14px; font-size: 12px; font-family: var(--f); outline: none; } .post-add-comment input:focus { border-color: var(--or); } .post-add-comment button { width: 34px; height: 34px; border-radius: 50%; background: var(--or); color: #fff; border: none; font-size: 16px; font-weight: 800; cursor: pointer; flex-shrink: 0; } .comments-expand-btn { background: transparent; border: none; color: var(--or); font-size: 11px; font-weight: 700; cursor: pointer; padding: 4px 0; font-family: var(--f); } .comments-expand-btn:active { opacity: .6; } /* Popup contact - liste stylée */ .user-popup-contact-list { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; } .user-popup-contact-item { display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: var(--c2); border: 1px solid var(--b2); border-radius: 12px; color: var(--t1); font-size: 12px; font-weight: 600; text-decoration: none; text-align: left; word-break: break-word; } .user-popup-contact-item span { font-size: 16px; flex-shrink: 0; color: var(--or); } .user-popup-contact-item:active { background: var(--c3); } /* ── Onglet Médias dans chantier détail ── */ .chantier-tabs { display: flex; gap: 4px; padding: 8px 12px 0; background: var(--c1); border-bottom: 1px solid var(--b2); position: sticky; top: 0; z-index: 4; } .chantier-tab-btn { flex: 1; padding: 10px 8px; background: transparent; border: none; border-bottom: 2px solid transparent; color: var(--t2); font-size: 12px; font-weight: 700; cursor: pointer; font-family: var(--f); } .chantier-tab-btn.active { color: var(--or); border-bottom-color: var(--or); } .media-tab-content { padding: 12px; } .media-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; } .media-grid-item { aspect-ratio: 1/1; background: var(--c2); border-radius: 8px; overflow: hidden; cursor: pointer; position: relative; } .media-grid-item img, .media-grid-item video { width: 100%; height: 100%; object-fit: cover; display: block; } .media-grid-item .video-badge { position: absolute; top: 4px; right: 4px; background: rgba(0,0,0,.6); color: #fff; font-size: 10px; padding: 2px 6px; border-radius: 4px; font-weight: 700; } .media-docs-list { display: flex; flex-direction: column; gap: 8px; } .media-empty { text-align: center; padding: 40px 20px; color: var(--t3); font-size: 13px; } /* ════════════════════════════════════════════════════════════ v20 — Fil centré LinkedIn + Tags + Filtres + Actions profil ════════════════════════════════════════════════════════════ */ /* Reset : plus de bulles gauche/droite → tout centré */ .post-row { display: flex; flex-direction: column; max-width: 100%; align-self: stretch; align-items: stretch; } .post-row-mine, .post-row-other { align-self: stretch !important; align-items: stretch !important; } .post-card { max-width: 100%; border-top-left-radius: 16px; border-top-right-radius: 16px; } .post-card-mine, .post-card-other { background: var(--c1) !important; border: 1px solid var(--b2) !important; border-radius: 16px !important; } .post-comments { align-self: stretch !important; align-items: stretch !important; } .post-comments-mine, .post-comments-other { align-self: stretch !important; align-items: stretch !important; } /* Header : date sous le nom maintenant */ .post-date { font-size: 11px; color: var(--t3); font-weight: 500; } /* Tag badge sur le post */ .post-tag-badge { display: inline-block; font-size: 10px; font-weight: 800; padding: 3px 10px; border: 1.5px solid; border-radius: 99px; margin-bottom: 8px; letter-spacing: .3px; } /* Tag selector dans le header (admin) */ .post-tag-select { background: var(--c2); border: 1px solid var(--b2); border-radius: 8px; color: var(--t1); font-size: 14px; padding: 4px 6px; flex-shrink: 0; cursor: pointer; font-family: var(--f); -webkit-appearance: none; } /* Barre de filtres */ .filter-btn { padding: 6px 14px; border-radius: 99px; background: var(--c2); border: 1px solid var(--b2); color: var(--t2); font-size: 12px; font-weight: 700; white-space: nowrap; cursor: pointer; font-family: var(--f); flex-shrink: 0; } .filter-btn.active { background: var(--or); color: #fff; border-color: var(--or); } /* Tag radio dans modal nouveau post */ .tag-radio { display: inline-flex; cursor: pointer; } .tag-radio input { display: none; } .tag-opt { padding: 5px 10px; border-radius: 99px; background: var(--c2); border: 1px solid var(--b2); font-size: 11px; font-weight: 700; color: var(--t2); } .tag-radio input:checked + .tag-opt { border-color: var(--or); background: rgba(249,115,22,.15); color: var(--or); } .tag-red { color: #ef4444 !important; } .tag-orange { color: #f97316 !important; } .tag-green { color: #22c55e !important; } /* Boutons d'action dans la popup profil */ .user-popup-actions { display: flex; gap: 10px; justify-content: center; margin-top: 14px; } .user-action-btn { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 12px 16px; background: var(--c2); border: 1px solid var(--b2); border-radius: 14px; color: var(--t1); font-size: 11px; font-weight: 700; text-decoration: none; min-width: 70px; } .user-action-btn span { font-size: 22px; } .user-action-btn:active { background: var(--c3); } /* Bouton fermer popup profil */ .user-popup-close-btn { display: block; width: 100%; margin-top: 14px; padding: 12px; background: var(--or); color: #fff; border: none; border-radius: 14px; font-size: 14px; font-weight: 800; cursor: pointer; font-family: var(--f); } /* ════════════════════════════════════════════════════════════ v27 — PLANNING GANTT PRO BTP - Vue Chantiers / Ressources - Hiérarchie Parent/Enfant - Sidebar pliable - Design épuré ════════════════════════════════════════════════════════════ */ #s-gantt { background: var(--bg); padding-bottom: 0 !important; overflow: hidden !important; } #s-gantt.on { display: flex !important; flex-direction: column !important; } /* ── Toolbar ── */ .gantt-toolbar { background: var(--c1); border-bottom: 1px solid var(--b2); padding: 10px 14px; flex-shrink: 0; display: flex; flex-direction: column; gap: 8px; } .gantt-toolbar-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .gantt-summary { font-size: 11px; color: var(--t3); font-weight: 600; margin-left: auto; white-space: nowrap; } /* Segmented toggle Chantiers/Ressources */ .gantt-view-tabs { display: flex; background: var(--c2); border-radius: 10px; padding: 3px; gap: 2px; } .gantt-view-btn { padding: 7px 14px; background: transparent; border: none; color: var(--t2); font-size: 12px; font-weight: 700; cursor: pointer; border-radius: 8px; font-family: var(--f); white-space: nowrap; } .gantt-view-btn.active { background: var(--c1); color: var(--or); box-shadow: 0 1px 3px rgba(0,0,0,.1); } /* Zoom tabs */ .gantt-zoom-tabs { display: flex; gap: 2px; background: var(--c2); border-radius: 10px; padding: 3px; } .gantt-zoom-btn { padding: 6px 12px; background: transparent; border: none; color: var(--t2); font-size: 11px; font-weight: 700; cursor: pointer; border-radius: 7px; font-family: var(--f); } .gantt-zoom-btn.active { background: var(--or); color: #fff; } /* Boutons d'action */ .gantt-today-btn, .gantt-filter-btn, .gantt-icon-btn { padding: 7px 12px; background: var(--c2); border: 1px solid var(--b2); color: var(--t1); font-size: 12px; font-weight: 700; cursor: pointer; border-radius: 9px; font-family: var(--f); white-space: nowrap; } .gantt-icon-btn { width: 34px; padding: 7px 0; text-align: center; font-size: 11px; } .gantt-filter-btn.active { background: var(--or); color: #fff; border-color: var(--or); } /* ── Layout ── */ #gantt-layout { display: flex; flex: 1; min-height: 0; overflow: hidden; position: relative; } /* Sidebar */ #gantt-sidebar { width: 280px; flex-shrink: 0; background: var(--c1); border-right: 1px solid var(--b2); overflow-y: auto; display: flex; flex-direction: column; transition: width 0.2s ease, margin-left 0.2s ease; } #s-gantt.gantt-sidebar-hidden #gantt-sidebar { width: 0; margin-left: -1px; border-right: none; overflow: hidden; } .gantt-sidebar-header { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid var(--b2); font-size: 10px; font-weight: 800; color: var(--t3); text-transform: uppercase; letter-spacing: .6px; position: sticky; top: 0; background: var(--c1); z-index: 2; flex-shrink: 0; } .gantt-sidebar-header button { background: var(--or); border: none; color: #fff; width: 28px; height: 28px; border-radius: 50%; font-size: 16px; font-weight: 800; cursor: pointer; } #gantt-tree { flex: 1; } .gantt-empty { padding: 48px 20px; text-align: center; color: var(--t3); font-size: 13px; line-height: 1.6; } /* ── Lignes parent (chantier / tech) ── */ .gantt-parent-row { display: flex; align-items: center; gap: 8px; padding: 0 16px; height: 48px; border-bottom: 1px solid var(--b1); border-left: 3px solid; cursor: pointer; font-weight: 700; transition: background 0.1s; } .gantt-parent-row:hover { filter: brightness(1.05); } .gantt-chevron { font-size: 10px; color: var(--t3); width: 12px; text-align: center; flex-shrink: 0; } .gantt-parent-name { flex: 1; font-size: 13px; font-weight: 800; color: var(--t1); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .gantt-parent-meta { display: flex; align-items: center; gap: 6px; flex-shrink: 0; } .gantt-mini-bar { width: 50px; height: 5px; background: rgba(0,0,0,0.08); border-radius: 99px; overflow: hidden; display: inline-block; } .gantt-mini-fill { display: block; height: 100%; border-radius: 99px; } .gantt-parent-pct { font-size: 10px; font-weight: 800; color: var(--t2); min-width: 32px; text-align: right; } .gantt-tech-av { width: 24px; height: 24px; border-radius: 50%; background: #64748b; color: #fff; font-size: 11px; font-weight: 800; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } /* ── Lignes enfant (tâche / absence) ── */ .gantt-child-row { display: flex; align-items: center; gap: 6px; padding: 0 16px 0 44px; height: 48px; border-bottom: 1px solid var(--b1); cursor: pointer; background: var(--c1); } .gantt-child-row:hover { background: var(--c2); } .gantt-child-name { flex: 1; font-size: 12px; color: var(--t1); font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .gantt-child-pct { font-size: 10px; font-weight: 700; color: var(--t3); } .gantt-add-row { padding: 0 16px 0 44px; height: 44px; display: flex; align-items: center; font-size: 11px; color: var(--or); font-weight: 700; cursor: pointer; border-bottom: 1px solid var(--b1); background: var(--c1); } .gantt-add-row:hover { background: var(--c2); } /* ── Niveau 2 : Tâche principale ── */ .gantt-task-row { display: flex; align-items: center; gap: 6px; padding: 0 12px 0 28px; height: 42px; border-bottom: 1px solid var(--b1); cursor: pointer; background: var(--c1); border-left: 2px solid transparent; } .gantt-task-row:hover { background: var(--c2); } .gantt-task-chevron { font-size: 9px; color: var(--t3); width: 10px; flex-shrink: 0; } .gantt-task-name { flex: 1; font-size: 12px; font-weight: 600; color: var(--t1); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .gantt-task-pct { font-size: 10px; font-weight: 700; color: var(--t3); flex-shrink: 0; } /* ── Niveau 3 : Sous-tâche ── */ .gantt-sub-row { display: flex; align-items: center; gap: 5px; padding: 0 12px 0 40px; height: 38px; border-bottom: 1px solid var(--b1); cursor: pointer; background: var(--c1); } .gantt-sub-row:hover { background: var(--c2); } .gantt-sub-indent { font-size: 11px; color: var(--t3); flex-shrink: 0; } .gantt-sub-name { flex: 1; font-size: 11px; font-weight: 500; color: var(--t2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .gantt-sub-pct { font-size: 10px; font-weight: 600; color: var(--t3); flex-shrink: 0; } /* ── Bouton ajouter sous-tâche ── */ .gantt-add-sub-row { padding: 0 12px 0 52px; height: 36px; display: flex; align-items: center; font-size: 10px; color: var(--or); font-weight: 700; cursor: pointer; border-bottom: 1px solid var(--b1); background: var(--c1); opacity: 0.8; } .gantt-add-sub-row:hover { background: var(--c2); opacity: 1; } /* ── Barre sous-tâche (canvas) ── */ .g-bar-sub { border-style: dashed; opacity: 0.9; } /* ── Bandeau vue active ── */ #gantt-view-banner { display: flex; align-items: center; gap: 6px; padding: 5px 14px; font-size: 10px; font-weight: 800; text-transform: uppercase; letter-spacing: .6px; border-bottom: 1px solid var(--b2); flex-shrink: 0; } #gantt-view-banner.banner-chantiers { background: rgba(249,115,22,0.07); color: var(--or); border-bottom-color: rgba(249,115,22,0.2); } #gantt-view-banner.banner-ressources { background: rgba(59,130,246,0.07); color: var(--bl); border-bottom-color: rgba(59,130,246,0.2); } /* ── Drag feedback ── */ .g-bar-drag-ready { outline: 2px solid var(--or); outline-offset: 2px; animation: g-lp-pulse 0.4s ease-out forwards; } @keyframes g-lp-pulse { 0% { outline-color: transparent; outline-offset: 6px; } 60% { outline-color: var(--or); outline-offset: 2px; } 100% { outline-color: var(--or); outline-offset: 2px; } } .g-bar-drag-active { box-shadow: 0 8px 24px rgba(0,0,0,.35) !important; transform: translateY(-2px) scale(1.01) !important; transition: none !important; z-index: 20 !important; } .g-bar { contain: layout style; } /* ── Main : timeline + canvas ── */ #gantt-main { flex: 1; overflow: auto; background: var(--bg); position: relative; } #gantt-timeline { position: sticky; top: 0; background: var(--c1); border-bottom: 1px solid var(--b2); z-index: 3; box-shadow: 0 1px 0 rgba(0,0,0,0.04); } .gtl-top, .gtl-bot { display: flex; } .gtl-cell-top { font-size: 10px; font-weight: 800; color: var(--t2); text-transform: uppercase; letter-spacing: .5px; padding: 6px 8px; border-right: 1px solid var(--b1); background: var(--c2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .gtl-cell-bot { font-size: 10px; color: var(--t2); text-align: center; padding: 4px 0; border-right: 1px solid var(--b1); background: var(--c1); } .gtl-cell-bot.we { background: rgba(0,0,0,0.04); color: var(--t3); } .gtl-d1 { font-size: 8px; color: var(--t3); font-weight: 700; text-transform: uppercase; letter-spacing: .3px; } .gtl-d2 { font-size: 12px; font-weight: 800; color: var(--t1); margin-top: 1px; } .gtl-day { padding: 6px 0 8px; } /* ── Canvas ── */ #gantt-canvas-wrap { position: relative; min-height: 300px; } #gantt-grid { position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; } .g-grid-row { position: absolute; left: 0; right: 0; height: 1px; background: rgba(0,0,0,0.04); } .g-grid-col { position: absolute; top: 0; bottom: 0; border-right: 1px solid rgba(0,0,0,0.04); } .g-grid-col.we { background: rgba(0,0,0,0.025); } #gantt-bars { position: relative; } #gantt-arrows-svg { position: absolute; top: 0; left: 0; pointer-events: none; z-index: 2; display: none; } #s-gantt.gantt-show-arrows #gantt-arrows-svg { display: block; } /* ── Barres parent (résumé chantier) ── */ .g-parent-bar { position: absolute; border: 1px solid; border-radius: 6px; overflow: hidden; pointer-events: none; z-index: 3; } .g-parent-fill { position: absolute; top: 0; left: 0; bottom: 0; } /* ── Barres tâches ── */ .g-bar { position: absolute; border: 1.5px solid; border-radius: 8px; cursor: pointer; overflow: hidden; display: flex; align-items: center; user-select: none; -webkit-user-select: none; z-index: 5; transition: box-shadow 0.12s, transform 0.12s; box-shadow: 0 1px 3px rgba(0,0,0,0.08); } .g-bar:hover { box-shadow: 0 4px 12px rgba(0,0,0,0.18); transform: translateY(-1px); z-index: 6; } .g-bar-fill { position: absolute; top: 0; left: 0; bottom: 0; opacity: 0.35; pointer-events: none; transition: width 0.2s; } .g-bar-inner { position: relative; z-index: 1; display: flex; align-items: center; gap: 8px; padding: 0 10px; width: 100%; pointer-events: none; } .g-bar-name { flex: 1; font-size: 12px; font-weight: 700; color: var(--t1); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 1; } .g-bar-avs { display: flex; flex-shrink: 0; } .g-bar-av { width: 22px; height: 22px; border-radius: 50%; background: var(--c3); color: var(--t1); font-size: 10px; font-weight: 800; display: flex; align-items: center; justify-content: center; border: 2px solid var(--c1); background-size: cover; background-position: center; margin-left: -6px; flex-shrink: 0; } .g-bar-av:first-child { margin-left: 0; } .g-bar-av-more { background: var(--or); color: #fff; font-size: 9px; } .g-handle { position: absolute; top: 0; bottom: 0; width: 6px; cursor: ew-resize; z-index: 3; } .g-handle-l { left: 0; } .g-handle-r { right: 0; } /* Statuts */ .g-bar-bloquee { border-style: dashed !important; } .g-bar-terminee .g-bar-fill { opacity: 0.6; } /* Absence bar */ .g-abs-bar { border-radius: 10px; } /* ── Ligne aujourd'hui ── */ #gantt-today-line { position: absolute; top: 0; width: 2px; background: #ef4444; pointer-events: none; z-index: 4; box-shadow: 0 0 6px rgba(239,68,68,0.5); } #gantt-today-line::before { content: ""; position: absolute; top: -4px; left: -3px; width: 8px; height: 8px; background: #ef4444; border-radius: 50%; } /* ── Tooltip ── */ .g-tip { position: fixed; z-index: 9999; background: var(--c1); border: 1px solid var(--b2); border-radius: 12px; box-shadow: 0 12px 32px rgba(0,0,0,0.35); width: 260px; overflow: hidden; animation: gtipPop 0.18s ease-out; } @keyframes gtipPop { from { opacity: 0; transform: translateY(-4px) scale(0.97); } to { opacity: 1; transform: translateY(0) scale(1); } } .g-tip-head { padding: 8px 12px; color: #fff; font-size: 11px; font-weight: 800; text-transform: uppercase; letter-spacing: .4px; } .g-tip-body { padding: 12px; } .g-tip-title { font-size: 14px; font-weight: 800; color: var(--t1); margin-bottom: 8px; } .g-tip-row { font-size: 11px; color: var(--t2); margin-top: 4px; } .g-tip-close { position: absolute; top: 6px; right: 6px; background: rgba(0,0,0,0.3); color: #fff; border: none; width: 22px; height: 22px; border-radius: 50%; font-size: 11px; cursor: pointer; } /* ── Mobile ── */ #s-gantt.gantt-mobile #gantt-sidebar { position: absolute; top: 0; left: 0; bottom: 0; z-index: 10; box-shadow: 2px 0 12px rgba(0,0,0,0.2); } #s-gantt.gantt-mobile.gantt-sidebar-hidden #gantt-sidebar { transform: translateX(-100%); width: 280px; } #s-gantt.gantt-mobile:not(.gantt-sidebar-hidden) #gantt-main { pointer-events: none; } /* ── Modale tâche Gantt ── */ .gantt-label { display: block; font-size: 10px; font-weight: 800; color: var(--t3); text-transform: uppercase; letter-spacing: .5px; margin: 12px 0 6px; } .gantt-progress-row, .gantt-status-row { display: flex; gap: 5px; flex-wrap: wrap; } .gantt-prog-btn, .gantt-status-btn { flex: 1; min-width: 54px; padding: 8px 4px; background: var(--c2); border: 1px solid var(--b2); color: var(--t2); border-radius: 9px; font-size: 11px; font-weight: 700; cursor: pointer; font-family: var(--f); } .gantt-prog-btn.active, .gantt-status-btn.active { background: rgba(249,115,22,0.15); border-color: var(--or); color: var(--or); } .gantt-members-list { display: flex; flex-wrap: wrap; gap: 6px; max-height: 180px; overflow-y: auto; padding: 6px; background: var(--c2); border: 1px solid var(--b2); border-radius: 10px; } .gantt-member-pill { display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px 5px 5px; background: var(--c1); border: 1px solid var(--b2); border-radius: 99px; font-size: 11px; cursor: pointer; user-select: none; } .gantt-member-pill input { display: none; } .gantt-member-pill:has(input:checked) { border-color: var(--or); background: rgba(249,115,22,0.15); } .gantt-member-av { width: 22px; height: 22px; border-radius: 50%; background: var(--or); color: #fff; font-size: 10px; font-weight: 800; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }