UNPKG

@event-calendar/core

Version:

Full-sized drag & drop event calendar with resource & timeline views

758 lines (678 loc) 18.7 kB
/*! * 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!important; } .ec-resizing-y, .ec-resizing-y * { cursor: ns-resize!important; } .ec-resizing-x, .ec-resizing-x * { cursor: ew-resize!important; } .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; }