PlanTempusApp/PlanTempus.Application/wwwroot/css/services.css
Janus C. H. Knudsen 33c338345e Adds comprehensive Settings page with multiple configuration tabs
Introduces a new Settings page with configurable modules:
- General company information
- Calendar and booking settings
- Billing and payment configurations
- Tracking and analytics integrations

Implements modular ViewComponents for each settings section
Enhances user experience with toggle switches and detailed configuration options
2026-01-18 22:50:33 +01:00

453 lines
9.7 KiB
CSS

/**
* Services Styles
*
* Feature-specific styling only.
* Reuses:
* - swp-action-bar (components.css)
* - swp-stat-card (stats.css)
* - swp-data-table (components.css)
* - swp-sticky-header, swp-page-container (page.css)
* - swp-row-toggle (components.css)
* - swp-btn (components.css)
* - swp-detail-grid, swp-edit-section (components.css)
* - swp-tags-row, swp-tag (components.css)
* - swp-status-indicator (components.css)
* - swp-fact-boxes-inline (components.css)
* - view-fade-out (components.css)
*/
/* ===========================================
SEARCH INPUT
=========================================== */
swp-search-input {
display: flex;
align-items: center;
gap: var(--spacing-3);
padding: var(--spacing-3) var(--spacing-4);
background: var(--color-background);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
min-width: 280px;
i {
color: var(--color-text-secondary);
font-size: var(--font-size-lg);
}
input {
border: none;
background: transparent;
outline: none;
box-shadow: none;
font-size: var(--font-size-base);
color: var(--color-text);
width: 100%;
&:focus {
outline: none;
box-shadow: none;
}
&::placeholder {
color: var(--color-text-tertiary);
}
}
&:focus-within {
border-color: var(--color-teal);
}
}
/* ===========================================
SERVICES LIST TABLE
=========================================== */
swp-card.services-list {
padding: 0;
overflow: hidden;
}
/* Table columns: Service(1fr) | Varighed(100px) | Pris(100px) | Caret(40px) */
swp-card.services-list swp-data-table {
grid-template-columns: 1fr 100px 100px 40px;
}
swp-card.services-list swp-data-table-header,
swp-card.services-list swp-data-table-row,
swp-card.services-list swp-category-row {
padding: 0 var(--spacing-10);
}
swp-card.services-list swp-data-table-header swp-data-table-cell {
padding-top: var(--spacing-5);
padding-bottom: var(--spacing-5);
}
swp-card.services-list swp-data-table-row {
cursor: pointer;
}
swp-card.services-list swp-data-table-cell {
padding: var(--spacing-5) 0;
&:last-child {
display: flex;
align-items: center;
justify-content: center;
}
}
/* Mono font for duration and price columns */
swp-card.services-list swp-data-table-row swp-data-table-cell:nth-child(2),
swp-card.services-list swp-data-table-row swp-data-table-cell:nth-child(3) {
font-family: var(--font-mono);
}
/* ===========================================
CATEGORY ROW
=========================================== */
swp-category-row {
display: grid;
grid-column: 1 / -1;
grid-template-columns: subgrid;
background: var(--bg-blue-subtle);
cursor: pointer;
border-bottom: 1px solid var(--color-border);
border-left: 4px solid var(--color-blue);
}
swp-category-row:hover {
background: var(--bg-blue-medium);
}
swp-category-row swp-data-table-cell {
padding: var(--spacing-5) 0;
display: flex;
align-items: center;
gap: var(--spacing-4);
}
swp-category-row swp-data-table-cell:first-child {
font-weight: var(--font-weight-semibold);
font-size: var(--font-size-base);
text-transform: uppercase;
letter-spacing: 0.03em;
color: var(--color-text-secondary);
}
swp-category-toggle {
display: flex;
align-items: center;
justify-content: center;
width: 24px;
height: 24px;
color: var(--color-blue);
background: var(--bg-blue-medium);
border-radius: var(--radius-sm);
transition: background 0.2s ease;
}
swp-category-row:hover swp-category-toggle {
background: var(--bg-blue-strong);
}
swp-category-toggle i {
transition: transform 0.2s ease;
}
swp-category-row[data-expanded="false"] swp-category-toggle i {
transform: rotate(-90deg);
}
.category-name {
color: var(--color-text-secondary);
}
.category-count {
color: var(--color-text-tertiary);
font-weight: var(--font-weight-normal);
font-size: var(--font-size-xs);
margin-left: var(--spacing-2);
}
/* Category edit icon */
swp-category-edit {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
color: var(--color-text-tertiary);
border-radius: var(--radius-sm);
cursor: pointer;
transition: all 0.15s ease;
opacity: 0;
}
swp-category-row:hover swp-category-edit {
opacity: 1;
}
swp-category-edit:hover {
color: var(--color-blue);
background: var(--bg-blue-medium);
}
/* ===========================================
SERVICE ROW (indented under category)
=========================================== */
swp-card.services-list swp-data-table-row swp-data-table-cell:first-child {
padding-left: 56px;
}
/* ===========================================
SERVICE ROW HOVER
=========================================== */
swp-card.services-list swp-data-table-row:hover {
background: var(--color-background-hover);
}
swp-card.services-list swp-data-table-row:hover swp-row-toggle {
color: var(--color-teal);
}
/* ===========================================
VIEW CONTAINERS (List / Detail)
=========================================== */
swp-services-list-view,
swp-service-detail-view {
transition: opacity 100ms ease;
}
swp-service-detail-view {
display: none;
}
/* ===========================================
SERVICE DETAIL HEADER
=========================================== */
swp-service-detail-header {
display: flex;
gap: var(--spacing-6);
padding: var(--spacing-6) 0;
}
swp-service-info {
flex: 1;
display: flex;
flex-direction: column;
gap: var(--spacing-2);
}
swp-service-name-row {
display: flex;
align-items: center;
gap: var(--spacing-4);
}
swp-service-name {
font-size: var(--font-size-2xl);
font-weight: var(--font-weight-semibold);
color: var(--color-text);
outline: none;
&:focus {
border-bottom: 1px dashed var(--color-teal);
}
}
/* ===========================================
PRICE MODE TOGGLE (Priser tab)
=========================================== */
swp-price-mode {
display: flex;
gap: 0;
border: 1px solid var(--color-border);
border-radius: var(--radius-sm);
overflow: hidden;
margin-bottom: var(--spacing-6);
width: fit-content;
}
swp-price-mode-btn {
padding: var(--spacing-3) var(--spacing-6);
font-size: var(--font-size-sm);
cursor: pointer;
background: var(--color-surface);
border-right: 1px solid var(--color-border);
transition: all var(--transition-fast);
&:last-child {
border-right: none;
}
&:hover {
background: var(--color-background-alt);
}
&.active {
background: var(--color-teal);
color: white;
}
}
/* ===========================================
PRICE MATRIX TABLE (Priser tab)
=========================================== */
swp-price-matrix {
display: block;
}
swp-data-table.price-matrix {
grid-template-columns: 3fr repeat(4, 2fr);
margin-bottom: var(--spacing-6);
}
swp-data-table.price-matrix swp-data-table-cell:first-child {
font-weight: var(--font-weight-medium);
}
swp-data-table.price-matrix span[contenteditable="true"] {
outline: none;
padding: var(--spacing-1) var(--spacing-2);
border-radius: var(--radius-sm);
&:hover {
background: var(--color-background-alt);
}
&:focus {
background: var(--color-surface);
box-shadow: 0 0 0 2px var(--color-teal);
}
}
/* ===========================================
DURATION LIST (Varighed tab)
=========================================== */
swp-duration-list {
display: flex;
flex-direction: column;
gap: var(--spacing-2);
margin-bottom: var(--spacing-6);
}
swp-duration-item {
display: grid;
grid-template-columns: 1fr auto auto;
align-items: center;
gap: var(--spacing-4);
padding: var(--spacing-4);
background: var(--color-background-alt);
border-radius: var(--radius-md);
transition: background var(--transition-fast);
&:hover {
background: var(--color-background-hover);
}
}
swp-duration-name {
font-size: var(--font-size-base);
font-weight: var(--font-weight-medium);
color: var(--color-text);
}
swp-duration-value {
display: flex;
align-items: center;
gap: var(--spacing-2);
font-family: var(--font-mono);
font-size: var(--font-size-base);
color: var(--color-text);
span[contenteditable="true"] {
outline: none;
padding: var(--spacing-1) var(--spacing-2);
border-radius: var(--radius-sm);
min-width: 40px;
text-align: right;
&:hover {
background: var(--color-background);
}
&:focus {
background: var(--color-surface);
box-shadow: 0 0 0 2px var(--color-teal);
}
}
}
swp-duration-unit {
font-size: var(--font-size-sm);
color: var(--color-text-secondary);
font-family: var(--font-family);
}
swp-duration-delete {
display: flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border-radius: var(--radius-sm);
color: var(--color-text-tertiary);
cursor: pointer;
transition: all var(--transition-fast);
opacity: 0;
&:hover {
color: var(--color-red);
background: var(--bg-red-subtle);
}
}
swp-duration-item:hover swp-duration-delete {
opacity: 1;
}
/* ===========================================
AVAILABILITY LIST (Services - Tilgængelighed)
=========================================== */
swp-availability-list {
display: flex;
flex-direction: column;
}
swp-availability-row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--spacing-2) var(--spacing-4);
padding: var(--spacing-3) 0;
border-bottom: 1px solid var(--color-border);
&:last-child {
border-bottom: none;
}
&[data-enabled="false"] {
opacity: 0.5;
}
}
swp-availability-day {
width: 100%;
font-size: var(--font-size-base);
font-weight: var(--font-weight-medium);
color: var(--color-text);
}
swp-availability-time {
flex: 1;
transition: opacity var(--transition-fast);
}