ts-gantt
Version:
simple gantt chart written using typescript
340 lines (310 loc) • 9.29 kB
CSS
:root {
--tsg-table-min-width: 100px;
--tsg-chart-min-width: 100px;
--tsg-nesting-indent: 20px;
--tsg-background-color: white;
--tsg-foreground-color: black;
--tsg-separator-color: dimgray;
--tsg-header-color: ghostwhite;
--tsg-border-color: lightgray;
--tsg-symbol-color: dimgray;
--tsg-selection-color: ghostwhite;
--tsg-scrollbar-track-color: #eeeeee;
--tsg-scrollbar-thumb-color: #b0b0b0;
--tsg-not-started-fg-color: dimgray;
--tsg-in-progress-fg-color: black;
--tsg-overdue-fg-color: darkred;
--tsg-completed-fg-color: darkgreen;
--tsg-completed-late-fg-color: sienna;
--tsg-today-line-color: orangered;
--tsg-chart-bar-color-1: skyblue;
--tsg-chart-bar-color-2: lightcoral;
--tsg-chart-bar-accent-1: darkcyan;
--tsg-chart-bar-accent-2: darkred;
--tsg-font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
--tsg-font-size: 14px;
--tsg-line-height: 16px;
--tsg-max-cell-text-lines: 2;
}
.tsg-no-text-selection {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.tsg-wrapper {
position: relative;
box-sizing: border-box;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
width: 100%;
height: 100%;
overflow-y: auto;
overflow-x: hidden;
background-color: var(--tsg-background-color);
}
.tsg-wrapper * {
box-sizing: border-box;
}
.tsg-separator {
display: flex;
flex: 0 0 auto;
width: var(--tsg-separator-width);
height: 100%;
padding: 0;
cursor: ew-resize;
background-color: var(--tsg-separator-color);
}
.tsg-table-wrapper {
position: relative;
display: flex;
flex-direction: column;
width: calc(50% - 5px);
height: 100%;
min-width: var(--tsg-table-min-width);
overflow-y: auto;
overflow-x: scroll;
}
.tsg-table {
width: 100%;
border-spacing: 0;
font-family: var(--tsg-font-family);
color: var(--tsg-foreground-color);
table-layout: fixed;
}
.tsg-table-header {
position: sticky;
top: 0;
padding: 5px;
height: var(--tsg-header-height) ;
font-size: var(--tsg-font-size);
border-width: var(--tsg-gridlines-width) var(--tsg-gridlines-width) var(--tsg-gridlines-width) 0;
border-color: var(--tsg-border-color);
border-style: solid;
background-color: var(--tsg-header-color);
z-index: 5;
}
.tsg-table-col-resizer {
position: absolute;
top: 0;
right: 0;
width: 10px;
height: 100%;
cursor: col-resize;
}
.tsg-table-body-row {
height: var(--tsg-row-height) ;
}
.tsg-table-body-row.selected {
background-color: var(--tsg-selection-color);
}
.selected .tsg-table-body-cell {
font-weight: bold;
}
.not-started .tsg-table-body-cell {
color: var(--tsg-not-started-fg-color);
}
.in-progress .tsg-table-body-cell {
color: var(--tsg-in-progress-fg-color);
}
.overdue .tsg-table-body-cell {
color: var(--tsg-overdue-fg-color);
}
.completed .tsg-table-body-cell {
color: var(--tsg-completed-fg-color);
}
.completed-late .tsg-table-body-cell {
color: var(--tsg-completed-late-fg-color);
}
.tsg-table-body-cell {
padding: 0;
cursor: default;
border-width: 0 var(--tsg-gridlines-width) var(--tsg-gridlines-width) 0;
border-color: var(--tsg-border-color);
border-style: solid;
}
.tsg-table-body-cell-text-wrapper {
display: flex;
align-items: center;
height: calc(var(--tsg-row-height) - 2px);
padding: 2px;
}
.tsg-table-body-cell-text-wrapper.start {
justify-content: flex-start;
}
.tsg-table-body-cell-text-wrapper.center {
justify-content: center;
}
.tsg-table-body-cell-text-wrapper.end {
justify-content: flex-end;
}
.tsg-table-body-cell-text-expander {
width: var(--tsg-nesting-indent) ;
min-width: var(--tsg-nesting-indent) ;
color: var(--tsg-symbol-color);
text-align: center;
cursor: pointer;
}
.tsg-table-body-cell-text-expander.nesting-1 {
padding-left: var(--tsg-nesting-indent) ;
width: calc(var(--tsg-nesting-indent) * 2) ;
min-width: calc(var(--tsg-nesting-indent) * 2) ;
}
.tsg-table-body-cell-text-expander.nesting-2 {
padding-left: calc(var(--tsg-nesting-indent) * 2) ;
width: calc(var(--tsg-nesting-indent) * 3) ;
min-width: calc(var(--tsg-nesting-indent) * 3) ;
}
.tsg-table-body-cell-text-expander.nesting-3 {
padding-left: calc(var(--tsg-nesting-indent) * 3) ;
width: calc(var(--tsg-nesting-indent) * 4) ;
min-width: calc(var(--tsg-nesting-indent) * 4) ;
}
.tsg-table-body-cell-text-expander.nesting-4 {
padding-left: calc(var(--tsg-nesting-indent) * 4) ;
width: calc(var(--tsg-nesting-indent) * 5) ;
min-width: calc(var(--tsg-nesting-indent) * 5) ;
}
.tsg-table-body-cell-text-expander.nesting-5 {
padding-left: calc(var(--tsg-nesting-indent) * 5) ;
width: calc(var(--tsg-nesting-indent) * 6) ;
min-width: calc(var(--tsg-nesting-indent) * 6) ;
}
.tsg-table-body-cell-text-expander.nesting-6 {
padding-left: calc(var(--tsg-nesting-indent) * 6) ;
width: calc(var(--tsg-nesting-indent) * 7) ;
min-width: calc(var(--tsg-nesting-indent) * 7) ;
}
.tsg-table-body-cell-text-expander.nesting-7 {
padding-left: calc(var(--tsg-nesting-indent) * 7) ;
width: calc(var(--tsg-nesting-indent) * 8) ;
min-width: calc(var(--tsg-nesting-indent) * 8) ;
}
.tsg-table-body-cell-text-expander.nesting-8 {
padding-left: calc(var(--tsg-nesting-indent) * 8) ;
width: calc(var(--tsg-nesting-indent) * 9) ;
min-width: calc(var(--tsg-nesting-indent) * 9) ;
}
.tsg-table-body-cell-text-expander.nesting-9 {
padding-left: calc(var(--tsg-nesting-indent) * 9) ;
width: calc(var(--tsg-nesting-indent) * 10) ;
min-width: calc(var(--tsg-nesting-indent) * 10) ;
}
.tsg-table-body-cell-text-expander.nesting-max {
padding-left: calc(var(--tsg-nesting-indent) * 10) ;
width: calc(var(--tsg-nesting-indent) * 11) ;
min-width: calc(var(--tsg-nesting-indent) * 11) ;
}
.tsg-table-body-cell-text {
position: relative;
overflow: hidden;
max-height: calc(var(--tsg-max-cell-text-lines) * var(--tsg-line-height));
font-size: var(--tsg-font-size);
line-height: var(--tsg-line-height);
display: -webkit-box;
-webkit-line-clamp: var(--tsg-max-cell-text-lines);
-webkit-box-orient: vertical;
}
.tsg-chart-wrapper {
position: relative;
display: flex;
flex-direction: column;
width: 50%;
height: 100%;
min-width: var(--tsg-chart-min-width);
overflow-y: auto;
overflow-x: scroll;
}
.tsg-chart {
display: flex;
flex-direction: column;
flex-shrink: 0;
}
.tsg-chart-header {
position: sticky;
top: 0;
}
.tsg-chart-header-bg {
fill: var(--tsg-header-color);
stroke-width: var(--tsg-gridlines-width);
stroke: var(--tsg-border-color);
}
.tsg-chart-header-text {
font-family: var(--tsg-font-family);
font-size: var(--tsg-font-size);
font-weight: bold;
}
.tsg-chart-header-gl,
.tsg-chart-body-gl {
stroke-width: var(--tsg-gridlines-width);
stroke: var(--tsg-border-color);
shape-rendering: crispEdges;
}
.tsg-chart-body-gl-today {
stroke-width: calc(var(--tsg-gridlines-width) + 2px);
stroke: var(--tsg-today-line-color);
}
.tsg-chart-body-bg {
fill: transparent;
}
.tsg-chart-row-bg {
fill: var(--tsg-background-color);
}
.tsg-chart-row-bg.selected {
fill: var(--tsg-selection-color);
}
.tsg-chart-row {
fill: transparent;
}
.tsg-chart-bar-planned {
fill: var(--tsg-chart-bar-color-1);
stroke: var(--tsg-chart-bar-color-1);
stroke-width: var(--tsg-bar-stroke-width);
}
.selected .tsg-chart-bar-planned {
stroke: var(--tsg-chart-bar-accent-1);
}
.tsg-chart-bar-planned-progress {
fill: var(--tsg-chart-bar-accent-1);
stroke: var(--tsg-chart-bar-accent-1);
stroke-width: var(--tsg-bar-stroke-width);
}
.tsg-chart-bar-actual {
fill: var(--tsg-chart-bar-color-2);
stroke: var(--tsg-chart-bar-color-2);
stroke-width: var(--tsg-bar-stroke-width);
}
.selected .tsg-chart-bar-actual {
stroke: var(--tsg-chart-bar-accent-2);
}
.tsg-chart-bar-actual-progress {
fill: var(--tsg-chart-bar-accent-2);
stroke: var(--tsg-chart-bar-accent-2);
stroke-width: var(--tsg-bar-stroke-width);
}
.tsg-chart-bar-handle {
fill: var(--tsg-symbol-color);
cursor: ew-resize;
}
.tsg-table-wrapper::-webkit-scrollbar {
width: 0;
height: 15px;
}
.tsg-chart-wrapper::-webkit-scrollbar {
width: 15px;
height: 15px;
}
.tsg-table-wrapper::-webkit-scrollbar-track,
.tsg-chart-wrapper::-webkit-scrollbar-track {
border-radius: 0;
background: var(--tsg-scrollbar-track-color);
}
.tsg-table-wrapper::-webkit-scrollbar-thumb,
.tsg-chart-wrapper::-webkit-scrollbar-thumb {
border-radius: 0;
background: var(--tsg-scrollbar-thumb-color);
}