UNPKG

ts-gantt

Version:

simple gantt chart written using typescript

340 lines (310 loc) 9.29 kB
: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) !important; 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) !important; } .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) !important; min-width: var(--tsg-nesting-indent) !important; color: var(--tsg-symbol-color); text-align: center; cursor: pointer; } .tsg-table-body-cell-text-expander.nesting-1 { padding-left: var(--tsg-nesting-indent) !important; width: calc(var(--tsg-nesting-indent) * 2) !important; min-width: calc(var(--tsg-nesting-indent) * 2) !important; } .tsg-table-body-cell-text-expander.nesting-2 { padding-left: calc(var(--tsg-nesting-indent) * 2) !important; width: calc(var(--tsg-nesting-indent) * 3) !important; min-width: calc(var(--tsg-nesting-indent) * 3) !important; } .tsg-table-body-cell-text-expander.nesting-3 { padding-left: calc(var(--tsg-nesting-indent) * 3) !important; width: calc(var(--tsg-nesting-indent) * 4) !important; min-width: calc(var(--tsg-nesting-indent) * 4) !important; } .tsg-table-body-cell-text-expander.nesting-4 { padding-left: calc(var(--tsg-nesting-indent) * 4) !important; width: calc(var(--tsg-nesting-indent) * 5) !important; min-width: calc(var(--tsg-nesting-indent) * 5) !important; } .tsg-table-body-cell-text-expander.nesting-5 { padding-left: calc(var(--tsg-nesting-indent) * 5) !important; width: calc(var(--tsg-nesting-indent) * 6) !important; min-width: calc(var(--tsg-nesting-indent) * 6) !important; } .tsg-table-body-cell-text-expander.nesting-6 { padding-left: calc(var(--tsg-nesting-indent) * 6) !important; width: calc(var(--tsg-nesting-indent) * 7) !important; min-width: calc(var(--tsg-nesting-indent) * 7) !important; } .tsg-table-body-cell-text-expander.nesting-7 { padding-left: calc(var(--tsg-nesting-indent) * 7) !important; width: calc(var(--tsg-nesting-indent) * 8) !important; min-width: calc(var(--tsg-nesting-indent) * 8) !important; } .tsg-table-body-cell-text-expander.nesting-8 { padding-left: calc(var(--tsg-nesting-indent) * 8) !important; width: calc(var(--tsg-nesting-indent) * 9) !important; min-width: calc(var(--tsg-nesting-indent) * 9) !important; } .tsg-table-body-cell-text-expander.nesting-9 { padding-left: calc(var(--tsg-nesting-indent) * 9) !important; width: calc(var(--tsg-nesting-indent) * 10) !important; min-width: calc(var(--tsg-nesting-indent) * 10) !important; } .tsg-table-body-cell-text-expander.nesting-max { padding-left: calc(var(--tsg-nesting-indent) * 10) !important; width: calc(var(--tsg-nesting-indent) * 11) !important; min-width: calc(var(--tsg-nesting-indent) * 11) !important; } .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); }