Files
vac-optimizer/src/app/components/calendar-year/calendar-year.scss
T
nessar d9d9befa12
CI / policy (push) Successful in 7s
CI / validate (push) Successful in 1m15s
CI / test (push) Successful in 3m18s
CI / benchmark (push) Failing after 5m53s
CI / build (push) Successful in 1m23s
CI / security (push) Successful in 7m6s
CI / policy (pull_request) Successful in 7s
CI / validate (pull_request) Successful in 1m9s
CI / build (pull_request) Successful in 43s
CI / test (pull_request) Successful in 3m19s
CI / images (push) Successful in 3m7s
CI / required (push) Successful in 2s
CI / benchmark (pull_request) Failing after 5m28s
CI / security (pull_request) Successful in 6m37s
CI / images (pull_request) Successful in 3m18s
CI / required (pull_request) Successful in 1s
refactor(planning): remove the original decision trace
2026-10-15 20:42:33 +02:00

798 lines
14 KiB
SCSS

:host {
display: block;
min-width: 0;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
}
.calendar-year {
display: grid;
container: calendar-year / inline-size;
gap: 1rem;
min-width: 0;
position: relative;
}
h2,
h3,
h4,
h5,
p {
margin: 0;
}
h2 {
font-size: clamp(1.5rem, 2.2vw, 2rem);
line-height: 1.2;
text-wrap: balance;
}
h3 {
font-size: 1.125rem;
}
h4 {
font-size: 1rem;
}
code {
font-size: 0.8em;
overflow-wrap: anywhere;
}
button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
min-width: 2.75rem;
min-height: 2.75rem;
padding: 0.5rem 0.75rem;
border: 1px solid var(--mat-sys-outline);
border-radius: var(--ui-radius-sm);
background: var(--ui-card-bg);
color: var(--mat-sys-primary);
font: inherit;
font-size: 0.875rem;
cursor: pointer;
transition: background-color 150ms ease;
&:hover:not(:disabled),
&[aria-pressed='true'] {
background: var(--ui-panel-bg);
}
&:disabled {
opacity: 0.45;
cursor: not-allowed;
}
&[aria-disabled='true'] {
opacity: 0.45;
cursor: not-allowed;
}
}
summary {
min-height: 2.75rem;
padding: 0.75rem;
font-weight: 500;
cursor: pointer;
}
summary:focus-visible {
outline: 3px solid var(--mat-sys-primary);
outline-offset: 2px;
}
.results-header,
.explanation-heading {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.results-header {
align-items: flex-start;
padding-block: 0.25rem 0.5rem;
}
.results-heading {
display: grid;
gap: 0.75rem;
}
.planning-status {
display: flex;
align-items: center;
gap: 0.375rem;
width: fit-content;
max-width: 65ch;
padding: 0.25rem 0.625rem;
border-radius: var(--ui-radius-sm);
font-size: 0.8125rem;
font-weight: 600;
mat-icon {
flex-shrink: 0;
}
&.success {
background: var(--ui-success-bg);
color: var(--ui-success-text);
}
&.warning {
background: var(--ui-warning-bg);
color: var(--ui-warning-text);
}
&.error {
background: var(--ui-error-bg);
color: var(--ui-error-text);
}
}
.plan-summary {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.75rem;
margin: 0;
div {
display: flex;
flex-direction: column;
gap: 0.375rem;
padding: 1.25rem;
border: 1px solid var(--ui-border);
border-radius: var(--ui-radius-md);
background: var(--ui-card-bg);
}
dt {
color: var(--ui-text-secondary);
font-size: 0.875rem;
line-height: 1.4;
}
dd {
order: -1;
margin: 0;
font-size: 2.25rem;
font-weight: 600;
font-variant-numeric: tabular-nums;
line-height: 1.1;
}
div:first-child {
background: var(--mat-sys-primary);
color: var(--mat-sys-on-primary);
border-color: transparent;
dt {
color: inherit;
}
}
}
.plan-insights {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
align-items: start;
gap: 0.75rem;
> details {
min-width: 0;
border: 1px solid var(--ui-border);
border-radius: var(--ui-radius-md);
background: var(--ui-card-bg);
scroll-margin-block-start: 1rem;
> summary {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 1rem;
min-height: 4.5rem;
border-radius: calc(var(--ui-radius-md) - 1px);
transition: background-color 150ms ease;
list-style: none;
font-size: 0.875rem;
font-weight: 600;
&::-webkit-details-marker {
display: none;
}
&:hover {
background: var(--ui-panel-bg);
}
> mat-icon {
flex-shrink: 0;
color: var(--mat-sys-primary);
}
> span {
flex: 1;
}
small {
display: block;
margin-top: 0.25rem;
font-size: 0.8125rem;
color: var(--ui-text-secondary);
font-weight: 400;
}
}
&[open] {
grid-column: 1 / -1;
> summary {
border-bottom: 1px solid var(--ui-border);
border-radius: calc(var(--ui-radius-md) - 1px) calc(var(--ui-radius-md) - 1px) 0 0;
}
.disclosure-chevron {
transform: rotate(180deg);
}
}
}
}
.statistics-content {
display: grid;
gap: 1rem;
}
.statistics-summary {
grid-template-columns: minmax(0, 1fr);
}
.earned-leave-breakdown {
display: grid;
gap: 0.75rem;
margin: 0;
div {
display: flex;
justify-content: space-between;
gap: 1rem;
}
dt {
min-width: 0;
overflow-wrap: anywhere;
}
dd {
margin: 0;
font-weight: 600;
font-variant-numeric: tabular-nums;
}
}
.placement-explanation,
.outcome-explanation {
display: grid;
gap: 1rem;
min-width: 0;
}
.placement-explanation {
padding: 1.25rem;
}
.placement-explanation ul {
margin: 0.5rem 0 0;
padding-inline-start: 1.25rem;
}
.break-story,
.outcome-explanation {
padding: 1rem;
border-radius: var(--ui-radius-sm);
background: var(--ui-panel-bg);
}
.technical-details {
border: 1px solid var(--ui-border);
border-radius: var(--ui-radius-sm);
> dl,
> div {
padding: 0.75rem;
}
}
.break-story,
.day-impact,
.leave-story,
.counterfactual-result {
display: grid;
gap: 0.75rem;
}
.break-story > p,
.day-impact > p {
color: var(--ui-text-secondary);
font-size: 0.875rem;
}
.break-equation {
display: grid;
grid-template-columns: 1fr auto 1fr auto 1fr;
align-items: center;
gap: 0.5rem;
text-align: center;
font-size: 0.8125rem;
strong {
display: block;
font-size: 1.75rem;
font-variant-numeric: tabular-nums;
}
}
.impact-table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
font-size: 0.875rem;
th,
td {
padding: 0.75rem 0.5rem;
border-bottom: 1px solid var(--ui-border);
text-align: center;
overflow-wrap: anywhere;
}
th:first-child {
width: 52%;
text-align: start;
}
td {
font-size: 1.125rem;
font-weight: 600;
font-variant-numeric: tabular-nums;
}
small {
display: block;
margin-top: 0.25rem;
font-size: 0.8125rem;
font-weight: 400;
color: var(--ui-text-secondary);
}
}
.compare-date-field {
width: 100%;
min-width: 0;
}
.compare-dates-button {
justify-self: start;
}
.placement-stepper {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
}
.placement-stepper button {
padding: 0.375rem;
}
output {
font-size: 0.8125rem;
font-variant-numeric: tabular-nums;
padding: 0.375rem;
}
.compact-facts {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
gap: 0.75rem;
margin: 0;
}
.compact-facts > div {
min-width: 0;
padding: 0.75rem;
background: var(--ui-panel-bg);
border-radius: var(--ui-radius-sm);
}
.compact-facts dt {
font-size: 0.8125rem;
font-weight: 600;
color: var(--ui-text-secondary);
}
.compact-facts dd {
margin: 0.25rem 0 0;
overflow-wrap: anywhere;
}
.reason-list {
padding: 1rem 1rem 1rem 2rem;
margin: 0;
}
.inline-error,
.counterfactual-inline-error,
.conflict-explanation {
padding: 0.75rem;
border-inline-start: 4px solid var(--ui-error-text);
background: var(--ui-error-bg);
color: var(--ui-error-text);
}
.counterfactual-inline-error {
display: grid;
justify-items: start;
gap: 0.75rem;
}
.decisive-summary {
padding: 0.75rem;
border-inline-start: 3px solid var(--mat-sys-primary);
background: var(--ui-panel-bg);
}
.incomplete-explanation,
.incomplete-incumbent {
padding: 1rem;
border-inline-start: 4px solid var(--ui-warning-text);
background: var(--ui-warning-bg);
color: var(--ui-warning-text);
}
.calendar-help {
display: flex;
align-items: center;
gap: 0.5rem;
color: var(--ui-text-secondary);
font-size: 0.875rem;
mat-icon {
flex-shrink: 0;
font-size: 1.125rem;
width: 1.125rem;
height: 1.125rem;
}
}
.calendar-legend {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem 1rem;
font-size: 0.875rem;
ul {
display: flex;
flex-wrap: wrap;
gap: 0.5rem 1rem;
margin: 0;
padding: 0;
list-style: none;
}
li {
display: flex;
align-items: center;
gap: 0.375rem;
color: var(--ui-text-secondary);
}
}
.legend-swatch {
width: 1rem;
height: 1rem;
border-radius: 0.25rem;
flex-shrink: 0;
&.declared {
background-image: var(--declared-day-pattern);
border: 1px solid var(--ui-border);
}
&.weekend {
background: var(--weekend-bg);
}
&.closed-day {
border: 2px solid var(--closed-day-bg);
}
&.cp {
background: var(--cp-bg);
}
&.rtt {
background: var(--rtt-bg);
}
&.other {
background: var(--other-bg);
}
&.today {
border: 2px dashed var(--today-border-color);
}
&.current {
outline: 2px solid var(--today-border-color);
outline-offset: -2px;
}
&.explained-period {
box-shadow: inset 0 -3px var(--today-border-color);
}
}
.legend-symbol,
.status-symbol {
min-width: 1rem;
font-weight: 700;
}
.month-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(100%, 20rem), 1fr));
gap: 1rem;
&.declaration-entry {
user-select: none;
}
}
.month-card {
min-width: 0;
background: var(--ui-card-bg);
border: 1px solid var(--ui-border);
border-radius: var(--ui-radius-md);
box-shadow: none;
}
.loading-overlay {
position: absolute;
inset: 0;
display: grid;
place-items: start center;
padding-top: 5rem;
min-height: 18rem;
border-radius: var(--ui-radius-lg);
z-index: 1;
background: var(--loading-overlay-bg);
}
.loading-spinner {
display: grid;
justify-items: center;
gap: 1rem;
}
.cancel-calculation {
min-height: 44px;
}
.spinner-container {
position: relative;
}
.spinner-text {
position: absolute;
inset: 0;
display: grid;
place-items: center;
font-size: 1.125rem;
font-weight: 600;
}
@container calendar-year (max-width: 35rem) {
.plan-insights {
grid-template-columns: minmax(0, 1fr);
}
.plan-summary {
gap: 0.5rem;
div {
padding: 1rem 0.625rem;
}
dd {
font-size: 1.75rem;
}
dt {
font-size: 0.75rem;
}
}
.placement-explanation {
padding: 0.875rem;
}
.placement-stepper {
gap: 0.25rem;
output {
order: -1;
flex-basis: 100%;
text-align: center;
}
}
}
.calculation-content,
.criteria-detail,
.balance-detail {
display: grid;
gap: 0.75rem;
min-width: 0;
}
.calculation-content {
gap: 1.5rem;
}
.calculation-intro,
.balance-detail > p {
color: var(--ui-text-secondary);
font-size: 0.875rem;
}
.balance-ledger {
display: flex;
flex-wrap: wrap;
gap: 1rem 2rem;
margin: 0;
dt {
color: var(--ui-text-secondary);
font-size: 0.8125rem;
}
dd {
margin: 0.25rem 0 0;
font-weight: 600;
}
}
.criterion-help {
summary {
padding: 0;
align-content: center;
font-size: inherit;
}
p {
font-weight: 400;
font-size: 0.8125rem;
padding-block: 0.5rem;
}
}
.decisive-row {
background: var(--ui-panel-bg);
}
.decisive-label {
display: inline-block;
margin-top: 0.375rem;
padding: 0.125rem 0.375rem;
border: 1px solid var(--mat-sys-primary);
border-radius: var(--ui-radius-sm);
color: var(--mat-sys-primary);
font-size: 0.75rem;
font-weight: 600;
}
.tie-breaks {
padding: 0.75rem;
border-inline-start: 2px solid var(--ui-border);
font-size: 0.875rem;
ol {
margin: 0.5rem 0 0;
padding-inline-start: 1.25rem;
}
}
.audit-data {
border-top: 1px solid var(--ui-border);
summary {
padding-inline: 0;
color: var(--ui-text-secondary);
font-size: 0.875rem;
}
pre {
max-height: 24rem;
overflow: auto;
white-space: pre-wrap;
overflow-wrap: anywhere;
padding: 0.75rem;
background: var(--ui-panel-bg);
font-size: 0.75rem;
}
}
.counterfactual-panel {
display: flex;
flex-direction: column;
max-height: calc(100dvh - 2rem);
background: var(--ui-card-bg);
color: var(--mat-sys-on-surface);
}
.comparison-heading,
.comparison-footer,
.comparison-result-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.comparison-heading {
align-items: flex-start;
padding: 1.5rem;
h2 {
font-size: 1.5rem;
}
p {
margin-top: 0.5rem;
color: var(--ui-text-secondary);
font-size: 0.875rem;
}
}
.comparison-close {
flex-shrink: 0;
padding: 0;
border-color: transparent;
}
.counterfactual-panel .comparison-content {
display: grid;
gap: 1rem;
min-height: 0;
max-height: none;
padding: 0 1.5rem 1.5rem;
color: inherit;
font: inherit;
font-size: 0.875rem;
}
.comparison-date-pair {
display: grid;
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
align-items: center;
gap: 0.75rem;
> mat-icon {
color: var(--ui-text-secondary);
}
> .original-date {
padding: 1rem;
border: 1px solid var(--ui-border);
border-radius: var(--ui-radius-sm);
}
}
.original-date {
display: grid;
gap: 0.75rem;
background: var(--ui-panel-bg);
span {
color: var(--ui-text-secondary);
}
strong {
font-size: 1.125rem;
}
}
.comparison-range {
color: var(--ui-text-secondary);
font-size: 0.8125rem;
}
.nearby-dates {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
> span {
flex-basis: 100%;
color: var(--ui-text-secondary);
}
}
.comparison-result-heading {
flex-wrap: wrap;
padding-top: 0.5rem;
}
.available-date,
.unavailable-date,
.comparison-loading {
display: flex;
align-items: center;
gap: 0.5rem;
mat-icon {
flex-shrink: 0;
}
}
.available-date {
color: var(--ui-success-text);
font-size: 0.8125rem;
}
.unavailable-date {
align-items: flex-start;
padding: 1rem;
border-radius: var(--ui-radius-sm);
background: var(--ui-warning-bg);
color: var(--ui-warning-text);
p {
margin-top: 0.5rem;
}
}
.comparison-empty {
padding: 1rem;
background: var(--ui-panel-bg);
border-radius: var(--ui-radius-sm);
}
.comparison-loading {
padding-block: 2rem;
justify-content: center;
}
.comparison-footer {
padding: 1rem 1.5rem;
border-top: 1px solid var(--ui-border);
font-size: 0.8125rem;
color: var(--ui-text-secondary);
.comparison-done {
background: var(--mat-sys-primary);
color: var(--mat-sys-on-primary);
&:hover {
background: var(--mat-sys-primary);
opacity: 0.9;
}
}
}
@media (max-width: 560px) {
.comparison-heading {
padding: 1rem;
}
.counterfactual-panel .comparison-content {
padding: 0 1rem 1rem;
}
.comparison-date-pair {
grid-template-columns: minmax(0, 1fr);
> mat-icon {
display: none;
}
> div {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
padding: 0.75rem;
}
}
.comparison-footer {
padding: 1rem;
flex-wrap: wrap;
button {
width: 100%;
}
}
}
.nearby-dates button[aria-pressed='true'] {
border-color: var(--mat-sys-primary);
}