/* styles/layout.css */ /* Main calendar container */ swp-calendar { display: flex; flex-direction: column; height: 100vh; background: var(--color-background); position: relative; } /* Calendar container grid */ swp-calendar-container { flex: 1; display: grid; grid-template-columns: 60px 1fr; grid-template-rows: auto 1fr; overflow: hidden; position: relative; } /* Time axis (left side) */ swp-time-axis { grid-column: 1; grid-row: 2; background: var(--color-surface); border-right: 1px solid var(--color-border); position: relative; z-index: 2; } swp-hour-marker { height: var(--hour-height); padding: 8px; font-size: 0.75rem; color: var(--color-text-secondary); display: flex; align-items: flex-start; position: relative; /* Hour line extending into calendar */ &::after { content: ''; position: absolute; top: 0; left: 100%; width: 100vw; height: 1px; background: var(--color-grid-line); pointer-events: none; } } /* Week header */ swp-week-header { grid-column: 2; grid-row: 1; display: grid; grid-template-columns: repeat(var(--week-days, 7), 1fr); background: var(--color-surface); border-bottom: 1px solid var(--color-border); position: sticky; top: 0; z-index: 3; } swp-day-header { padding: 12px; text-align: center; border-right: 1px solid var(--color-grid-line); &:last-child { border-right: none; } swp-day-name { display: block; font-weight: 500; font-size: 0.875rem; color: var(--color-text-secondary); } swp-day-date { display: block; font-size: 1.25rem; font-weight: 600; margin-top: 4px; } /* Today indicator */ &[data-today="true"] { swp-day-date { color: var(--color-primary); background: rgba(33, 150, 243, 0.1); border-radius: 50%; width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; margin: 4px auto 0; } } } /* Scrollable content */ swp-scrollable-content { grid-column: 2; grid-row: 2; overflow-y: auto; overflow-x: hidden; scroll-behavior: smooth; position: relative; } /* All-day events container */ swp-allday-container { position: sticky; top: 0; background: var(--color-background); border-bottom: 1px solid var(--color-border); min-height: 0; z-index: 2; &:not(:empty) { padding: 8px 0; } } /* Time grid */ swp-time-grid { position: relative; height: calc(var(--total-hours, 12) * var(--hour-height)); /* Work hours background */ &::before { content: ''; position: absolute; top: calc((var(--work-start-hour) - var(--day-start-hour)) * var(--hour-height)); height: calc((var(--work-end-hour) - var(--work-start-hour)) * var(--hour-height)); left: 0; right: 0; background: var(--color-work-hours); pointer-events: none; } } /* Grid lines */ swp-grid-lines { position: absolute; inset: 0; pointer-events: none; /* 15-minute intervals */ background-image: repeating-linear-gradient( to bottom, transparent, transparent calc(var(--hour-height) / 4 - 1px), var(--color-grid-line-light) calc(var(--hour-height) / 4 - 1px), var(--color-grid-line-light) calc(var(--hour-height) / 4) ); /* Show stronger lines when dragging */ &[data-dragging="true"] { background-image: repeating-linear-gradient( to bottom, transparent, transparent calc(var(--hour-height) / 4 - 1px), rgba(33, 150, 243, 0.2) calc(var(--hour-height) / 4 - 1px), rgba(33, 150, 243, 0.2) calc(var(--hour-height) / 4) ); } } /* Day columns */ swp-day-columns { position: absolute; inset: 0; display: grid; grid-template-columns: repeat(var(--week-days, 7), 1fr); } swp-day-column { position: relative; border-right: 1px solid var(--color-grid-line); &:last-child { border-right: none; } /* Hover effect for empty slots */ &:hover { background: rgba(0, 0, 0, 0.01); } } /* Events layer */ swp-events-layer { position: absolute; inset: 0; /* Layout modes */ &[data-layout="overlap"] { swp-event { width: calc(100% - 16px); left: 8px; } } &[data-layout="side-by-side"] { swp-event { width: calc(var(--event-width, 100%) - 16px); left: calc(8px + var(--event-offset, 0px)); } } } /* Current time indicator */ swp-current-time-indicator { position: absolute; left: 0; right: 0; height: 2px; background: var(--color-current-time); pointer-events: none; z-index: var(--z-current-time); /* Time label */ &::before { content: attr(data-time); position: absolute; left: -55px; top: -10px; background: var(--color-current-time); color: white; padding: 2px 6px; font-size: 0.75rem; border-radius: 3px; white-space: nowrap; } /* Animated dot */ &::after { content: ''; position: absolute; right: -4px; top: -4px; width: 10px; height: 10px; background: var(--color-current-time); border-radius: 50%; box-shadow: 0 0 0 2px rgba(255, 0, 0, 0.3); } /* Position based on current time */ top: calc(var(--current-minutes) * var(--minute-height)); }