Enhances the resize handle indicator for calendar events by using cached event elements for efficiency. This eliminates the need to constantly query the DOM, and only refreshes the cache on relevant event changes. Additionally updates the resize indicator style for improved visual clarity and user experience.
275 lines
5.7 KiB
CSS
275 lines
5.7 KiB
CSS
/* styles/components/events.css */
|
|
|
|
/* Event base styles */
|
|
swp-day-columns swp-event {
|
|
position: absolute;
|
|
border-radius: 3px;
|
|
overflow: hidden;
|
|
cursor: pointer;
|
|
transition: box-shadow 150ms ease, transform 150ms ease;
|
|
z-index: 10;
|
|
left: 2px;
|
|
right: 2px;
|
|
color: var(--color-text);
|
|
font-size: 12px;
|
|
padding: 2px 4px;
|
|
|
|
/* Event types */
|
|
&[data-type="meeting"] {
|
|
background: var(--color-event-meeting);
|
|
border-left: 4px solid var(--color-event-meeting-border);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
&[data-type="meal"] {
|
|
background: var(--color-event-meal);
|
|
border-left: 4px solid var(--color-event-meal-border);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
&[data-type="work"] {
|
|
background: var(--color-event-work);
|
|
border-left: 4px solid var(--color-event-work-border);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
&[data-type="milestone"] {
|
|
background: var(--color-event-milestone);
|
|
border-left: 4px solid var(--color-event-milestone-border);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
&[data-type="personal"] {
|
|
background: var(--color-event-personal);
|
|
border-left: 4px solid var(--color-event-personal-border);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
&[data-type="deadline"] {
|
|
background: var(--color-event-milestone);
|
|
border-left: 4px solid var(--color-event-milestone-border);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
/* Dragging state */
|
|
&.dragging {
|
|
position: absolute;
|
|
z-index: 999999;
|
|
pointer-events: none;
|
|
opacity: 0.8;
|
|
left: 2px;
|
|
right: 2px;
|
|
width: auto;
|
|
}
|
|
|
|
}
|
|
|
|
swp-day-columns swp-event:hover {
|
|
box-shadow: var(--shadow-md);
|
|
transform: translateX(2px);
|
|
z-index: 20;
|
|
}
|
|
|
|
/* Resize handle indicator - created by JavaScript */
|
|
swp-resize-indicator {
|
|
position: absolute;
|
|
bottom: -3px;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
width: 40px;
|
|
height: 6px;
|
|
background: var(--color-primary);
|
|
border-radius: 3px;
|
|
pointer-events: none;
|
|
z-index: 30;
|
|
opacity: 0;
|
|
animation: fadeIn 0.3s ease forwards;
|
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
/* Grip dots on handle */
|
|
swp-resize-indicator::before {
|
|
content: '';
|
|
position: absolute;
|
|
left: 50%;
|
|
top: 50%;
|
|
transform: translate(-50%, -50%);
|
|
width: 12px;
|
|
height: 2px;
|
|
background: rgba(255, 255, 255, 0.7);
|
|
border-radius: 1px;
|
|
box-shadow:
|
|
-5px 0 0 rgba(255, 255, 255, 0.7),
|
|
5px 0 0 rgba(255, 255, 255, 0.7);
|
|
}
|
|
|
|
@keyframes fadeIn {
|
|
from {
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
swp-day-columns swp-event[data-resize-hover="true"] {
|
|
cursor: ns-resize;
|
|
overflow: visible;
|
|
}
|
|
|
|
swp-day-columns swp-event-time {
|
|
display: block;
|
|
font-size: 0.875rem;
|
|
font-weight: 500;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
swp-day-columns swp-event-title {
|
|
display: block;
|
|
font-size: 0.875rem;
|
|
line-height: 1.3;
|
|
}
|
|
|
|
/* Multi-day events */
|
|
swp-multi-day-event {
|
|
position: relative;
|
|
height: 28px;
|
|
margin: 2px 4px;
|
|
padding: 0 8px;
|
|
border-radius: 4px;
|
|
display: flex;
|
|
align-items: center;
|
|
font-size: 0.875rem;
|
|
font-weight: 500;
|
|
cursor: pointer;
|
|
transition: all var(--transition-fast);
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
|
|
/* Event type colors */
|
|
&[data-type="milestone"] {
|
|
background: var(--color-event-milestone);
|
|
color: var(--color-event-milestone-border);
|
|
}
|
|
|
|
/* Continuation indicators */
|
|
&[data-continues-before="true"] {
|
|
border-top-left-radius: 0;
|
|
border-bottom-left-radius: 0;
|
|
margin-left: 0;
|
|
padding-left: 20px;
|
|
|
|
&::before {
|
|
content: '◀';
|
|
position: absolute;
|
|
left: 4px;
|
|
opacity: 0.6;
|
|
font-size: 0.75rem;
|
|
}
|
|
}
|
|
|
|
&[data-continues-after="true"] {
|
|
border-top-right-radius: 0;
|
|
border-bottom-right-radius: 0;
|
|
margin-right: 0;
|
|
padding-right: 20px;
|
|
|
|
&::after {
|
|
content: '▶';
|
|
position: absolute;
|
|
right: 4px;
|
|
opacity: 0.6;
|
|
font-size: 0.75rem;
|
|
}
|
|
}
|
|
|
|
&:hover {
|
|
transform: translateY(-1px);
|
|
box-shadow: var(--shadow-sm);
|
|
}
|
|
}
|
|
|
|
/* Event creation preview */
|
|
swp-event-preview {
|
|
position: absolute;
|
|
left: 8px;
|
|
right: 8px;
|
|
background: rgba(33, 150, 243, 0.1);
|
|
border: 2px dashed var(--color-primary);
|
|
border-radius: 4px;
|
|
pointer-events: none;
|
|
|
|
/* Position via CSS variables */
|
|
top: calc(var(--preview-start) * var(--minute-height));
|
|
height: calc(var(--preview-duration) * var(--minute-height));
|
|
}
|
|
|
|
/* Event filtering styles */
|
|
/* When filter is active, all events are dimmed by default */
|
|
swp-events-layer[data-filter-active="true"] swp-event {
|
|
opacity: 0.2;
|
|
transition: opacity 200ms ease;
|
|
}
|
|
|
|
/* Events that match the filter stay normal */
|
|
swp-events-layer[data-filter-active="true"] swp-event[data-matches="true"] {
|
|
opacity: 1;
|
|
}
|
|
|
|
/* Event overlap styling */
|
|
/* Event group container for column sharing */
|
|
swp-event-group {
|
|
position: absolute;
|
|
display: grid;
|
|
gap: 2px;
|
|
left: 2px;
|
|
right: 2px;
|
|
z-index: 10;
|
|
}
|
|
|
|
/* Grid column configurations */
|
|
swp-event-group.cols-2 {
|
|
grid-template-columns: 1fr 1fr;
|
|
}
|
|
|
|
swp-event-group.cols-3 {
|
|
grid-template-columns: 1fr 1fr 1fr;
|
|
}
|
|
|
|
swp-event-group.cols-4 {
|
|
grid-template-columns: 1fr 1fr 1fr 1fr;
|
|
}
|
|
|
|
/* Stack levels using margin-left */
|
|
swp-event-group.stack-level-0 {
|
|
margin-left: 0px;
|
|
}
|
|
|
|
swp-event-group.stack-level-1 {
|
|
margin-left: 15px;
|
|
}
|
|
|
|
swp-event-group.stack-level-2 {
|
|
margin-left: 30px;
|
|
}
|
|
|
|
swp-event-group.stack-level-3 {
|
|
margin-left: 45px;
|
|
}
|
|
|
|
swp-event-group.stack-level-4 {
|
|
margin-left: 60px;
|
|
}
|
|
|
|
/* Child events within grid */
|
|
swp-event-group swp-event {
|
|
position: relative;
|
|
left: 0;
|
|
right: 0;
|
|
}
|
|
|
|
/* All-day event transition for smooth repositioning */
|
|
swp-allday-container swp-event.transitioning {
|
|
transition: grid-area 200ms ease-out, grid-row 200ms ease-out, grid-column 200ms ease-out;
|
|
}
|