144 lines
3.0 KiB
CSS
144 lines
3.0 KiB
CSS
/* Layout variables */
|
|
:root {
|
|
/* Layout */
|
|
--row-h: 2.2em;
|
|
--label-w: minmax(4em, 8%);
|
|
--cell-w: 1fr;
|
|
--cell-h: clamp(4em, 8vh, 8em);
|
|
--overlay-w: minmax(3rem, 5%);
|
|
}
|
|
|
|
/* Layout & typography */
|
|
* { box-sizing: border-box }
|
|
|
|
body {
|
|
margin: 0;
|
|
font: 500 14px/1.2 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Inter, Arial;
|
|
background: var(--bg);
|
|
color: var(--ink);
|
|
}
|
|
|
|
header {
|
|
display: flex;
|
|
align-items: baseline;
|
|
justify-content: space-between;
|
|
margin-bottom: .75rem;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.header-controls {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: .75rem;
|
|
}
|
|
|
|
.today-date { cursor: pointer }
|
|
.today-date::first-line { color: var(--today) }
|
|
.today-button:hover { opacity: .8 }
|
|
|
|
/* Header row */
|
|
.calendar-header, #calendar-header {
|
|
display: grid;
|
|
grid-template-columns: var(--label-w) repeat(7, var(--cell-w)) var(--overlay-w);
|
|
border-bottom: .2em solid var(--muted);
|
|
align-items: last baseline;
|
|
flex-shrink: 0;
|
|
width: 100%;
|
|
}
|
|
|
|
/* Main container */
|
|
.calendar-container, #calendar-container {
|
|
flex: 1;
|
|
overflow: hidden;
|
|
position: relative;
|
|
width: 100%;
|
|
display: flex;
|
|
}
|
|
|
|
/* Viewports (support id or class) */
|
|
.calendar-viewport, #calendar-viewport {
|
|
height: 100%;
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
flex: 1;
|
|
width: 100%;
|
|
scrollbar-width: none;
|
|
}
|
|
.calendar-viewport::-webkit-scrollbar,
|
|
#calendar-viewport::-webkit-scrollbar { display: none }
|
|
|
|
.jogwheel-viewport, #jogwheel-viewport {
|
|
position: absolute;
|
|
top: 0; right: 0; bottom: 0;
|
|
width: var(--overlay-w);
|
|
overflow-y: auto;
|
|
overflow-x: hidden;
|
|
scrollbar-width: none;
|
|
z-index: 20;
|
|
cursor: ns-resize;
|
|
}
|
|
.jogwheel-viewport::-webkit-scrollbar,
|
|
#jogwheel-viewport::-webkit-scrollbar { display: none }
|
|
|
|
.jogwheel-content, #jogwheel-content { position: relative; width: 100% }
|
|
.calendar-content, #calendar-content { position: relative }
|
|
|
|
/* Week row: label + 7-day grid + jogwheel column */
|
|
.week-row {
|
|
display: grid;
|
|
grid-template-columns: var(--label-w) repeat(7, var(--cell-w)) var(--overlay-w);
|
|
position: relative;
|
|
overflow: visible;
|
|
height: var(--cell-h);
|
|
scroll-snap-align: start;
|
|
width: 100%;
|
|
}
|
|
|
|
/* Label cells */
|
|
.year-label, .week-label {
|
|
display: grid;
|
|
place-items: center;
|
|
width: 100%;
|
|
color: var(--muted);
|
|
cursor: ns-resize;
|
|
font-size: 1.2em;
|
|
}
|
|
|
|
.week-label {
|
|
height: var(--cell-h);
|
|
}
|
|
/* 7-day grid inside each week row */
|
|
.week-row > .days-grid {
|
|
grid-column: 2 / span 7;
|
|
display: grid;
|
|
grid-template-columns: repeat(7, 1fr);
|
|
grid-auto-rows: 1fr;
|
|
position: relative;
|
|
height: 100%;
|
|
width: 100%;
|
|
}
|
|
|
|
.month-name-label {
|
|
grid-column: -2 / -1;
|
|
font-size: 2em;
|
|
font-weight: 700;
|
|
color: var(--muted);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
pointer-events: none;
|
|
z-index: 15;
|
|
overflow: visible;
|
|
position: absolute;
|
|
top: 0; right: 0;
|
|
width: 100%;
|
|
}
|
|
.month-name-label > span {
|
|
display: inline-block;
|
|
white-space: nowrap;
|
|
writing-mode: vertical-rl;
|
|
text-orientation: mixed;
|
|
transform: rotate(180deg);
|
|
transform-origin: center;
|
|
}
|