keen-dashboard-builder
Version:
Dashboard builder for Keen.io
1,316 lines (1,128 loc) • 23.9 kB
CSS
/* // colors
// #f9f9f9
// #000
// #f5f5f5
// #d3d3d3
// #929191
// #2f97b9
// #fff
// #eee
// #fdfdfd
// #f3f3f3
// #7c7c7c
// #6f6f6fa8
// #808080
// #ccc
// #cfcfcf
// #414141 */
body {
margin: 0;
}
.dashboard-builder {
width: 100%;
margin: 0;
height: 100vh;
position: relative;
display: flex;
justify-content: center;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
background: #f9f9f9;
color: #000;
overflow: hidden;
box-sizing: border-box;
&.container {
width: 1200px;
min-height: 100vh;
height: auto;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-content: flex-start;
justify-content: flex-start;
background: #f5f5f5;
}
.dashboard {
position: relative;
width: 100%;
min-height: calc(100vh - 130px);
padding: 20px;
box-sizing: border-box;
&-container {
width: 100%;
overflow: auto;
padding-left: 60px;
&-viewer {
width: 100%;
overflow: auto;
.dashboard-top-bar {
width: 100%;
z-index: 1010;
.export-icon {
margin: 0 1rem;
order: 2;
flex-shrink: 0;
}
}
}
}
&-inner-container {
background: #fdfdfd;
margin: auto;
}
&-title {
height: 60px;
width: 100%;
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.5rem;
input {
border: 0;
background: inherit;
width: 100%;
font-size: 30px;
outline: none;
padding: 5px 5px 5px 0;
}
.title {
padding: 20px;
}
a {
text-decoration: none;
}
}
&-top-bar {
height: 50px;
width: 100%;
background: #f9f9f9;
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: center;
position: sticky;
top: 0;
left: 0;
z-index: 999;
&__menu {
flex-shrink: 0;
display: flex;
align-items: center;
}
.share {
position: relative;
}
.share,
.embed {
margin: 0 1rem;
cursor: pointer;
}
}
&-list-item {
width: 20%;
min-width: 180px;
height: 200px;
padding: 10px;
position: relative;
&:hover {
& > .dashboard-list-item-buttons {
visibility: visible;
}
}
&-box {
background: #fff;
display: flex;
justify-content: center;
align-items: center;
border: 1px solid #eee;
border-radius: 5px;
width: 100%;
height: 100%;
transition: box-shadow 0.3s;
color: #000;
padding: 10px;
text-align: center;
&:hover {
box-shadow: -6px 6px 8px 0 rgba(0, 0, 0, 0.23);
}
time {
position: absolute;
bottom: 15px;
left: 20px;
color: rgb(170, 170, 170);
font-size: 12px;
}
}
&-buttons {
position: absolute;
top: 15px;
right: 15px;
cursor: pointer;
visibility: hidden;
}
}
&-saved-message {
position: absolute;
top: 0.5rem;
left: 45%;
padding: 0.5rem 1rem;
border-radius: 5px;
background: #333;
color: #fff;
font-size: 0.85rem;
z-index: 1001;
}
img {
width: 100%;
height: 100%;
}
}
.toolbar {
position: absolute;
left: 0;
top: 0;
width: 60px;
height: 100%;
z-index: 1000;
&-bar {
width: 100%;
height: 100%;
position: relative;
z-index: 6;
border-right: 1px solid #929191;
padding: 20px;
background: #2f97b9;
color: #fff;
cursor: pointer;
h3 {
transform: translate(0, 100%) rotate(-90deg);
transform-origin: 0 0;
white-space: nowrap;
overflow: hidden;
position: absolute;
top: 110px;
left: 15px;
color: #fff;
}
}
&-container {
position: absolute;
left: -135px;
height: 100%;
border-right: 1px solid #929191;
background: #fff;
box-shadow: 3px 3px 6px #eee;
border-right: 0;
overflow-y: auto;
transition: left 250ms ease-out;
}
&-hidden {
width: 90px;
display: flex;
flex-direction: row;
flex-wrap: wrap;
padding: 10px 10px 10px 20px;
& > h4 {
font-size: 0.7rem;
width: 100%;
margin: 2rem 0 0.5rem;
font-weight: 400;
text-transform: uppercase;
&:first-of-type {
margin-top: 1rem;
}
}
p {
cursor: pointer;
z-index: 5;
margin: 0;
padding: 5px;
width: 50px;
height: 50px;
display: flex;
align-items: center;
justify-content: center;
background: #fff;
}
.metric-chart-icon {
font-size: 20px;
font-weight: 600;
}
}
&-visible {
left: 60px;
}
}
.burger-icon {
padding: 0 20px;
cursor: pointer;
position: relative;
.fa-bars {
color: #2f97b9;
}
}
.modal {
display: block;
position: absolute;
background: #fff;
border: 1px solid #eee;
border-radius: 5px;
z-index: 1001;
top: 0;
left: 20px;
right: auto;
bottom: auto;
font-size: 14px;
width: 250px;
box-shadow: -6px 6px 8px 0 rgba(0, 0, 0, 0.23);
&-header {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
padding: 15px;
border-bottom: 1px solid #eee;
font-size: 17px;
.svg-inline--fa {
cursor: pointer;
}
}
.dashboards-filter {
padding: 0.25rem 1rem;
border-bottom: 1px solid #eee;
display: flex;
justify-content: space-between;
input {
font-size: 14px;
}
}
&-body {
padding: 15px;
max-height: 300px;
overflow: auto;
.item {
padding: 1rem;
border-bottom: 1px solid #eee;
display: flex;
flex-direction: column;
&:hover {
background: #f3f3f3;
}
.time {
color: rgb(170, 170, 170);
font-size: 12px;
}
}
.active {
background: #f9f9f9;
.fa-angle-double-right {
color: #2f97b9;
padding-right: 5px;
}
}
.modal-input {
padding: 8px 4px;
margin-bottom: 0.5em;
width: 100%;
}
.prism {
margin-bottom: 40px;
white-space: pre-wrap;
}
}
&-button {
border-radius: 5px;
padding: 5px 15px;
cursor: pointer;
color: #fff;
background: #2f97b9;
border: none;
font-size: 14px;
line-height: 1;
.svg-inline--fa {
margin-right: 0.25rem;
}
}
&-footer {
padding: 10px;
}
&-cover {
width: 100%;
height: 100%;
opacity: 0.4;
background: #000;
position: absolute;
top: 0;
left: 0;
z-index: 1000;
}
&.share-dashboard {
width: 500px;
top: 50px;
left: 50%;
transform: translateX(-50%);
}
&.embed-dashboard {
width: 75%;
max-width: 700px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
.modal-button {
position: fixed;
bottom: 15px;
left: 15px;
}
}
}
.editor-dashboard-switch {
.modal-body {
padding: 0;
}
}
.paragraph {
padding: 0 10px;
overflow: hidden;
width: 100%;
p {
margin: 0;
}
}
.keen-dataviz {
padding: 15px;
border: 1px solid #ccc;
.keen-dataviz {
padding: 0;
border: none;
}
}
.chart-container {
background: #fff;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
border-radius: 5px;
display: flex;
flex-direction: column;
transition: box-shadow 0.3s;
z-index: 1;
&:hover {
box-shadow: -6px 6px 8px 0 rgba(0, 0, 0, 0.23);
z-index: 101;
.config-buttons {
visibility: visible;
}
}
img {
border-radius: 5px;
}
& > .keen-dataviz {
overflow: auto;
width: 100%;
margin-top: 0;
border: 1px solid #eee;
}
&-viewer {
background: #fff;
display: flex;
justify-content: center;
align-items: center;
border-radius: 5px;
display: flex;
flex-direction: column;
transition: box-shadow 0.3s;
z-index: 1;
position: relative;
.c3-tooltip-container {
z-index: 1000;
}
&:hover {
.explorer-button {
visibility: visible;
}
}
img {
border-radius: 5px;
}
& > .keen-dataviz {
overflow: auto;
width: 100%;
margin-top: 0;
border: 1px solid #eee;
}
}
}
.config-buttons {
position: absolute;
top: -1px;
right: -35px;
display: flex;
flex-direction: column;
visibility: hidden;
padding-left: 5px;
opacity: 1;
div {
cursor: pointer;
width: 30px;
height: 30px;
background: #000;
color: #fff;
font-size: 15px;
box-sizing: border-box;
margin-bottom: 2px;
display: flex;
align-items: center;
justify-content: center;
opacity: 0.7;
border-radius: 3px;
&:hover {
background: #424242;
}
}
}
.explorer-button {
position: absolute;
z-index: 4;
top: 2px;
right: 2px;
cursor: pointer;
width: 30px;
height: 30px;
background: #000;
color: #fff;
box-sizing: border-box;
opacity: 0.7;
border-radius: 3px;
padding-left: 8px;
padding-top: 2px;
visibility: hidden;
& a {
color: #fff;
}
&:hover {
background: #424242;
}
}
.top-left {
left: 0;
top: 0;
cursor: nwse-resize;
width: 10px;
height: 10px;
z-index: 4;
}
.top-right {
right: 0;
top: 0;
cursor: nesw-resize;
width: 10px;
height: 10px;
z-index: 4;
}
.bottom-left {
left: 0;
bottom: 0;
cursor: nesw-resize;
width: 10px;
height: 10px;
z-index: 4;
}
.bottom-right {
right: 1px;
bottom: 1px;
cursor: nwse-resize;
width: 12px;
height: 12px;
z-index: 4;
border-style: solid;
border-width: 0 0 12px 12px;
border-color: transparent transparent #7c7c7c transparent;
}
.left {
left: 0;
top: 0;
height: 100%;
width: 5px;
cursor: ew-resize;
z-index: 3;
}
.right {
right: 0;
top: 0;
height: 100%;
width: 5px;
cursor: ew-resize;
z-index: 3;
}
.top {
left: 0;
top: 0;
width: 100%;
height: 5px;
cursor: ns-resize;
z-index: 3;
}
.bottom {
left: 0;
bottom: 0;
width: 100%;
height: 5px;
cursor: ns-resize;
z-index: 3;
}
.keen-dataviz-table {
th {
z-index: 0;
}
}
.keen-dataviz-title {
padding-top: 5px;
}
.keen-dataviz-title,
.keen-dataviz-metric-title,
.keen-dataviz-subtitle,
.keen-dataviz-metric-subtitle {
padding-left: 10px;
padding-right: 10px;
}
.chart-draggable {
position: absolute;
left: 10px;
width: calc(100% - 20px);
height: calc(100% - 20px);
z-index: 2;
cursor: move;
}
.search {
width: 65%;
height: 100%;
display: flex;
flex-direction: row;
font-size: 15px;
align-items: center;
svg {
margin-right: 10px;
}
input {
border: 0;
background: inherit;
width: 100%;
height: 100%;
outline: none;
font-size: 20px;
}
}
.sorting-select {
width: 200px;
margin-top: 15px;
}
.screen-resize-icon {
display: flex;
color: #6f6f6fa8;
align-items: center;
flex: 1;
justify-content: center;
svg {
margin: 0 1rem;
cursor: pointer;
&:hover {
color: #000;
}
}
}
.save-dashboard-button {
border-radius: 5px;
padding: 5px;
cursor: pointer;
transition: 0.3s;
width: 80px;
height: 31px;
margin-right: 20px;
margin-left: 20px;
text-align: center;
color: #fff;
background: #2f97b9;
text-transform: uppercase;
line-height: 1;
svg {
margin-right: 0.25rem;
}
}
.settings {
width: 350px;
background: #F3F7F9;
h4 {
margin-top: 2rem;
margin-bottom: 0.5rem;
font-weight: normal;
}
&-wrapper {
padding: 1rem;
}
&-input {
color: hsl(0,0%,20%);
width: 100%;
font-size: 14px;
border-radius: 4px;
padding: 9px;
border: 1px solid #ccc;
outline: none;
height: 38px;
}
&-textarea {
color: #808080;
width: 100%;
font-size: 16px;
border-radius: 4px;
padding: 9px;
border: 1px solid #ccc;
height: 50%;
outline: none;
}
&-select {
& > div {
width: 100%;
}
}
&-chart {
padding: 0;
&-saved-query {
padding: 1rem;
}
#dashboard-builder-explorer {
.keen-explorer {
.panel-main {
min-width: 0;
max-width: 330px;
box-shadow: none;
}
}
}
.keen-theme-builder {
padding: 0;
.builder__header {
display: none;
}
.keen-theme-builder__row {
padding-left: 1rem;
padding-right: 1rem;
}
.accordion__item__content {
.keen-theme-builder__row {
padding: 0;
}
}
}
h4 {
&:first-child {
margin-top: 0;
}
}
}
}
.react-tabs__tab {
width: 50%;
padding: 10px;
text-align: center;
cursor: pointer;
color: #fff;
outline: none;
border: 0;
background: #2f97b9;
&:first-of-type {
border-right: none;
}
&--selected {
color: #000;
border-bottom: none;
background: #fff;
border-top: 1px solid #eee;
}
&-list {
display: flex;
flex-direction: row;
list-style: none;
justify-content: space-between;
padding: 0;
margin-block-end: 0;
}
&-panel {
border: 0;
&--selected {
padding: 10px 20px 20px 20px;
border: 0;
visibility: visible;
height: calc(100vh - 40px);
overflow-y: auto;
.keen-theme-builder {
padding: 0;
}
}
}
}
.settings-container {
min-width: 350px;
min-height: 100%;
background: #fff;
border-left: 1px solid #eee;
position: relative;
background: #F3F7F9;
overflow: auto;
.color-palette__item {
.color-picker__popover {
left: 0;
right: auto;
}
&:nth-child(even) {
.color-picker__popover {
left: auto;
right: 0;
}
}
}
}
.new-dashboard-button {
border-radius: 5px;
padding: 1rem;
cursor: pointer;
color: #fff;
background: #2f97b9;
text-align: left;
white-space: nowrap;
display: flex;
align-items: center;
&:hover {
color: #fff;
background: #2f97b9;
}
svg {
margin-right: 0.5rem;
}
}
.container {
width: 1200px;
background: #f5f5f5;
min-height: 100vh;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-content: flex-start;
}
.top-toolbar {
flex: 1 100%;
padding: 20px;
display: flex;
flex-direction: row;
justify-content: space-between;
width: 100%;
border-bottom: 1px solid #cfcfcf;
}
.message {
width: 100%;
text-align: center;
padding: 20px;
}
.new-chart-info {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
background: rgba(251, 251, 251, 0.9);
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
}
.settings-loading {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
background: rgba(251, 251, 251, 0.9);
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
}
.error-message {
z-index: 1;
background: #fff;
padding: 20px;
text-align: center;
color: red;
border: 1px solid red;
border-radius: 5px;
}
.dry-run-message {
position: absolute;
left: 0;
bottom: 0;
padding: 1rem;
background: #6f6f6fa8;
color: #fff;
border-radius: 0 1rem 0 0;
}
.select-palette-button {
select {
margin-right: 20px;
border-radius: 5px;
padding: 8px;
width: 100px;
height: 31px;
background: #fff;
}
}
.preview {
padding: 10px;
a {
color: #000;
}
}
.preview:hover a,
.share-icon:hover,
.embed-icon:hover {
color: #414141;
}
.quill {
height: 70%;
}
.edit-dashboard-button {
border-radius: 5px;
padding: 5px 10px;
cursor: pointer;
width: fit-content;
text-align: center;
color: #fff;
background: #2f97b9;
text-decoration: none;
flex-shrink: 0;
margin: 0 0 0 0.5em;
&__link {
display: block;
color: #ffffff;
text-decoration: none;
&:hover {
color: #ffffff;
text-decoration: none;
}
}
}
.big-icon {
font-size: 50px;
color: #eee;
}
.loading {
font-size: 50px;
animation: spin 1s ease infinite;
z-index: 2000;
}
.settings-theme-builder {
padding: 0;
.keen-theme-builder {
padding: 0;
.builder__header {
display: none;
}
}
}
.switch-dashboard {
width: 400px;
z-index: 1000;
}
.__react_component_tooltip {
padding: 3px 5px;
}
.keen-theme-builder {
background-color: #fff;
.color-picker__popover {
z-index: 1000;
}
.builder__header {
display: none;
}
}
.heatmap-container {
.keen-dataviz-rendering-vertical {
height: calc(100% - 50px);
}
}
.keen-dataviz .rangeable-container {
margin: 2rem auto;
width: 75%;
}
.keen-dataviz .rangeable-container .rangeable-track,
.keen-dataviz .rangeable-container .rangeable-progress {
height: 4px;
}
.keen-dataviz .rangeable-container .rangeable-handle {
width: 16px;
height: 16px;
border-width: 4px;
}
.keen-dataviz .rangeable-container .rangeable-tooltip {
border-radius: 0;
font-weight: normal;
padding: 3px 9px;
}
.c3-circle {
fill: currentColor;
}
@media only screen and (max-width: 1300px) {
.dashboard {
min-height: calc(100vh - 130px);
}
}
@media only screen and (min-width: 1800px) {
.toolbar-bar {
visibility: hidden;
}
.toolbar-container {
left: 0;
}
.dashboard-container {
padding-left: 90px;
}
}
.export-icon {
cursor: pointer;
}
.switcher {
margin-bottom: 0.5rem;
display: block;
position: relative;
overflow: hidden;
&__input {
&:checked ~ .switcher__toggle {
border-color: #3ED08E;
background-color: #DCF9EB;
}
&:checked ~ .switcher__toggle .switcher__switch {
right: 2px;
background-color: #3ED08E;
}
&:checked ~ .switcher__value .on {
display: block;
}
&:checked ~ .switcher__value .off {
display: none;
}
}
&__toggle {
position: relative;
width: 36px;
height: 20px;
margin-right: 0.25rem;
margin-left: 0.5rem;
border: 1px solid #ccc;
background-color: #fff;
border-radius: 10px;
display: inline-block;
}
&__switch {
position: absolute;
top: 2px;
bottom: 0;
right: 18px;
width: 14px;
height: 14px;
margin: 0;
background: #ccc;
border-radius: 50%;
flex-shrink: 0;
transition: right 0.15s ease-in-out, background-color 0.15s ease-in-out;
}
&__title {
font-weight: 800;
}
&__label {
display: flex;
align-items: center;
cursor: pointer;
}
&__input {
position: absolute;
left: -999px;
}
&__value {
margin-left: 0.25rem;
color: #B3B5B6;
.on {
display: none;
}
.off {
display: block;
}
}
}
.layout {
&.editor {
.keen-dataviz {
.c3-chart {
pointer-events: none;
}
}
}
}
.react-grid-item {
&:hover {
z-index: 100;
.config-buttons {
visibility: visible;
}
}
& > .react-resizable-handle {
width: 16px;
height: 16px;
background-color: transparent;
background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0IiB2aWV3Qm94PSI5Mi43MjYzMzE4ODA1ODUzOCA4My45MzgyNjA0OTcxMDkwMSA0NzQuMTIxNzExMjU2OTYxIDQ3NC4xMjM0NzkwMDU3ODIiIHdpZHRoPSI0NzAuMTIiIGhlaWdodD0iNDcwLjEyIj48ZGVmcz48cGF0aCBkPSJNMTg1LjY1IDI0Ny41N0w0MDEuMjEgNDYzLjE0QzM3Ni43OSA0ODcuNTYgMzYzLjIyIDUwMS4xMyAzNjAuNSA1MDMuODVDMzQxLjYgNTIyLjc1IDM1NC45OSA1NTUuMDYgMzgxLjcyIDU1NS4wNkMzOTYuOTMgNTU1LjA2IDUxOC42MyA1NTUuMDYgNTMzLjg1IDU1NS4wNkM1NTAuNDIgNTU1LjA2IDU2My44NSA1NDEuNjMgNTYzLjg1IDUyNS4wNkM1NjMuODUgNTA5Ljg1IDU2My44NSAzODguMTQgNTYzLjg1IDM3Mi45M0M1NjMuODUgMzQ2LjIgNTMxLjUzIDMzMi44MiA1MTIuNjMgMzUxLjcyQzUwOS45MiAzNTQuNDMgNDk2LjM1IDM2OCA0NzEuOTIgMzkyLjQzTDI1Ni4zNiAxNzYuODZDMjgwLjc5IDE1Mi40NCAyOTQuMzYgMTM4Ljg3IDI5Ny4wNyAxMzYuMTVDMzE1Ljk3IDExNy4yNSAzMDIuNTkgODQuOTQgMjc1Ljg2IDg0Ljk0QzI2MC42NSA4NC45NCAxMzguOTQgODQuOTQgMTIzLjczIDg0Ljk0QzEwNy4xNiA4NC45NCA5My43MyA5OC4zNyA5My43MyAxMTQuOTRDOTMuNzMgMTMwLjE1IDkzLjczIDI1MS44NiA5My43MyAyNjcuMDdDOTMuNzMgMjkzLjggMTI2LjA0IDMwNy4xOCAxNDQuOTQgMjg4LjI4QzE1MC4zNyAyODIuODYgMTYzLjk0IDI2OS4yOSAxODUuNjUgMjQ3LjU3WiIgaWQ9ImFYVDAwb2VrQyI+PC9wYXRoPjwvZGVmcz48Zz48Zz48dXNlIHhsaW5rOmhyZWY9IiNhWFQwMG9la0MiIG9wYWNpdHk9IjEiIGZpbGw9IiMwMDAwMDAiIGZpbGwtb3BhY2l0eT0iMSI+PC91c2U+PGc+PHVzZSB4bGluazpocmVmPSIjYVhUMDBvZWtDIiBvcGFjaXR5PSIxIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2Utb3BhY2l0eT0iMCI+PC91c2U+PC9nPjwvZz48L2c+PC9zdmc+');
background-size: contain;
cursor: nwse-resize;
opacity: 0;
will-change: opacity;
transition: opacity 250ms ease-out;
&::after {
content: none;
}
}
&.react-resizable {
&:hover {
.react-resizable-handle {
opacity: 1;
}
}
}
&.react-grid-placeholder {
background: #2f97b9;
}
.keen-dataviz {
overflow: auto;
}
img {
pointer-events: none;
}
}
.react-grid-layout {
min-height: 230px;
}
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@keyframes fadein {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}