perspective 2.0.0

A data visualization and analytics component, especially well-suited for large and/or streaming datasets.
/******************************************************************************
 *
 * Copyright (c) 2017, the Perspective Authors.
 *
 * This file is part of the Perspective library, distributed under the terms
 * of the Apache License 2.0.  The full license can be found in the LICENSE
 * file.
 *
 */

:host {
    #status_bar.titled {
        padding-right: 108px;

        #menu-bar {
            opacity: 0.2;
        }
    }

    // When settings open ...
    #main_column #status_bar,
    #main_column #status_bar.titled {
        padding-right: 36px;


        #menu-bar {
            opacity: 1;
        }
    }

    #status_bar {
        overflow: hidden;
        display: flex;
        align-items: center;
        background: var(--plugin--background);
        padding-left: 8px;
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        height: 48px;

        .input-sizer {
            display: inline-block;
            align-items: center;
            position: relative;
            margin-top: 1px;
            min-width: 65px;
            overflow: hidden;

            &:after,
            input,
            textarea {
                width: auto;
                grid-area: 1 / 1;
                font-family: inherit;
            }

            input,
            textarea {
                // grid-area: 1 / 1;
                position: absolute;
                left: 0;
                right: 0;
                text-overflow: ellipsis;
                padding: 0;
                border: none;
                background: transparent;
                font-size: 12px;
                color: inherit;
                height: 100%;
            }

            &:after {
                content: attr(data-value) " ";
                color: var(--inactive--color, inherit);
                visibility: hidden;
                white-space: nowrap;
                padding-right: 12px;
                font-size: 12px;
            }

            &:focus-within {
                textarea:focus,
                input:focus {
                    outline: none;
                }
            }
        }
        
        .app-title {
            margin-left: 12px;
            font-size: 16px;
        }

        .section {
            display: flex;
            align-items: center;
        }

        #rows {
            flex: 1 1000 auto;
            overflow: hidden;
            span {
                white-space: nowrap;
                font-size: 12px;
            }
        }

        // Exceptions when the menu bar is visible and the settings panel is closed.
        
        #menu-bar {
            overflow: hidden;
            flex: 0 1000000 auto;
            .button {
                height: 36px;
                select { 
                    height: 34px;
                    font-size: 9px;
                }
            }
        }

        #plugin-settings {
            margin-left: auto;
        }

        #counter-arrow:before {
            content: var(--status-bar-counter--content, "arrow_back");
        }

        span {
            font-size: 9px;
            margin: 0px 10px;
            user-select: none;
            height: 100%;
            line-height: 36px;

            &:before {
                margin-right: 4px;
                position: relative;
            }

            &:hover {
                color: inherit;
            }
        }

        span#rows {
            margin-left: 2px;
        }

        span.icon {
            height: 100%;
            line-height: 36px;
            margin: 0;
        }

        span#status {
            &:before {
                top: -1px;
                color: #ccc;
                font-size: 8px;
                content: var(--status-icon--content, "\2B24");
            }

            &.connected,
            &.error,
            &.initializing {
                opacity: 1;
            }

            &.connected:before {
                color: rgb(51, 159, 77);
            }

            &.initializing:before {
                color: rgb(223, 198, 57);
            }

            &.error:before {
                color: rgb(252, 64, 52);
            }
        }

        span.button:before {
            height: 21px;
            width: 21px;
            background-repeat: no-repeat;
            background-color: var(--icon--color);
            content: "";
            -webkit-mask-size: cover;
            mask-size: cover;
            pointer-events: none;
        }

        span#export {
            &:before {
                -webkit-mask-image:  url("../svg/export-icon.svg");
                mask-image:  url("../svg/export-icon.svg");
            }
        }

        span#lock {
            &:before {
                -webkit-mask-image:  url("../svg/free-scroll-icon.svg");
                mask-image:  url("../svg/free-scroll-icon.svg");
            }
        }

        span#reset {
            &:before {
                -webkit-mask-image:  url("../svg/revert-icon.svg");
                mask-image:  url("../svg/revert-icon.svg");
            }
        }

        span#copy {
            &:before {
                -webkit-mask-image:  url("../svg/duplicate-icon.svg");
                mask-image:  url("../svg/duplicate-icon.svg");
            }
        }

        span#theme {
            &:before {
                -webkit-mask-image:  url("../svg/theme-icon.svg");
                mask-image:  url("../svg/theme-icon.svg");
            }
        }

        span.button {
            display: inline-flex;
            align-items: center;
            margin: 0px;
            padding: 0 5px 0px 10px;
            transition: background-color 0.2s;
            color: var(--inactive--color, #ccc);
            border: 1px solid transparent;
            border-radius: 2px;
            font-size: 9px;

            & > span,
            & > .dropdown-width-container {
                pointer-events: none;
                overflow: hidden;
                display: none;
            }

            &:before {
                z-index: 1;
                font-size: 14px;
            }

            &:hover select {
                background-color: transparent;
            }

            &:hover,
            &.modal-target {
                min-width: var(--button--min-width, 75px);
                color: inherit;
                cursor: pointer;
                transition: none;
                border: 1px solid var(--inactive--color);

                & > span {
                    display: contents;
                }

                & > .dropdown-width-container {
                    overflow: visible;
                    display: inline;
                    pointer-events: all;
                    & > select {
                        cursor: pointer;
                        margin-left: -28px;
                        padding-left: 28px;
                        width: calc(100% + 28px);
                        height: 36px;
                    }
                }
            }
        }
    }
}

// Status bar status icon animations
:host #status_bar.updating span#status {
    animation-name: status-bar-updating;
    animation-duration: var(--status-icon-updating--animation-duration, 1s);
    animation-iteration-count: infinite;
}

:host #status_bar span#status {
    animation-name: status-bar;
    animation-duration: var(--status-icon--animation-duration, 0.5s);
    animation-iteration-count: 1;
}

@keyframes status-bar-updating {
    0% {
        filter: var(--status-icon-updating-keyframes-start--filter, opacity(1));
        transform: var(--status-icon-updating-keyframes-start--transform, none);
    }

    100% {
        filter: var(--status-icon-updating-keyframes-end--filter, opacity(0.2));
        transform: var(--status-icon-updating-keyframes-end--transform, none);
    }
}

@keyframes status-bar {
    0% {
        filter: var(--status-icon-keyframes-start--filter, saturate(4));
        transform: var(--status-icon-keyframes-start--transform, none);
    }

    100% {
        filter: var(--status-icon-keyframes-end--filter, saturate(1));
        transform: var(--status-icon-keyframes-end--transform, none);
    }
}