/** * Employees Styles - User & Role Management * * Employees-specific styling only. * Reuses: swp-stat-card (stats.css), swp-stats-row (stats.css), swp-tab-bar (tabs.css), * swp-btn, swp-status-badge, swp-icon-btn, swp-card, swp-section-label, * swp-add-button (components.css), * swp-row-toggle (cash.css), * swp-sticky-header, swp-header-content (page.css), * swp-toggle-slider, swp-checkbox-list (controls.css) * * Creates: swp-employee-table, swp-employee-row, swp-user-info, * swp-employee-avatar-large, swp-employee-detail-header, * swp-fact-inline, swp-edit-section/row/label/value/select, swp-detail-grid, * swp-salary-table, swp-document-list/item/info/name/meta/actions, * swp-subsection/title, swp-simple-list/item/text */ /* =========================================== USERS HEADER =========================================== */ swp-users-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--section-gap); } swp-users-count { display: flex; align-items: center; gap: var(--spacing-4); font-size: var(--font-size-sm); color: var(--color-text-secondary); } swp-users-count strong { color: var(--color-text); font-weight: var(--font-weight-semibold); } swp-users-progress { width: 120px; height: 6px; background: var(--color-border); border-radius: var(--radius-sm); overflow: hidden; } swp-users-progress-bar { display: block; height: 100%; background: var(--color-teal); border-radius: var(--radius-sm); transition: width var(--transition-normal); } /* =========================================== EMPLOYEE TABLE (Grid + Subgrid) =========================================== */ swp-employee-table-card { display: block; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--border-radius-lg); overflow: hidden; } swp-employee-table { display: grid; grid-template-columns: minmax(220px, 1fr) 120px 140px 120px 40px; } swp-employee-table-header { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; background: var(--color-background-alt); padding: 0 var(--spacing-10); } swp-employee-table-body { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; } swp-employee-row { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; align-items: center; padding: 0 var(--spacing-10); border-bottom: 1px solid var(--color-border); transition: background var(--transition-fast); } swp-employee-table-body swp-employee-row { cursor: pointer; } swp-employee-table-body swp-employee-row:hover { background: var(--color-background-hover); } swp-employee-row:last-child { border-bottom: none; } swp-employee-cell { padding: var(--spacing-5) 0; font-size: var(--font-size-base); color: var(--color-text); } /* Chevron cell (last column) */ swp-employee-cell:last-child { display: flex; align-items: center; justify-content: center; } /* Header cells */ swp-employee-table-header swp-employee-cell { font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); text-transform: uppercase; letter-spacing: 0.5px; color: var(--color-text-secondary); padding-top: var(--spacing-5); padding-bottom: var(--spacing-5); } /* =========================================== USER INFO (Avatar + Details) =========================================== */ swp-user-info { display: flex; align-items: center; gap: var(--spacing-3); } swp-user-avatar { width: 36px; height: 36px; border-radius: 50%; background: var(--color-teal); color: white; display: flex; align-items: center; justify-content: center; font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); flex-shrink: 0; } swp-user-avatar.purple { background: var(--color-purple); } swp-user-avatar.blue { background: var(--color-blue); } swp-user-avatar.amber { background: var(--color-amber); } swp-user-details { min-width: 0; } swp-user-name { display: block; font-size: var(--font-size-base); font-weight: var(--font-weight-medium); color: var(--color-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } swp-user-email { display: block; font-size: var(--font-size-sm); color: var(--color-text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* =========================================== TABLE ACTIONS =========================================== */ swp-table-actions { display: flex; align-items: center; gap: var(--spacing-2); justify-content: flex-end; } /* Icon button styles in components.css */ /* =========================================== PERMISSIONS MATRIX =========================================== */ swp-permissions-matrix { display: block; background: var(--color-surface); border-radius: var(--radius-lg); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); overflow: hidden; } swp-permissions-matrix table { width: 100%; border-collapse: collapse; } swp-permissions-matrix th, swp-permissions-matrix td { padding: var(--spacing-5) var(--spacing-6); text-align: center; border-bottom: 1px solid var(--color-border); font-size: var(--font-size-base); } swp-permissions-matrix th:first-child, swp-permissions-matrix td:first-child { text-align: left; font-weight: var(--font-weight-medium); } swp-permissions-matrix thead th { background: var(--color-background-alt); font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); text-transform: uppercase; letter-spacing: 0.5px; color: var(--color-text-secondary); } swp-permissions-matrix tbody tr:last-child td { border-bottom: none; } swp-permissions-matrix .permission-name { display: flex; align-items: center; gap: var(--spacing-3); font-size: var(--font-size-base); color: var(--color-text); } swp-permissions-matrix .permission-name i { font-size: 18px; color: var(--color-text-secondary); } swp-permissions-matrix .check { color: var(--color-teal); font-size: 20px; } swp-permissions-matrix .no-access { color: var(--color-border); font-size: 16px; } /* =========================================== EMPLOYEE DETAIL VIEW (replaces page content) =========================================== */ /* Large avatar for detail view */ swp-employee-avatar-large { width: 80px; height: 80px; border-radius: 50%; background: var(--color-teal); color: white; display: flex; align-items: center; justify-content: center; font-size: var(--font-size-2xl); font-weight: var(--font-weight-semibold); flex-shrink: 0; } swp-employee-avatar-large.purple { background: var(--color-purple); } swp-employee-avatar-large.blue { background: var(--color-blue); } swp-employee-avatar-large.amber { background: var(--color-amber); } /* Detail header content (inside swp-header-content) */ swp-employee-detail-header { display: flex; gap: var(--spacing-12); } swp-employee-info { flex: 1; display: flex; flex-direction: column; gap: var(--spacing-2); min-width: 0; } /* Name row with name + tags + status */ swp-employee-name-row { display: flex; align-items: center; gap: var(--spacing-8); } swp-employee-name { font-size: var(--font-size-2xl); font-weight: var(--font-weight-semibold); color: var(--color-text); } /* Tags row */ swp-tags-row { display: flex; align-items: center; gap: var(--spacing-2); flex-wrap: wrap; } swp-tag { display: inline-flex; align-items: center; gap: var(--spacing-1); padding: var(--spacing-1) var(--spacing-3); font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); text-transform: uppercase; letter-spacing: 0.3px; border-radius: var(--radius-sm); background: var(--color-background); color: var(--color-text-secondary); } swp-tag.master { background: var(--bg-purple-strong); color: var(--color-purple); } swp-tag.senior { background: var(--bg-blue-strong); color: var(--color-blue); } swp-tag.junior { background: var(--bg-amber-strong); color: #b45309; } swp-tag.cert { background: var(--bg-teal-strong); color: var(--color-teal); } /* Employee status indicator */ swp-employee-status { display: inline-flex; align-items: center; gap: var(--spacing-2); padding: var(--spacing-2) var(--spacing-4); font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); border-radius: var(--radius-md); cursor: pointer; transition: all var(--transition-fast); margin-left: auto; } swp-employee-status[data-active="true"] { background: var(--bg-green-strong); color: var(--color-green); border: 1px solid var(--bg-green-border); } swp-employee-status[data-active="false"] { background: var(--bg-red-medium); color: var(--color-red); border: 1px solid var(--bg-red-border); } swp-employee-status .icon { font-size: var(--font-size-base); } /* Inline fact boxes (horizontal baseline alignment) */ swp-fact-boxes-inline { display: flex; gap: var(--spacing-12); margin-top: var(--spacing-1); flex-wrap: wrap; } swp-fact-inline { display: flex; align-items: baseline; gap: var(--spacing-2); } swp-fact-inline-value { font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); font-family: var(--font-mono); color: var(--color-text); } swp-fact-inline-label { font-size: var(--font-size-sm); color: var(--color-text-secondary); } /* Edit rows for contenteditable (Grid + Subgrid) */ swp-edit-section { display: grid; grid-template-columns: 140px 1fr; gap: var(--spacing-4); } swp-edit-row { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; align-items: center; } swp-edit-label { font-size: var(--font-size-md); color: var(--color-text-secondary); } swp-edit-value { font-size: var(--font-size-base); color: var(--color-text); padding: var(--spacing-4) var(--spacing-5); border-radius: var(--radius-sm); background: var(--color-background-alt); border: 1px solid transparent; transition: all var(--transition-fast); cursor: text; } swp-edit-value:hover { background: var(--color-background); } swp-edit-value:focus { outline: none; background: var(--color-surface); border-color: var(--color-teal); } /* swp-section-label is now in components.css */ /* =========================================== VIEW CONTAINERS (List/Detail swap) =========================================== */ swp-employees-list-view { display: block; } swp-employee-detail-view { display: none; min-height: calc(100vh - 60px); } /* Back link */ swp-back-link { display: inline-flex; align-items: center; gap: var(--spacing-2); color: var(--color-text-secondary); font-size: var(--font-size-sm); cursor: pointer; transition: color var(--transition-fast); } swp-back-link:hover { color: var(--color-teal); } swp-back-link i { font-size: 16px; } /* Detail grid for cards (2-column layout) */ swp-detail-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--spacing-8); } swp-detail-grid > div { display: flex; flex-direction: column; gap: var(--spacing-8); } /* swp-card base styles in components.css */ @media (max-width: 900px) { swp-detail-grid { grid-template-columns: 1fr; } } /* =========================================== SCHEDULE GRID (Hours tab) =========================================== */ swp-schedule-grid { display: flex; flex-direction: column; } swp-schedule-row { display: flex; justify-content: space-between; align-items: center; padding: var(--spacing-4) 0; border-bottom: 1px solid var(--color-border); } swp-schedule-row:last-child { border-bottom: none; } swp-schedule-row.off { color: var(--color-text-secondary); } swp-schedule-day { font-size: var(--font-size-base); font-weight: var(--font-weight-medium); } swp-schedule-time { font-size: var(--font-size-base); font-family: var(--font-mono); color: var(--color-teal); } swp-schedule-row.off swp-schedule-time { color: var(--color-text-secondary); } /* =========================================== SERVICE LIST (Services tab) =========================================== */ swp-service-list { display: flex; flex-direction: column; } swp-service-item { display: grid; grid-template-columns: 1fr auto auto; gap: var(--spacing-6); align-items: center; padding: var(--spacing-4) 0; border-bottom: 1px solid var(--color-border); } swp-service-item:last-child { border-bottom: none; } swp-service-name { font-size: var(--font-size-base); font-weight: var(--font-weight-medium); } swp-service-duration { font-size: var(--font-size-sm); color: var(--color-text-secondary); } swp-service-price { font-size: var(--font-size-base); font-family: var(--font-mono); color: var(--color-teal); font-weight: var(--font-weight-medium); } /* =========================================== DOCUMENT LIST (HR tab) Also used for certs, courses, and similar lists =========================================== */ swp-document-list { display: flex; flex-direction: column; gap: var(--spacing-2); } swp-document-item { display: flex; align-items: center; gap: var(--spacing-3); padding: 12px 16px; background: var(--color-background-alt); border-radius: var(--radius-md); border: 1px solid var(--color-border); } /* Icon (optional) */ swp-document-item i, swp-document-icon { font-size: 20px; color: var(--color-text-secondary); flex-shrink: 0; } swp-document-item i.ph-file-pdf { color: var(--color-red); } /* Info wrapper (name + meta) */ swp-document-info { flex: 1; min-width: 0; } swp-document-name { display: block; font-size: var(--font-size-base); font-weight: var(--font-weight-medium); color: var(--color-text); } swp-document-meta { display: block; font-size: var(--font-size-sm); color: var(--color-text-secondary); margin-top: 2px; } /* Actions (buttons/badges at end) */ swp-document-actions { display: flex; align-items: center; gap: var(--spacing-2); flex-shrink: 0; } /* Notes area */ swp-notes-area { display: block; min-height: 100px; padding: var(--spacing-4); background: var(--color-background-alt); border-radius: var(--radius-sm); font-size: var(--font-size-base); color: var(--color-text-secondary); line-height: 1.6; } swp-notes-area:focus { outline: none; color: var(--color-text); } /* =========================================== EDIT SELECT (dropdown in edit rows) =========================================== */ swp-edit-select { display: block; } swp-edit-select select { width: 100%; padding: var(--spacing-2) var(--spacing-4); font-size: var(--font-size-base); border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: var(--color-surface); cursor: pointer; } swp-edit-select select:focus { outline: none; border-color: var(--color-teal); } /* Mono variant for edit-value */ swp-edit-value.mono { font-family: var(--font-mono); width: 150px; text-align: right; justify-self: end; } /* Input in edit-row */ swp-edit-row input { font-size: var(--font-size-base); padding: var(--spacing-4) var(--spacing-5); border-radius: var(--radius-sm); background: var(--color-background-alt); border: 1px solid var(--color-border); color: var(--color-text); transition: all var(--transition-fast); cursor: text; } swp-edit-row input:hover { background: var(--color-background); } swp-edit-row input:focus { outline: none; background: var(--color-surface); border-color: var(--color-teal); } /* Number input variant */ swp-edit-row input[data-type="number"] { font-family: var(--font-mono); text-align: right; width: 150px; justify-self: end; } /* =========================================== SALARY TABLE (Grid + Subgrid) =========================================== */ swp-salary-table { display: grid; grid-template-columns: 1fr 120px 60px; } swp-salary-table-header, swp-salary-table-body { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; } swp-salary-table-header { border-bottom: 1px solid var(--color-border); } swp-salary-table-row { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; align-items: center; border-bottom: 1px solid var(--color-border); } swp-salary-table-row:last-child { border-bottom: none; } swp-salary-table-cell { padding: var(--spacing-4) var(--spacing-2); font-size: var(--font-size-base); color: var(--color-text); } swp-salary-table-cell:first-child { padding-left: 0; } swp-salary-table-cell:last-child { padding-right: 0; text-align: right; } swp-salary-table-header swp-salary-table-cell { font-size: var(--font-size-xs); font-weight: var(--font-weight-semibold); text-transform: uppercase; letter-spacing: 0.5px; color: var(--color-text-secondary); } swp-salary-table-cell.mono { font-family: var(--font-mono); } /* Chevron for row actions */ swp-salary-table-cell i { color: var(--color-text-muted); font-size: 16px; } swp-salary-table-row { cursor: pointer; transition: background var(--transition-fast); } swp-salary-table-row:hover { background: var(--color-background-hover); } swp-salary-table-row:hover swp-salary-table-cell i { color: var(--color-teal); } /* =========================================== SUBSECTION TITLE (for grouped lists like courses) =========================================== */ swp-subsection { display: block; margin-bottom: var(--spacing-6); } swp-subsection:last-of-type { margin-bottom: 0; } swp-subsection-title { display: block; font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold); color: var(--color-text-secondary); margin-bottom: var(--spacing-3); } /* =========================================== SIMPLE LIST (dates + badge, like vacation) =========================================== */ swp-simple-list { display: flex; flex-direction: column; gap: var(--spacing-2); } swp-simple-item { display: flex; align-items: center; justify-content: space-between; gap: var(--spacing-3); padding: 12px 16px; background: var(--color-background-alt); border-radius: var(--radius-md); border: 1px solid var(--color-border); } swp-simple-item-text { flex: 1; font-size: var(--font-size-base); font-family: var(--font-mono); color: var(--color-text); } /* swp-add-button styles in components.css */ /* =========================================== RATES DRAWER CONTENT (overrides for swp-data-*) =========================================== */ .rates-content swp-data-table { display: grid; grid-template-columns: 28px 1fr 100px; } .rates-content swp-data-row { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; align-items: center; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--color-border); } .rates-content swp-data-row:last-child { border-bottom: none; } .rates-content swp-data-row input[type="checkbox"] { width: 18px; height: 18px; accent-color: var(--color-teal); } .rates-content swp-data-label { font-size: var(--font-size-base); } .rates-content swp-data-label.disabled { opacity: 0.4; } .rates-content swp-data-input { display: flex; align-items: center; justify-self: end; gap: 4px; font-size: var(--font-size-sm); color: var(--color-text-secondary); } .rates-content swp-data-input input { width: 100px; padding: 6px 8px; border: 1px solid var(--color-border); border-radius: var(--radius-sm); font-size: var(--font-size-sm); font-family: var(--font-mono); text-align: right; } .rates-content swp-data-input.disabled input { opacity: 0.4; background: var(--color-background); } .rates-content swp-section-label { margin-bottom: 12px; } .rates-content swp-data-section { margin-top: 24px; padding-top: 16px; border-top: 1px solid var(--color-border); } /* =========================================== RESPONSIVE =========================================== */ @media (max-width: 1024px) { swp-employee-table { grid-template-columns: minmax(180px, 1fr) 100px 120px 100px 40px; } } @media (max-width: 768px) { swp-employee-table { grid-template-columns: minmax(160px, 1fr) 90px 110px 90px 40px; } swp-employee-cell { padding: var(--spacing-3) 0; } swp-employee-table-header, swp-employee-row { padding: 0 var(--spacing-4); } swp-users-header { flex-direction: column; align-items: flex-start; gap: var(--spacing-4); } swp-users-header swp-btn { width: 100%; justify-content: center; } } /* =========================================== STATS BOOKINGS TABLE (columns for swp-data-table) =========================================== */ .stats-bookings swp-data-table { grid-template-columns: 90px 60px minmax(120px, 1fr) minmax(150px, 1fr) 80px 100px 100px; } /* Dato, Tid, Varighed: mono + muted */ .stats-bookings swp-data-table-row swp-data-table-cell:nth-child(1), .stats-bookings swp-data-table-row swp-data-table-cell:nth-child(2), .stats-bookings swp-data-table-row swp-data-table-cell:nth-child(5) { font-family: var(--font-mono); font-size: 12px; color: var(--color-text-secondary); } /* Kunde: medium */ .stats-bookings swp-data-table-row swp-data-table-cell:nth-child(3) { font-weight: var(--font-weight-medium); } /* Beløb: mono + bold + right */ .stats-bookings swp-data-table-row swp-data-table-cell:nth-child(6), .stats-bookings swp-data-table-header swp-data-table-cell:nth-child(6) { text-align: right; } .stats-bookings swp-data-table-row swp-data-table-cell:nth-child(6) { font-family: var(--font-mono); font-size: 12px; font-weight: var(--font-weight-semibold); }