* feat: ability to rearrange columns and rows * chore: update delete icon * refactor: table utilities and plugins * chore: handle edge cases * chore: safe pseudo element inserts --------- Co-authored-by: Sriram Veeraghanta <veeraghanta.sriram@gmail.com>
271 lines
6.4 KiB
CSS
271 lines
6.4 KiB
CSS
.table-wrapper {
|
|
overflow-x: auto;
|
|
padding-bottom: 26px;
|
|
|
|
table {
|
|
position: relative;
|
|
border-collapse: collapse;
|
|
table-layout: fixed;
|
|
margin: 0.5rem 0 0 0;
|
|
border: 1px solid rgba(var(--color-border-200));
|
|
width: 100%;
|
|
|
|
td,
|
|
th {
|
|
min-width: 1em;
|
|
border: 1px solid rgba(var(--color-border-300));
|
|
padding: 7px 10px;
|
|
vertical-align: top;
|
|
box-sizing: border-box;
|
|
position: relative;
|
|
transition: background-color 0.3s ease;
|
|
|
|
> * {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
/* Selected cell outline */
|
|
&.selectedCell:not(.content-hidden) {
|
|
user-select: none;
|
|
|
|
&::after {
|
|
position: absolute;
|
|
content: "";
|
|
top: -1px;
|
|
left: -1px;
|
|
height: calc(100% + 2px);
|
|
width: calc(100% + 2px);
|
|
}
|
|
|
|
&.selectedCell-border-top::after {
|
|
border-top: 2px solid rgba(var(--color-primary-100));
|
|
}
|
|
|
|
&.selectedCell-border-left::after {
|
|
border-left: 2px solid rgba(var(--color-primary-100));
|
|
}
|
|
|
|
&.selectedCell-border-bottom::after {
|
|
border-bottom: 2px solid rgba(var(--color-primary-100));
|
|
}
|
|
|
|
&.selectedCell-border-right::after {
|
|
border-right: 2px solid rgba(var(--color-primary-100));
|
|
}
|
|
}
|
|
/* End selected cell outline */
|
|
|
|
.table-col-handle-container,
|
|
.table-row-handle-container {
|
|
& > button {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
&:hover {
|
|
.table-col-handle-container,
|
|
.table-row-handle-container {
|
|
& > button {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
.ProseMirror-widget + * {
|
|
padding-top: 0 !important;
|
|
}
|
|
|
|
&.content-hidden > * {
|
|
visibility: hidden;
|
|
}
|
|
}
|
|
|
|
th {
|
|
font-weight: 500;
|
|
text-align: left;
|
|
}
|
|
|
|
tr[background="none"],
|
|
tr:not([background]) {
|
|
th {
|
|
background-color: rgba(var(--color-background-90));
|
|
}
|
|
}
|
|
|
|
.table-drop-marker {
|
|
background-color: rgba(var(--color-primary-100));
|
|
position: absolute;
|
|
z-index: 10;
|
|
|
|
&.hidden {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
.table-col-drag-marker,
|
|
.table-row-drag-marker {
|
|
position: absolute;
|
|
z-index: 10;
|
|
|
|
&.hidden {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
.table-col-drag-marker {
|
|
top: -9px;
|
|
}
|
|
|
|
.table-row-drag-marker {
|
|
left: 0;
|
|
}
|
|
}
|
|
|
|
/* Selected status */
|
|
&.ProseMirror-selectednode {
|
|
table {
|
|
background-color: rgba(var(--color-primary-100), 0.2);
|
|
}
|
|
}
|
|
/* End selected status */
|
|
}
|
|
|
|
/* Column resizer */
|
|
.table-wrapper table .column-resize-handle {
|
|
position: absolute;
|
|
right: -1px;
|
|
top: -1px;
|
|
width: 2px;
|
|
height: calc(100% + 2px);
|
|
z-index: 5;
|
|
background-color: rgba(var(--color-primary-100));
|
|
pointer-events: none;
|
|
}
|
|
/* End column resizer */
|
|
|
|
.table-wrapper .table-controls {
|
|
position: absolute;
|
|
|
|
.columns-control,
|
|
.rows-control {
|
|
transition: opacity ease-in 100ms;
|
|
position: absolute;
|
|
z-index: 5;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.columns-control {
|
|
height: 20px;
|
|
transform: translateY(-50%);
|
|
|
|
.columns-control-div {
|
|
color: white;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Cpath fill='%238F95B2' d='M4.5 10.5c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5S6 12.825 6 12s-.675-1.5-1.5-1.5zm15 0c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5S21 12.825 21 12s-.675-1.5-1.5-1.5zm-7.5 0c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5 1.5-.675 1.5-1.5-.675-1.5-1.5-1.5z'/%3E%3C/svg%3E");
|
|
width: 30px;
|
|
height: 15px;
|
|
}
|
|
}
|
|
|
|
.rows-control {
|
|
width: 20px;
|
|
transform: translateX(-50%);
|
|
left: -8px;
|
|
|
|
.rows-control-div {
|
|
color: white;
|
|
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Cpath fill='%238F95B2' d='M12 3c-.825 0-1.5.675-1.5 1.5S11.175 6 12 6s1.5-.675 1.5-1.5S12.825 3 12 3zm0 15c-.825 0-1.5.675-1.5 1.5S11.175 21 12 21s1.5-.675 1.5-1.5S12.825 18 12 18zm0-7.5c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5 1.5-.675 1.5-1.5-.675-1.5-1.5-1.5z'/%3E%3C/svg%3E");
|
|
height: 30px;
|
|
width: 15px;
|
|
}
|
|
}
|
|
|
|
.columns-control-div,
|
|
.rows-control-div {
|
|
background-color: rgba(var(--color-background-80));
|
|
border: 0.5px solid rgba(var(--color-border-200));
|
|
border-radius: 4px;
|
|
background-size: 1.25rem;
|
|
background-repeat: no-repeat;
|
|
background-position: center;
|
|
transition:
|
|
transform ease-out 100ms,
|
|
background-color ease-out 100ms;
|
|
outline: none;
|
|
box-shadow: rgba(var(--color-shadow-2xs));
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
|
|
.resize-cursor .table-wrapper .table-controls .rows-control,
|
|
.table-wrapper.controls--disabled .table-controls .rows-control,
|
|
.resize-cursor .table-wrapper .table-controls .columns-control,
|
|
.table-wrapper.controls--disabled .table-controls .columns-control {
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* Insert buttons */
|
|
.table-wrapper {
|
|
.table-column-insert-button,
|
|
.table-row-insert-button {
|
|
position: absolute;
|
|
background-color: rgba(var(--color-background-90));
|
|
color: rgba(var(--color-text-300));
|
|
border: 1px solid rgba(var(--color-border-200));
|
|
border-radius: 4px;
|
|
display: grid;
|
|
place-items: center;
|
|
opacity: 0;
|
|
pointer-events: none;
|
|
outline: none;
|
|
z-index: 10;
|
|
transition: all 0.2s ease;
|
|
|
|
&:hover {
|
|
background-color: rgba(var(--color-background-80));
|
|
color: rgba(var(--color-text-100));
|
|
}
|
|
|
|
&.dragging {
|
|
opacity: 1;
|
|
pointer-events: auto;
|
|
background-color: rgba(var(--color-primary-100), 0.2);
|
|
color: rgba(var(--color-text-100));
|
|
}
|
|
|
|
svg {
|
|
width: 12px;
|
|
height: 12px;
|
|
}
|
|
}
|
|
|
|
.table-column-insert-button {
|
|
top: 0;
|
|
right: -16px;
|
|
width: 16px;
|
|
height: 100%;
|
|
transform: translateX(50%);
|
|
cursor: col-resize;
|
|
}
|
|
|
|
.table-row-insert-button {
|
|
bottom: -16px;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 16px;
|
|
transform: translateY(50%);
|
|
cursor: row-resize;
|
|
}
|
|
|
|
/* Show buttons on table hover */
|
|
&:hover {
|
|
.table-column-insert-button,
|
|
.table-row-insert-button {
|
|
opacity: 1;
|
|
pointer-events: auto;
|
|
}
|
|
}
|
|
}
|
|
/* End insert buttons */
|