Spaces:
Running
Running
| :root { | |
| --bg: #f6f6f9; | |
| --surface: #ffffff; | |
| --line: #e6e6ec; | |
| --text: #1f1d2c; | |
| --muted: #6b6781; | |
| --primary: #6d36c8; | |
| --primary-strong: #5b22b5; | |
| --primary-soft: #ede4ff; | |
| --accent: #38bdf8; | |
| --success: #16a34a; | |
| --warn: #f59e0b; | |
| --danger: #dc2626; | |
| color: var(--text); | |
| background: var(--bg); | |
| font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; | |
| } | |
| * { | |
| box-sizing: border-box; | |
| } | |
| body { | |
| margin: 0; | |
| } | |
| button, | |
| input, | |
| select, | |
| textarea { | |
| font: inherit; | |
| color: inherit; | |
| } | |
| a { | |
| color: inherit; | |
| text-decoration: none; | |
| } | |
| h1, | |
| h2, | |
| h3 { | |
| margin: 0; | |
| } | |
| .app-shell { | |
| display: flex; | |
| flex-direction: column; | |
| min-height: 100vh; | |
| } | |
| .topnav { | |
| align-items: center; | |
| background: var(--surface); | |
| border-bottom: 1px solid var(--line); | |
| display: grid; | |
| gap: 12px; | |
| grid-template-columns: 220px 1fr auto; | |
| padding: 10px 24px; | |
| position: sticky; | |
| top: 0; | |
| z-index: 30; | |
| } | |
| .topnav-brand { | |
| align-items: center; | |
| display: flex; | |
| gap: 12px; | |
| } | |
| .brand-mark { | |
| align-items: center; | |
| background: var(--primary); | |
| border-radius: 10px; | |
| color: white; | |
| display: flex; | |
| font-weight: 800; | |
| height: 36px; | |
| justify-content: center; | |
| width: 36px; | |
| } | |
| .topnav-brand strong { | |
| display: block; | |
| font-size: 14px; | |
| line-height: 1.1; | |
| } | |
| .topnav-brand small { | |
| color: var(--muted); | |
| font-size: 11px; | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| } | |
| .topnav-tabs { | |
| align-items: center; | |
| display: flex; | |
| gap: 4px; | |
| justify-self: center; | |
| } | |
| .topnav-tab { | |
| align-items: center; | |
| background: transparent; | |
| border: none; | |
| border-radius: 0; | |
| color: var(--muted); | |
| cursor: pointer; | |
| display: inline-flex; | |
| font-family: inherit; | |
| font-size: 14px; | |
| font-weight: 600; | |
| gap: 6px; | |
| padding: 10px 14px; | |
| position: relative; | |
| text-decoration: none; | |
| transition: color 120ms; | |
| } | |
| .topnav-tab:focus { | |
| outline: none; | |
| } | |
| .topnav-tab:focus-visible { | |
| border-radius: 6px; | |
| outline: 2px solid var(--primary-soft); | |
| outline-offset: 2px; | |
| } | |
| .topnav-tab:hover { | |
| background: transparent; | |
| color: var(--text); | |
| } | |
| .topnav-tab.active { | |
| color: var(--primary); | |
| } | |
| .topnav-tab.active::after { | |
| background: var(--primary); | |
| border-radius: 2px 2px 0 0; | |
| bottom: -10px; | |
| content: ""; | |
| height: 3px; | |
| left: 14px; | |
| position: absolute; | |
| right: 14px; | |
| } | |
| .topnav-tab-caret { | |
| margin-left: 2px; | |
| opacity: 0.7; | |
| } | |
| .topnav-actions { | |
| align-items: center; | |
| display: flex; | |
| gap: 10px; | |
| position: relative; | |
| } | |
| .user-chip { | |
| align-items: center; | |
| background: white; | |
| border: 1px solid var(--line); | |
| border-radius: 999px; | |
| cursor: pointer; | |
| display: flex; | |
| gap: 8px; | |
| padding: 4px 12px 4px 4px; | |
| } | |
| .user-avatar { | |
| align-items: center; | |
| background: var(--primary); | |
| border-radius: 999px; | |
| color: white; | |
| display: flex; | |
| font-weight: 800; | |
| height: 28px; | |
| justify-content: center; | |
| width: 28px; | |
| } | |
| .user-meta { | |
| display: grid; | |
| font-size: 12px; | |
| text-align: left; | |
| } | |
| .user-meta strong { | |
| font-size: 13px; | |
| line-height: 1.1; | |
| } | |
| .badge.live { | |
| background: var(--success); | |
| color: white; | |
| font-size: 9px; | |
| padding: 2px 6px; | |
| } | |
| .user-menu { | |
| background: white; | |
| border: 1px solid var(--line); | |
| border-radius: 12px; | |
| box-shadow: 0 16px 40px rgba(15, 23, 42, 0.16); | |
| padding: 6px; | |
| position: absolute; | |
| right: 0; | |
| top: calc(100% + 8px); | |
| z-index: 40; | |
| display: grid; | |
| min-width: 160px; | |
| } | |
| .user-menu button { | |
| background: transparent; | |
| border: 0; | |
| border-radius: 8px; | |
| color: var(--text); | |
| cursor: pointer; | |
| font-weight: 600; | |
| padding: 8px 12px; | |
| text-align: left; | |
| } | |
| .user-menu button:hover { | |
| background: var(--primary-soft); | |
| color: var(--primary); | |
| } | |
| .content { | |
| display: grid; | |
| gap: 18px; | |
| padding: 20px 24px; | |
| } | |
| .eyebrow { | |
| color: var(--muted); | |
| font-size: 11px; | |
| font-weight: 800; | |
| letter-spacing: 0.14em; | |
| margin: 0 0 4px; | |
| text-transform: uppercase; | |
| } | |
| .page-header { | |
| display: grid; | |
| gap: 6px; | |
| } | |
| .page-header.row { | |
| align-items: end; | |
| } | |
| .page-header h2 { | |
| font-size: 26px; | |
| } | |
| .page-subtitle { | |
| color: var(--muted); | |
| margin: 4px 0 0; | |
| max-width: 70ch; | |
| } | |
| .row { | |
| align-items: center; | |
| display: flex; | |
| justify-content: space-between; | |
| gap: 12px; | |
| } | |
| .row.gap { | |
| justify-content: flex-start; | |
| gap: 12px; | |
| flex-wrap: wrap; | |
| } | |
| .kpi-grid, | |
| .card-list { | |
| display: grid; | |
| gap: 16px; | |
| grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); | |
| } | |
| .card, | |
| .panel, | |
| .table-card { | |
| background: var(--surface); | |
| border: 1px solid var(--line); | |
| border-radius: 14px; | |
| padding: 18px; | |
| display: grid; | |
| gap: 12px; | |
| align-content: start; | |
| } | |
| .card span { | |
| color: var(--muted); | |
| font-size: 13px; | |
| font-weight: 600; | |
| } | |
| .card strong { | |
| display: block; | |
| font-size: 30px; | |
| } | |
| .link-muted { | |
| color: var(--primary); | |
| font-weight: 600; | |
| font-size: 13px; | |
| } | |
| .banner { | |
| background: linear-gradient(135deg, var(--primary-soft), #e0f2fe); | |
| border-color: #d8b4fe; | |
| } | |
| .two-column { | |
| display: grid; | |
| gap: 16px; | |
| grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); | |
| } | |
| .muted-text { | |
| color: var(--muted); | |
| margin: 0; | |
| } | |
| .bullet-list { | |
| list-style: none; | |
| margin: 0; | |
| padding: 0; | |
| display: grid; | |
| gap: 10px; | |
| } | |
| .bullet-list li { | |
| align-items: center; | |
| display: grid; | |
| grid-template-columns: 1fr auto auto; | |
| gap: 8px; | |
| } | |
| .bullet-list.compact li { | |
| grid-template-columns: 1fr auto; | |
| } | |
| .bullet-list small { | |
| color: var(--muted); | |
| } | |
| .avatar { | |
| align-items: center; | |
| border-radius: 999px; | |
| color: white; | |
| display: inline-flex; | |
| font-weight: 800; | |
| justify-content: center; | |
| } | |
| .badge { | |
| background: var(--primary-soft); | |
| border-radius: 999px; | |
| color: var(--primary); | |
| font-size: 12px; | |
| font-weight: 700; | |
| padding: 3px 10px; | |
| border: 0; | |
| cursor: default; | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 6px; | |
| } | |
| .badge.muted { | |
| background: #f1f0f6; | |
| color: var(--muted); | |
| } | |
| .badge.danger { | |
| background: #fee2e2; | |
| color: var(--danger); | |
| } | |
| .badge-row { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 6px; | |
| } | |
| .skill-toggle { | |
| cursor: pointer; | |
| } | |
| .status-active { background: #dcfce7; color: #166534; } | |
| .status-planning { background: #ede9fe; color: #5b21b6; } | |
| .status-on_hold { background: #fef3c7; color: #854d0e; } | |
| .status-completed { background: #f1f5f9; color: var(--muted); } | |
| .project-card { | |
| border-left: 6px solid; | |
| } | |
| .person-card { | |
| display: grid; | |
| gap: 10px; | |
| } | |
| .person-card-header { | |
| align-items: center; | |
| display: flex; | |
| gap: 12px; | |
| } | |
| .person-card-header h3 { | |
| font-size: 16px; | |
| } | |
| .person-card-header small { | |
| color: var(--muted); | |
| } | |
| .card-actions { | |
| display: flex; | |
| gap: 8px; | |
| flex-wrap: wrap; | |
| margin-top: 6px; | |
| } | |
| .primary-button, | |
| .secondary-button, | |
| .ghost-button { | |
| border: 0; | |
| border-radius: 10px; | |
| cursor: pointer; | |
| font-weight: 700; | |
| padding: 9px 14px; | |
| transition: background 120ms ease, color 120ms ease; | |
| } | |
| .primary-button { | |
| background: var(--primary); | |
| color: white; | |
| } | |
| .primary-button:hover { | |
| background: var(--primary-strong); | |
| } | |
| .primary-button:disabled { | |
| background: #c8c4d6; | |
| cursor: not-allowed; | |
| } | |
| .add-button { | |
| border-radius: 999px; | |
| padding: 8px 16px; | |
| } | |
| .add-button .plus { | |
| font-weight: 900; | |
| margin-right: 4px; | |
| } | |
| .secondary-button { | |
| background: #ecebf3; | |
| color: var(--text); | |
| } | |
| .secondary-button:hover { | |
| background: #ddd9ec; | |
| } | |
| .ghost-button { | |
| background: transparent; | |
| color: var(--text); | |
| padding: 6px 12px; | |
| } | |
| .ghost-button:hover { | |
| background: var(--primary-soft); | |
| color: var(--primary); | |
| } | |
| .ghost-button.danger { | |
| color: var(--danger); | |
| } | |
| .icon-button { | |
| background: transparent; | |
| border: 0; | |
| border-radius: 8px; | |
| color: var(--muted); | |
| cursor: pointer; | |
| font-size: 18px; | |
| padding: 4px 10px; | |
| } | |
| .icon-button:hover { | |
| background: var(--primary-soft); | |
| color: var(--primary); | |
| } | |
| .search-input, | |
| .select-input, | |
| input[type="text"], | |
| input[type="email"], | |
| input[type="number"], | |
| input[type="password"], | |
| input[type="date"], | |
| input[type="search"], | |
| select, | |
| textarea { | |
| background: white; | |
| border: 1px solid var(--line); | |
| border-radius: 10px; | |
| padding: 9px 12px; | |
| width: 100%; | |
| } | |
| input[type="range"] { | |
| width: 100%; | |
| } | |
| input:focus, | |
| select:focus, | |
| textarea:focus { | |
| border-color: var(--primary); | |
| box-shadow: 0 0 0 3px rgba(109, 54, 200, 0.15); | |
| outline: none; | |
| } | |
| .filter-bar { | |
| display: flex; | |
| gap: 8px; | |
| flex-wrap: wrap; | |
| align-items: center; | |
| } | |
| .filter-bar .search-input { | |
| flex: 1; | |
| min-width: 220px; | |
| } | |
| .filter-bar .select-input, | |
| .filter-bar select { | |
| width: auto; | |
| min-width: 200px; | |
| } | |
| .view-toggle { | |
| display: inline-flex; | |
| gap: 4px; | |
| background: #ecebf3; | |
| padding: 4px; | |
| border-radius: 12px; | |
| } | |
| .view-toggle button { | |
| padding: 6px 12px; | |
| border-radius: 8px; | |
| } | |
| .tabs { | |
| display: flex; | |
| gap: 4px; | |
| border-bottom: 1px solid var(--line); | |
| } | |
| .tab { | |
| background: transparent; | |
| border: 0; | |
| border-bottom: 3px solid transparent; | |
| color: var(--muted); | |
| cursor: pointer; | |
| font-weight: 700; | |
| padding: 10px 14px; | |
| } | |
| .tab.active { | |
| color: var(--text); | |
| border-color: var(--primary); | |
| } | |
| .empty-state { | |
| background: var(--surface); | |
| border: 1px dashed var(--line); | |
| border-radius: 16px; | |
| padding: 40px; | |
| text-align: center; | |
| display: grid; | |
| gap: 8px; | |
| justify-items: center; | |
| } | |
| .empty-state h3 { | |
| font-size: 18px; | |
| } | |
| .empty-state p { | |
| color: var(--muted); | |
| margin: 0; | |
| } | |
| .skeleton { | |
| background: linear-gradient(90deg, #f1f5f9 0%, #e2e8f0 50%, #f1f5f9 100%); | |
| background-size: 200% 100%; | |
| animation: shimmer 1.4s ease infinite; | |
| height: 120px; | |
| } | |
| @keyframes shimmer { | |
| 0% { background-position: 200% 0; } | |
| 100% { background-position: -200% 0; } | |
| } | |
| table { | |
| border-collapse: collapse; | |
| width: 100%; | |
| } | |
| th, | |
| td { | |
| border-bottom: 1px solid var(--line); | |
| padding: 10px 12px; | |
| text-align: left; | |
| vertical-align: middle; | |
| } | |
| th { | |
| font-size: 12px; | |
| text-transform: uppercase; | |
| letter-spacing: 0.08em; | |
| color: var(--muted); | |
| } | |
| .modal-backdrop { | |
| align-items: center; | |
| background: rgba(15, 23, 42, 0.5); | |
| display: flex; | |
| inset: 0; | |
| justify-content: center; | |
| padding: 24px; | |
| position: fixed; | |
| z-index: 100; | |
| } | |
| .modal { | |
| background: white; | |
| border-radius: 18px; | |
| display: flex; | |
| flex-direction: column; | |
| max-height: 92vh; | |
| width: min(560px, 100%); | |
| box-shadow: 0 30px 80px rgba(15, 23, 42, 0.32); | |
| } | |
| .modal-md { width: min(560px, 100%); } | |
| .modal-lg { width: min(720px, 100%); } | |
| .modal-sm { width: min(420px, 100%); } | |
| .modal-header { | |
| align-items: center; | |
| border-bottom: 1px solid var(--line); | |
| display: flex; | |
| justify-content: space-between; | |
| padding: 18px 22px; | |
| } | |
| .modal-header h3 { | |
| font-size: 18px; | |
| } | |
| .modal-body { | |
| overflow-y: auto; | |
| padding: 22px; | |
| } | |
| .modal-footer { | |
| border-top: 1px solid var(--line); | |
| display: flex; | |
| gap: 10px; | |
| justify-content: flex-end; | |
| padding: 14px 22px; | |
| } | |
| .drawer-backdrop { | |
| background: rgba(15, 23, 42, 0.35); | |
| display: flex; | |
| inset: 0; | |
| justify-content: flex-end; | |
| position: fixed; | |
| z-index: 100; | |
| } | |
| .drawer-panel { | |
| background: #fff; | |
| box-shadow: -12px 0 40px rgba(15, 23, 42, 0.18); | |
| display: flex; | |
| flex-direction: column; | |
| height: 100%; | |
| max-width: 100%; | |
| width: min(480px, 100vw); | |
| } | |
| .drawer-header { | |
| align-items: center; | |
| border-bottom: 1px solid var(--line); | |
| display: flex; | |
| gap: 12px; | |
| justify-content: space-between; | |
| padding: 20px 22px 16px; | |
| } | |
| .drawer-title-row { | |
| align-items: center; | |
| display: flex; | |
| gap: 12px; | |
| min-width: 0; | |
| } | |
| .drawer-title-row h2 { | |
| font-size: 20px; | |
| font-weight: 700; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .drawer-project-swatch { | |
| flex-shrink: 0; | |
| height: 28px; | |
| width: 28px; | |
| } | |
| .drawer-tabs { | |
| border-bottom: 1px solid var(--line); | |
| display: flex; | |
| gap: 4px; | |
| padding: 0 22px; | |
| } | |
| .drawer-tab { | |
| background: none; | |
| border: none; | |
| border-bottom: 2px solid transparent; | |
| color: var(--muted); | |
| cursor: pointer; | |
| font-size: 12px; | |
| font-weight: 700; | |
| letter-spacing: 0.06em; | |
| margin-bottom: -1px; | |
| padding: 12px 10px; | |
| text-transform: uppercase; | |
| } | |
| .drawer-tab.active { | |
| border-bottom-color: var(--primary); | |
| color: var(--primary); | |
| } | |
| .drawer-body { | |
| flex: 1; | |
| overflow-y: auto; | |
| padding: 22px; | |
| } | |
| .drawer-form { | |
| display: grid; | |
| gap: 18px; | |
| } | |
| .drawer-form label { | |
| color: var(--text); | |
| display: grid; | |
| font-size: 13px; | |
| font-weight: 700; | |
| gap: 8px; | |
| } | |
| .drawer-form label small { | |
| color: var(--muted); | |
| font-weight: 500; | |
| } | |
| .drawer-form input, | |
| .drawer-form select, | |
| .drawer-form textarea { | |
| font-weight: 500; | |
| } | |
| .drawer-footer { | |
| align-items: center; | |
| border-top: 1px solid var(--line); | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 10px; | |
| padding: 14px 22px; | |
| } | |
| .drawer-footer-spacer { | |
| flex: 1; | |
| } | |
| .form-grid { | |
| display: grid; | |
| gap: 14px; | |
| grid-template-columns: repeat(2, 1fr); | |
| } | |
| .form-grid label { | |
| color: var(--text); | |
| display: grid; | |
| font-size: 13px; | |
| font-weight: 700; | |
| gap: 6px; | |
| } | |
| .form-grid label small { | |
| color: var(--muted); | |
| font-weight: 500; | |
| } | |
| .form-grid .span-2 { | |
| grid-column: span 2; | |
| } | |
| .color-picker { | |
| display: flex; | |
| gap: 8px; | |
| flex-wrap: wrap; | |
| } | |
| .color-swatch { | |
| border: 2px solid transparent; | |
| border-radius: 999px; | |
| cursor: pointer; | |
| height: 28px; | |
| width: 28px; | |
| } | |
| .color-swatch.selected { | |
| border-color: var(--text); | |
| transform: scale(1.1); | |
| } | |
| .toast-stack { | |
| bottom: 24px; | |
| display: grid; | |
| gap: 8px; | |
| position: fixed; | |
| right: 24px; | |
| z-index: 5000; | |
| } | |
| body.is-clone-mode-active .toast-stack { | |
| bottom: calc(42vh + 20px); | |
| } | |
| .toast { | |
| background: var(--text); | |
| border-radius: 12px; | |
| color: white; | |
| font-weight: 600; | |
| padding: 12px 16px; | |
| box-shadow: 0 10px 30px rgba(15, 23, 42, 0.2); | |
| } | |
| .toast-success { background: #0f2d52; } | |
| .toast-error { background: var(--danger); } | |
| .toast-info { background: var(--text); } | |
| .toast-rich { | |
| align-items: stretch; | |
| display: grid; | |
| gap: 10px; | |
| min-width: min(300px, calc(100vw - 48px)); | |
| padding: 14px 16px; | |
| } | |
| .toast-rich-main { | |
| align-items: flex-start; | |
| display: flex; | |
| gap: 10px; | |
| } | |
| .toast-check { | |
| align-items: center; | |
| background: var(--success); | |
| border-radius: 999px; | |
| color: white; | |
| display: inline-flex; | |
| flex-shrink: 0; | |
| height: 22px; | |
| justify-content: center; | |
| width: 22px; | |
| } | |
| .toast-rich-text { | |
| display: grid; | |
| flex: 1; | |
| gap: 2px; | |
| } | |
| .toast-rich-text strong { | |
| font-size: 14px; | |
| } | |
| .toast-rich-text span { | |
| font-size: 13px; | |
| font-weight: 500; | |
| opacity: 0.9; | |
| } | |
| .toast-dismiss { | |
| background: none; | |
| border: none; | |
| color: rgba(255, 255, 255, 0.7); | |
| cursor: pointer; | |
| font-size: 14px; | |
| line-height: 1; | |
| padding: 2px; | |
| } | |
| .toast-dismiss:hover { | |
| color: white; | |
| } | |
| .toast-action { | |
| background: none; | |
| border: none; | |
| color: white; | |
| cursor: pointer; | |
| font-size: 13px; | |
| font-weight: 700; | |
| justify-self: start; | |
| padding: 0; | |
| text-decoration: underline; | |
| text-underline-offset: 3px; | |
| } | |
| .toast-action:hover { | |
| opacity: 0.85; | |
| } | |
| .planner-milestone-day { | |
| align-items: center; | |
| bottom: 0; | |
| display: flex; | |
| justify-content: center; | |
| position: absolute; | |
| top: 0; | |
| z-index: 5; | |
| } | |
| .milestone-add-button { | |
| align-items: center; | |
| background: #2563eb; | |
| border: 2px solid white; | |
| border-radius: 999px; | |
| box-shadow: 0 2px 8px rgba(37, 99, 235, 0.45); | |
| color: white; | |
| cursor: pointer; | |
| display: inline-flex; | |
| font-size: 16px; | |
| font-weight: 700; | |
| height: 26px; | |
| justify-content: center; | |
| line-height: 1; | |
| opacity: 0; | |
| pointer-events: none; | |
| transform: scale(0.85); | |
| transition: opacity 0.12s ease, transform 0.12s ease; | |
| width: 26px; | |
| } | |
| .planner-milestone-day.is-hovered .milestone-add-button, | |
| .milestone-add-button:focus-visible { | |
| opacity: 1; | |
| pointer-events: auto; | |
| transform: scale(1); | |
| } | |
| .milestone-add-button:hover { | |
| background: #1d4ed8; | |
| } | |
| .milestone-add-popover { | |
| background: white; | |
| border-radius: 12px; | |
| border: 1px solid var(--line); | |
| box-shadow: 0 20px 50px rgba(15, 23, 42, 0.2); | |
| display: grid; | |
| position: fixed; | |
| width: min(300px, calc(100vw - 16px)); | |
| z-index: 120; | |
| } | |
| .milestone-add-popover-header { | |
| align-items: center; | |
| border-bottom: 1px solid var(--line); | |
| display: grid; | |
| gap: 4px; | |
| grid-template-columns: 1fr auto auto; | |
| padding: 12px 14px; | |
| } | |
| .milestone-add-popover-header strong { | |
| font-size: 14px; | |
| grid-column: 1; | |
| } | |
| .milestone-add-popover-header .muted-text { | |
| font-size: 12px; | |
| grid-column: 2; | |
| } | |
| .milestone-add-popover-header .icon-button { | |
| grid-column: 3; | |
| } | |
| .milestone-icon-picker { | |
| display: flex; | |
| gap: 8px; | |
| padding: 12px 14px 0; | |
| } | |
| .milestone-icon-option { | |
| align-items: center; | |
| background: white; | |
| border: 1px solid var(--line); | |
| border-radius: 999px; | |
| color: var(--muted); | |
| cursor: pointer; | |
| display: inline-flex; | |
| height: 34px; | |
| justify-content: center; | |
| width: 34px; | |
| } | |
| .milestone-icon-option.selected { | |
| background: #eff6ff; | |
| border-color: #2563eb; | |
| color: #2563eb; | |
| } | |
| .milestone-add-popover-body { | |
| display: grid; | |
| gap: 12px; | |
| padding: 12px 14px; | |
| } | |
| .milestone-add-popover-body label { | |
| display: grid; | |
| font-size: 12px; | |
| font-weight: 700; | |
| gap: 6px; | |
| } | |
| .milestone-add-popover-footer { | |
| border-top: 1px solid var(--line); | |
| display: flex; | |
| justify-content: flex-end; | |
| padding: 12px 14px; | |
| } | |
| .planner-calendar-project-line { | |
| cursor: default; | |
| } | |
| /* ---------- Planner ---------- */ | |
| .planner-page { | |
| display: grid; | |
| gap: 14px; | |
| } | |
| .planner-header { | |
| background: var(--surface); | |
| border: 1px solid var(--line); | |
| border-radius: 14px; | |
| display: grid; | |
| gap: 10px; | |
| padding: 12px 16px; | |
| } | |
| .planner-search-row { | |
| align-items: center; | |
| display: flex; | |
| gap: 8px; | |
| } | |
| .planner-search-row .search-input { | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .planner-filter-button { | |
| align-items: center; | |
| display: inline-flex; | |
| flex-shrink: 0; | |
| font-size: 13px; | |
| font-weight: 700; | |
| gap: 6px; | |
| padding: 7px 12px; | |
| } | |
| .planner-filter-button .filter-icon { | |
| color: var(--muted); | |
| } | |
| .planner-controls-row { | |
| align-items: center; | |
| display: flex; | |
| gap: 12px; | |
| justify-content: space-between; | |
| } | |
| .planner-controls-left { | |
| align-items: center; | |
| display: flex; | |
| flex: 1 1 auto; | |
| flex-wrap: wrap; | |
| gap: 8px; | |
| min-width: 0; | |
| } | |
| .planner-stat { | |
| align-items: center; | |
| display: flex; | |
| gap: 6px; | |
| font-size: 13px; | |
| font-weight: 700; | |
| } | |
| .planner-stat .dot { | |
| background: var(--primary); | |
| border-radius: 999px; | |
| display: inline-block; | |
| height: 8px; | |
| width: 8px; | |
| } | |
| .planner-stat .dot.dim { | |
| background: #c4bedb; | |
| } | |
| .filter-divider { | |
| background: var(--line); | |
| height: 22px; | |
| width: 1px; | |
| } | |
| .planner-select select { | |
| background: white; | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| font-size: 13px; | |
| font-weight: 700; | |
| padding: 7px 26px 7px 12px; | |
| width: auto; | |
| } | |
| .planner-toggle { | |
| align-items: center; | |
| display: flex; | |
| gap: 6px; | |
| font-size: 13px; | |
| font-weight: 700; | |
| cursor: pointer; | |
| } | |
| .switch { | |
| background: #ddd9ec; | |
| border-radius: 999px; | |
| cursor: pointer; | |
| display: inline-block; | |
| height: 18px; | |
| position: relative; | |
| transition: background 120ms ease; | |
| width: 32px; | |
| } | |
| .switch.on { | |
| background: var(--primary); | |
| } | |
| .switch .thumb { | |
| background: white; | |
| border-radius: 999px; | |
| height: 14px; | |
| left: 2px; | |
| position: absolute; | |
| top: 2px; | |
| transition: left 120ms ease; | |
| width: 14px; | |
| } | |
| .switch.on .thumb { | |
| left: 16px; | |
| } | |
| .planner-date-controls { | |
| align-items: center; | |
| display: flex; | |
| flex-shrink: 0; | |
| gap: 8px; | |
| margin-left: auto; | |
| } | |
| .planner-date-nav { | |
| align-items: center; | |
| background: white; | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| display: flex; | |
| gap: 0; | |
| overflow: hidden; | |
| } | |
| .planner-date-nav > button { | |
| border: 0; | |
| border-radius: 0; | |
| border-right: 1px solid var(--line); | |
| min-width: 36px; | |
| } | |
| .planner-date-nav > button:last-child { | |
| border-right: 0; | |
| } | |
| .planner-date-nav .today-button { | |
| font-size: 13px; | |
| font-weight: 700; | |
| padding: 6px 12px; | |
| } | |
| .today-button { | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| padding: 6px 14px; | |
| } | |
| .planner-chart { | |
| align-items: end; | |
| background: var(--surface); | |
| border: 1px solid var(--line); | |
| border-radius: 14px; | |
| display: flex; | |
| flex-wrap: nowrap; | |
| gap: 0; | |
| height: 140px; | |
| overflow-x: auto; | |
| padding: 12px 12px 8px; | |
| } | |
| .planner-chart .chart-week, | |
| .planner-chart .chart-day { | |
| align-items: end; | |
| display: grid; | |
| flex: 0 0 auto; | |
| gap: 4px; | |
| height: 100%; | |
| justify-items: center; | |
| } | |
| .planner-chart .chart-bars { | |
| align-items: end; | |
| display: flex; | |
| gap: 2px; | |
| height: 100%; | |
| width: 100%; | |
| justify-content: center; | |
| } | |
| .planner-chart .chart-bar { | |
| border-radius: 6px 6px 0 0; | |
| width: 14px; | |
| display: block; | |
| min-height: 2px; | |
| } | |
| .planner-chart .chart-bar.available { background: #d8d2ed; } | |
| .planner-chart .chart-bar.allocated { background: var(--primary); } | |
| .planner-chart .chart-week small, | |
| .planner-chart .chart-day small { | |
| color: var(--muted); | |
| font-size: 11px; | |
| } | |
| .planner-chart .chart-day-today { | |
| background: var(--primary); | |
| border-radius: 999px; | |
| color: white; | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| height: 20px; | |
| min-width: 20px; | |
| padding: 0 4px; | |
| } | |
| .planner { | |
| background: var(--surface); | |
| border: 1px solid var(--line); | |
| border-radius: 14px; | |
| overflow: hidden; | |
| } | |
| .planner-sync { | |
| width: 100%; | |
| } | |
| .planner-grid-header { | |
| align-items: stretch; | |
| background: #fafaff; | |
| border-bottom: 1px solid var(--line); | |
| display: grid; | |
| grid-template-columns: 240px minmax(0, 1fr); | |
| min-height: 72px; | |
| } | |
| .planner-row-label { | |
| align-items: center; | |
| border-right: 1px solid var(--line); | |
| display: flex; | |
| font-weight: 700; | |
| gap: 10px; | |
| padding: 10px 14px; | |
| } | |
| .planner-sidebar-head { | |
| border-right: 1px solid var(--line); | |
| display: flex; | |
| flex-direction: column; | |
| gap: 8px; | |
| justify-content: center; | |
| min-height: 72px; | |
| padding: 12px 14px; | |
| } | |
| .planner-sidebar-head .add-button { | |
| align-self: flex-start; | |
| width: auto; | |
| } | |
| .planner-sidebar-head .planner-stat { | |
| font-size: 13px; | |
| } | |
| .planner-sidebar-head .planner-stat.muted-text { | |
| font-size: 12px; | |
| font-weight: 500; | |
| } | |
| .planner-axis { | |
| min-height: 72px; | |
| min-width: 0; | |
| position: relative; | |
| width: 100%; | |
| } | |
| .planner-axis-month { | |
| border-right: 1px solid var(--line); | |
| box-sizing: border-box; | |
| color: var(--muted); | |
| font-size: 11px; | |
| font-weight: 700; | |
| letter-spacing: 0.05em; | |
| padding: 8px 8px 0; | |
| position: absolute; | |
| text-transform: uppercase; | |
| top: 0; | |
| } | |
| .planner-day-labels { | |
| border-top: 1px solid var(--line); | |
| bottom: 0; | |
| color: var(--muted); | |
| display: grid; | |
| font-size: 11px; | |
| grid-template-columns: repeat(var(--planner-cols, 5), minmax(0, 1fr)); | |
| left: 0; | |
| position: absolute; | |
| right: 0; | |
| width: 100%; | |
| } | |
| .planner-day-label { | |
| align-items: center; | |
| display: inline-flex; | |
| font-weight: 600; | |
| height: 28px; | |
| justify-content: center; | |
| position: relative; | |
| } | |
| .planner-day-label.is-today { | |
| color: var(--primary); | |
| font-weight: 800; | |
| } | |
| .planner-day-label.is-today::before { | |
| background: var(--primary); | |
| border-radius: 999px; | |
| content: ""; | |
| height: 22px; | |
| left: 50%; | |
| opacity: 0.12; | |
| position: absolute; | |
| transform: translateX(-50%); | |
| width: 22px; | |
| z-index: 0; | |
| } | |
| .planner-row { | |
| border-bottom: 1px solid var(--line); | |
| display: grid; | |
| grid-template-columns: 240px minmax(0, 1fr); | |
| min-height: 52px; | |
| } | |
| .planner-row:last-child { | |
| border-bottom: 0; | |
| } | |
| .planner-group-row { | |
| background: #fafaff; | |
| cursor: pointer; | |
| } | |
| .planner-group-row:hover { | |
| background: #f5f0ff; | |
| } | |
| .planner-row-label .caret { | |
| color: var(--muted); | |
| font-size: 11px; | |
| width: 14px; | |
| } | |
| .planner-row-label.person { | |
| cursor: pointer; | |
| font-weight: 600; | |
| } | |
| .planner-row-label.person:hover { | |
| background: var(--primary-soft); | |
| } | |
| .planner-row-label.person small { | |
| color: var(--muted); | |
| display: block; | |
| font-weight: 500; | |
| } | |
| .planner-row-label.add { | |
| color: var(--primary); | |
| cursor: pointer; | |
| font-weight: 700; | |
| } | |
| .planner-row-label.add .plus { | |
| background: var(--primary-soft); | |
| border-radius: 999px; | |
| color: var(--primary); | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| height: 22px; | |
| width: 22px; | |
| font-weight: 800; | |
| margin-right: 8px; | |
| } | |
| .planner-new-project-row { | |
| background: #fbfaff; | |
| border-top: 1px solid var(--line); | |
| } | |
| .planner-new-project-button { | |
| align-items: center; | |
| background: white; | |
| border: 1px solid var(--primary); | |
| border-radius: 999px; | |
| color: var(--primary); | |
| cursor: pointer; | |
| display: inline-flex; | |
| font-weight: 700; | |
| gap: 8px; | |
| margin: 12px 14px; | |
| padding: 8px 18px; | |
| } | |
| .planner-new-project-button:hover { | |
| background: var(--primary-soft); | |
| } | |
| .planner-new-project-button .plus { | |
| font-size: 16px; | |
| line-height: 1; | |
| } | |
| .planner-add-row .planner-row-grid { | |
| align-items: center; | |
| display: flex; | |
| padding: 0 14px; | |
| } | |
| .planner-row-track { | |
| align-items: stretch; | |
| display: flex; | |
| min-height: 44px; | |
| min-width: 0; | |
| overflow: hidden; | |
| width: 100%; | |
| } | |
| .planner-timeline { | |
| height: 100%; | |
| min-height: 44px; | |
| min-width: 0; | |
| position: relative; | |
| width: 100%; | |
| } | |
| .planner-day-grid { | |
| background-image: linear-gradient(90deg, var(--line) 1px, transparent 1px); | |
| background-size: calc(100% / var(--planner-cols, 5)) 100%; | |
| bottom: 0; | |
| left: 0; | |
| pointer-events: none; | |
| position: absolute; | |
| right: 0; | |
| top: 0; | |
| } | |
| .planner-bar { | |
| align-items: center; | |
| border-radius: 4px; | |
| box-sizing: border-box; | |
| cursor: default; | |
| display: flex; | |
| font-size: 11px; | |
| font-weight: 700; | |
| height: calc(100% - 8px); | |
| justify-content: center; | |
| min-width: 0; | |
| overflow: hidden; | |
| padding: 0 6px; | |
| position: absolute; | |
| text-overflow: ellipsis; | |
| top: 4px; | |
| white-space: nowrap; | |
| } | |
| .planner-bar[role="button"] { | |
| cursor: pointer; | |
| } | |
| .planner-bar[role="button"]:hover { | |
| filter: brightness(0.96); | |
| } | |
| .planner-bar-label { | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .cell-empty { | |
| background: transparent; | |
| color: var(--muted); | |
| } | |
| .cell-free { | |
| background: rgba(197, 232, 200, 0.75); | |
| border-top: 3px solid #4ade80; | |
| color: #166534; | |
| } | |
| .cell-busy { | |
| background: rgba(191, 219, 254, 0.75); | |
| border-top: 3px solid #60a5fa; | |
| color: #1e3a8a; | |
| } | |
| .cell-tight { | |
| background: rgba(216, 210, 237, 0.85); | |
| border-top: 3px solid #8b5cf6; | |
| color: #4c1d95; | |
| } | |
| .cell-full { | |
| background: #4338ca; | |
| border-top: 3px solid #312e81; | |
| color: white; | |
| } | |
| .cell-over { | |
| background: #312e81; | |
| border-top: 3px solid var(--danger); | |
| color: white; | |
| } | |
| .planner-group-row .planner-bar { | |
| height: calc(100% - 6px); | |
| top: 3px; | |
| } | |
| .project-swatch { | |
| border: 1px solid rgba(0, 0, 0, 0.08); | |
| border-radius: 4px; | |
| flex-shrink: 0; | |
| height: 28px; | |
| width: 28px; | |
| } | |
| .project-bar { | |
| align-items: center; | |
| border-radius: 4px; | |
| border-top: 3px solid #312e81; | |
| box-sizing: border-box; | |
| color: white; | |
| cursor: pointer; | |
| display: flex; | |
| font-size: 11px; | |
| font-weight: 700; | |
| height: calc(100% - 8px); | |
| justify-content: flex-start; | |
| min-width: 0; | |
| overflow: hidden; | |
| padding: 0 10px; | |
| position: absolute; | |
| text-overflow: ellipsis; | |
| top: 4px; | |
| white-space: nowrap; | |
| } | |
| .project-bar:hover { | |
| filter: brightness(1.05); | |
| } | |
| .project-bar.tentative { | |
| opacity: 0.55; | |
| } | |
| .project-bar .planner-bar-label { | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .planner-add-row .planner-row-track { | |
| align-items: center; | |
| color: var(--muted); | |
| font-size: 13px; | |
| padding: 0 14px; | |
| } | |
| /* ---------- Schedule (legacy view kept for /schedule) ---------- */ | |
| .schedule { | |
| background: white; | |
| border-radius: 14px; | |
| border: 1px solid var(--line); | |
| overflow: hidden; | |
| } | |
| .schedule-row { | |
| display: grid; | |
| grid-template-columns: 220px 1fr; | |
| min-height: 72px; | |
| border-bottom: 1px solid var(--line); | |
| } | |
| .schedule-row.schedule-header { | |
| min-height: 44px; | |
| background: #fafaff; | |
| } | |
| .schedule-person { | |
| border-right: 1px solid var(--line); | |
| display: flex; | |
| flex-direction: column; | |
| gap: 8px; | |
| font-weight: 700; | |
| padding: 14px; | |
| justify-content: space-between; | |
| } | |
| .schedule-person small { | |
| color: var(--muted); | |
| display: block; | |
| font-weight: 500; | |
| } | |
| .timeline, | |
| .schedule-axis { | |
| background-image: linear-gradient(90deg, rgba(109, 54, 200, 0.1) 1px, transparent 1px); | |
| background-size: 64px 100%; | |
| position: relative; | |
| } | |
| .schedule-axis { | |
| background-image: none; | |
| } | |
| .schedule-axis-mark { | |
| color: var(--muted); | |
| font-size: 12px; | |
| font-weight: 700; | |
| left: 0; | |
| padding: 8px 6px; | |
| position: absolute; | |
| top: 0; | |
| white-space: nowrap; | |
| } | |
| .schedule-today, | |
| .gantt-today { | |
| background: rgba(220, 38, 38, 0.7); | |
| position: absolute; | |
| top: 0; | |
| bottom: 0; | |
| width: 2px; | |
| pointer-events: none; | |
| } | |
| .allocation-bar { | |
| background: var(--primary); | |
| border: 0; | |
| border-radius: 10px; | |
| color: white; | |
| cursor: pointer; | |
| font-size: 12px; | |
| font-weight: 700; | |
| left: 0; | |
| overflow: hidden; | |
| padding: 8px 10px; | |
| position: absolute; | |
| text-align: left; | |
| text-overflow: ellipsis; | |
| top: 14px; | |
| white-space: nowrap; | |
| height: 36px; | |
| } | |
| .allocation-bar.tentative { | |
| opacity: 0.6; | |
| background-image: repeating-linear-gradient( | |
| 135deg, | |
| rgba(255, 255, 255, 0.25) 0, | |
| rgba(255, 255, 255, 0.25) 6px, | |
| transparent 6px, | |
| transparent 12px | |
| ); | |
| } | |
| .allocation-bar.overallocated { | |
| outline: 2px solid var(--danger); | |
| outline-offset: -2px; | |
| box-shadow: 0 0 0 4px rgba(220, 38, 38, 0.18); | |
| } | |
| .leave-bar { | |
| background: repeating-linear-gradient( | |
| 135deg, | |
| rgba(148, 163, 184, 0.45) 0, | |
| rgba(148, 163, 184, 0.45) 6px, | |
| rgba(226, 232, 240, 0.85) 6px, | |
| rgba(226, 232, 240, 0.85) 12px | |
| ); | |
| border-radius: 8px; | |
| position: absolute; | |
| top: 56px; | |
| bottom: 6px; | |
| pointer-events: none; | |
| } | |
| /* ---------- Gantt for Projects ---------- */ | |
| .gantt { | |
| background: white; | |
| border: 1px solid var(--line); | |
| border-radius: 14px; | |
| display: grid; | |
| grid-template-rows: auto 1fr; | |
| } | |
| .gantt-header { | |
| border-bottom: 1px solid var(--line); | |
| height: 44px; | |
| position: relative; | |
| background: #fafaff; | |
| } | |
| .gantt-header span { | |
| color: var(--muted); | |
| font-size: 12px; | |
| font-weight: 700; | |
| left: 0; | |
| padding: 12px 6px; | |
| position: absolute; | |
| top: 0; | |
| } | |
| .gantt-body { | |
| padding: 12px 0; | |
| } | |
| .gantt-row { | |
| display: grid; | |
| grid-template-columns: 200px 1fr; | |
| min-height: 50px; | |
| align-items: center; | |
| border-top: 1px solid #f1f0f6; | |
| } | |
| .gantt-row:first-child { border-top: 0; } | |
| .gantt-label { | |
| border-right: 1px solid var(--line); | |
| cursor: pointer; | |
| display: grid; | |
| font-weight: 700; | |
| gap: 4px; | |
| padding: 8px 14px; | |
| } | |
| .gantt-label small { color: var(--muted); font-weight: 500; } | |
| .gantt-track { | |
| height: 36px; | |
| position: relative; | |
| } | |
| .gantt-bar { | |
| border-radius: 999px; | |
| color: white; | |
| font-size: 12px; | |
| font-weight: 700; | |
| height: 24px; | |
| left: 0; | |
| overflow: hidden; | |
| padding: 4px 12px; | |
| position: absolute; | |
| top: 6px; | |
| white-space: nowrap; | |
| cursor: pointer; | |
| } | |
| .gantt-bar.tentative { opacity: 0.6; } | |
| .gantt-milestone { | |
| background: var(--text); | |
| border: 2px solid white; | |
| border-radius: 4px; | |
| height: 14px; | |
| position: absolute; | |
| top: 11px; | |
| transform: translateX(-50%) rotate(45deg); | |
| width: 14px; | |
| } | |
| .utilization-bar { | |
| align-items: center; | |
| background: #f1f0f6; | |
| border-radius: 999px; | |
| display: flex; | |
| height: 22px; | |
| overflow: hidden; | |
| position: relative; | |
| } | |
| .utilization-fill { | |
| background: var(--success); | |
| height: 100%; | |
| } | |
| .utilization-fill.warn { background: var(--warn); } | |
| .utilization-fill.danger { background: var(--danger); } | |
| .utilization-bar span { | |
| color: var(--text); | |
| font-size: 12px; | |
| font-weight: 700; | |
| padding-left: 12px; | |
| position: absolute; | |
| } | |
| .chart { | |
| align-items: end; | |
| display: flex; | |
| gap: 4px; | |
| height: 220px; | |
| padding: 12px; | |
| border-radius: 12px; | |
| background: #fafaff; | |
| border: 1px solid var(--line); | |
| overflow-x: auto; | |
| } | |
| .chart-week { | |
| align-items: end; | |
| display: grid; | |
| flex: 1 0 56px; | |
| gap: 4px; | |
| height: 100%; | |
| justify-items: center; | |
| } | |
| .chart-bars { | |
| align-items: end; | |
| display: flex; | |
| gap: 2px; | |
| height: 100%; | |
| width: 100%; | |
| justify-content: center; | |
| } | |
| .chart-bar { | |
| border-radius: 6px 6px 0 0; | |
| width: 12px; | |
| display: block; | |
| min-height: 2px; | |
| } | |
| .chart-bar.available { background: #d8d2ed; } | |
| .chart-bar.allocated { background: var(--primary); } | |
| .chart-bar.tentative { background: repeating-linear-gradient(135deg, #c4b5fd 0 4px, #ede9fe 4px 8px); } | |
| .chart-week small { | |
| color: var(--muted); | |
| font-size: 11px; | |
| } | |
| .chart-legend { | |
| color: var(--muted); | |
| font-size: 13px; | |
| } | |
| .chart-legend i { | |
| display: inline-block; | |
| height: 10px; | |
| width: 10px; | |
| border-radius: 999px; | |
| margin-right: 6px; | |
| vertical-align: middle; | |
| } | |
| .chart-legend i.available { background: #d8d2ed; } | |
| .chart-legend i.allocated { background: var(--primary); } | |
| .chart-legend i.tentative { background: #c4b5fd; } | |
| .heatmap-scroll { | |
| overflow-x: auto; | |
| } | |
| .heatmap { | |
| border: 0; | |
| } | |
| .heatmap th, | |
| .heatmap td { | |
| border: 1px solid white; | |
| font-size: 12px; | |
| padding: 8px; | |
| text-align: center; | |
| } | |
| .heatmap thead th { | |
| background: #fafaff; | |
| text-transform: none; | |
| letter-spacing: 0; | |
| } | |
| .heatmap-name { | |
| background: #fafaff; | |
| font-weight: 700; | |
| text-align: left; | |
| white-space: nowrap; | |
| } | |
| .heatmap-cell { | |
| font-weight: 700; | |
| min-width: 70px; | |
| } | |
| .stacked { | |
| display: grid; | |
| gap: 18px; | |
| } | |
| .login-page { | |
| align-items: center; | |
| background: | |
| radial-gradient(circle at top left, rgba(109, 54, 200, 0.32), transparent 32rem), | |
| linear-gradient(135deg, #1f1d2c 0%, #312e81 50%, #4c1d95 100%); | |
| display: flex; | |
| justify-content: center; | |
| min-height: 100vh; | |
| padding: 24px; | |
| } | |
| .login-card { | |
| background: white; | |
| border: 1px solid rgba(226, 232, 240, 0.9); | |
| border-radius: 24px; | |
| box-shadow: 0 24px 70px rgba(15, 23, 42, 0.28); | |
| max-width: 420px; | |
| padding: 36px; | |
| width: 100%; | |
| } | |
| .login-card h1 { | |
| color: var(--text); | |
| font-size: 28px; | |
| line-height: 1.15; | |
| margin: 8px 0 10px; | |
| } | |
| .login-copy { | |
| color: var(--muted); | |
| line-height: 1.6; | |
| margin: 0 0 28px; | |
| } | |
| .login-form { | |
| display: grid; | |
| gap: 16px; | |
| } | |
| .login-form label { | |
| color: var(--text); | |
| display: grid; | |
| font-size: 14px; | |
| font-weight: 700; | |
| gap: 8px; | |
| } | |
| .form-error { | |
| background: #fee2e2; | |
| border-radius: 10px; | |
| color: #991b1b; | |
| margin: 0; | |
| padding: 10px 12px; | |
| } | |
| /* === Tier 1: roles/teams/tags additions === */ | |
| .label-row { | |
| align-items: center; | |
| display: flex; | |
| justify-content: space-between; | |
| } | |
| .link-button { | |
| background: transparent; | |
| border: none; | |
| color: var(--accent); | |
| cursor: pointer; | |
| font-size: 12px; | |
| font-weight: 600; | |
| padding: 2px 4px; | |
| } | |
| .link-button:hover { | |
| text-decoration: underline; | |
| } | |
| .link-button.danger { | |
| color: #dc2626; | |
| } | |
| .link-button.danger:hover { | |
| color: #b91c1c; | |
| } | |
| .link-button:disabled { | |
| color: var(--muted); | |
| cursor: not-allowed; | |
| } | |
| .tag-filter-bar { | |
| align-items: center; | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 6px; | |
| padding: 6px 0; | |
| } | |
| .tag-chip { | |
| border-width: 1.5px; | |
| border-style: solid; | |
| cursor: pointer; | |
| } | |
| .tag-pill { | |
| align-items: center; | |
| background: white; | |
| border-radius: 999px; | |
| border: 1.5px solid var(--line); | |
| display: inline-flex; | |
| font-size: 13px; | |
| font-weight: 600; | |
| margin: 4px 4px 0 0; | |
| padding: 4px 10px; | |
| } | |
| .planner-project-block { | |
| border-bottom: 1px solid var(--line); | |
| } | |
| .planner-project-block .planner-project-row { | |
| min-height: 52px; | |
| } | |
| .planner-sidebar-head-count { | |
| justify-content: flex-start; | |
| padding: 12px 14px; | |
| } | |
| .planner-project-label { | |
| align-items: center; | |
| display: flex; | |
| gap: 8px; | |
| justify-content: space-between; | |
| padding: 8px 10px 8px 12px; | |
| } | |
| .planner-project-actions { | |
| align-items: center; | |
| display: flex; | |
| flex-shrink: 0; | |
| gap: 2px; | |
| } | |
| .planner-expand-end { | |
| align-items: center; | |
| background: none; | |
| border: none; | |
| color: var(--muted); | |
| cursor: pointer; | |
| display: inline-flex; | |
| height: 32px; | |
| justify-content: center; | |
| transition: transform 0.15s ease; | |
| width: 32px; | |
| } | |
| .planner-expand-end.expanded { | |
| transform: rotate(90deg); | |
| } | |
| .planner-expand-end:hover { | |
| background: var(--primary-soft); | |
| border-radius: 6px; | |
| color: var(--primary); | |
| } | |
| .planner-project-name { | |
| align-items: center; | |
| background: none; | |
| border: none; | |
| cursor: pointer; | |
| display: flex; | |
| flex: 1; | |
| gap: 10px; | |
| min-width: 0; | |
| padding: 0; | |
| text-align: left; | |
| } | |
| .planner-project-name:hover .person-meta strong { | |
| color: var(--primary); | |
| } | |
| .planner-project-subrow { | |
| min-height: 40px; | |
| } | |
| .planner-project-subrow .planner-row-label.nested { | |
| align-items: center; | |
| display: flex; | |
| font-weight: 600; | |
| gap: 10px; | |
| padding: 6px 10px 6px 34px; | |
| } | |
| .planner-project-subrow .planner-row-label.nested.member { | |
| padding-left: 48px; | |
| } | |
| .planner-project-subrow .planner-row-label.nested.add-member { | |
| background: none; | |
| border: none; | |
| color: var(--primary); | |
| cursor: pointer; | |
| font-weight: 700; | |
| width: 100%; | |
| } | |
| .planner-project-subrow .planner-row-label.nested.add-member:hover { | |
| background: var(--primary-soft); | |
| } | |
| .planner-sub-icon { | |
| color: var(--muted); | |
| flex-shrink: 0; | |
| font-size: 14px; | |
| width: 18px; | |
| } | |
| .planner-effort-label { | |
| align-items: center; | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 8px 10px; | |
| } | |
| .effort-display-select { | |
| background: #fff; | |
| border: 2px solid #2563eb; | |
| border-radius: 8px; | |
| color: #1e40af; | |
| cursor: pointer; | |
| font-size: 13px; | |
| font-weight: 700; | |
| min-width: 72px; | |
| padding: 4px 8px; | |
| } | |
| .planner-effort-total { | |
| color: var(--muted); | |
| font-size: 12px; | |
| font-weight: 700; | |
| margin-left: auto; | |
| } | |
| .planner-effort-total.is-over { | |
| color: #dc2626; | |
| } | |
| .planner-hours-track { | |
| align-self: center; | |
| background: #ece9f5; | |
| border-radius: 999px; | |
| height: 8px; | |
| margin: 0 14px; | |
| overflow: hidden; | |
| width: calc(100% - 28px); | |
| } | |
| .planner-hours-bar { | |
| background: linear-gradient(90deg, var(--primary), #9b6df0); | |
| border-radius: 999px; | |
| height: 100%; | |
| min-width: 4px; | |
| } | |
| .planner-member-row .planner-timeline { | |
| min-height: 36px; | |
| } | |
| .planner-member-row .planner-row-track, | |
| .planner-member-row .planner-drag-timeline { | |
| overflow: visible; | |
| } | |
| .planner-drag-timeline { | |
| cursor: crosshair; | |
| touch-action: none; | |
| user-select: none; | |
| } | |
| .planner-drag-timeline.is-dragging { | |
| cursor: col-resize; | |
| } | |
| .planner-day-hit { | |
| bottom: 0; | |
| pointer-events: none; | |
| position: absolute; | |
| top: 0; | |
| z-index: 1; | |
| } | |
| .planner-day-hit.is-today { | |
| background: rgba(109, 54, 200, 0.06); | |
| } | |
| .planner-drag-preview { | |
| opacity: 0.55; | |
| pointer-events: none; | |
| z-index: 3; | |
| } | |
| .project-bar.allocation-bar.preview { | |
| border-style: dashed; | |
| } | |
| .allocation-drag-popover { | |
| background: white; | |
| border-radius: 12px; | |
| border: 1px solid var(--line); | |
| box-shadow: 0 20px 50px rgba(15, 23, 42, 0.2); | |
| display: grid; | |
| gap: 0; | |
| position: fixed; | |
| width: min(280px, calc(100vw - 16px)); | |
| z-index: 120; | |
| } | |
| .allocation-drag-popover-header { | |
| align-items: center; | |
| border-bottom: 1px solid var(--line); | |
| display: flex; | |
| justify-content: space-between; | |
| padding: 12px 14px; | |
| } | |
| .allocation-drag-popover-header strong { | |
| font-size: 14px; | |
| } | |
| .allocation-drag-popover-body { | |
| display: grid; | |
| gap: 12px; | |
| padding: 14px; | |
| } | |
| .allocation-drag-popover-body label { | |
| display: grid; | |
| font-size: 12px; | |
| font-weight: 700; | |
| gap: 6px; | |
| } | |
| .allocation-drag-popover-footer { | |
| border-top: 1px solid var(--line); | |
| display: flex; | |
| gap: 8px; | |
| justify-content: flex-end; | |
| padding: 12px 14px; | |
| } | |
| .sr-only { | |
| border: 0; | |
| clip: rect(0, 0, 0, 0); | |
| height: 1px; | |
| margin: -1px; | |
| overflow: hidden; | |
| padding: 0; | |
| position: absolute; | |
| white-space: nowrap; | |
| width: 1px; | |
| } | |
| /* Runn-style allocation popover */ | |
| .runn-allocation-popover { | |
| background: #fff; | |
| border: 1px solid var(--line); | |
| border-radius: 12px; | |
| box-shadow: 0 16px 40px rgba(15, 23, 42, 0.18); | |
| display: grid; | |
| gap: 12px; | |
| padding: 16px 18px; | |
| position: fixed; | |
| width: min(560px, calc(100vw - 16px)); | |
| z-index: 120; | |
| } | |
| .runn-allocation-person { | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| color: #0f172a; | |
| font-size: 14px; | |
| font-weight: 600; | |
| padding: 8px 10px; | |
| width: 100%; | |
| } | |
| .runn-effort-row { | |
| align-items: end; | |
| display: grid; | |
| gap: 14px; | |
| grid-template-columns: minmax(0, 1.4fr) minmax(88px, 0.75fr) minmax(0, 1.25fr); | |
| } | |
| .runn-field { | |
| display: grid; | |
| gap: 6px; | |
| min-width: 0; | |
| } | |
| .runn-field-label { | |
| align-items: center; | |
| color: #64748b; | |
| display: inline-flex; | |
| font-size: 12px; | |
| font-weight: 600; | |
| gap: 4px; | |
| } | |
| .runn-split { | |
| align-items: stretch; | |
| background: #fff; | |
| border: 1px solid #cbd5e1; | |
| border-radius: 8px; | |
| display: flex; | |
| min-height: 40px; | |
| overflow: hidden; | |
| } | |
| .runn-split input { | |
| background: transparent; | |
| border: 0; | |
| box-shadow: none; | |
| color: #0f172a; | |
| flex: 1; | |
| font-size: 15px; | |
| font-weight: 600; | |
| min-width: 0; | |
| outline: none; | |
| padding: 8px 12px; | |
| width: auto; | |
| } | |
| .runn-split select { | |
| appearance: auto; | |
| background: #f8fafc; | |
| border: 0; | |
| border-left: 1px solid #cbd5e1; | |
| box-shadow: none; | |
| color: #0f172a; | |
| flex-shrink: 0; | |
| font-size: 13px; | |
| font-weight: 600; | |
| outline: none; | |
| padding: 8px 28px 8px 10px; | |
| width: 88px; | |
| } | |
| .runn-workdays { | |
| appearance: auto; | |
| border: 1px solid #cbd5e1; | |
| border-radius: 8px; | |
| box-sizing: border-box; | |
| color: #0f172a; | |
| font-size: 15px; | |
| font-weight: 600; | |
| min-height: 40px; | |
| padding: 8px 12px; | |
| text-align: center; | |
| width: 100%; | |
| } | |
| .runn-repeat-hint { | |
| font-size: 12px; | |
| } | |
| .runn-note-toggle { | |
| align-items: center; | |
| background: none; | |
| border: 0; | |
| color: #64748b; | |
| cursor: pointer; | |
| display: inline-flex; | |
| font-size: 13px; | |
| font-weight: 600; | |
| gap: 4px; | |
| padding: 0; | |
| } | |
| .runn-note-toggle svg.is-open { | |
| transform: rotate(90deg); | |
| } | |
| .runn-note-input { | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| font-family: inherit; | |
| font-size: 13px; | |
| padding: 8px 10px; | |
| resize: vertical; | |
| width: 100%; | |
| } | |
| .runn-date-row { | |
| display: grid; | |
| gap: 10px; | |
| grid-template-columns: 1fr 1fr; | |
| } | |
| .runn-date-row label { | |
| display: grid; | |
| font-size: 11px; | |
| font-weight: 700; | |
| gap: 4px; | |
| } | |
| .runn-date-row input { | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| padding: 6px 8px; | |
| } | |
| .runn-popover-footer { | |
| align-items: center; | |
| border-top: 1px solid var(--line); | |
| display: flex; | |
| justify-content: space-between; | |
| margin-top: 4px; | |
| padding-top: 14px; | |
| } | |
| .runn-delete { | |
| background: none; | |
| border: 0; | |
| color: #2563eb; | |
| cursor: pointer; | |
| font-size: 14px; | |
| font-weight: 600; | |
| padding: 0; | |
| } | |
| .runn-delete:hover { | |
| text-decoration: underline; | |
| } | |
| .runn-footer-actions { | |
| align-items: center; | |
| display: flex; | |
| gap: 8px; | |
| } | |
| .runn-icon-pill { | |
| align-items: center; | |
| background: #fff; | |
| border: 1px solid #cbd5e1; | |
| border-radius: 999px; | |
| color: #2563eb; | |
| cursor: pointer; | |
| display: inline-flex; | |
| height: 40px; | |
| justify-content: center; | |
| width: 40px; | |
| } | |
| .runn-icon-pill.is-active { | |
| background: #eff6ff; | |
| border-color: #2563eb; | |
| } | |
| .runn-menu-wrap { | |
| position: relative; | |
| } | |
| .runn-menu { | |
| background: #fff; | |
| border: 1px solid var(--line); | |
| border-radius: 10px; | |
| bottom: calc(100% + 6px); | |
| box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12); | |
| display: grid; | |
| gap: 8px; | |
| min-width: 200px; | |
| padding: 10px; | |
| position: absolute; | |
| right: 0; | |
| z-index: 2; | |
| } | |
| .runn-menu-item { | |
| align-items: center; | |
| display: flex; | |
| font-size: 13px; | |
| font-weight: 600; | |
| gap: 8px; | |
| } | |
| .runn-menu-actions { | |
| gap: 0; | |
| min-width: 220px; | |
| padding: 4px 0; | |
| } | |
| .runn-menu-action { | |
| background: transparent; | |
| border: 0; | |
| color: #1e40af; | |
| cursor: pointer; | |
| font-size: 14px; | |
| font-weight: 600; | |
| padding: 10px 14px; | |
| text-align: left; | |
| width: 100%; | |
| } | |
| .runn-menu-action:hover { | |
| background: #f1f5f9; | |
| } | |
| .runn-menu-sub { | |
| border-top: 1px solid var(--line); | |
| padding: 8px 12px 10px; | |
| } | |
| .runn-menu-sub select { | |
| font-size: 13px; | |
| width: 100%; | |
| } | |
| .project-bar.allocation-bar.is-selected, | |
| .allocation-bar-host.is-selected { | |
| box-shadow: 0 0 0 2px #fff, 0 0 0 4px #2563eb; | |
| outline: none; | |
| } | |
| .allocation-bar-host { | |
| align-items: stretch; | |
| box-sizing: border-box; | |
| display: flex; | |
| flex-direction: row; | |
| gap: 0; | |
| min-width: 76px; | |
| overflow: visible; | |
| position: absolute; | |
| z-index: 6; | |
| } | |
| .allocation-bar-host.is-span { | |
| border-radius: 8px; | |
| height: 36px; | |
| top: 14px; | |
| } | |
| .allocation-bar-host.is-compact { | |
| border-radius: 999px; | |
| box-shadow: 0 1px 4px rgba(15, 23, 42, 0.18); | |
| height: 30px; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| } | |
| .allocation-bar-host .allocation-bar-main { | |
| align-items: center; | |
| border: none; | |
| border-radius: inherit; | |
| color: #fff; | |
| cursor: pointer; | |
| display: flex; | |
| flex: 1 1 auto; | |
| font-family: inherit; | |
| font-size: 12px; | |
| font-weight: 700; | |
| justify-content: center; | |
| left: auto; | |
| line-height: 1; | |
| min-width: 0; | |
| overflow: hidden; | |
| padding: 0 6px; | |
| position: relative; | |
| text-align: center; | |
| top: auto; | |
| width: auto; | |
| } | |
| /* Override global .allocation-bar absolute positioning inside the host flex layout */ | |
| .allocation-bar-host .allocation-bar-main.allocation-bar, | |
| .allocation-bar-host .allocation-bar-main.project-bar { | |
| height: 100%; | |
| left: auto; | |
| position: relative; | |
| top: auto; | |
| } | |
| .allocation-bar-host .allocation-bar-main .planner-bar-label { | |
| display: block; | |
| line-height: 1; | |
| overflow: hidden; | |
| padding: 0; | |
| text-align: center; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| width: 100%; | |
| } | |
| .allocation-bar-host.is-compact .allocation-bar-main { | |
| border-radius: 999px 0 0 999px; | |
| } | |
| .allocation-bar-host.is-span .allocation-bar-main { | |
| border-radius: 8px 0 0 8px; | |
| } | |
| .allocation-bar-host.is-clone-source { | |
| box-shadow: 0 0 0 2px #fff, 0 0 0 4px #1d4ed8; | |
| } | |
| .allocation-bar-menu-btn { | |
| align-items: center; | |
| align-self: stretch; | |
| background: rgba(15, 23, 42, 0.5); | |
| border: 0; | |
| border-left: 1px solid rgba(255, 255, 255, 0.35); | |
| border-radius: 0; | |
| color: #fff; | |
| cursor: pointer; | |
| display: flex; | |
| flex: 0 0 24px; | |
| justify-content: center; | |
| min-width: 24px; | |
| padding: 0; | |
| width: 24px; | |
| } | |
| .allocation-bar-menu-btn:hover { | |
| background: rgba(15, 23, 42, 0.72); | |
| } | |
| .allocation-bar-host.is-compact .allocation-bar-menu-btn { | |
| border-radius: 0 999px 999px 0; | |
| } | |
| .allocation-bar-host.is-span .allocation-bar-menu-btn { | |
| border-radius: 0 8px 8px 0; | |
| } | |
| .planner-member-row.allocation-row-highlight { | |
| animation: allocation-row-flash 2s ease; | |
| background: rgba(37, 99, 235, 0.08); | |
| scroll-margin: 80px; | |
| } | |
| @keyframes allocation-row-flash { | |
| 0%, | |
| 15% { | |
| background: rgba(37, 99, 235, 0.18); | |
| } | |
| 100% { | |
| background: rgba(37, 99, 235, 0.08); | |
| } | |
| } | |
| .allocation-bar-menu { | |
| background: #fff; | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| box-shadow: 0 10px 28px rgba(15, 23, 42, 0.14); | |
| display: grid; | |
| min-width: 220px; | |
| overflow: hidden; | |
| padding: 4px 0; | |
| pointer-events: auto; | |
| } | |
| .allocation-bar-menu-item { | |
| background: transparent; | |
| border: 0; | |
| color: #1e40af; | |
| cursor: pointer; | |
| font-size: 14px; | |
| font-weight: 600; | |
| padding: 10px 14px; | |
| text-align: left; | |
| width: 100%; | |
| } | |
| .allocation-bar-menu-item:hover { | |
| background: #f1f5f9; | |
| } | |
| .allocation-bar-menu-item.is-danger { | |
| color: #b91c1c; | |
| } | |
| .allocation-bar-menu-sub { | |
| border-top: 1px solid var(--line); | |
| padding: 8px 12px 10px; | |
| } | |
| .allocation-bar-menu-sub select { | |
| font-size: 13px; | |
| width: 100%; | |
| } | |
| .clone-mode-banner { | |
| align-items: center; | |
| background: #1e3a8a; | |
| border-radius: 8px; | |
| bottom: calc(42vh + 16px); | |
| box-shadow: 0 8px 24px rgba(15, 23, 42, 0.2); | |
| color: #fff; | |
| display: flex; | |
| font-size: 13px; | |
| gap: 16px; | |
| justify-content: space-between; | |
| left: 50%; | |
| max-width: min(960px, calc(100vw - 32px)); | |
| padding: 12px 16px; | |
| position: fixed; | |
| transform: translateX(-50%); | |
| z-index: 1100; | |
| } | |
| .clone-mode-banner strong { | |
| font-weight: 800; | |
| letter-spacing: 0.04em; | |
| } | |
| .clone-mode-exit { | |
| background: #fff; | |
| border: 0; | |
| border-radius: 6px; | |
| color: #1e3a8a; | |
| cursor: pointer; | |
| font-size: 13px; | |
| font-weight: 700; | |
| padding: 6px 14px; | |
| } | |
| .clone-mode-panel { | |
| background: #fff; | |
| border-top: 1px solid var(--line); | |
| bottom: 0; | |
| box-shadow: 0 -8px 32px rgba(15, 23, 42, 0.1); | |
| display: flex; | |
| flex-direction: column; | |
| height: 42vh; | |
| left: 0; | |
| position: fixed; | |
| right: 0; | |
| z-index: 1090; | |
| } | |
| .planner-page.is-clone-mode { | |
| padding-bottom: 42vh; | |
| } | |
| .clone-mode-panel-header { | |
| align-items: center; | |
| border-bottom: 1px solid var(--line); | |
| display: flex; | |
| flex-shrink: 0; | |
| gap: 16px; | |
| padding: 12px 16px; | |
| } | |
| .clone-mode-panel-title { | |
| align-items: center; | |
| display: flex; | |
| gap: 8px; | |
| } | |
| .clone-mode-label { | |
| color: #64748b; | |
| font-size: 11px; | |
| font-weight: 800; | |
| letter-spacing: 0.06em; | |
| } | |
| .clone-mode-panel-title select { | |
| border: 1px solid var(--line); | |
| border-radius: 6px; | |
| font-size: 14px; | |
| font-weight: 600; | |
| padding: 6px 10px; | |
| } | |
| .clone-mode-search { | |
| align-items: center; | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| display: flex; | |
| flex: 1; | |
| gap: 8px; | |
| max-width: 360px; | |
| padding: 0 10px; | |
| } | |
| .clone-mode-search input { | |
| border: 0; | |
| flex: 1; | |
| font-size: 14px; | |
| min-width: 0; | |
| outline: none; | |
| padding: 8px 0; | |
| } | |
| .clone-mode-close { | |
| align-items: center; | |
| background: transparent; | |
| border: 0; | |
| color: #64748b; | |
| cursor: pointer; | |
| display: flex; | |
| margin-left: auto; | |
| padding: 4px; | |
| } | |
| .clone-mode-list { | |
| flex: 1; | |
| overflow: auto; | |
| } | |
| .clone-mode-row { | |
| align-items: center; | |
| border-bottom: 1px solid #f1f5f9; | |
| display: grid; | |
| gap: 12px; | |
| grid-template-columns: minmax(200px, 260px) 1fr auto; | |
| padding: 10px 16px; | |
| } | |
| .clone-mode-row-person { | |
| align-items: center; | |
| display: flex; | |
| gap: 10px; | |
| } | |
| .clone-mode-row-track { | |
| min-width: 0; | |
| } | |
| .clone-mode-mini-timeline { | |
| min-height: 36px; | |
| position: relative; | |
| } | |
| .clone-mode-mini-bar { | |
| border-radius: 6px; | |
| height: 28px; | |
| opacity: 0.85; | |
| position: absolute; | |
| top: 4px; | |
| } | |
| .clone-mode-capacity { | |
| font-size: 12px; | |
| font-weight: 700; | |
| position: absolute; | |
| right: 0; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| } | |
| .clone-mode-capacity.is-free { | |
| color: #0369a1; | |
| } | |
| .clone-mode-capacity.is-over { | |
| color: #1e3a8a; | |
| } | |
| .clone-mode-capacity.is-off { | |
| color: #94a3b8; | |
| } | |
| .clone-mode-project-dot { | |
| border-radius: 50%; | |
| flex-shrink: 0; | |
| height: 12px; | |
| width: 12px; | |
| } | |
| .clone-mode-clone-btn { | |
| background: #fff; | |
| border: 1px solid #2563eb; | |
| border-radius: 6px; | |
| color: #2563eb; | |
| cursor: pointer; | |
| font-size: 14px; | |
| font-weight: 700; | |
| min-width: 72px; | |
| padding: 8px 16px; | |
| } | |
| .clone-mode-clone-btn:disabled { | |
| cursor: not-allowed; | |
| opacity: 0.45; | |
| } | |
| .clone-mode-clone-btn:not(:disabled):hover { | |
| background: #eff6ff; | |
| } | |
| .planner-multi-select-bar { | |
| align-items: center; | |
| background: #eff6ff; | |
| border-top: 1px solid #bfdbfe; | |
| display: flex; | |
| gap: 16px; | |
| justify-content: space-between; | |
| padding: 10px 16px; | |
| position: sticky; | |
| bottom: 0; | |
| z-index: 5; | |
| } | |
| .planner-multi-select-bar span { | |
| color: #1e3a8a; | |
| font-size: 14px; | |
| font-weight: 600; | |
| } | |
| .planner-multi-select-actions { | |
| display: flex; | |
| gap: 8px; | |
| } | |
| .ghost-button.danger { | |
| color: #b91c1c; | |
| } | |
| .runn-save { | |
| background: #2563eb; | |
| border: 0; | |
| border-radius: 999px; | |
| color: #fff; | |
| cursor: pointer; | |
| font-size: 15px; | |
| font-weight: 700; | |
| min-height: 40px; | |
| min-width: 96px; | |
| padding: 0 22px; | |
| } | |
| .runn-save:disabled { | |
| cursor: not-allowed; | |
| opacity: 0.55; | |
| } | |
| @media (max-width: 620px) { | |
| .runn-effort-row { | |
| grid-template-columns: 1fr; | |
| } | |
| } | |
| .planner-calendar-track { | |
| min-height: 36px; | |
| } | |
| .planner-calendar-track.planner-calendar-phases { | |
| cursor: crosshair; | |
| } | |
| .planner-project-row .planner-row-track { | |
| background: #fff; | |
| } | |
| .planner-calendar-track.planner-calendar-project-line { | |
| background: #fff; | |
| min-height: 32px; | |
| } | |
| .planner-calendar-track.planner-calendar-project-line .planner-timeline { | |
| min-height: 32px; | |
| } | |
| .project-span-line { | |
| border-radius: 2px; | |
| box-sizing: border-box; | |
| height: 4px; | |
| min-width: 8px; | |
| pointer-events: none; | |
| position: absolute; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| z-index: 2; | |
| } | |
| .project-span-line.tentative { | |
| opacity: 0.45; | |
| } | |
| .phase-bar { | |
| align-items: center; | |
| border-radius: 6px; | |
| box-sizing: border-box; | |
| color: #0f766e; | |
| display: flex; | |
| font-size: 11px; | |
| font-weight: 700; | |
| height: calc(100% - 10px); | |
| justify-content: flex-start; | |
| min-width: 0; | |
| overflow: hidden; | |
| padding: 0 8px; | |
| position: absolute; | |
| text-overflow: ellipsis; | |
| top: 5px; | |
| white-space: nowrap; | |
| z-index: 3; | |
| } | |
| .phase-bar.preview { | |
| opacity: 0.72; | |
| pointer-events: none; | |
| z-index: 4; | |
| } | |
| .planner-calendar-phases.planner-drag-timeline { | |
| cursor: crosshair; | |
| touch-action: none; | |
| user-select: none; | |
| } | |
| .planner-calendar-phases.planner-drag-timeline.is-dragging { | |
| cursor: col-resize; | |
| } | |
| .phase-create-popover { | |
| background: #fff; | |
| border: 1px solid var(--line); | |
| border-radius: 10px; | |
| box-shadow: 0 8px 28px rgba(15, 23, 42, 0.14); | |
| display: grid; | |
| gap: 10px; | |
| min-width: 300px; | |
| padding: 12px 14px; | |
| position: fixed; | |
| z-index: 1200; | |
| } | |
| .phase-create-popover-input { | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| font-size: 14px; | |
| font-weight: 600; | |
| padding: 10px 12px; | |
| width: 100%; | |
| } | |
| .phase-create-popover-footer { | |
| align-items: center; | |
| display: flex; | |
| justify-content: space-between; | |
| } | |
| .phase-create-popover-tools { | |
| align-items: center; | |
| display: flex; | |
| gap: 10px; | |
| } | |
| .phase-color-picker { | |
| position: relative; | |
| } | |
| .phase-color-trigger { | |
| border: 2px solid #fff; | |
| border-radius: 999px; | |
| box-shadow: 0 0 0 1px var(--line); | |
| cursor: pointer; | |
| height: 28px; | |
| width: 28px; | |
| } | |
| .phase-color-menu { | |
| background: #fff; | |
| border: 1px solid var(--line); | |
| border-radius: 8px; | |
| bottom: calc(100% + 6px); | |
| box-shadow: 0 4px 16px rgba(15, 23, 42, 0.12); | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 6px; | |
| left: 50%; | |
| padding: 8px; | |
| position: absolute; | |
| transform: translateX(-50%); | |
| width: 148px; | |
| z-index: 2; | |
| } | |
| .phase-color-menu button { | |
| border: 2px solid transparent; | |
| border-radius: 999px; | |
| cursor: pointer; | |
| height: 22px; | |
| width: 22px; | |
| } | |
| .phase-color-menu button.is-selected { | |
| border-color: #0f172a; | |
| } | |
| .phase-date-hint { | |
| align-items: center; | |
| color: var(--muted); | |
| display: inline-flex; | |
| } | |
| .milestone-pin { | |
| background: #f59e0b; | |
| border: 2px solid white; | |
| border-radius: 2px; | |
| box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15); | |
| height: 14px; | |
| margin-left: -7px; | |
| pointer-events: none; | |
| position: absolute; | |
| top: 50%; | |
| transform: translateY(-50%) rotate(45deg); | |
| width: 14px; | |
| z-index: 4; | |
| } | |
| .milestone-pin.completed { | |
| background: var(--success); | |
| } | |
| .quick-popover-body { | |
| gap: 10px; | |
| } | |
| .quick-popover-actions { | |
| display: flex; | |
| gap: 8px; | |
| justify-content: flex-end; | |
| margin-top: 4px; | |
| } | |
| .planner-phases-row .planner-row-track { | |
| min-height: 40px; | |
| } | |
| .project-bar.allocation-bar { | |
| border: none; | |
| font-family: inherit; | |
| z-index: 5; | |
| } | |
| /* Pill layout handled by .allocation-bar-host.is-pill */ | |
| .planner-row-archived { | |
| opacity: 0.55; | |
| } | |
| .planner-row-archived .planner-row-label.person strong { | |
| text-decoration: line-through; | |
| } | |
| .person-meta { | |
| display: grid; | |
| gap: 2px; | |
| min-width: 0; | |
| } | |
| .person-tag-row { | |
| display: inline-flex; | |
| flex-wrap: wrap; | |
| gap: 4px; | |
| margin-top: 2px; | |
| } | |
| .person-tag-row .tag-chip { | |
| font-size: 11px; | |
| padding: 1px 6px; | |
| } | |
| /* === Manage dropdown + sub-navigation === */ | |
| .topnav-dropdown { | |
| position: relative; | |
| } | |
| .topnav-menu { | |
| background: white; | |
| border-radius: 12px; | |
| border: 1px solid var(--line); | |
| box-shadow: 0 16px 40px rgba(15, 23, 42, 0.14); | |
| display: grid; | |
| left: 50%; | |
| margin-top: 14px; | |
| min-width: 220px; | |
| padding: 6px; | |
| position: absolute; | |
| top: 100%; | |
| transform: translateX(-50%); | |
| z-index: 50; | |
| } | |
| .topnav-menu-group { | |
| display: grid; | |
| padding: 4px 0; | |
| } | |
| .topnav-menu-group + .topnav-menu-group { | |
| border-top: 1px solid var(--line); | |
| } | |
| .topnav-menu-item { | |
| align-items: center; | |
| border-radius: 8px; | |
| color: var(--text); | |
| display: flex; | |
| font-size: 14px; | |
| font-weight: 600; | |
| gap: 12px; | |
| padding: 9px 12px; | |
| text-decoration: none; | |
| transition: background 100ms, color 100ms; | |
| } | |
| .topnav-menu-item:hover { | |
| background: var(--primary-soft); | |
| color: var(--primary); | |
| } | |
| .topnav-menu-item.active { | |
| background: var(--primary-soft); | |
| color: var(--primary); | |
| } | |
| .topnav-menu-icon { | |
| color: var(--muted); | |
| flex-shrink: 0; | |
| } | |
| .topnav-menu-item:hover .topnav-menu-icon, | |
| .topnav-menu-item.active .topnav-menu-icon { | |
| color: var(--primary); | |
| } | |
| .manage-page { | |
| display: grid; | |
| gap: 18px; | |
| } | |
| .manage-subnav { | |
| background: white; | |
| border-radius: 12px; | |
| border: 1px solid var(--line); | |
| display: inline-flex; | |
| flex-wrap: wrap; | |
| gap: 2px; | |
| padding: 4px; | |
| } | |
| .manage-subnav-item { | |
| border-radius: 8px; | |
| color: var(--muted); | |
| font-size: 14px; | |
| font-weight: 600; | |
| padding: 8px 14px; | |
| text-decoration: none; | |
| transition: background 120ms, color 120ms; | |
| } | |
| .manage-subnav-item:hover { | |
| color: var(--text); | |
| } | |
| .manage-subnav-item.active { | |
| background: var(--accent); | |
| color: white; | |
| } | |
| .manage-inline-form { | |
| border-top: 1px dashed var(--line); | |
| margin-top: 18px; | |
| padding-top: 18px; | |
| } | |
| .data-table { | |
| background: white; | |
| border-collapse: collapse; | |
| border-radius: 10px; | |
| overflow: hidden; | |
| width: 100%; | |
| } | |
| .data-table th, | |
| .data-table td { | |
| border-bottom: 1px solid var(--line); | |
| padding: 10px 14px; | |
| text-align: left; | |
| } | |
| .data-table th { | |
| background: #fafafa; | |
| color: var(--muted); | |
| font-size: 12px; | |
| font-weight: 700; | |
| letter-spacing: 0.06em; | |
| text-transform: uppercase; | |
| } | |
| .data-table tr:last-child td { | |
| border-bottom: none; | |
| } | |
| .tag-remove { | |
| background: transparent; | |
| border: none; | |
| color: white; | |
| cursor: pointer; | |
| font-size: 14px; | |
| font-weight: 700; | |
| margin-left: 6px; | |
| padding: 0 4px; | |
| } | |
| .tag-remove:hover { | |
| opacity: 0.75; | |
| } | |
| /* Runn-style Manage tables */ | |
| .manage-card { | |
| background: white; | |
| border-radius: 14px; | |
| border: 1px solid var(--line); | |
| display: grid; | |
| overflow: hidden; | |
| } | |
| .manage-toolbar { | |
| align-items: center; | |
| background: #fafafa; | |
| border-bottom: 1px solid var(--line); | |
| display: flex; | |
| gap: 12px; | |
| justify-content: space-between; | |
| padding: 14px 18px; | |
| } | |
| .manage-toolbar-search { | |
| align-items: center; | |
| background: white; | |
| border-radius: 8px; | |
| border: 1px solid var(--line); | |
| display: flex; | |
| flex: 1 1 320px; | |
| gap: 8px; | |
| max-width: 360px; | |
| padding: 0 10px; | |
| } | |
| .manage-toolbar-search-icon { | |
| color: var(--muted); | |
| flex-shrink: 0; | |
| } | |
| .manage-toolbar-search input { | |
| background: transparent; | |
| border: none; | |
| font-family: inherit; | |
| font-size: 14px; | |
| outline: none; | |
| padding: 9px 0; | |
| width: 100%; | |
| } | |
| .manage-toolbar-new { | |
| align-items: center; | |
| border-radius: 999px; | |
| display: inline-flex; | |
| font-size: 13px; | |
| gap: 6px; | |
| padding: 9px 16px; | |
| } | |
| .runn-table { | |
| border-radius: 0; | |
| table-layout: fixed; | |
| width: 100%; | |
| } | |
| .runn-table col.runn-col-name { | |
| width: 42%; | |
| } | |
| .runn-table col.runn-col-meta { | |
| width: 22%; | |
| } | |
| .runn-table col.runn-col-stat { | |
| width: 20%; | |
| } | |
| .runn-table col.runn-col-actions { | |
| width: 72px; | |
| } | |
| .runn-table th, | |
| .runn-table td { | |
| overflow: hidden; | |
| padding: 14px 18px; | |
| text-overflow: ellipsis; | |
| vertical-align: middle; | |
| } | |
| .runn-table th { | |
| background: white; | |
| border-bottom: 1px solid var(--line); | |
| } | |
| .runn-table tbody tr:hover { | |
| background: rgba(124, 58, 237, 0.04); | |
| } | |
| .runn-table th.num, | |
| .runn-table td.num { | |
| text-align: left; | |
| white-space: nowrap; | |
| } | |
| .runn-table th.num { | |
| color: var(--muted); | |
| } | |
| .runn-table .row-actions { | |
| overflow: visible; | |
| padding-left: 8px; | |
| padding-right: 14px; | |
| text-align: right; | |
| text-overflow: clip; | |
| white-space: nowrap; | |
| width: 72px; | |
| } | |
| .link-text { | |
| background: transparent; | |
| border: none; | |
| color: var(--text); | |
| cursor: pointer; | |
| font-family: inherit; | |
| font-size: 14px; | |
| font-weight: 600; | |
| padding: 0; | |
| text-align: left; | |
| } | |
| .link-text:hover { | |
| color: var(--primary); | |
| text-decoration: underline; | |
| } | |
| .tag-name-cell { | |
| align-items: center; | |
| display: inline-flex; | |
| gap: 8px; | |
| } | |
| .count-link { | |
| color: var(--primary); | |
| font-weight: 600; | |
| text-decoration: underline; | |
| text-decoration-color: transparent; | |
| text-underline-offset: 3px; | |
| } | |
| .count-link:hover { | |
| text-decoration-color: currentColor; | |
| } | |
| .count-static { | |
| color: var(--text); | |
| font-weight: 600; | |
| } | |
| .count-zero { | |
| color: var(--muted); | |
| } | |
| .row-menu-trigger { | |
| align-items: center; | |
| background: transparent; | |
| border-radius: 6px; | |
| border: none; | |
| color: var(--muted); | |
| cursor: pointer; | |
| display: inline-flex; | |
| height: 30px; | |
| justify-content: center; | |
| padding: 0; | |
| width: 30px; | |
| } | |
| .row-menu-trigger:hover { | |
| background: var(--primary-soft); | |
| color: var(--primary); | |
| } | |
| .row-menu-popover { | |
| background: white; | |
| border-radius: 10px; | |
| border: 1px solid var(--line); | |
| box-shadow: 0 16px 40px rgba(15, 23, 42, 0.18); | |
| display: grid; | |
| min-width: 180px; | |
| padding: 4px; | |
| position: fixed; | |
| z-index: 1000; | |
| } | |
| .row-menu-item { | |
| align-items: center; | |
| background: transparent; | |
| border-radius: 6px; | |
| border: none; | |
| color: var(--text); | |
| cursor: pointer; | |
| display: flex; | |
| font-family: inherit; | |
| font-size: 13px; | |
| font-weight: 600; | |
| gap: 10px; | |
| padding: 8px 10px; | |
| text-align: left; | |
| } | |
| .row-menu-item:hover { | |
| background: var(--primary-soft); | |
| color: var(--primary); | |
| } | |
| .row-menu-item.danger { | |
| color: var(--danger, #dc2626); | |
| } | |
| .row-menu-item.danger:hover { | |
| background: rgba(220, 38, 38, 0.08); | |
| color: var(--danger, #dc2626); | |
| } | |
| .filter-scope-bar { | |
| align-items: center; | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 8px; | |
| margin-top: 14px; | |
| } | |
| /* Runn-style page header with icon circle */ | |
| .manage-header { | |
| align-items: center; | |
| background: white; | |
| border-radius: 16px; | |
| border: 1px solid var(--line); | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 14px; | |
| justify-content: space-between; | |
| margin-bottom: 16px; | |
| padding: 18px 22px; | |
| } | |
| .manage-header-title { | |
| align-items: center; | |
| display: flex; | |
| gap: 14px; | |
| min-width: 0; | |
| } | |
| .manage-header-icon { | |
| align-items: center; | |
| background: var(--primary-soft); | |
| border-radius: 999px; | |
| color: var(--primary); | |
| display: flex; | |
| flex-shrink: 0; | |
| height: 44px; | |
| justify-content: center; | |
| width: 44px; | |
| } | |
| .manage-header-title h2 { | |
| font-size: 22px; | |
| letter-spacing: -0.01em; | |
| margin: 0; | |
| } | |
| .manage-header-title p { | |
| color: var(--muted); | |
| font-size: 13px; | |
| margin: 4px 0 0; | |
| } | |
| .manage-header-actions { | |
| align-items: center; | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 10px; | |
| } | |
| .manage-toolbar-trailing { | |
| align-items: center; | |
| display: flex; | |
| gap: 10px; | |
| } | |
| /* Compact "Filter [Active]" pill */ | |
| .filter-pill { | |
| align-items: center; | |
| background: white; | |
| border-radius: 8px; | |
| border: 1px solid var(--line); | |
| color: var(--muted); | |
| display: inline-flex; | |
| font-size: 12px; | |
| font-weight: 600; | |
| gap: 8px; | |
| padding: 0 10px 0 12px; | |
| text-transform: uppercase; | |
| letter-spacing: 0.05em; | |
| } | |
| .filter-pill label { | |
| cursor: pointer; | |
| } | |
| .filter-pill select { | |
| background: transparent; | |
| border: none; | |
| color: var(--text); | |
| cursor: pointer; | |
| font-family: inherit; | |
| font-size: 13px; | |
| font-weight: 600; | |
| padding: 8px 4px; | |
| text-transform: none; | |
| letter-spacing: normal; | |
| } | |
| .filter-pill select:focus { | |
| outline: none; | |
| } | |
| /* Cell with avatar + name */ | |
| .cell-person { | |
| align-items: center; | |
| display: flex; | |
| gap: 10px; | |
| } | |
| .cell-project { | |
| align-items: center; | |
| display: flex; | |
| gap: 10px; | |
| } | |
| .project-swatch { | |
| border-radius: 6px; | |
| display: inline-block; | |
| flex-shrink: 0; | |
| height: 18px; | |
| width: 18px; | |
| } | |
| .cell-tags { | |
| align-items: center; | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 4px; | |
| } | |
| .tag-pill { | |
| border-radius: 999px; | |
| font-size: 12px; | |
| font-weight: 600; | |
| padding: 3px 9px; | |
| } | |
| .row-archived td { | |
| opacity: 0.6; | |
| } | |
| .row-archived .link-text { | |
| text-decoration: line-through; | |
| } | |
| /* Status badges */ | |
| .badge.status-planning { background: rgba(124, 58, 237, 0.12); color: #6d28d9; border-color: transparent; } | |
| .badge.status-active { background: rgba(34, 197, 94, 0.14); color: #15803d; border-color: transparent; } | |
| .badge.status-on_hold { background: rgba(245, 158, 11, 0.15); color: #b45309; border-color: transparent; } | |
| .badge.status-completed { background: rgba(100, 116, 139, 0.18); color: #475569; border-color: transparent; } | |
| /* Hub Details button */ | |
| .hub-details-btn { | |
| border-radius: 999px; | |
| font-size: 12px; | |
| padding: 6px 14px; | |
| } | |
| /* Tag picker in modal forms */ | |
| .tag-picker { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 6px; | |
| margin-top: 4px; | |
| } | |
| .checkbox-row { | |
| align-items: center; | |
| display: flex; | |
| flex-direction: row; | |
| gap: 10px; | |
| } | |
| .checkbox-row input { | |
| height: auto; | |
| margin: 0; | |
| width: auto; | |
| } | |
| .demo-sample-banner { | |
| display: grid; | |
| gap: 12px; | |
| } | |
| .demo-sample-banner .primary-button { | |
| justify-self: start; | |
| width: auto; | |
| } | |
| .demo-sample-panel { | |
| display: grid; | |
| gap: 10px; | |
| margin-top: 16px; | |
| } | |
| .demo-sample-panel .primary-button { | |
| justify-self: start; | |
| width: auto; | |
| } | |
| /* Skills page — Runn-style SKILLS / PEOPLE tabs */ | |
| .skills-subnav { | |
| background: white; | |
| border-radius: 12px; | |
| border: 1px solid var(--line); | |
| display: inline-flex; | |
| gap: 0; | |
| margin-bottom: 16px; | |
| padding: 0; | |
| } | |
| .skills-subnav-item { | |
| background: transparent; | |
| border: none; | |
| border-bottom: 2px solid transparent; | |
| color: var(--muted); | |
| cursor: pointer; | |
| font-family: inherit; | |
| font-size: 12px; | |
| font-weight: 700; | |
| letter-spacing: 0.06em; | |
| padding: 12px 20px; | |
| text-transform: uppercase; | |
| } | |
| .skills-subnav-item:hover { | |
| color: var(--text); | |
| } | |
| .skills-subnav-item.active { | |
| border-bottom-color: var(--primary); | |
| color: var(--primary); | |
| } | |
| .skill-row-actions { | |
| align-items: center; | |
| display: flex; | |
| gap: 4px; | |
| justify-content: flex-end; | |
| } | |
| .skill-add-people-btn { | |
| align-items: center; | |
| display: inline-flex; | |
| font-size: 13px; | |
| font-weight: 600; | |
| gap: 6px; | |
| white-space: nowrap; | |
| } | |
| .skill-add-modal { | |
| display: grid; | |
| gap: 12px; | |
| } | |
| .skill-add-search { | |
| align-items: center; | |
| background: var(--bg); | |
| border-radius: 8px; | |
| border: 1px solid var(--line); | |
| display: flex; | |
| gap: 10px; | |
| padding: 0 12px; | |
| } | |
| .skill-add-search input { | |
| background: transparent; | |
| border: none; | |
| flex: 1; | |
| font-size: 14px; | |
| outline: none; | |
| padding: 10px 0; | |
| } | |
| .skill-add-list { | |
| border: 1px solid var(--line); | |
| border-radius: 10px; | |
| max-height: 360px; | |
| overflow-y: auto; | |
| } | |
| .skill-add-empty { | |
| padding: 24px; | |
| text-align: center; | |
| } | |
| .skill-add-row { | |
| align-items: center; | |
| border-bottom: 1px solid var(--line); | |
| display: grid; | |
| gap: 12px; | |
| grid-template-columns: 36px 1.4fr 1fr 1fr 140px 28px; | |
| padding: 10px 14px; | |
| } | |
| .skill-add-row:last-child { | |
| border-bottom: none; | |
| } | |
| .skill-add-row:hover { | |
| background: rgba(124, 58, 237, 0.04); | |
| } | |
| .skill-add-person { | |
| display: grid; | |
| gap: 2px; | |
| min-width: 0; | |
| } | |
| .skill-add-person strong { | |
| font-size: 14px; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .skill-add-person small { | |
| color: var(--muted); | |
| font-size: 12px; | |
| } | |
| .skill-add-role, | |
| .skill-add-team { | |
| color: var(--muted); | |
| font-size: 13px; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .skill-add-level { | |
| align-items: center; | |
| display: flex; | |
| gap: 6px; | |
| } | |
| .skill-add-level select { | |
| flex: 1; | |
| font-size: 13px; | |
| min-width: 0; | |
| } | |
| .skill-add-row input[type="checkbox"] { | |
| height: 16px; | |
| margin: 0; | |
| width: 16px; | |
| } | |