UNPKG

color-calendar

Version:

A zero-dependency, customizable events calendar widget with themes and event colors.

619 lines (600 loc) 16.5 kB
.color-calendar *:focus-visible { outline: 2px solid #007bff; outline: 2px solid var(--cal-color-primary, #007bff); outline-offset: 2px; } .color-calendar { position: relative; display: inline-flex; flex-direction: column; width: auto; height: auto; box-sizing: border-box; -webkit-user-select: none; -moz-user-select: none; user-select: none; overflow: hidden; font-family: var(--cal-font-family-body); font-size: 1rem; } .color-calendar .calendar__header { position: relative; display: grid; grid-template-columns: repeat(7, minmax(20px, 55px)); font-family: var(--cal-font-family-header); } .color-calendar .calendar__monthyear { font-size: 1.5rem; margin: 0 auto; text-align: center; grid-column: 2/span 5; display: flex; align-items: center; justify-content: center; } .color-calendar .calendar__monthyear .calendar__month { cursor: pointer; background: none; border: none; padding: 0; margin: 0; font: inherit; color: inherit; cursor: pointer; outline: none; } .color-calendar .calendar__monthyear .calendar__month:focus-visible { outline: 2px solid var(--cal-color-primary); outline-offset: 2px; border-radius: 4px; } .color-calendar .calendar__monthyear .calendar__year { cursor: pointer; background: none; border: none; padding: 0; margin: 0; font: inherit; color: inherit; cursor: pointer; outline: none; } .color-calendar .calendar__monthyear .calendar__year:focus-visible { outline: 2px solid var(--cal-color-primary); outline-offset: 2px; border-radius: 4px; } .color-calendar .calendar__arrow { height: 35px; width: 100%; position: relative; -webkit-touch-callout: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; -webkit-tap-highlight-color: transparent; z-index: 101; display: flex; align-items: center; justify-content: center; background: none; border: none; padding: 0; margin: 0; font: inherit; color: inherit; cursor: pointer; outline: none; } .color-calendar .calendar__arrow:focus-visible .calendar__arrow-inner { outline: 2px solid var(--cal-color-primary); outline-offset: -2px; border-radius: 50%; } .color-calendar .calendar__arrow-inner { width: 35px; height: 35px; position: relative; cursor: pointer; display: flex; align-items: center; justify-content: center; } .color-calendar .calendar__arrow-prev { position: relative; display: flex; align-items: center; justify-content: center; } .color-calendar .calendar__arrow-prev .calendar__arrow-inner::before { margin-left: 0.3em; transform: rotate(-135deg); } .color-calendar .calendar__arrow-next { position: relative; display: flex; align-items: center; justify-content: center; } .color-calendar .calendar__arrow-next .calendar__arrow-inner::before { margin-right: 0.3em; transform: rotate(45deg); } .color-calendar .calendar__body { height: auto; overflow: hidden; } .color-calendar .calendar__weekdays { display: grid; grid-template-columns: repeat(7, minmax(20px, 55px)); margin-bottom: 5px; font-family: var(--cal-font-family-weekdays); } .color-calendar .calendar__weekdays .calendar__weekday { display: flex; align-items: center; justify-content: center; height: 40px; } .color-calendar .calendar__days { display: grid; grid-template-columns: repeat(7, minmax(20px, 55px)); grid-template-rows: repeat(6, minmax(30px, 40px)); font-family: var(--cal-font-family-body); } .color-calendar .calendar__days .calendar__day { position: relative; z-index: 101; display: flex; align-items: center; justify-content: center; } .color-calendar .calendar__days .calendar__day:focus-visible { outline: 2px solid var(--cal-color-primary); outline-offset: 2px; border-radius: 4px; } .color-calendar .calendar__days .calendar__day-text { cursor: pointer; } .color-calendar .calendar__days .calendar__day-box { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: calc(55% + 8px); height: 90%; opacity: 0; z-index: -1; cursor: pointer; transition: opacity 0.3s ease-out; will-change: opacity; } .color-calendar .calendar__days .calendar__day-event { /* Event Bullets */ } .color-calendar .calendar__days .calendar__day-event .calendar__day-bullet { position: absolute; top: 80%; border-radius: 50%; width: 4px; height: 4px; transform: translateX(-50%); overflow: hidden; cursor: pointer; z-index: 1; } .color-calendar .calendar__days .calendar__day-selected:not(.calendar__day-today) .calendar__day-box { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: calc(55% + 8px); height: 90%; z-index: -1; cursor: pointer; } .color-calendar .calendar__picker { position: absolute; z-index: 201; width: 100%; top: 75px; left: 0; bottom: 0; background-color: white; display: flex; align-items: center; justify-content: center; visibility: hidden; opacity: 0; transition: all 0.3s ease; font-family: var(--cal-font-family-body); } .color-calendar .calendar__picker:focus-visible { outline: 2px solid var(--cal-color-primary); outline-offset: 2px; border-radius: var(--cal-border-radius); } .color-calendar .calendar__picker .calendar__picker-month { width: 100%; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-rows: repeat(4, minmax(0, 1fr)); grid-gap: 1rem 6%; gap: 1rem 6%; margin: 8%; transition: none; } .color-calendar .calendar__picker .calendar__picker-month-option { position: relative; text-align: center; padding: 15px 0; font-weight: 700; color: #323232; border-radius: var(--cal-border-radius); align-self: center; cursor: pointer; background: none; border: none; margin: 0; font-family: inherit; font-size: inherit; cursor: pointer; outline: none; } .color-calendar .calendar__picker .calendar__picker-month-option:focus-visible { outline: 2px solid var(--cal-color-primary); outline-offset: 2px; border-radius: var(--cal-border-radius); } .color-calendar .calendar__picker .calendar__picker-month-option::after { content: ""; width: 100%; height: 50px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: var(--cal-color-primary); border-radius: var(--cal-border-radius); opacity: 0.1; z-index: -1; } .color-calendar .calendar__picker .calendar__picker-month-option:hover:after { opacity: 0.08; } .color-calendar .calendar__picker .calendar__picker-month-selected { color: white; } .color-calendar .calendar__picker .calendar__picker-month-selected::after { opacity: 1; } .color-calendar .calendar__picker .calendar__picker-month-selected:hover:after { opacity: 0.9; } .color-calendar .calendar__picker .calendar__picker-year { width: 100%; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-rows: repeat(4, minmax(0, 1fr)); grid-gap: 1rem 6%; gap: 1rem 6%; margin: 8%; transition: none; } .color-calendar .calendar__picker .calendar__picker-year-option { position: relative; text-align: center; padding: 15px 0; font-weight: 700; color: #323232; border-radius: var(--cal-border-radius); align-self: center; cursor: pointer; background: none; border: none; margin: 0; font-family: inherit; font-size: inherit; cursor: pointer; outline: none; } .color-calendar .calendar__picker .calendar__picker-year-option:focus-visible { outline: 2px solid var(--cal-color-primary); outline-offset: 2px; border-radius: var(--cal-border-radius); } .color-calendar .calendar__picker .calendar__picker-year-option::after { content: ""; width: 100%; height: 50px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: var(--cal-color-primary); border-radius: var(--cal-border-radius); opacity: 0.1; z-index: -1; } .color-calendar .calendar__picker .calendar__picker-year-option:hover:after { opacity: 0.08; } .color-calendar .calendar__picker .calendar__picker-year-selected { color: white; } .color-calendar .calendar__picker .calendar__picker-year-selected::after { opacity: 1; } .color-calendar .calendar__picker .calendar__picker-year-selected:hover:after { opacity: 0.9; } .color-calendar .calendar__picker .calendar__picker-year-arrow { position: absolute; opacity: 0.4; border-radius: var(--cal-border-radius); cursor: pointer; transition: all 0.3s ease; background: none; border: none; padding: 0; margin: 0; font-family: inherit; font-size: inherit; color: inherit; cursor: pointer; outline: none; } .color-calendar .calendar__picker .calendar__picker-year-arrow:focus-visible { outline: 2px solid var(--cal-color-primary); outline-offset: 2px; border-radius: var(--cal-border-radius); } .color-calendar .calendar__picker .calendar__picker-year-arrow-left { top: 0; bottom: 0; left: 0; display: flex; align-items: center; justify-content: center; padding-left: 10px; padding-right: 4px; } .color-calendar .calendar__picker .calendar__picker-year-arrow-right { top: 0; bottom: 0; right: 0; display: flex; align-items: center; justify-content: center; padding-left: 4px; padding-right: 10px; } .color-calendar .calendar__picker .calendar__picker-year-arrow:hover { opacity: 1; background-color: #f8f8f8; } .chevron-thin-left { display: inline-block; border-right: 2px solid var(--cal-color-primary); border-bottom: 2px solid var(--cal-color-primary); width: 10px; height: 10px; transform: rotate(-225deg); } .chevron-thin-right { display: inline-block; border-right: 2px solid var(--cal-color-primary); border-bottom: 2px solid var(--cal-color-primary); width: 10px; height: 10px; transform: rotate(-45deg); } .color-calendar.month-left-align .calendar__header .calendar__monthyear { grid-column: 1/span 5; margin: 0; justify-content: flex-start; padding-left: 5%; } .color-calendar.basic { --cal-color-primary: #000000; --cal-font-family-header: "Work Sans", sans-serif; --cal-font-family-weekdays: "Work Sans", sans-serif; --cal-font-family-body: "Work Sans", sans-serif; --cal-drop-shadow: 0 7px 30px -10px rgba(150, 170, 180, 0.5); --cal-border: none; --cal-border-radius: 0.5rem; --cal-header-color: black; --cal-weekdays-color: black; border-radius: 0.5rem; border-radius: var(--cal-border-radius); box-shadow: 0 7px 30px -10px rgba(150, 170, 180, 0.5); box-shadow: var(--cal-drop-shadow); color: #000000; color: var(--cal-color-primary); background-color: white; border: none; border: var(--cal-border); } .color-calendar.basic .calendar__header { padding: 20px 14px 0px 14px; color: var(--cal-header-color); } .color-calendar.basic .calendar__monthyear { font-weight: 600; color: var(--cal-header-color); } .color-calendar.basic .calendar__arrow-inner { border-radius: 50%; } .color-calendar.basic .calendar__arrow-inner::before { content: ""; width: 0.6em; height: 0.6em; position: absolute; border-style: solid; border-width: 0.15em 0.15em 0 0; display: inline-block; transform-origin: center center; transform: rotate(-45deg); border-radius: 1px; color: var(--cal-header-color); } .color-calendar.basic .calendar__arrow-inner::after { content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 35px; height: 35px; border-radius: 50%; background-color: var(--cal-header-color); opacity: 0; z-index: -1; transition: opacity 0.3s ease; will-change: opacity; } .color-calendar.basic .calendar__arrow-inner:hover::after { transition: opacity 0.3s ease; opacity: 0.05; } .color-calendar.basic .calendar__arrow-prev { position: relative; display: flex; align-items: center; justify-content: center; } .color-calendar.basic .calendar__arrow-prev .calendar__arrow-inner::before { margin-left: 0.3em; transform: rotate(-135deg); } .color-calendar.basic .calendar__arrow-next { position: relative; display: flex; align-items: center; justify-content: center; } .color-calendar.basic .calendar__arrow-next .calendar__arrow-inner::before { margin-right: 0.3em; transform: rotate(45deg); } .color-calendar.basic .calendar__body { padding: 14px; } .color-calendar.basic .calendar__weekdays { display: grid; grid-template-columns: repeat(7, minmax(20px, 55px)); margin-bottom: 5px; } .color-calendar.basic .calendar__weekdays .calendar__weekday { font-weight: 500; opacity: 0.6; color: var(--cal-weekdays-color); } .color-calendar.basic .calendar__days .calendar__day-other { color: var(--cal-color-primary); opacity: 0.2; } .color-calendar.basic .calendar__days .calendar__day { font-weight: 600; } .color-calendar.basic .calendar__days .calendar__day-today { font-weight: 700; color: var(--cal-color-primary); } .color-calendar.basic .calendar__days .calendar__day-today .calendar__day-box { border-radius: 0.5rem; background-color: var(--cal-color-primary); opacity: 0.1; } .color-calendar.basic .calendar__days .calendar__day-text:hover ~ .calendar__day-box { opacity: 0.1; } .color-calendar.basic .calendar__days .calendar__day-bullet:hover ~ .calendar__day-box { opacity: 0.1; } .color-calendar.basic .calendar__days .calendar__day-box { border-radius: 0.5rem; background-color: var(--cal-color-primary); box-shadow: 0 3px 15px -5px var(--cal-color-primary); } .color-calendar.basic .calendar__days .calendar__day-box:hover { opacity: 0.1; } .color-calendar.basic .calendar__days .calendar__day-event { font-weight: 700; } .color-calendar.basic .calendar__days .calendar__day-selected { color: white; font-weight: 700; } .color-calendar.basic .calendar__days .calendar__day-selected .calendar__day-box { border-radius: 0.5rem; background-color: var(--cal-color-primary); opacity: 1; box-shadow: 0 3px 15px -5px var(--cal-color-primary); } .color-calendar.basic .calendar__days .calendar__day-selected .calendar__day-bullet { background-color: white !important; } .color-calendar.basic .calendar__days .calendar__day-selected .calendar__day-text:hover ~ .calendar__day-box { opacity: 1; } .color-calendar.basic .calendar__days .calendar__day-selected .calendar__day-bullet { background-color: white; } .color-calendar.basic .calendar__days .calendar__day-selected .calendar__day-bullet:hover ~ .calendar__day-box { opacity: 1; } .color-calendar.basic .calendar__picker { background-color: white; border-radius: var(--cal-border-radius); } .color-calendar.basic .calendar__picker-month-today { box-shadow: inset 0px 0px 0px 1px var(--cal-color-primary); } .color-calendar.basic .calendar__picker-year-today { box-shadow: inset 0px 0px 0px 1px var(--cal-color-primary); } .color-calendar.basic.color-calendar--small { font-size: 0.8rem; } .color-calendar.basic.color-calendar--small .calendar__header { padding: 10px 10px 0 10px; grid-template-columns: repeat(7, minmax(25px, 41px)); } .color-calendar.basic.color-calendar--small .calendar__header .calendar__monthyear { font-size: 1.2rem; } .color-calendar.basic.color-calendar--small .calendar__header .calendar__arrow-inner, .color-calendar.basic.color-calendar--small .calendar__header .calendar__arrow-inner::after { width: 30px; height: 30px; } .color-calendar.basic.color-calendar--small .calendar__body { padding: 0 10px 10px 10px; } .color-calendar.basic.color-calendar--small .calendar__body .calendar__weekdays { grid-template-columns: repeat(7, minmax(25px, 41px)); margin-bottom: 0; } .color-calendar.basic.color-calendar--small .calendar__body .calendar__days { grid-template-columns: repeat(7, minmax(25px, 41px)); grid-template-rows: repeat(6, minmax(30px, 35px)); } .color-calendar.basic.color-calendar--small .calendar__body .calendar__picker { top: 55px; } .color-calendar.basic.color-calendar--small .calendar__body .calendar__picker .calendar__picker-month-option { padding: 10px 0; } .color-calendar.basic.color-calendar--small .calendar__body .calendar__picker .calendar__picker-month-option::after { height: 40px; } .color-calendar.basic.color-calendar--small .calendar__body .calendar__picker .calendar__picker-year-option { padding: 10px 0; } .color-calendar.basic.color-calendar--small .calendar__body .calendar__picker .calendar__picker-year-option::after { height: 40px; }