wikimedia/mediawiki-core

View on GitHub
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less

Summary

Maintainability
Test Coverage
/*!
 * MediaWiki Widgets – CalendarWidget styles.
 *
 * @copyright 2011-2023 MediaWiki Widgets Team and others; see AUTHORS.txt
 * @license The MIT License (MIT); see LICENSE.txt
 */

/* stylelint-disable no-duplicate-selectors */
@import 'mediawiki.skin.variables.less';
@import 'mediawiki.mixins.less';

@calendarWidth: 21em;
@calendarHeight: 14em;

.mw-widget-calendarWidget {
    width: @calendarWidth;
}

.mw-widget-calendarWidget-header {
    position: relative;
    line-height: 2.5;

    // Overwrite OOUI's `.oo-ui-buttonElement-frameless.oo-ui-iconElement:first-child`
    .oo-ui-buttonWidget.oo-ui-iconElement {
        margin-left: 0;
        margin-right: 0;
    }

    .mw-widget-calendarWidget-labelButton {
        margin: 0 auto;
        display: block;
        width: @calendarWidth - 2 * 3em;

        .oo-ui-buttonElement-button {
            width: @calendarWidth - 2 * 3em;
            text-align: center;
        }
    }
}

.mw-widget-calendarWidget-upButton {
    position: absolute;
    top: 0;
    right: 3em;
    pointer-events: none;
}

.mw-widget-calendarWidget-prevButton {
    float: left;
}

.mw-widget-calendarWidget-nextButton {
    float: right;
}

.mw-widget-calendarWidget-body-outer-wrapper {
    clear: both;
    position: relative;
    overflow: hidden;
    // Fit 7 days, 3em each
    width: @calendarWidth;
    // Fit 6 weeks + heading line, 2em each
    height: @calendarHeight;
}

.mw-widget-calendarWidget-body-wrapper {
    .mw-widget-calendarWidget-body {
        display: inline-block;
        display: inline-grid;
        // Fit 7 days, 3em each
        width: @calendarWidth;
        // Fit 6 weeks + heading line, 2em each
        height: @calendarHeight;
    }

    .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):first-child {
        margin-top: -@calendarHeight;
        margin-left: -@calendarWidth;
    }

    .mw-widget-calendarWidget-body:not( .mw-widget-calendarWidget-old-body ):last-child {
        margin-top: 0;
        margin-left: 0;
    }
}

.mw-widget-calendarWidget-body-wrapper-fade-previous {
    width: @calendarWidth * 2;
    height: @calendarHeight;

    .mw-widget-calendarWidget-body:first-child {
        margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
        margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
        transition: margin-left 500ms;
    }
}

.mw-widget-calendarWidget-body-wrapper-fade-next {
    width: @calendarWidth * 2;
    height: @calendarHeight;

    .mw-widget-calendarWidget-body:first-child {
        margin-left: -@calendarWidth !important; /* stylelint-disable-line declaration-no-important */
        margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
        transition: margin-left 500ms;
    }
}

.mw-widget-calendarWidget-body-wrapper-fade-up {
    width: @calendarWidth;
    height: @calendarHeight * 2;

    .mw-widget-calendarWidget-body {
        display: block;
        display: grid;
    }

    .mw-widget-calendarWidget-body:first-child {
        margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
        margin-top: 0 !important; /* stylelint-disable-line declaration-no-important */
        transition: margin-top 500ms;
    }
}

.mw-widget-calendarWidget-body-wrapper-fade-down {
    width: @calendarWidth;
    height: @calendarHeight * 2;

    .mw-widget-calendarWidget-body {
        display: block;
        display: grid;
    }

    .mw-widget-calendarWidget-body:first-child {
        margin-left: 0 !important; /* stylelint-disable-line declaration-no-important */
        margin-top: -@calendarHeight !important; /* stylelint-disable-line declaration-no-important */
        transition: margin-top 500ms;
    }
}

// Support: Browsers that render CSS Grid. All others ignore unknown `grid-*` properties.
// This avoids any calculation issues pushing items to next line.
.mw-widget-calendarWidget-body-month {
    grid-template-columns: auto auto auto auto auto auto auto;
}

.mw-widget-calendarWidget-body-year {
    grid-template-columns: auto auto;
}

.mw-widget-calendarWidget-body-duodecade {
    grid-template-columns: auto auto auto auto auto;
}

.mw-widget-calendarWidget-day,
.mw-widget-calendarWidget-day-heading,
.mw-widget-calendarWidget-month,
.mw-widget-calendarWidget-year {
    display: inline-block;
    vertical-align: middle;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    text-align: center;
}

.mw-widget-calendarWidget-day,
.mw-widget-calendarWidget-day-heading {
    // 7x7 grid
    width: @calendarWidth / 7;
    line-height: @calendarHeight / 7;

    // Don't overlap the hacked-up fake box-shadow border we get when focussed
    &:nth-child( 7n ) {
        width: @calendarWidth / 7 - 0.2em;
        margin-right: 0.2em;
    }

    &:nth-child( 7n+1 ) {
        width: @calendarWidth / 7 - 0.2em;
        margin-left: 0.2em;
    }

    &:nth-child( 42 ) ~ & {
        line-height: @calendarHeight / 7 - 0.2em;
        margin-bottom: 0.2em;
    }
}

.mw-widget-calendarWidget-month {
    // 2x6 grid
    width: @calendarWidth / 2;
    line-height: @calendarHeight / 6;

    // Don't overlap the hacked-up fake box-shadow border we get when focussed
    &:nth-child( 2n ) {
        width: @calendarWidth / 2 - 0.2em;
        margin-right: 0.2em;
    }

    &:nth-child( 2n+1 ) {
        width: @calendarWidth / 2 - 0.2em;
        margin-left: 0.2em;
    }

    &:nth-child( 10 ) ~ & {
        line-height: @calendarHeight / 6 - 0.2em;
        margin-bottom: 0.2em;
    }
}

.mw-widget-calendarWidget-year {
    // 5x4 grid
    width: @calendarWidth / 5;
    line-height: @calendarHeight / 4;

    // Don't overlap the hacked-up fake box-shadow border we get when focussed
    &:nth-child( 5n ) {
        width: @calendarWidth / 5 - 0.2em;
        margin-right: 0.2em;
    }

    &:nth-child( 5n+1 ) {
        width: @calendarWidth / 5 - 0.2em;
        margin-left: 0.2em;
    }

    &:nth-child( 15 ) ~ & {
        line-height: @calendarHeight / 4 - 0.2em;
        margin-bottom: 0.2em;
    }
}

.mw-widget-calendarWidget-item {
    cursor: pointer;
}

/* Theme-specific */
.mw-widget-calendarWidget {
    box-sizing: border-box;
    border: @border-base;
    transition: border-color 100ms, box-shadow 100ms;

    &:focus {
        border-color: @border-color-progressive--focus;
        box-shadow: @box-shadow-inset-small @box-shadow-color-progressive--focus;
        outline: @outline-base--focus;
    }

    &-day {
        color: @color-base;
        border-radius: @border-radius-base;
    }

    &-day-heading {
        color: @color-subtle;
        font-weight: bold;
    }

    &-day-additional {
        color: #a2a9b1;

        &:hover {
            color: #202122;
        }
    }

    &-day-today {
        box-shadow: @box-shadow-inset-small @box-shadow-color-progressive-selected;
    }

    &-item {
        transition: background-color 250ms, color 250ms;

        &:hover {
            background-color: #36c;
            color: #fff;
        }

        &-selected {
            background-color: #2a4b8d;
            color: #fff;
        }
    }
}