@event-calendar/core
Version:
Full-sized drag & drop event calendar with resource & timeline views
758 lines (678 loc) • 18.7 kB
CSS
/*!
* EventCalendar v5.4.0
* https://github.com/vkurko/calendar
*/
.ec {
color-scheme: light;
/* Main colors */
--ec-color-400: oklch(70.8% 0 0);
--ec-color-300: oklch(87% 0 0);
--ec-color-200: oklch(92.2% 0 0);
--ec-color-100: oklch(97% 0 0);
--ec-color-50: oklch(98.5% 0 0);
/* General props */
--ec-bg-color: #fff;
--ec-text-color: currentcolor;
--ec-border-color: var(--ec-color-300);
/* Buttons */
--ec-button-bg-color: var(--ec-bg-color);
--ec-button-border-color: var(--ec-border-color);
--ec-button-text-color: var(--ec-text-color);
--ec-button-active-bg-color: var(--ec-color-200);
--ec-button-active-border-color: var(--ec-color-400);
--ec-button-active-text-color: var(--ec-button-text-color);
/* Days */
--ec-today-bg-color: oklch(98.7% 0.026 102.212);
--ec-highlight-color: oklch(98.4% 0.019 200.873);
/* Events */
--ec-event-bg-color: oklch(70.7% 0.165 254.624);
--ec-event-text-color: #fff;
--ec-bg-event-color: var(--ec-color-300);
--ec-bg-event-opacity: 0.3;
--ec-event-col-gap: .375rem;
/* Now Indicator */
--ec-now-indicator-color: oklch(63.7% 0.237 25.331);
/* Popup */
--ec-popup-bg-color: var(--ec-bg-color);
.ec-dark & {
color-scheme: dark;
--ec-color-400: oklch(43.9% 0 0);
--ec-color-300: oklch(37.1% 0 0);
--ec-color-200: oklch(26.9% 0 0);
--ec-color-100: oklch(20.5% 0 0);
--ec-color-50: oklch(14.5% 0 0);
--ec-bg-color: var(--ec-color-100);
--ec-today-bg-color: oklch(28.6% 0.066 53.813);
--ec-highlight-color: oklch(30.2% 0.056 229.695);
--ec-bg-event-opacity: 0.5;
}
@media (prefers-color-scheme: dark) {
.ec-auto-dark & {
color-scheme: dark;
--ec-color-400: oklch(43.9% 0 0);
--ec-color-300: oklch(37.1% 0 0);
--ec-color-200: oklch(26.9% 0 0);
--ec-color-100: oklch(20.5% 0 0);
--ec-color-50: oklch(14.5% 0 0);
--ec-bg-color: var(--ec-color-100);
--ec-today-bg-color: oklch(28.6% 0.066 53.813);
--ec-highlight-color: oklch(30.2% 0.056 229.695);
--ec-bg-event-opacity: 0.5;
}
}
}
.ec-day {
--ec-day-bg-color: var(--ec-bg-color);
background-color: var(--ec-day-bg-color);
border: 1px solid var(--ec-border-color);
border-block-start: none;
border-inline-start: none;
&.ec-today {
--ec-day-bg-color: var(--ec-today-bg-color);
}
&.ec-highlight {
--ec-day-bg-color: var(--ec-highlight-color);
}
.ec-time-grid .ec-body & {
background-image:
linear-gradient(to top, var(--ec-day-bg-color) 1px, transparent 1px),
linear-gradient(to top, var(--ec-border-color) 1px, transparent 1px),
linear-gradient(to right, var(--ec-day-bg-color) 1px, transparent 1px),
linear-gradient(to top, var(--ec-border-color) 1px, transparent 1px);
background-size:
100% 100%,
100% calc(var(--ec-slot-height) * var(--ec-slot-label-periodicity)),
2px 100%,
100% var(--ec-slot-height);
}
.ec-timeline:not(.ec-month-view) .ec-body & {
--ec-last-line-color: transparent;
--ec-direction: to left;
[dir="rtl"] & {
--ec-direction: to right;
}
background-image:
linear-gradient(var(--ec-direction), var(--ec-last-line-color) 1px, transparent 1px),
linear-gradient(var(--ec-direction), var(--ec-border-color) 1px, transparent 1px),
linear-gradient(var(--ec-day-bg-color) 1px, transparent 1px),
linear-gradient(var(--ec-direction), var(--ec-border-color) 1px, transparent 1px);
background-size:
100% 100%,
calc(var(--ec-slot-width) * var(--ec-slot-label-periodicity)) 100%,
100% 2px,
var(--ec-slot-width) 100%;
border-inline: none;
&.ec-no-ieb {
--ec-last-line-color: var(--ec-day-bg-color);
}
}
.ec-day-grid & {
display: flex;
flex-direction: column;
justify-content: space-between;
min-block-size: 5em;
}
.ec-day-grid .ec-uniform & {
min-block-size: auto;
}
.ec-list & {
border-inline: none;
&:last-child {
border: none;
}
}
&.ec-no-ieb {
border-inline-end: none;
}
&.ec-no-beb {
border-block-end: none;
}
}
.ec-day-head {
display: flex;
flex-direction: row-reverse;
justify-content: space-between;
.ec-day-grid.ec-month-view & {
padding: .375rem;
}
.ec-day.ec-other-month & time {
opacity: .3;
}
.ec-list & {
background-color: var(--ec-day-bg-color);
border-block-end: 1px solid var(--ec-border-color);
flex-direction: unset;
margin: 0 0 -1px;
padding: .5em 1.5em;
position: sticky;
inset-block-start: 0;
z-index: 2;
}
}
.ec-day-foot {
padding: .18rem;
font-size: .85em;
a {
cursor: pointer;
}
}
.ec-disabled {
position: relative;
&:after {
content: '';
position: absolute;
inset: 0 0 0 0;
background-color: var(--ec-bg-event-color);
opacity: var(--ec-bg-event-opacity);
}
}
/* Toolbar */
.ec-toolbar {
display: flex;
justify-content: space-between;
align-items: center;
margin-block-end: 1em;
> * {
display: inline-flex;
flex-wrap: wrap;
column-gap: .75rem;
row-gap: .5rem;
}
}
.ec-title {
margin: 0;
}
.ec-button {
background-color: var(--ec-button-bg-color);
border: 1px solid var(--ec-button-border-color);
padding: .375rem .75rem;
font-size: 1rem;
line-height: 1.5;
border-radius: .25rem;
&:not(:disabled) {
color: var(--ec-button-text-color);
cursor: pointer;
}
&:not(:disabled):hover,
&.ec-active {
background-color: var(--ec-button-active-bg-color);
border-color: var(--ec-button-active-border-color);
color: var(--ec-button-active-text-color);
z-index: 1; /* make all borders visible */
}
}
.ec-button-group {
display: inline-flex;
vertical-align: top;
.ec-button:not(:first-child) {
border-start-start-radius: 0;
border-end-start-radius: 0;
margin-inline-start: -1px;
}
.ec-button:not(:last-child) {
border-start-end-radius: 0;
border-end-end-radius: 0;
}
}
.ec-icon {
display: inline-block;
inline-size: 1em;
&.ec-prev:after,
&.ec-next:after {
content: '';
position: relative;
inline-size: .5em;
block-size: .5em;
border-block-start: 2px solid currentcolor;
border-inline-end: 2px solid currentcolor;
display: inline-block;
}
&.ec-prev:after {
inset-inline-start: 3px;
rotate: -135deg;
}
[dir="rtl"] &.ec-prev:after {
rotate: 135deg;
}
&.ec-next:after {
inset-inline-start: -3px;
rotate: 45deg;
}
[dir="rtl"] &.ec-next:after {
rotate: -45deg;
}
}
.ec-sidebar {
position: sticky;
inset-inline-start: 0;
z-index: 1;
background-color: var(--ec-bg-color);
border-inline-end: 1px solid var(--ec-border-color);
text-align: end;
overflow: clip;
.ec-header & {
border-block-end: 1px solid var(--ec-border-color);
padding-block: .375rem;
}
.ec-time-grid & {
padding-inline: .75rem;
}
.ec-time-grid .ec-body & {
--ec-direction: to left;
[dir="rtl"] & {
--ec-direction: to right;
}
background-image:
linear-gradient(var(--ec-direction), transparent .375rem, var(--ec-bg-color) .375rem),
linear-gradient(to top, var(--ec-bg-color) 1px, transparent 1px),
linear-gradient(to top, var(--ec-border-color) 1px, transparent 1px),
linear-gradient(to right, var(--ec-bg-color) 1px, transparent 1px),
linear-gradient(to top, var(--ec-border-color) 1px, transparent 1px);
background-size:
100% 100%,
100% 100%,
100% calc(var(--ec-slot-height) * var(--ec-slot-label-periodicity)),
2px 100%,
100% var(--ec-slot-height);
}
.ec-timeline .ec-body & {
grid-area: 1 / 1 / -1 / 2;
display: grid;
grid-template-rows: subgrid;
}
}
.ec-row-head {
display: flex;
border-block-end: 1px solid var(--ec-border-color);
padding: .375em .75rem;
min-block-size: 1.5em;
&:last-child {
border: none;
}
}
.ec-expander {
inline-size: 1.25em;
margin-inline-end: .25em;
margin-block-start: -1px;
.ec-button {
line-height: normal;
padding: 0;
aspect-ratio: 1;
block-size: 1.25em;
}
}
.ec-slot {
white-space: nowrap;
.ec-time-grid & {
block-size: calc(var(--ec-slot-height) * var(--ec-slot-label-periodicity));
position: relative;
inset-block-start: -.5lh;
}
.ec-timeline & {
grid-column: span var(--ec-slot-label-periodicity);
font-size: .95em;
padding: .18rem 0;
overflow: clip;
text-overflow: ellipsis;
}
}
.ec-slots {
display: grid;
grid-auto-flow: column;
grid-auto-columns: var(--ec-slot-width);
text-align: center;
--ec-day-bg-color: var(--ec-bg-color);
background-color: var(--ec-day-bg-color);
border-block-end: 1px solid var(--ec-border-color);
&.ec-today {
--ec-day-bg-color: var(--ec-today-bg-color);
}
&.ec-highlight {
--ec-day-bg-color: var(--ec-highlight-color);
}
--ec-last-line-color: transparent;
--ec-direction: to left;
[dir="rtl"] & {
--ec-direction: to right;
}
background-image:
linear-gradient(var(--ec-direction), var(--ec-last-line-color) 1px, transparent 1px),
linear-gradient(var(--ec-direction), var(--ec-border-color) 1px, transparent 1px);
background-size:
100% 100%,
calc(var(--ec-slot-width) * var(--ec-slot-label-periodicity)) 100%;
&:last-child {
--ec-last-line-color: var(--ec-day-bg-color);
}
}
.ec-events {
grid-area: 1 / 2 / -1 / -1;
display: grid;
grid-template: subgrid / subgrid;
isolation: isolate;
pointer-events: none;
.ec-day-grid & {
grid-column-start: 1;
}
}
.ec-event {
display: flex;
position: relative;
padding: 2px;
color: var(--ec-event-text-color);
box-sizing: border-box;
box-shadow: 0 0 1px 0 var(--ec-border-color);
background-color: var(--ec-event-bg-color);
border-radius: 3px;
font-size: .85em;
line-height: 1.5;
z-index: 1;
pointer-events: all;
inline-size: calc(100% - var(--ec-event-col-gap));
.ec-time-grid & {
grid-row: 1;
}
.ec-day-grid &,
.ec-all-day &,
.ec-timeline & {
block-size: max-content;
margin-block-end: var(--ec-event-col-gap);
}
.ec-list & {
flex-direction: row;
padding: .5em 1.5em;
color: inherit;
background-color: var(--ec-day-bg-color);
border-radius: 0;
}
&.ec-preview {
z-index: 1000;
user-select: none;
opacity: .8;
}
&.ec-pointer {
color: inherit;
pointer-events: none;
user-select: none;
z-index: 0;
box-shadow: none;
}
}
.ec-bg-event {
grid-row: 1;
position: relative;
background-color: var(--ec-bg-event-color);
opacity: var(--ec-bg-event-opacity);
}
.ec-draggable {
cursor: pointer;
user-select: none;
}
.ec-ghost {
opacity: .5;
user-select: none;
pointer-events: none;
}
.ec-event-body {
display: flex;
flex-direction: column;
inline-size: 100%;
.ec-day-grid &,
.ec-all-day &,
.ec-timeline & {
flex-direction: row;
}
}
.ec-event-tag {
inline-size: 4px;
border-radius: 2px;
margin-inline-end: 8px;
}
.ec-event-time {
overflow: hidden;
white-space: nowrap;
margin: 0 0 1px 0;
flex-shrink: 0;
max-block-size: 100%;
.ec-day-grid &,
.ec-timeline & {
margin: 0 3px 0 0;
max-inline-size: 100%;
text-overflow: ellipsis;
}
}
.ec-event-title {
overflow: hidden;
margin: 0;
font-weight: inherit;
.ec-time-grid & {
position: sticky;
inset-block-start: var(--ec-header-height);
}
.ec-day-grid &,
.ec-all-day &,
.ec-timeline & {
min-block-size: 1.5em;
white-space: nowrap;
text-overflow: ellipsis;
position: sticky;
inset-inline-start: calc(var(--ec-sidebar-width) + .18em);
}
.ec-list & {
font-size: 1rem;
}
}
.ec-resizer {
position: absolute;
user-select: none;
.ec-time-grid .ec-body & {
inset: auto 0 0 0;
block-size: 50%;
max-block-size: 8px;
cursor: ns-resize;
&.ec-start {
inset: 0 0 auto 0;
}
}
.ec-day-grid &,
.ec-all-day &,
.ec-timeline & {
inset: 0 0 0 auto;
inline-size: 50%;
max-inline-size: 8px;
cursor: ew-resize;
&.ec-start {
inset: 0 auto 0 0;
}
}
}
.ec-dragging, .ec-dragging * {
cursor: pointer;
}
.ec-resizing-y, .ec-resizing-y * {
cursor: ns-resize;
}
.ec-resizing-x, .ec-resizing-x * {
cursor: ew-resize;
}
.ec-no-events {
text-align: center;
padding: 5em 0;
background-color: var(--ec-bg-color);
}
.ec-now-indicator {
grid-row: 2;
position: relative;
pointer-events: none;
will-change: inset;
.ec-time-grid & {
inline-size: 100%;
block-size: 0;
border-block-start: var(--ec-now-indicator-color) solid 2px;
}
.ec-timeline & {
inline-size: 0;
border-inline-start: var(--ec-now-indicator-color) solid 2px;
&:before {
inset-block-start: calc(var(--ec-header-height) - 6.5px);
z-index: 2;
}
}
&:before {
background: var(--ec-now-indicator-color);
border-radius: 50%;
content: "";
display: block;
block-size: 12px;
inline-size: 12px;
margin-block-start: -7px;
margin-inline-start: -7px;
position: sticky;
inset-inline-start: calc(var(--ec-sidebar-width) - 6.5px);
z-index: 1;
}
}
.ec-popup {
position: relative;
display: flex;
flex-direction: column;
box-sizing: border-box;
block-size: max-content;
inline-size: 125%;
min-block-size: 8em;
min-inline-size: 12em;
padding: .375rem .75rem .75rem;
background-color: var(--ec-popup-bg-color);
border: 1px solid var(--ec-border-color);
border-radius: .25rem;
box-shadow: var(--ec-color-300) 0 10px 15px -3px, var(--ec-color-300) 0 4px 6px -4px;
.ec-day-head {
flex-direction: row;
padding-inline: 0;
a {
cursor: pointer;
font-size: 1.5em;
line-height: .8;
}
}
.ec-events {
--ec-event-col-gap: 0;
display: block;
overflow-y: auto;
pointer-events: auto;
}
}
.ec-custom-scrollbars {
.ec-main {
&::-webkit-scrollbar {
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
border: 4px solid transparent;
box-shadow: none;
background-color: var(--ec-border-color);
background-clip: padding-box;
border-radius: 8px;
}
&::-webkit-scrollbar-thumb:hover {
background-color: var(--ec-color-400);
}
}
}
.ec {
display: flex;
flex-direction: column;
}
.ec-main {
display: grid;
border: 1px solid var(--ec-border-color);
overflow: auto;
/*scrollbar-width: thin;*/
.ec-time-grid & {
grid-template-columns: max-content repeat(var(--ec-grid-cols), var(--ec-col-width));
grid-template-rows: repeat(2, max-content);
}
.ec-day-grid & {
--ec-row-height: auto;
grid-template-columns: repeat(var(--ec-grid-cols), minmax(0, 1fr));
grid-template-rows: max-content repeat(var(--ec-grid-rows), var(--ec-row-height));
&.ec-uniform {
--ec-row-height: minmax(0, 1fr);
overflow: hidden;
flex-grow: 1;
}
}
.ec-timeline & {
grid-template-columns: max-content repeat(var(--ec-grid-cols), min-content);
grid-template-rows: max-content var(--ec-grid-rows);
flex-grow: 1;
}
.ec-timeline.ec-month-view & {
grid-template-columns: max-content repeat(var(--ec-grid-cols), var(--ec-col-width));
}
.ec-list & {
}
}
.ec-header {
grid-area: 1 / 1 / 2 / -1;
display: grid;
grid-template-columns: subgrid;
position: sticky;
inset-block-start: 0;
z-index: 2;
}
.ec-grid {
grid-area: 1 / 1 / -1 / -1;
display: grid;
grid-template-columns: subgrid;
.ec-body & {
grid-template-rows: subgrid;
}
.ec-time-grid &,
.ec-timeline & {
grid-column-start: 2;
}
}
.ec-all-day {
grid-area: 2 / 1 / auto / -1;
display: grid;
grid-template-columns: subgrid;
min-block-size: var(--ec-slot-height);
}
.ec-col-group {
grid-column: span var(--ec-col-group-span);
}
.ec-col-group,
.ec-col-head {
text-align: center;
padding: .375rem .18em;
background-color: var(--ec-bg-color);
border: 1px solid var(--ec-border-color);
border-block-start: none;
border-inline-start: none;
overflow: clip;
text-overflow: ellipsis;
&.ec-today {
background-color: var(--ec-today-bg-color);
}
&.ec-highlight {
background-color: var(--ec-highlight-color);
}
}
.ec-col-group:nth-last-child(1 of .ec-col-group),
.ec-col-head:nth-last-child(1 of .ec-col-head) {
border-inline-end: none;
}
.ec-col-group > *,
.ec-timeline .ec-col-head > * {
position: sticky;
inset-inline-start: calc(var(--ec-sidebar-width) + .18em);
}
.ec-body {
grid-area: 2 / 1 / -1 / -1;
display: grid;
grid-template: subgrid / subgrid;
}
.ec-hidden {
visibility: hidden;
}