@sdziadkowiec/react-datasheet-grid
Version:
An Excel-like React component to create beautiful spreadsheets.
583 lines (522 loc) • 17.8 kB
CSS
:root {
--dsg-border-color: #3a3a3a;
--dsg-selection-border-color: rgb(69, 128, 230);
--dsg-selection-border-radius: 2px;
--dsg-selection-border-width: 2px;
--dsg-selection-background-color: rgba(69, 128, 230, 0.08);
--dsg-selection-disabled-border-color: #666666;
--dsg-selection-disabled-background-color: rgba(255, 255, 255, 0.08);
--dsg-corner-indicator-width: 10px;
--dsg-header-text-color: rgb(180, 180, 180);
--dsg-header-active-text-color: white;
--dsg-cell-background-color: #1e1e1e;
--dsg-cell-disabled-background-color: rgb(40, 40, 40);
--dsg-transition-duration: 0.1s;
--dsg-expand-rows-indicator-width: 10px;
--dsg-scroll-shadow-width: 7px;
--dsg-scroll-shadow-color: rgba(0, 0, 0, 0.4);
}
.dsg-container {
border: solid 1px var(--dsg-border-color);
border-top: none;
border-left: none;
cursor: cell;
user-select: none;
box-sizing: border-box;
color: white;
background: #1e1e1e;
position: relative;
width: 100%;
overflow: auto;
will-change: transform;
direction: ltr;
}
.dsg-corner-indicator {
margin: auto;
width: 0;
border-bottom: solid var(--dsg-corner-indicator-width)
var(--dsg-header-text-color);
border-left: solid var(--dsg-corner-indicator-width) transparent;
}
.dsg-row {
position: absolute;
top: 0;
left: 0;
background: var(--dsg-cell-background-color);
box-shadow: 0 1px var(--dsg-border-color) inset;
}
.dsg-row-header {
position: sticky;
top: 0;
z-index: 40;
}
.dsg-cell {
display: flex;
align-items: center;
box-sizing: border-box;
background: var(--dsg-cell-background-color);
border: solid 1px var(--dsg-border-color);
border-bottom: none;
border-right: none;
box-shadow: 1px 1px var(--dsg-border-color);
position: absolute;
top: 0;
height: 100%;
}
.dsg-hidden-cell {
display: none;
}
.dsg-cell-sticky-right {
position: sticky;
right: 0;
z-index: 30;
margin-left: auto;
transform: translateY(-100%);
}
.dsg-cell-disabled {
background: var(--dsg-cell-disabled-background-color);
}
.dsg-cell-header,
.dsg-cell-gutter {
color: var(--dsg-header-text-color);
transition: color var(--dsg-transition-duration);
box-shadow: none;
}
.dsg-cell-header-container {
padding: 0 10px;
line-height: 15px;
}
.dsg-cell-header.dsg-cell-gutter {
box-shadow: 1px 0 var(--dsg-border-color), 0 1px var(--dsg-border-color);
}
.dsg-cell-header.dsg-cell-sticky-right {
box-shadow: 0 1px var(--dsg-border-color);
}
.dsg-cell-gutter {
position: sticky;
left: 0;
padding: 0 5px;
justify-content: center;
z-index: 30;
height: 100%;
}
.dsg-cell-header-active,
.dsg-cell-gutter-active {
color: var(--dsg-header-active-text-color);
}
.dsg-active-cell,
.dsg-selection-rect {
position: absolute;
border: solid var(--dsg-selection-border-width)
var(--dsg-selection-border-color);
box-sizing: border-box;
border-radius: var(--dsg-selection-border-radius);
transition: all var(--dsg-transition-duration);
pointer-events: none;
z-index: 20;
}
.dsg-active-cell-focus {
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
}
.dsg-active-cell-disabled,
.dsg-selection-rect-disabled {
border-color: var(--dsg-selection-disabled-border-color);
}
.dsg-selection-rect {
background: var(--dsg-selection-background-color);
}
.dsg-selection-rect-disabled {
background: var(--dsg-selection-disabled-background-color);
}
.dsg-scrollable-view-container {
position: absolute;
pointer-events: none;
top: 0;
left: 0;
}
.dsg-scrollable-view {
position: sticky;
z-index: 10;
box-sizing: border-box;
border: solid 1px var(--dsg-border-color);
border-bottom: none;
border-right: none;
transition: box-shadow 0.3s;
box-shadow: 0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-t {
box-shadow: 0 var(--dsg-scroll-shadow-width) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-r {
box-shadow: 0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
calc(0px - var(--dsg-scroll-shadow-width)) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-b {
box-shadow: 0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-l {
box-shadow: 0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
var(--dsg-scroll-shadow-width) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-t.dsg-scrollable-view-r {
box-shadow: 0 var(--dsg-scroll-shadow-width) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
calc(0px - var(--dsg-scroll-shadow-width)) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-r.dsg-scrollable-view-b {
box-shadow: 0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
calc(0px - var(--dsg-scroll-shadow-width)) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-b.dsg-scrollable-view-l {
box-shadow: 0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
var(--dsg-scroll-shadow-width) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-l.dsg-scrollable-view-t {
box-shadow: 0 var(--dsg-scroll-shadow-width) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
var(--dsg-scroll-shadow-width) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-t.dsg-scrollable-view-b {
box-shadow: 0 var(--dsg-scroll-shadow-width) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-l.dsg-scrollable-view-r {
box-shadow: 0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
calc(0px - var(--dsg-scroll-shadow-width)) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
var(--dsg-scroll-shadow-width) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-t.dsg-scrollable-view-r.dsg-scrollable-view-b {
box-shadow: 0 var(--dsg-scroll-shadow-width) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
calc(0px - var(--dsg-scroll-shadow-width)) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-r.dsg-scrollable-view-b.dsg-scrollable-view-l {
box-shadow: 0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
calc(0px - var(--dsg-scroll-shadow-width)) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
var(--dsg-scroll-shadow-width) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-b.dsg-scrollable-view-l.dsg-scrollable-view-t {
box-shadow: 0 var(--dsg-scroll-shadow-width) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
var(--dsg-scroll-shadow-width) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-l.dsg-scrollable-view-t.dsg-scrollable-view-r {
box-shadow: 0 var(--dsg-scroll-shadow-width) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
calc(0px - var(--dsg-scroll-shadow-width)) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
var(--dsg-scroll-shadow-width) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-scrollable-view-t.dsg-scrollable-view-r.dsg-scrollable-view-b.dsg-scrollable-view-l {
box-shadow: 0 var(--dsg-scroll-shadow-width) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
calc(0px - var(--dsg-scroll-shadow-width)) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
0 calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset,
var(--dsg-scroll-shadow-width) 0 var(--dsg-scroll-shadow-width)
calc(0px - var(--dsg-scroll-shadow-width)) var(--dsg-scroll-shadow-color)
inset;
}
.dsg-selection-col-marker-container {
position: absolute;
top: 0;
}
.dsg-selection-col-marker {
background: var(--dsg-selection-border-color);
position: sticky;
width: 100%;
height: var(--dsg-selection-border-width);
}
.dsg-selection-row-marker-container {
position: absolute;
left: 0;
}
.dsg-selection-row-marker {
background: var(--dsg-selection-border-color);
position: sticky;
height: 100%;
width: var(--dsg-selection-border-width);
}
.dsg-selection-col-marker-container,
.dsg-selection-col-marker,
.dsg-selection-row-marker-container,
.dsg-selection-row-marker {
z-index: 20;
transition: all var(--dsg-transition-duration);
pointer-events: none;
}
.dsg-selection-col-marker-disabled,
.dsg-selection-row-marker-disabled {
background: var(--dsg-selection-disabled-border-color);
}
.dsg-add-row {
background: #2a2a2a;
border: 1px solid var(--dsg-border-color);
border-top: none;
padding: 7px 10px;
display: flex;
align-items: center;
color: white;
}
.dsg-add-row > * {
margin-right: 10px;
}
.dsg-add-row-btn,
.dsg-add-row-input {
background: #333333;
padding: 7px 10px;
display: flex;
align-items: center;
position: relative;
border: 1px solid #555555;
border-radius: 2px;
transition: all 0.2s;
color: white;
}
.dsg-add-row-input {
width: 55px;
}
.dsg-add-row-btn:hover,
.dsg-add-row-input:hover {
border-color: #777777;
}
.dsg-add-row-btn:focus,
.dsg-add-row-input:focus {
border-color: var(--dsg-selection-border-color);
outline: none;
}
.dsg-add-row-btn:before {
content: '';
display: inline-block;
margin-right: 10px;
background: #9da6ab;
width: 10px;
height: 2px;
}
.dsg-add-row-btn:after {
content: '';
display: block;
position: absolute;
left: 14px;
margin-right: 10px;
background: #9da6ab;
width: 2px;
height: 10px;
}
.dsg-input {
display: block;
flex: 1;
border: none;
min-width: 0;
align-self: stretch;
box-sizing: border-box;
background: none;
padding: 0 10px;
font-size: 1rem;
outline: none;
color: white;
}
.dsg-input-suffix {
padding-right: 10px;
opacity: 0.5;
margin-left: -5px;
}
.dsg-input-align-right {
text-align: right;
}
.dsg-hide-date-picker[type="date"]::-webkit-inner-spin-button,
.dsg-hide-date-picker[type="date"]::-webkit-calendar-picker-indicator {
display: none;
-webkit-appearance: none;
}
.dsg-checkbox {
margin: auto;
accent-color: var(--dsg-selection-border-color);
}
.dsg-context-menu {
position: fixed;
background: #2a2a2a;
z-index: 10000;
border-radius: 4px;
box-shadow: 0 2px 6px 2px rgba(0, 0, 0, 0.4);
padding: 5px 0;
color: white;
border: 1px solid var(--dsg-border-color);
}
.dsg-context-menu-item {
padding: 3px 20px;
cursor: default;
}
.dsg-context-menu-item:hover {
background: #3a3a3a;
}
.dsg-expand-rows-indicator {
background: var(--dsg-cell-background-color);
border: solid 1px var(--dsg-selection-border-color);
box-shadow: 0 0 0 1px var(--dsg-cell-background-color);
width: var(--dsg-expand-rows-indicator-width);
height: var(--dsg-expand-rows-indicator-width);
box-sizing: border-box;
position: absolute;
transition: all var(--dsg-transition-duration);
cursor: crosshair;
z-index: 25;
}
.dsg-expand-rows-indicator-disabled {
border: solid 1px var(--dsg-selection-disabled-border-color);
}
.dsg-expand-rows-rect {
position: absolute;
box-sizing: border-box;
transition: all var(--dsg-transition-duration);
pointer-events: none;
background: rgba(255, 255, 255, 0.06);
}