oceanhelm 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .v-left{margin-left:20px}.vessel-card{background:white;border-radius:10px;box-shadow:0 8px 16px #0069c026;transition:all .3s ease;margin-bottom:20px;overflow:hidden;border-left:4px solid var(--accent-color)}.vessel-card:hover{transform:translateY(-5px);box-shadow:0 12px 20px #0069c033}.vessel-icon{display:inline-flex;align-items:center;justify-content:center;width:50px;height:50px;background-color:#e3f2fd;border-radius:10px;color:var(--accent-color);font-size:24px;margin-right:15px}.black{color:#000!important}.action-icon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:20px;color:var(--accent-color);font-size:16px;margin-right:15px;margin-top:20px;margin-bottom:10px}.delete{background-color:var(--danger)}.edit{background-color:var(--success)}.vessel-status{display:inline-block;padding:5px 12px;border-radius:20px;font-size:12px;font-weight:600}.status-active{background-color:#e8f5e9;color:#2e7d32}.status-maintenance{background-color:#fff8e1;color:#f57f17}.status-inactive{background-color:#f5f5f5;color:#757575}.page-header{margin-bottom:30px;border-bottom:1px solid #e0e0e0;padding-bottom:15px}.a-header{background:linear-gradient(135deg,var(--dashprimary-color),var(--dashsecondary-color));color:#fff;padding:2rem 0;margin-bottom:2rem;border-radius:12px;box-shadow:0 10px 30px #3499404d}.a-header h1{font-size:2.5rem;font-weight:700;margin-bottom:.5rem;text-align:center}.a-header p{text-align:center;opacity:.9;font-size:1.1rem}.a-controls{display:flex;gap:1rem;margin-bottom:2rem;flex-wrap:wrap;align-items:center}.a-search-box{flex:1;min-width:250px;position:relative}.a-search-box input{width:100%;padding:12px 16px;border:2px solid #e0e0e0;border-radius:8px;font-size:1rem;transition:all .3s ease}.a-search-box input:focus{outline:none;border-color:var(--dashsecondary-color);box-shadow:0 0 0 3px #3499401a}.filter-select{padding:12px 16px;border:2px solid #e0e0e0;border-radius:8px;font-size:1rem;background:white;cursor:pointer;transition:all .3s ease}.filter-select:focus{outline:none;border-color:var(--dashsecondary-color);box-shadow:0 0 0 3px #3499401a}.btn{padding:12px 24px;border-radius:8px;font-size:1rem;font-weight:600;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:8px}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-dark);transform:translateY(-1px);box-shadow:0 4px 12px #3499404d}.btn-secondary{background:var(--secondary);color:var(--dark)}.btn-secondary:hover{background:#e6a200;transform:translateY(-1px);box-shadow:0 4px 12px #f4b4004d}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1.5rem;margin-bottom:2rem}.stat-card{background:white;padding:1.5rem;border-radius:12px;box-shadow:0 4px 20px #0000000d;transition:transform .3s ease}.stat-card:hover{transform:translateY(-2px)}.stat-card h3{color:var(--gray);font-size:.9rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-bottom:.5rem}.stat-card .value{font-size:2rem;font-weight:700;color:var(--dashsecondary-color)}.logs-container{background:white;border-radius:12px;box-shadow:0 4px 20px #0000000d;overflow:hidden}.logs-header{background:var(--light);padding:1.5rem;border-bottom:1px solid #e0e0e0}.logs-header h2{color:var(--dark);font-size:1.3rem;font-weight:600}.logs-table{width:100%;border-collapse:collapse}.logs-table th,.logs-table td{padding:1rem;text-align:left;border-bottom:1px solid #f0f0f0}.logs-table th{background:var(--light);font-weight:600;color:var(--dark);font-size:.9rem;text-transform:uppercase;letter-spacing:.5px}.logs-table tr:hover{background:#f8f9fa}.activity-badge{padding:4px 12px;border-radius:20px;font-size:.8rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px}.badge-login{background:var(--success);color:#fff}.badge-logout{background:var(--gray);color:#fff}.badge-create{background:var(--dashprimary-color);color:#fff}.badge-update{background:var(--warning);color:#fff}.badge-delete{background:var(--danger);color:#fff}.badge-danger{color:var(--danger)}.badge-view{background:var(--maitsecondary);color:#fff}.pagination{display:flex;justify-content:center;align-items:center;gap:.5rem;padding:1.5rem;background:var(--light)}.pagination button{padding:8px 12px;border:1px solid #e0e0e0;background:white;border-radius:6px;cursor:pointer;transition:all .3s ease}.pagination button:hover,.pagination button.active{background:var(--primary);color:#fff;border-color:var(--primary)}.pagination button:disabled{opacity:.5;cursor:not-allowed}.no-logs{text-align:center;padding:3rem;color:var(--gray)}.no-logs h3{font-size:1.5rem;margin-bottom:1rem}.loading{text-align:center;padding:3rem;color:var(--gray)}.spinner{border:3px solid #f3f3f3;border-top:3px solid var(--primary);border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite;margin:0 auto 1rem}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 768px){.a-controls{flex-direction:column;align-items:stretch}.a-search-box{min-width:100%}.stats-grid{grid-template-columns:1fr}.logs-table{font-size:.9rem}.logs-table th,.logs-table td{padding:.5rem}}.add-crew-form h2{color:#005792}.crew-section{margin-bottom:30px}.crew-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:20px;margin-bottom:30px;align-items:start}.crew-card{background-color:#f8f9fa;border-radius:6px;padding:15px;box-shadow:0 1px 5px #00000014;border-left:4px solid #00a8e8;position:relative}.crew-card.unavailable{border-left-color:#dc3545;opacity:.8}.crew-name{font-weight:700;font-size:1.1em;margin-bottom:5px;color:#005792}.crew-role{color:#6c757d;font-size:.9em;margin-bottom:10px}.crew-certifications,.crew-availability{font-size:.85em;margin:5px 0}.certification-tag{display:inline-block;background-color:#e6f7ff;color:#005792;border-radius:4px;padding:2px 8px;margin-right:5px;margin-bottom:5px;font-size:.85em;cursor:pointer}.certification-tag:hover{background-color:#d1f0ff}.crew-status-badge{position:absolute;top:15px;right:15px;font-size:.75em;padding:3px 8px;border-radius:12px;font-weight:700}.status-available{background-color:#d4edda;color:#155724}.status-unavailable{background-color:#f8d7da;color:#721c24}.status-onduty{background-color:#cce5ff;color:#004085}.action-buttons{display:flex;justify-content:space-between;margin-top:15px;gap:5px;flex-wrap:wrap}.btn{padding:6px 12px;border-radius:4px;cursor:pointer;font-size:.9em;transition:background-color .2s;border:none}.btn-primary{background-color:#005792;color:#fff}.btn-primary:hover{background-color:#004675}.btn-secondary{background-color:#e9ecef;color:#495057}.btn-secondary:hover{background-color:#dde2e6}.btn-warning{background-color:#ffc107;color:#212529}.btn-warning:hover{background-color:#e0a800}.btn-danger{background-color:#dc3545;color:#fff}.btn-danger:hover{background-color:#c82333}.btn-link{background:none;border:none;color:#005792;text-decoration:none;padding:4px 8px}.btn-link:hover{text-decoration:underline}.btn-sm{font-size:.8em;padding:4px 8px}.crew-footer{display:flex;justify-content:space-between;align-items:center;margin-top:10px;padding-top:10px;border-top:1px solid #e9ecef}.crew-log-toggle{flex:1}.log-toggle-btn{text-align:left;padding:0;display:flex;align-items:center;gap:5px}.crew-log{margin-top:15px;padding:10px;background-color:#fff;border-radius:4px;border:1px solid #dee2e6;max-height:300px;overflow-y:auto}.crew-log h4{margin:0 0 10px;font-size:.9em;color:#005792;border-bottom:1px solid #dee2e6;padding-bottom:5px}.log-entry{padding:8px;margin-bottom:8px;border-left:3px solid #005792;background-color:#f8f9fa;border-radius:3px}.log-entry:last-child{margin-bottom:0}.log-date{font-size:.75em;color:#6c757d;margin-bottom:3px}.log-action{font-weight:700;font-size:.85em;margin-bottom:3px;display:flex;align-items:center;gap:5px}.log-action-embark{color:#28a745}.log-action-deboard{color:#dc3545}.log-action-assign{color:#007bff}.log-action-status{color:#ffc107}.log-details{font-size:.8em;color:#495057}.log-notes{font-size:.8em;color:#6c757d;font-style:italic;margin-top:3px}.search-filter{display:flex;margin-bottom:20px;gap:10px;align-items:center}.search-filter input,.search-filter select{padding:8px 12px;border:1px solid #ced4da;border-radius:4px}.search-filter input{flex-grow:1}.search-filter select{min-width:150px}.add-crew-form{background-color:#f8f9fa;padding:20px;border-radius:6px;margin-top:30px}.form-row{display:flex;flex-wrap:wrap;gap:15px;margin-bottom:15px}.form-group{flex:1;min-width:200px}.form-group label{display:block;margin-bottom:5px;font-weight:700;color:#495057}.text-danger{color:red;font-weight:bolder}.text-warning{color:orange;font-weight:bolder}.text-success{color:green;font-weight:bolder}.icon{font-size:20px;cursor:pointer;color:#005792}.icon:hover{color:#003d5c}.delete-icon{font-size:20px;cursor:pointer;color:#dc3545;position:static;margin:0}.delete-icon:hover{color:#c82333}.form-group input,.form-group select,.form-group textarea{width:100%;padding:8px;border:1px solid #ced4da;border-radius:4px}.form-group input.error{border-color:#dc3545}.error-message{color:#dc3545;font-size:.85em;margin-top:5px}.form-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}.no-results{text-align:center;padding:40px 20px;color:#6c757d;font-size:1.1em}.crew-section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.crew-section-header h2{color:#005792;margin:0}.vcard{border-radius:6px;padding:5px}.loading-state{text-align:center;padding:40px 20px}.spinner-border{width:3rem;height:3rem;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;display:inline-block;animation:spinner-border .75s linear infinite}@keyframes spinner-border{to{transform:rotate(360deg)}}.text-primary{color:#005792}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.certification-section{margin:20px 0;padding:15px;background-color:#fff;border-radius:4px;border:1px solid #dee2e6}.certification-section h3{color:#005792;margin-top:0;margin-bottom:15px;font-size:1.1em}.certification-entry{margin-bottom:10px}.image-upload-wrapper{position:relative}.file-input{display:none}.file-input-label{display:inline-flex;align-items:center;gap:8px;padding:8px 16px;background-color:#005792;color:#fff!important;border-radius:4px;cursor:pointer;font-size:.9em;transition:background-color .2s}.file-input-label:hover{background-color:#004675}.file-input-label i{font-size:1.1em}.file-name{display:block;margin-top:5px;color:#6c757d;font-size:.85em}.image-preview{margin-top:10px;position:relative;display:inline-block}.image-preview img{max-width:200px;max-height:150px;border-radius:4px;border:2px solid #dee2e6}.pdf-preview{display:flex;align-items:center;gap:10px;padding:15px;background-color:#f8f9fa;border:2px solid #dee2e6;border-radius:4px;max-width:200px}.pdf-preview i{font-size:2em;color:#dc3545}.pdf-preview span{font-size:.85em;color:#495057;word-break:break-word}.btn-remove-image{position:absolute;top:-8px;right:-8px;background-color:#dc3545;color:#fff;border:none;border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;transition:background-color .2s}.btn-remove-image:hover{background-color:#c82333}.btn-remove-image i{font-size:1em}.timesheet-view{background-color:#fff;border-radius:6px;padding:20px;box-shadow:0 2px 8px #0000001a}.timesheet-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:15px;border-bottom:2px solid #005792}.timesheet-header h3{color:#005792;margin:0;display:flex;align-items:center;gap:10px}.timesheet-controls{display:flex;gap:10px}.timesheet-controls select,.timesheet-search{padding:8px 12px;border:1px solid #ced4da;border-radius:4px;font-size:.9em}.timesheet-search{min-width:250px}.timesheet-summary{display:flex;gap:20px;margin-bottom:20px;flex-wrap:wrap}.summary-card{flex:1;min-width:150px;background-color:#f8f9fa;padding:15px;border-radius:6px;border-left:4px solid #005792}.summary-label{display:block;font-size:.85em;color:#6c757d;margin-bottom:5px}.summary-value{display:block;font-size:1.5em;font-weight:700;color:#005792}.timesheet-table-container{overflow-x:auto;margin-top:20px}.timesheet-table{width:100%;border-collapse:collapse;font-size:.9em}.timesheet-table thead{background-color:#005792;color:#fff}.timesheet-table th{padding:12px 8px;text-align:left;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.timesheet-table th:hover{background-color:#004675}.timesheet-table th i{font-size:.8em;margin-left:5px}.timesheet-table tbody tr{border-bottom:1px solid #dee2e6}.timesheet-table tbody tr:hover{background-color:#f8f9fa}.timesheet-table td{padding:10px 8px}.timestamp-cell{white-space:nowrap;color:#495057;font-size:.85em}.crew-name-cell strong{color:#005792}.role-cell{color:#6c757d}.action-cell{white-space:nowrap}.action-badge{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:12px;font-size:.85em;font-weight:700}.vessel-cell{color:#495057}.duration-cell{color:#495057;font-weight:500}.notes-cell{color:#6c757d;font-style:italic;max-width:200px;overflow:hidden;text-overflow:ellipsis}.timesheet-row-embarked{background-color:#d4edda}.timesheet-row-deboarded{background-color:#f8d7da}.timesheet-row-assigned{background-color:#d1ecf1}.timesheet-row-status-changed{background-color:#fff3cd}@media (max-width: 768px){.crew-grid{grid-template-columns:1fr}.search-filter{flex-direction:column}.search-filter input,.search-filter select{width:100%}.timesheet-header{flex-direction:column;align-items:flex-start;gap:15px}.timesheet-controls{flex-direction:column;width:100%}.timesheet-controls select,.timesheet-search{width:100%}.timesheet-summary{flex-direction:column}.timesheet-table{font-size:.8em}.timesheet-table th,.timesheet-table td{padding:8px 4px}}.crew-subhead{color:#000}.s-container{max-width:1200px;margin:0 auto;background:rgba(255,255,255,.95);border-radius:20px;box-shadow:0 25px 50px #00000040;overflow:hidden;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;padding:20px}.header h1{font-size:2.5rem;margin-bottom:10px;position:relative;z-index:1}.header p{font-size:1.1rem;opacity:.9;position:relative;z-index:1}.nav-tabs{display:flex;background:#f8fafc;border-bottom:2px solid #e2e8f0;overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch;scrollbar-width:thin}.nav-tabs::-webkit-scrollbar{height:6px}.nav-tabs::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.nav-tabs::-webkit-scrollbar-track{background:transparent}.nav-tab{flex:1;padding:15px 20px;background:none;border:none;cursor:pointer;font-size:1rem;font-weight:600;color:#64748b;transition:all .3s ease;position:relative}.nav-tab:hover{background:#e2e8f0;color:#1e40af}.nav-tab.active{color:#1e40af;background:white}.nav-tab.active:after{content:"";position:absolute;bottom:-2px;left:0;right:0;height:3px;background:#1e40af}.tab-content{display:none;padding:30px;animation:fadeIn .5s ease-in}.tab-content.active{display:block}@keyframes fadeIn{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:25px;margin-bottom:30px}.form-group{display:flex;flex-direction:column}.form-group label{font-weight:600;margin-bottom:8px;color:#374151;font-size:.95rem}.form-group input,.form-group select,.form-group textarea{padding:12px 15px;border:2px solid #e5e7eb;border-radius:10px;font-size:1rem;transition:all .3s ease;background:white}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.form-group textarea{min-height:100px;resize:vertical}.items-section{background:#f8fafc;border-radius:15px;padding:25px;margin:25px 0;border:2px solid #e2e8f0}.items-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.items-header h3{color:#1e40af;font-size:1.3rem}.add-item-btn{background:linear-gradient(135deg,#10b981 0%,#059669 100%);color:#fff;border:none;padding:10px 20px;border-radius:8px;cursor:pointer;font-weight:600;transition:all .3s ease;box-shadow:0 4px 15px #10b9814d}.add-item-btn:hover{transform:translateY(-2px);box-shadow:0 6px 20px #10b98166}.item-row{display:grid;grid-template-columns:2fr 1fr 1fr 1fr auto;gap:15px;align-items:end;margin-bottom:15px;padding:15px;background:white;border-radius:10px;border:1px solid #e5e7eb;transition:all .3s ease}.item-row:hover{box-shadow:0 4px 15px #0000001a}.marginbox{margin:10px}.item-list{list-style:none;padding:0;margin:.5rem 0}.item-list li{background:#f1f5f9;margin-bottom:.5rem;padding:.5rem .75rem;border-radius:.375rem;font-size:.95rem;color:#1e293b;display:flex;justify-content:space-between;align-items:center;content:"•";color:#3b82f6}.remove-item-btn{background:#ef4444;color:#fff;border:none;padding:8px 12px;border-radius:6px;cursor:pointer;font-size:.9rem;transition:all .3s ease}.remove-item-btn:hover{background:#dc2626;transform:scale(1.05)}.approval-actions{display:flex;gap:10px;margin-top:15px}.btn-approve{background:linear-gradient(135deg,#10b981 0%,#059669 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-approve:hover{transform:translateY(-1px);box-shadow:0 4px 12px #10b9814d}.btn-reject{background:linear-gradient(135deg,#ef4444 0%,#dc2626 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-reject:hover{transform:translateY(-1px);box-shadow:0 4px 12px #ef44444d}.btn-request{background:linear-gradient(135deg,#ef9a44 0%,#fa920a 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-request:hover{transform:translateY(-1px);box-shadow:0 4px 12px #f0a2344d}.btn-create-po{background:linear-gradient(135deg,#8b5cf6 0%,#7c3aed 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-create-po:hover{transform:translateY(-1px);box-shadow:0 4px 12px #8b5cf64d}.btn-mark-delivered{background:linear-gradient(135deg,#06b6d4 0%,#0891b2 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-mark-delivered:hover{transform:translateY(-1px);box-shadow:0 4px 12px #06b6d44d}.po-info{background:#f8fafc;padding:15px;border-radius:8px;margin:10px 0;border:1px solid #e2e8f0}.po-info h4{color:#1e40af;margin-bottom:10px;font-size:1rem}.po-details{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;font-size:.9rem}.items-list{background:#f8fafc;padding:15px;border-radius:8px;margin:15px 0;border:1px solid #e2e8f0}.items-list h4{color:#374151;margin-bottom:10px;font-size:1rem}.item-detail{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid #e5e7eb}.item-detail:last-child{border-bottom:none}.comments-section{margin-top:15px}.comments-section textarea{width:100%;min-height:80px;padding:10px;border:1px solid #d1d5db;border-radius:6px;font-size:.9rem;resize:vertical}.role-badge{display:inline-block;padding:4px 8px;border-radius:12px;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-left:10px}.role-supervisor{background:#fef3c7;color:#92400e}.role-purchasing{background:#dbeafe;color:#1e40af}.role-receiving{background:#dcfce7;color:#166534}.status-badge{display:inline-block;padding:6px 12px;border-radius:20px;font-size:.85rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px}.status-draft{background:#fef3c7;color:#92400e}.status-under-review{background:#dbeafe;color:#1e40af}.status-approved{background:#dcfce7;color:#166534}.status-declined{background:#fee2e2;color:#dc2626}.status-info-requested{background:#e8cf12;color:#da7212}.status-po-created{background:#e0e7ff;color:#4bca38}.status-pending-supply{background:#113fd8;color:#4bca38}.status-delivered{background:#f3e8ff;color:#7c3aed}.status-received{background:#ecfdf5;color:#065f46}.action-buttons{display:flex;gap:15px;justify-content:flex-end;margin-top:30px;padding-top:25px;border-top:2px solid #e5e7eb}.btn-primary-req{background:linear-gradient(135deg,#1e40af 0%,#3b82f6 100%);color:#fff;box-shadow:0 4px 15px #1e40af4d}.btn-primary-req:hover{transform:translateY(-2px);box-shadow:0 6px 20px #1e40af66}.btn-secondary{background:#6b7280;color:#fff}.btn-secondary:hover{background:#4b5563;transform:translateY(-2px)}.requisition-list{display:grid;gap:20px}.requisition-card{background:white;border-radius:15px;padding:25px;box-shadow:0 4px 15px #0000001a;border:1px solid #e5e7eb;transition:all .3s ease}.requisition-card:hover{transform:translateY(-5px);box-shadow:0 8px 25px #00000026}.requisition-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.requisition-id{font-size:1.2rem;font-weight:700;color:#1e40af}.requisition-details{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:15px;margin-top:15px}.detail-item{display:flex;flex-direction:column}.detail-label{font-size:.85rem;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px}.detail-value{font-size:1rem;color:#374151;font-weight:500}.workflow-steps{display:flex;justify-content:space-between;align-items:center;margin:30px 0;padding:20px;background:#f8fafc;border-radius:15px;border:2px solid #e2e8f0}.workflow-step{display:flex;flex-direction:column;align-items:center;flex:1;position:relative}.workflow-step:not(:last-child):after{content:"";position:absolute;top:20px;right:-50%;width:100%;height:2px;background:#e5e7eb;z-index:1}.step-icon{width:40px;height:40px;border-radius:50%;background:#e5e7eb;display:flex;align-items:center;justify-content:center;font-weight:700;color:#6b7280;margin-bottom:10px;position:relative;z-index:2}.step-icon.active{background:#3b82f6;color:#fff}.step-icon.completed{background:#10b981;color:#fff}.step-title{font-size:.9rem;font-weight:600;color:#374151;text-align:center}@media (max-width: 768px){.form-grid{grid-template-columns:1fr}.item-row{grid-template-columns:1fr;gap:10px}.action-buttons{flex-direction:column}.workflow-steps{flex-direction:column;gap:20px}.workflow-step:after{display:none}}#content{width:100%;min-height:100vh;transition:all .3s;position:absolute;padding:20px 20px 20px 40px}#content.active{margin-left:var(--sidebar-width);width:calc(100% - var(--sidebar-width))}.po-content{padding:40px}.po-header{display:grid;grid-template-columns:1fr 1fr;gap:40px;margin-bottom:40px}.company-info,.po-details{background:#f8f9fa;padding:25px;border-radius:15px;border-left:5px solid #3498db}.company-info h3,.po-details h3{color:#2c3e50;margin-bottom:15px;font-size:1.3rem}.info-row{margin-bottom:8px;display:flex;justify-content:space-between}.info-label{font-weight:600;color:#555}.info-value{color:#2c3e50}.items-section{margin-top:30px}.section-title{color:#2c3e50;font-size:1.5rem;margin-bottom:20px;border-bottom:2px solid #3498db;padding-bottom:10px}.items-table{width:100%;border-collapse:collapse;margin-bottom:30px;background:white;border-radius:10px;overflow:hidden;box-shadow:0 5px 15px #0000001a}.items-table th{background:linear-gradient(135deg,#34495e 0%,#2c3e50 100%);color:#fff;padding:15px;text-align:left;font-weight:600}.items-table td{padding:15px;border-bottom:1px solid #eee;vertical-align:middle}.items-table tr:hover{background:#f8f9fa;transform:translateY(-1px);transition:all .3s ease}.price-input{padding:8px 12px;border:2px solid #ddd;border-radius:8px;font-size:14px;width:100px;transition:all .3s ease}.price-input:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.price-changed{background:#fff3cd;border-color:#ffc107}.edit-btn{background:#3498db;color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:12px;transition:all .3s ease}.edit-btn:hover{background:#2980b9;transform:translateY(-2px)}.save-btn{background:#27ae60;color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:12px;margin-right:5px}.cancel-btn{background:#e74c3c;color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:12px}.justification-modal{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content{background:white;padding:30px;border-radius:15px;max-width:500px;width:90%;box-shadow:0 20px 40px #0000004d}.modal-content h3{color:#2c3e50;margin-bottom:20px;font-size:1.3rem}.justification-textarea{width:100%;padding:15px;border:2px solid #ddd;border-radius:8px;font-family:inherit;font-size:14px;resize:vertical;min-height:100px}.justification-textarea:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.modal-buttons{margin-top:20px;display:flex;gap:10px;justify-content:flex-end}.totals{background:linear-gradient(135deg,#f8f9fa 0%,#e9ecef 100%);padding:25px;border-radius:15px;margin-top:20px}.total-row{display:flex;justify-content:space-between;margin-bottom:10px;font-size:1.1rem}.total-row.grand-total{border-top:2px solid #3498db;padding-top:15px;margin-top:15px;font-weight:700;font-size:1.3rem;color:#2c3e50}.justification-note{background:#fff3cd;border:1px solid #ffc107;border-radius:8px;padding:10px;margin-top:10px;font-size:12px;color:#856404}.price-change-indicator{background:#dc3545;color:#fff;border-radius:50%;width:20px;height:20px;font-size:12px;display:inline-flex;align-items:center;justify-content:center;margin-left:5px}@media (max-width: 768px){.po-header{grid-template-columns:1fr;gap:20px}.items-table{font-size:14px}.items-table th,.items-table td{padding:10px 8px}.price-input{width:80px}}
1
+ .v-left{margin-left:20px}.vessel-card{background:white;border-radius:10px;box-shadow:0 8px 16px #0069c026;transition:all .3s ease;margin-bottom:20px;overflow:hidden;border-left:4px solid var(--accent-color)}.vessel-card:hover{transform:translateY(-5px);box-shadow:0 12px 20px #0069c033}.vessel-icon{display:inline-flex;align-items:center;justify-content:center;width:50px;height:50px;background-color:#e3f2fd;border-radius:10px;color:var(--accent-color);font-size:24px;margin-right:15px}.black{color:#000!important}.action-icon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:20px;color:var(--accent-color);font-size:16px;margin-right:15px;margin-top:20px;margin-bottom:10px}.delete{background-color:var(--danger)}.edit{background-color:var(--success)}.vessel-status{display:inline-block;padding:5px 12px;border-radius:20px;font-size:12px;font-weight:600}.status-active{background-color:#e8f5e9;color:#2e7d32}.status-maintenance{background-color:#fff8e1;color:#f57f17}.status-inactive{background-color:#f5f5f5;color:#757575}.page-header{margin-bottom:30px;border-bottom:1px solid #e0e0e0;padding-bottom:15px}.btn-outline-primary{border:1px solid #0d6efd!important}.btn-outline-primary:hover{background-color:#0d6efd!important;border-color:#0d6efd!important;color:#fff!important}.reports-container[data-v-e9baa631]{padding:20px}.page-header[data-v-e9baa631]{margin-bottom:30px;border-bottom:1px solid #e0e0e0;padding-bottom:15px}.folders-section[data-v-e9baa631]{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:20px;padding:10px}@media (max-width: 768px){.folders-section[data-v-e9baa631]{grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:15px}}@media (min-width: 1400px){.folders-section[data-v-e9baa631]{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}}.folder-card[data-v-e9baa631]{position:relative;border:2px solid #e0e0e0;border-radius:8px;padding:15px;background-color:#fff;transition:all .2s;cursor:pointer;aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.folder-card[data-v-e9baa631]:hover{border-color:#0d6efd;box-shadow:0 4px 12px #0000001a;transform:translateY(-2px)}.folder-preview[data-v-e9baa631]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:white;border:2px solid #0d6efd;border-radius:8px;box-shadow:0 8px 24px #00000026;padding:0;z-index:100;min-width:280px;max-width:320px;pointer-events:none}.preview-header[data-v-e9baa631]{background:#f8f9fa;padding:12px 15px;border-bottom:1px solid #e0e0e0;border-radius:6px 6px 0 0}.preview-header strong[data-v-e9baa631]{font-size:.95rem;color:#333}.preview-content[data-v-e9baa631]{padding:10px;max-height:200px;overflow-y:auto}.preview-file[data-v-e9baa631]{display:flex;align-items:center;gap:8px;padding:6px 8px;font-size:.85rem;color:#495057;border-bottom:1px solid #f0f0f0}.preview-file[data-v-e9baa631]:last-child{border-bottom:none}.preview-file i[data-v-e9baa631]{color:#6c757d;font-size:.9rem}.preview-file span[data-v-e9baa631]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview-more[data-v-e9baa631]{text-align:center;padding:8px;font-size:.8rem;color:#6c757d;font-style:italic}.preview-empty[data-v-e9baa631]{padding:30px 20px;text-align:center;color:#adb5bd}.preview-empty i[data-v-e9baa631]{font-size:2rem;display:block;margin-bottom:8px}.folder-content[data-v-e9baa631]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;width:100%;height:100%}.folder-name[data-v-e9baa631]{margin-top:10px;font-weight:600;font-size:.9rem;word-break:break-word;max-width:100%;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}.folder-actions-overlay[data-v-e9baa631]{position:absolute;top:5px;right:5px;display:flex;gap:5px;opacity:0;transition:opacity .2s}.folder-card:hover .folder-actions-overlay[data-v-e9baa631]{opacity:1}.btn-icon[data-v-e9baa631]{width:28px;height:28px;padding:0;display:flex;align-items:center;justify-content:center;background:white;border:1px solid #dee2e6;border-radius:4px}.btn-icon[data-v-e9baa631]:hover{background:#f8f9fa;border-color:#0d6efd}.btn-icon i[data-v-e9baa631]{font-size:.85rem}.folder-modal-overlay[data-v-e9baa631]{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);z-index:1000;display:flex;align-items:center;justify-content:center}.folder-expanded[data-v-e9baa631]{background:white;border-radius:12px;box-shadow:0 10px 40px #0000004d;width:90%;max-width:700px;max-height:80vh;overflow:hidden;display:flex;flex-direction:column}.expanded-header[data-v-e9baa631]{display:flex;justify-content:space-between;align-items:center;padding:20px 25px;border-bottom:2px solid #f0f0f0;background:#f8f9fa}.expanded-header strong[data-v-e9baa631]{font-size:1.3rem;color:#333}.btn-close-expanded[data-v-e9baa631]{background:transparent;border:none;font-size:1.2rem;cursor:pointer;padding:5px 10px;display:flex;align-items:center;justify-content:center;transition:color .2s}.btn-close-expanded[data-v-e9baa631]:hover{color:#dc3545}.files-list[data-v-e9baa631]{padding:20px;max-height:60vh;overflow-y:auto}.file-item[data-v-e9baa631]{padding:12px;background-color:#f8f9fa;border-radius:4px;margin-bottom:8px}.file-item[data-v-e9baa631]:last-child{margin-bottom:0}.empty-folder-message[data-v-e9baa631]{padding:40px 20px;text-align:center;color:#6c757d}.empty-folder-message i[data-v-e9baa631]{font-size:3rem;color:#dee2e6}.empty-folder-message p[data-v-e9baa631]{margin:15px 0}.empty-state[data-v-e9baa631]{padding:60px 20px}.modal[data-v-e9baa631]{display:none;position:fixed;z-index:1050;left:0;top:0;width:100%;height:100%;overflow:hidden;background-color:#00000080;align-items:center;justify-content:center}.modal.show[data-v-e9baa631]{display:flex}.modal-dialog[data-v-e9baa631]{max-width:500px;margin:1.75rem auto}.modal-content[data-v-e9baa631]{background-color:#fff;border-radius:8px;box-shadow:0 5px 15px #0000004d}.modal-header[data-v-e9baa631]{padding:1rem;border-bottom:1px solid #dee2e6;display:flex;justify-content:space-between;align-items:center}.modal-body[data-v-e9baa631]{padding:1rem}.modal-footer[data-v-e9baa631]{padding:1rem;border-top:1px solid #dee2e6;display:flex;justify-content:flex-end;gap:10px}.btn-close[data-v-e9baa631]{background:transparent;border:none;font-size:1.5rem;font-weight:700;line-height:1;color:#000;opacity:.5;cursor:pointer}.btn-close[data-v-e9baa631]:hover{opacity:.75}.a-header{background:linear-gradient(135deg,var(--dashprimary-color),var(--dashsecondary-color));color:#fff;padding:2rem 0;margin-bottom:2rem;border-radius:12px;box-shadow:0 10px 30px #3499404d}.a-header h1{font-size:2.5rem;font-weight:700;margin-bottom:.5rem;text-align:center}.a-header p{text-align:center;opacity:.9;font-size:1.1rem}.a-controls{display:flex;gap:1rem;margin-bottom:2rem;flex-wrap:wrap;align-items:center}.a-search-box{flex:1;min-width:250px;position:relative}.a-search-box input{width:100%;padding:12px 16px;border:2px solid #e0e0e0;border-radius:8px;font-size:1rem;transition:all .3s ease}.a-search-box input:focus{outline:none;border-color:var(--dashsecondary-color);box-shadow:0 0 0 3px #3499401a}.filter-select{padding:12px 16px;border:2px solid #e0e0e0;border-radius:8px;font-size:1rem;background:white;cursor:pointer;transition:all .3s ease}.filter-select:focus{outline:none;border-color:var(--dashsecondary-color);box-shadow:0 0 0 3px #3499401a}.btn{padding:12px 24px;border-radius:8px;font-size:1rem;font-weight:600;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:8px}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-dark);transform:translateY(-1px);box-shadow:0 4px 12px #3499404d}.btn-secondary{background:var(--secondary);color:var(--dark)}.btn-secondary:hover{background:#e6a200;transform:translateY(-1px);box-shadow:0 4px 12px #f4b4004d}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1.5rem;margin-bottom:2rem}.stat-card{background:white;padding:1.5rem;border-radius:12px;box-shadow:0 4px 20px #0000000d;transition:transform .3s ease}.stat-card:hover{transform:translateY(-2px)}.stat-card h3{color:var(--gray);font-size:.9rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-bottom:.5rem}.stat-card .value{font-size:2rem;font-weight:700;color:var(--dashsecondary-color)}.logs-container{background:white;border-radius:12px;box-shadow:0 4px 20px #0000000d;overflow:hidden}.logs-header{background:var(--light);padding:1.5rem;border-bottom:1px solid #e0e0e0}.logs-header h2{color:var(--dark);font-size:1.3rem;font-weight:600}.logs-table{width:100%;border-collapse:collapse}.logs-table th,.logs-table td{padding:1rem;text-align:left;border-bottom:1px solid #f0f0f0}.logs-table th{background:var(--light);font-weight:600;color:var(--dark);font-size:.9rem;text-transform:uppercase;letter-spacing:.5px}.logs-table tr:hover{background:#f8f9fa}.activity-badge{padding:4px 12px;border-radius:20px;font-size:.8rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px}.badge-login{background:var(--success);color:#fff}.badge-logout{background:var(--gray);color:#fff}.badge-create{background:var(--dashprimary-color);color:#fff}.badge-update{background:var(--warning);color:#fff}.badge-delete{background:var(--danger);color:#fff}.badge-danger{color:var(--danger)}.badge-view{background:var(--maitsecondary);color:#fff}.pagination{display:flex;justify-content:center;align-items:center;gap:.5rem;padding:1.5rem;background:var(--light)}.pagination button{padding:8px 12px;border:1px solid #e0e0e0;background:white;border-radius:6px;cursor:pointer;transition:all .3s ease}.pagination button:hover,.pagination button.active{background:var(--primary);color:#fff;border-color:var(--primary)}.pagination button:disabled{opacity:.5;cursor:not-allowed}.no-logs{text-align:center;padding:3rem;color:var(--gray)}.no-logs h3{font-size:1.5rem;margin-bottom:1rem}.loading{text-align:center;padding:3rem;color:var(--gray)}.spinner{border:3px solid #f3f3f3;border-top:3px solid var(--primary);border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite;margin:0 auto 1rem}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 768px){.a-controls{flex-direction:column;align-items:stretch}.a-search-box{min-width:100%}.stats-grid{grid-template-columns:1fr}.logs-table{font-size:.9rem}.logs-table th,.logs-table td{padding:.5rem}}.add-crew-form h2{color:#005792}.crew-section{margin-bottom:30px}.crew-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:20px;margin-bottom:30px;align-items:start}.crew-card{background-color:#f8f9fa;border-radius:6px;padding:15px;box-shadow:0 1px 5px #00000014;border-left:4px solid #00a8e8;position:relative}.crew-card.unavailable{border-left-color:#dc3545;opacity:.8}.crew-name{font-weight:700;font-size:1.1em;margin-bottom:5px;color:#005792}.crew-role{color:#6c757d;font-size:.9em;margin-bottom:10px}.crew-certifications,.crew-availability{font-size:.85em;margin:5px 0}.certification-tag{display:inline-block;background-color:#e6f7ff;color:#005792;border-radius:4px;padding:2px 8px;margin-right:5px;margin-bottom:5px;font-size:.85em;cursor:pointer}.certification-tag:hover{background-color:#d1f0ff}.crew-status-badge{position:absolute;top:15px;right:15px;font-size:.75em;padding:3px 8px;border-radius:12px;font-weight:700}.status-available{background-color:#d4edda;color:#155724}.status-unavailable{background-color:#f8d7da;color:#721c24}.status-assigned{background-color:#ffc107;color:#212529}.status-onduty{background-color:#cce5ff;color:#004085}.status-onboard{background-color:#d1ecf1;color:#0c5460}.action-buttons{display:flex;justify-content:space-between;margin-top:15px;gap:5px;flex-wrap:wrap}.btn{padding:6px 12px;border-radius:4px;cursor:pointer;font-size:.9em;transition:background-color .2s;border:none}.btn-primary{background-color:#005792;color:#fff}.btn-primary:hover{background-color:#004675}.btn-secondary{background-color:#e9ecef;color:#495057}.btn-secondary:hover{background-color:#dde2e6}.btn-warning{background-color:#ffc107;color:#212529}.btn-warning:hover{background-color:#e0a800}.btn-success{background-color:#28a745;color:#fff}.btn-success:hover{background-color:#218838}.btn-danger{background-color:#dc3545;color:#fff}.btn-danger:hover{background-color:#c82333}.btn-link{background:none;border:none;color:#005792;text-decoration:none;padding:4px 8px}.btn-link:hover{text-decoration:underline}.btn-sm{font-size:.8em;padding:4px 8px}.crew-footer{display:flex;justify-content:space-between;align-items:center;margin-top:10px;padding-top:10px;border-top:1px solid #e9ecef}.crew-log-toggle{flex:1}.log-toggle-btn{text-align:left;padding:0;display:flex;align-items:center;gap:5px}.crew-log{margin-top:15px;padding:10px;background-color:#fff;border-radius:4px;border:1px solid #dee2e6;max-height:300px;overflow-y:auto}.crew-log h4{margin:0 0 10px;font-size:.9em;color:#005792;border-bottom:1px solid #dee2e6;padding-bottom:5px}.log-entry{padding:8px;margin-bottom:8px;border-left:3px solid #005792;background-color:#f8f9fa;border-radius:3px}.log-entry:last-child{margin-bottom:0}.log-date{font-size:.75em;color:#6c757d;margin-bottom:3px}.log-action{font-weight:700;font-size:.85em;margin-bottom:3px;display:flex;align-items:center;gap:5px}.log-action-embark{color:#28a745}.log-action-deboard{color:#dc3545}.log-action-assign{color:#007bff}.log-action-status{color:#ffc107}.log-details{font-size:.8em;color:#495057}.log-notes{font-size:.8em;color:#6c757d;font-style:italic;margin-top:3px}.search-filter{display:flex;margin-bottom:20px;gap:10px;align-items:center}.search-filter input,.search-filter select{padding:8px 12px;border:1px solid #ced4da;border-radius:4px}.search-filter input{flex-grow:1}.search-filter select{min-width:150px}.add-crew-form{background-color:#f8f9fa;padding:20px;border-radius:6px;margin-top:30px}.form-row{display:flex;flex-wrap:wrap;gap:15px;margin-bottom:15px}.form-group{flex:1;min-width:200px}.form-group label{display:block;margin-bottom:5px;font-weight:700;color:#495057}.text-danger{color:red;font-weight:bolder}.text-warning{color:orange;font-weight:bolder}.text-success{color:green;font-weight:bolder}.icon{font-size:20px;cursor:pointer;color:#005792}.icon:hover{color:#003d5c}.delete-icon{font-size:20px;cursor:pointer;color:#dc3545;position:static;margin:0}.delete-icon:hover{color:#c82333}.form-group input,.form-group select,.form-group textarea{width:100%;padding:8px;border:1px solid #ced4da;border-radius:4px}.form-group input.error{border-color:#dc3545}.error-message{color:#dc3545;font-size:.85em;margin-top:5px}.form-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}.no-results{text-align:center;padding:40px 20px;color:#6c757d;font-size:1.1em}.crew-section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.crew-section-header h2{color:#005792;margin:0}.vcard{border-radius:6px;padding:5px}.loading-state{text-align:center;padding:40px 20px}.spinner-border{width:3rem;height:3rem;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;display:inline-block;animation:spinner-border .75s linear infinite}@keyframes spinner-border{to{transform:rotate(360deg)}}.text-primary{color:#005792}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.certification-section{margin:20px 0;padding:15px;background-color:#fff;border-radius:4px;border:1px solid #dee2e6}.certification-section h3{color:#005792;margin-top:0;margin-bottom:15px;font-size:1.1em}.certification-entry{margin-bottom:10px}.image-upload-wrapper{position:relative}.file-input{display:none}.file-input-label{display:inline-flex;align-items:center;gap:8px;padding:8px 16px;background-color:#005792;color:#fff!important;border-radius:4px;cursor:pointer;font-size:.9em;transition:background-color .2s}.file-input-label:hover{background-color:#004675}.file-input-label i{font-size:1.1em}.file-name{display:block;margin-top:5px;color:#6c757d;font-size:.85em}.image-preview{margin-top:10px;position:relative;display:inline-block}.image-preview img{max-width:200px;max-height:150px;border-radius:4px;border:2px solid #dee2e6}.pdf-preview{display:flex;align-items:center;gap:10px;padding:15px;background-color:#f8f9fa;border:2px solid #dee2e6;border-radius:4px;max-width:200px}.pdf-preview i{font-size:2em;color:#dc3545}.pdf-preview span{font-size:.85em;color:#495057;word-break:break-word}.btn-remove-image{position:absolute;top:-8px;right:-8px;background-color:#dc3545;color:#fff;border:none;border-radius:50%;width:24px;height:24px;display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;transition:background-color .2s}.btn-remove-image:hover{background-color:#c82333}.btn-remove-image i{font-size:1em}.timesheet-view{background-color:#fff;border-radius:6px;padding:20px;box-shadow:0 2px 8px #0000001a}.timesheet-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding-bottom:15px;border-bottom:2px solid #005792}.timesheet-header h3{color:#005792;margin:0;display:flex;align-items:center;gap:10px}.timesheet-controls{display:flex;gap:10px}.timesheet-controls select,.timesheet-search{padding:8px 12px;border:1px solid #ced4da;border-radius:4px;font-size:.9em}.timesheet-search{min-width:250px}.timesheet-summary{display:flex;gap:20px;margin-bottom:20px;flex-wrap:wrap}.summary-card{flex:1;min-width:150px;background-color:#f8f9fa;padding:15px;border-radius:6px;border-left:4px solid #005792}.summary-label{display:block;font-size:.85em;color:#6c757d;margin-bottom:5px}.summary-value{display:block;font-size:1.5em;font-weight:700;color:#005792}.timesheet-table-container{overflow-x:auto;margin-top:20px}.timesheet-table{width:100%;border-collapse:collapse;font-size:.9em}.timesheet-table thead{background-color:#005792;color:#fff}.timesheet-table th{padding:12px 8px;text-align:left;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.timesheet-table th:hover{background-color:#004675}.timesheet-table th i{font-size:.8em;margin-left:5px}.timesheet-table tbody tr{border-bottom:1px solid #dee2e6}.timesheet-table tbody tr:hover{background-color:#f8f9fa}.timesheet-table td{padding:10px 8px}.timestamp-cell{white-space:nowrap;color:#495057;font-size:.85em}.crew-name-cell strong{color:#005792}.role-cell{color:#6c757d}.action-cell{white-space:nowrap}.action-badge{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:12px;font-size:.85em;font-weight:700}.vessel-cell{color:#495057}.duration-cell{color:#495057;font-weight:500}.notes-cell{color:#6c757d;font-style:italic;max-width:200px;overflow:hidden;text-overflow:ellipsis}.timesheet-row-embarked{background-color:#d4edda}.timesheet-row-deboarded{background-color:#f8d7da}.timesheet-row-assigned{background-color:#d1ecf1}.timesheet-row-status-changed{background-color:#fff3cd}@media (max-width: 768px){.crew-grid{grid-template-columns:1fr}.search-filter{flex-direction:column}.search-filter input,.search-filter select{width:100%}.timesheet-header{flex-direction:column;align-items:flex-start;gap:15px}.timesheet-controls{flex-direction:column;width:100%}.timesheet-controls select,.timesheet-search{width:100%}.timesheet-summary{flex-direction:column}.timesheet-table{font-size:.8em}.timesheet-table th,.timesheet-table td{padding:8px 4px}}.crew-subhead{color:#000}.s-container{max-width:1200px;margin:0 auto;background:rgba(255,255,255,.95);border-radius:20px;box-shadow:0 25px 50px #00000040;overflow:hidden;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;padding:20px}.header h1{font-size:2.5rem;margin-bottom:10px;position:relative;z-index:1}.header p{font-size:1.1rem;opacity:.9;position:relative;z-index:1}.nav-tabs{display:flex;background:#f8fafc;border-bottom:2px solid #e2e8f0;overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch;scrollbar-width:thin}.nav-tabs::-webkit-scrollbar{height:6px}.nav-tabs::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.nav-tabs::-webkit-scrollbar-track{background:transparent}.nav-tab{flex:1;padding:15px 20px;background:none;border:none;cursor:pointer;font-size:1rem;font-weight:600;color:#64748b;transition:all .3s ease;position:relative}.nav-tab:hover{background:#e2e8f0;color:#1e40af}.nav-tab.active{color:#1e40af;background:white}.nav-tab.active:after{content:"";position:absolute;bottom:-2px;left:0;right:0;height:3px;background:#1e40af}.tab-content{display:none;padding:30px;animation:fadeIn .5s ease-in}.tab-content.active{display:block}@keyframes fadeIn{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:25px;margin-bottom:30px}.form-group{display:flex;flex-direction:column}.form-group label{font-weight:600;margin-bottom:8px;color:#374151;font-size:.95rem}.form-group input,.form-group select,.form-group textarea{padding:12px 15px;border:2px solid #e5e7eb;border-radius:10px;font-size:1rem;transition:all .3s ease;background:white}.form-group input:focus,.form-group select:focus,.form-group textarea:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.form-group textarea{min-height:100px;resize:vertical}.items-section{background:#f8fafc;border-radius:15px;padding:25px;margin:25px 0;border:2px solid #e2e8f0}.items-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.items-header h3{color:#1e40af;font-size:1.3rem}.add-item-btn{background:linear-gradient(135deg,#10b981 0%,#059669 100%);color:#fff;border:none;padding:10px 20px;border-radius:8px;cursor:pointer;font-weight:600;transition:all .3s ease;box-shadow:0 4px 15px #10b9814d}.add-item-btn:hover{transform:translateY(-2px);box-shadow:0 6px 20px #10b98166}.item-row{display:grid;grid-template-columns:2fr 1fr 1fr 1fr auto;gap:15px;align-items:end;margin-bottom:15px;padding:15px;background:white;border-radius:10px;border:1px solid #e5e7eb;transition:all .3s ease}.item-row:hover{box-shadow:0 4px 15px #0000001a}.marginbox{margin:10px}.item-list{list-style:none;padding:0;margin:.5rem 0}.item-list li{background:#f1f5f9;margin-bottom:.5rem;padding:.5rem .75rem;border-radius:.375rem;font-size:.95rem;color:#1e293b;display:flex;justify-content:space-between;align-items:center;content:"•";color:#3b82f6}.remove-item-btn{background:#ef4444;color:#fff;border:none;padding:8px 12px;border-radius:6px;cursor:pointer;font-size:.9rem;transition:all .3s ease}.remove-item-btn:hover{background:#dc2626;transform:scale(1.05)}.approval-actions{display:flex;gap:10px;margin-top:15px}.btn-approve{background:linear-gradient(135deg,#10b981 0%,#059669 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-approve:hover{transform:translateY(-1px);box-shadow:0 4px 12px #10b9814d}.btn-reject{background:linear-gradient(135deg,#ef4444 0%,#dc2626 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-reject:hover{transform:translateY(-1px);box-shadow:0 4px 12px #ef44444d}.btn-request{background:linear-gradient(135deg,#ef9a44 0%,#fa920a 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-request:hover{transform:translateY(-1px);box-shadow:0 4px 12px #f0a2344d}.btn-create-po{background:linear-gradient(135deg,#8b5cf6 0%,#7c3aed 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-create-po:hover{transform:translateY(-1px);box-shadow:0 4px 12px #8b5cf64d}.btn-mark-delivered{background:linear-gradient(135deg,#06b6d4 0%,#0891b2 100%);color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:.9rem;font-weight:600;transition:all .3s ease}.btn-mark-delivered:hover{transform:translateY(-1px);box-shadow:0 4px 12px #06b6d44d}.po-info{background:#f8fafc;padding:15px;border-radius:8px;margin:10px 0;border:1px solid #e2e8f0}.po-info h4{color:#1e40af;margin-bottom:10px;font-size:1rem}.po-details{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;font-size:.9rem}.items-list{background:#f8fafc;padding:15px;border-radius:8px;margin:15px 0;border:1px solid #e2e8f0}.items-list h4{color:#374151;margin-bottom:10px;font-size:1rem}.item-detail{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid #e5e7eb}.item-detail:last-child{border-bottom:none}.comments-section{margin-top:15px}.comments-section textarea{width:100%;min-height:80px;padding:10px;border:1px solid #d1d5db;border-radius:6px;font-size:.9rem;resize:vertical}.role-badge{display:inline-block;padding:4px 8px;border-radius:12px;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px;margin-left:10px}.role-supervisor{background:#fef3c7;color:#92400e}.role-purchasing{background:#dbeafe;color:#1e40af}.role-receiving{background:#dcfce7;color:#166534}.status-badge{display:inline-block;padding:6px 12px;border-radius:20px;font-size:.85rem;font-weight:600;text-transform:uppercase;letter-spacing:.5px}.status-draft{background:#fef3c7;color:#92400e}.status-under-review{background:#dbeafe;color:#1e40af}.status-approved{background:#dcfce7;color:#166534}.status-declined{background:#fee2e2;color:#dc2626}.status-info-requested{background:#e8cf12;color:#da7212}.status-po-created{background:#e0e7ff;color:#4bca38}.status-pending-supply{background:#113fd8;color:#4bca38}.status-delivered{background:#f3e8ff;color:#7c3aed}.status-received{background:#ecfdf5;color:#065f46}.action-buttons{display:flex;gap:15px;justify-content:flex-end;margin-top:30px;padding-top:25px;border-top:2px solid #e5e7eb}.btn-primary-req{background:linear-gradient(135deg,#1e40af 0%,#3b82f6 100%);color:#fff;box-shadow:0 4px 15px #1e40af4d}.btn-primary-req:hover{transform:translateY(-2px);box-shadow:0 6px 20px #1e40af66}.btn-secondary{background:#6b7280;color:#fff}.btn-secondary:hover{background:#4b5563;transform:translateY(-2px)}.requisition-list{display:grid;gap:20px}.requisition-card{background:white;border-radius:15px;padding:25px;box-shadow:0 4px 15px #0000001a;border:1px solid #e5e7eb;transition:all .3s ease}.requisition-card:hover{transform:translateY(-5px);box-shadow:0 8px 25px #00000026}.requisition-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.requisition-id{font-size:1.2rem;font-weight:700;color:#1e40af}.requisition-details{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:15px;margin-top:15px}.detail-item{display:flex;flex-direction:column}.detail-label{font-size:.85rem;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px}.detail-value{font-size:1rem;color:#374151;font-weight:500}.workflow-steps{display:flex;justify-content:space-between;align-items:center;margin:30px 0;padding:20px;background:#f8fafc;border-radius:15px;border:2px solid #e2e8f0}.workflow-step{display:flex;flex-direction:column;align-items:center;flex:1;position:relative}.workflow-step:not(:last-child):after{content:"";position:absolute;top:20px;right:-50%;width:100%;height:2px;background:#e5e7eb;z-index:1}.step-icon{width:40px;height:40px;border-radius:50%;background:#e5e7eb;display:flex;align-items:center;justify-content:center;font-weight:700;color:#6b7280;margin-bottom:10px;position:relative;z-index:2}.step-icon.active{background:#3b82f6;color:#fff}.step-icon.completed{background:#10b981;color:#fff}.step-title{font-size:.9rem;font-weight:600;color:#374151;text-align:center}@media (max-width: 768px){.form-grid{grid-template-columns:1fr}.item-row{grid-template-columns:1fr;gap:10px}.action-buttons{flex-direction:column}.workflow-steps{flex-direction:column;gap:20px}.workflow-step:after{display:none}}#content{width:100%;min-height:100vh;transition:all .3s;position:absolute;padding:20px 20px 20px 40px}#content.active{margin-left:var(--sidebar-width);width:calc(100% - var(--sidebar-width))}.po-content{padding:40px}.po-header{display:grid;grid-template-columns:1fr 1fr;gap:40px;margin-bottom:40px}.company-info,.po-details{background:#f8f9fa;padding:25px;border-radius:15px;border-left:5px solid #3498db}.company-info h3,.po-details h3{color:#2c3e50;margin-bottom:15px;font-size:1.3rem}.info-row{margin-bottom:8px;display:flex;justify-content:space-between}.info-label{font-weight:600;color:#555}.info-value{color:#2c3e50}.items-section{margin-top:30px}.section-title{color:#2c3e50;font-size:1.5rem;margin-bottom:20px;border-bottom:2px solid #3498db;padding-bottom:10px}.items-table{width:100%;border-collapse:collapse;margin-bottom:30px;background:white;border-radius:10px;overflow:hidden;box-shadow:0 5px 15px #0000001a}.items-table th{background:linear-gradient(135deg,#34495e 0%,#2c3e50 100%);color:#fff;padding:15px;text-align:left;font-weight:600}.items-table td{padding:15px;border-bottom:1px solid #eee;vertical-align:middle}.items-table tr:hover{background:#f8f9fa;transform:translateY(-1px);transition:all .3s ease}.price-input{padding:8px 12px;border:2px solid #ddd;border-radius:8px;font-size:14px;width:100px;transition:all .3s ease}.price-input:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.price-changed{background:#fff3cd;border-color:#ffc107}.edit-btn{background:#3498db;color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:12px;transition:all .3s ease}.edit-btn:hover{background:#2980b9;transform:translateY(-2px)}.save-btn{background:#27ae60;color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:12px;margin-right:5px}.cancel-btn{background:#e74c3c;color:#fff;border:none;padding:8px 16px;border-radius:6px;cursor:pointer;font-size:12px}.justification-modal{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content{background:white;padding:30px;border-radius:15px;max-width:500px;width:90%;box-shadow:0 20px 40px #0000004d}.modal-content h3{color:#2c3e50;margin-bottom:20px;font-size:1.3rem}.justification-textarea{width:100%;padding:15px;border:2px solid #ddd;border-radius:8px;font-family:inherit;font-size:14px;resize:vertical;min-height:100px}.justification-textarea:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.modal-buttons{margin-top:20px;display:flex;gap:10px;justify-content:flex-end}.totals{background:linear-gradient(135deg,#f8f9fa 0%,#e9ecef 100%);padding:25px;border-radius:15px;margin-top:20px}.total-row{display:flex;justify-content:space-between;margin-bottom:10px;font-size:1.1rem}.total-row.grand-total{border-top:2px solid #3498db;padding-top:15px;margin-top:15px;font-weight:700;font-size:1.3rem;color:#2c3e50}.justification-note{background:#fff3cd;border:1px solid #ffc107;border-radius:8px;padding:10px;margin-top:10px;font-size:12px;color:#856404}.price-change-indicator{background:#dc3545;color:#fff;border-radius:50%;width:20px;height:20px;font-size:12px;display:inline-flex;align-items:center;justify-content:center;margin-left:5px}@media (max-width: 768px){.po-header{grid-template-columns:1fr;gap:20px}.items-table{font-size:14px}.items-table th,.items-table td{padding:10px 8px}.price-input{width:80px}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oceanhelm",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "description": "Oceanhelm's highly customizable library",
5
5
  "private": false,
6
6
  "type": "module",
@@ -18,6 +18,8 @@
18
18
  <option value="all">All Statuses</option>
19
19
  <option value="available">Available</option>
20
20
  <option value="onduty">On Duty</option>
21
+ <option value="onboard">On Board</option>
22
+ <option value="assigned">Assigned</option>
21
23
  <option value="unavailable">Unavailable</option>
22
24
  </select>
23
25
  <button class="btn btn-secondary" @click="showTimesheet = !showTimesheet">
@@ -155,14 +157,22 @@
155
157
  <div v-else class="status-unavailable crew-availability vcard">
156
158
  Vessel: Unassigned
157
159
  </div>
160
+ <!-- Available: Show Assign Shift button -->
158
161
  <button class="btn btn-primary" @click="handleAssignShift(member)"
159
- v-if="canAssignShift && member.status !== 'onduty'">
162
+ v-if="canAssignShift && member.status === 'available'">
160
163
  Assign Shift
161
164
  </button>
162
- <button class="btn btn-warning" @click="handleDeboardCrew(member)"
165
+ <!-- On Duty: Show Check In button -->
166
+ <button class="btn btn-success" @click="handleCheckinCrew(member)"
163
167
  v-if="canDeboardCrew && member.status === 'onduty'">
168
+ Check In
169
+ </button>
170
+ <!-- Onboard: Show Deboard button -->
171
+ <button class="btn btn-warning" @click="handleDeboardCrew(member)"
172
+ v-if="canDeboardCrew && member.status === 'onboard'">
164
173
  Deboard
165
174
  </button>
175
+ <!-- Unavailable & Assigned: No buttons -->
166
176
  </div>
167
177
 
168
178
  <!-- Crew Log Button and Delete Icon -->
@@ -225,14 +235,6 @@
225
235
  </div>
226
236
 
227
237
  <div class="form-row">
228
- <div class="form-group">
229
- <label for="crew-status">Status *</label>
230
- <select id="crew-status" v-model="newCrew.status">
231
- <option value="available">Available</option>
232
- <option value="onduty">On Duty</option>
233
- <option value="unavailable">Unavailable</option>
234
- </select>
235
- </div>
236
238
  <div class="form-group">
237
239
  <label for="crew-email">Email Address *</label>
238
240
  <input type="email" id="crew-email" v-model="newCrew.email" :class="{ 'error': formErrors.email }">
@@ -354,6 +356,7 @@ export default {
354
356
  'crew-delete',
355
357
  'crew-assign-shift',
356
358
  'crew-deboard',
359
+ 'crew-checkin',
357
360
  'crew-add-certification',
358
361
  'crew-view-certification',
359
362
  'search-changed',
@@ -593,15 +596,26 @@ export default {
593
596
  return
594
597
  }
595
598
 
596
- const validCertifications = this.newCrew.certifications.filter(cert =>
597
- cert.name.trim() !== '' && cert.expiryDate !== '' && cert.imageFile !== null
598
- )
599
+ // Check for incomplete certifications
600
+ const hasIncompleteCert = this.newCrew.certifications.some(cert => {
601
+ const hasName = cert.name.trim() !== ''
602
+ const hasDate = cert.expiryDate !== ''
603
+ const hasImage = cert.imageFile !== null
604
+
605
+ // If any field is filled but not all, it's incomplete
606
+ return (hasName || hasDate || hasImage) && !(hasName && hasDate && hasImage)
607
+ })
599
608
 
600
- if (validCertifications.length === 0) {
601
- alert('Please add at least one complete certification with name, expiry date, and image.')
609
+ if (hasIncompleteCert) {
610
+ this.$emit('incomplete-certification')
602
611
  return
603
612
  }
604
613
 
614
+ // Filter only complete certifications (all three fields filled)
615
+ const validCertifications = this.newCrew.certifications.filter(cert => {
616
+ return cert.name.trim() !== '' && cert.expiryDate !== '' && cert.imageFile !== null
617
+ })
618
+
605
619
  const finalRole = this.newCrew.role === 'Other' ? this.newCrew.customRole : this.newCrew.role
606
620
 
607
621
  // Upload all certification images first and get their URLs
@@ -623,7 +637,7 @@ export default {
623
637
  const newMember = {
624
638
  name: this.newCrew.name,
625
639
  role: finalRole,
626
- status: this.newCrew.status,
640
+ status: 'unavailable',
627
641
  certifications: certificationsWithUrls,
628
642
  notes: this.newCrew.notes,
629
643
  vessel: this.vesselName,
@@ -695,6 +709,15 @@ export default {
695
709
  this.$emit('crew-deboard', { member, duration })
696
710
  },
697
711
 
712
+ handleCheckinCrew(member) {
713
+ if (!this.canDeboardCrew) {
714
+ this.$emit('access-denied', { action: 'check in crew', userProfile: this.userProfile })
715
+ return
716
+ }
717
+
718
+ this.$emit('crew-checkin', member)
719
+ },
720
+
698
721
  toggleCrewLog(memberId) {
699
722
  const index = this.expandedLogs.indexOf(memberId)
700
723
  if (index > -1) {
@@ -722,7 +745,7 @@ export default {
722
745
  name: '',
723
746
  role: 'Deckhand',
724
747
  customRole: '',
725
- status: 'available',
748
+ status: 'Unavailable',
726
749
  nextShift: '',
727
750
  certifications: [{
728
751
  name: '',
@@ -761,7 +784,13 @@ export default {
761
784
  this.formErrors.customRole = 'Custom role is required when "Other" is selected'
762
785
  }
763
786
 
764
- return Object.keys(this.formErrors).length === 0
787
+ // Emit validation errors if any exist
788
+ if (Object.keys(this.formErrors).length > 0) {
789
+ this.$emit('validation-error', this.formErrors)
790
+ return false
791
+ }
792
+
793
+ return true
765
794
  },
766
795
 
767
796
  isValidEmail(email) {
@@ -827,7 +856,9 @@ export default {
827
856
  const statusMap = {
828
857
  'available': 'status-available',
829
858
  'onduty': 'status-onduty',
830
- 'unavailable': 'status-unavailable'
859
+ 'onboard': 'status-onboard',
860
+ 'unavailable': 'status-unavailable',
861
+ 'assigned': 'status-assigned'
831
862
  }
832
863
  return statusMap[status] || ''
833
864
  },
@@ -976,11 +1007,21 @@ export default {
976
1007
  color: #721c24;
977
1008
  }
978
1009
 
1010
+ .status-assigned {
1011
+ background-color: #ffc107;
1012
+ color: #212529;
1013
+ }
1014
+
979
1015
  .status-onduty {
980
1016
  background-color: #cce5ff;
981
1017
  color: #004085;
982
1018
  }
983
1019
 
1020
+ .status-onboard {
1021
+ background-color: #d1ecf1;
1022
+ color: #0c5460;
1023
+ }
1024
+
984
1025
  .action-buttons {
985
1026
  display: flex;
986
1027
  justify-content: space-between;
@@ -1025,6 +1066,15 @@ export default {
1025
1066
  background-color: #e0a800;
1026
1067
  }
1027
1068
 
1069
+ .btn-success {
1070
+ background-color: #28a745;
1071
+ color: white;
1072
+ }
1073
+
1074
+ .btn-success:hover {
1075
+ background-color: #218838;
1076
+ }
1077
+
1028
1078
  .btn-danger {
1029
1079
  background-color: #dc3545;
1030
1080
  color: white;
@@ -1655,7 +1705,8 @@ export default {
1655
1705
  padding: 8px 4px;
1656
1706
  }
1657
1707
  }
1658
- .crew-subhead{
1708
+
1709
+ .crew-subhead {
1659
1710
  color: #000;
1660
1711
  }
1661
1712
  </style>
@@ -51,4 +51,14 @@ export default {
51
51
  border-bottom: 1px solid #e0e0e0;
52
52
  padding-bottom: 15px;
53
53
  }
54
+
55
+ .btn-outline-primary {
56
+ border: 1px solid #0d6efd !important;
57
+ }
58
+
59
+ .btn-outline-primary:hover {
60
+ background-color: #0d6efd !important;
61
+ border-color: #0d6efd !important;
62
+ color: white !important;
63
+ }
54
64
  </style>