Merge pull request #676 from influxdata/apply-function-ui-fix

DE Polish
pull/681/head
Alex Paxton 2016-12-09 17:17:36 -08:00 committed by GitHub
commit aecf4ce07c
34 changed files with 769 additions and 983 deletions

View File

@ -60,13 +60,13 @@ const DatabaseList = React.createClass({
const {onChooseNamespace, query} = this.props;
return (
<ul className="query-editor__list">
<ul className="qeditor--list">
{this.state.namespaces.map((namespace) => {
const {database, retentionPolicy} = namespace;
const isActive = database === query.database && retentionPolicy === query.retentionPolicy;
return (
<li className={classNames('query-editor__list-item query-editor__list-radio', {active: isActive})} key={`${database}..${retentionPolicy}`} onClick={_.wrap(namespace, onChooseNamespace)}>
<li className={classNames('qeditor--list-item qeditor--list-radio', {active: isActive})} key={`${database}..${retentionPolicy}`} onClick={_.wrap(namespace, onChooseNamespace)}>
{database}.{retentionPolicy}
</li>
);

View File

@ -80,14 +80,15 @@ const Explorer = React.createClass({
return (
<div className={classNames('explorer', {active: isExpanded})}>
<div className="explorer__header" onClick={this.handleSelectExplorer}>
<div className="explorer__header-name">
<div className="explorer--header" onClick={this.handleSelectExplorer}>
<div className="explorer--name">
<span className="icon caret-right"></span>
{panel.name || "Graph"}
</div>
<div className="explorer__header-actions">
<div title="Rename" className="explorer__header-rename" onClick={this.openRenamePanelModal}><span className="icon pencil"></span></div>
<div title="Delete" className="explorer__header-delete" onClick={this.handleDeletePanel}><span className="icon trash"></span></div>
<div className="explorer--actions">
<div title="Export Queries to Dashboard" className="explorer--action"><span className="icon export"></span></div>
<div title="Rename Graph" className="explorer--action" onClick={this.openRenamePanelModal}><span className="icon pencil"></span></div>
<div title="Delete Graph" className="explorer--action" onClick={this.handleDeletePanel}><span className="icon trash"></span></div>
</div>
</div>
{this.renderQueryTabList()}
@ -107,7 +108,7 @@ const Explorer = React.createClass({
if (!query) {
return (
<div className="query-editor__empty">
<div className="qeditor--empty">
<h5>This Graph has no Queries</h5>
<br/>
<div className="btn btn-primary" role="button" onClick={this.handleAddQuery}>Add a Query</div>
@ -129,10 +130,10 @@ const Explorer = React.createClass({
if (!this.props.isExpanded) {
return null;
}
return (
<div className="explorer__tabs">
<div className="explorer--tabs">
{this.props.queries.map((q) => {
const queryTabText = (q.measurement && q.fields.length !== 0) ? `${q.measurement}.${q.fields[0].field}` : 'Query';
return (
<QueryTabItem
isActive={this.getActiveQuery().id === q.id}
@ -140,10 +141,11 @@ const Explorer = React.createClass({
query={q}
onSelect={this.handleSetActiveQuery}
onDelete={this.handleDeleteQuery}
queryTabText={queryTabText}
/>
);
})}
<div className="explorer__tab" onClick={this.handleAddQuery}>
<div className="explorer--tab" onClick={this.handleAddQuery}>
<span className="icon plus"></span>
</div>
</div>

View File

@ -74,9 +74,11 @@ const FieldList = React.createClass({
<div>
{
hasAggregates ?
<div className="query-editor__list-header group-by-time">
<div className="group-by-time-dropdown-label">Group by Time:</div>
<GroupByTimeDropdown isOpen={!hasGroupByTime} selected={query.groupBy.time} onChooseGroupByTime={this.handleGroupByTime} />
<div className="qeditor--list-header">
<div className="group-by-time">
<p>Group by Time</p>
<GroupByTimeDropdown isOpen={!hasGroupByTime} selected={query.groupBy.time} onChooseGroupByTime={this.handleGroupByTime} />
</div>
</div>
: null
}
@ -88,10 +90,10 @@ const FieldList = React.createClass({
renderList() {
const {database, measurement} = this.props.query;
if (!database || !measurement) {
return <div className="query-editor__empty">No measurement selected.</div>;
return <div className="qeditor--empty">No <strong>Measurement</strong> selected</div>;
}
return (<ul className="query-editor__list">
return (<ul className="qeditor--list">
{this.state.fields.map((fieldFunc) => {
const selectedField = this.props.query.fields.find((f) => f.field === fieldFunc.field);
return (

View File

@ -39,9 +39,9 @@ const FieldListItem = React.createClass({
});
return (
<li className={classNames("query-editor__list-item query-editor__list-checkbox", {checked: isSelected})} key={fieldFunc} onClick={_.wrap(fieldFunc, this.handleToggleField)}>
<span className="query-editor__list-checkbox__checkbox">{fieldText}</span>
<div className="query-editor__hidden-dropdown">
<li className={classNames("qeditor--list-item qeditor--list-checkbox", {checked: isSelected})} key={fieldFunc} onClick={_.wrap(fieldFunc, this.handleToggleField)}>
<span className="qeditor--list-checkbox__checkbox">{fieldText}</span>
<div className="qeditor--hidden-dropdown">
{
isKapacitorRule ?
<Dropdown items={items} onChoose={this.handleApplyFunctions} selected={fieldFunc.funcs.length ? fieldFunc.funcs[0] : 'Select a function'} /> :

View File

@ -24,8 +24,7 @@ const GroupByTimeDropdown = React.createClass({
<ul className={classNames("dropdown-menu", {show: isOpen})} aria-labelledby="group-by-dropdown">
{groupByTimeOptions.map((groupBy) => {
return (
<li className="dropdown-option"
key={groupBy.menuOption}>
<li key={groupBy.menuOption}>
<a href="#" onClick={() => onChooseGroupByTime(groupBy)}>
{groupBy.menuOption}
</a>

View File

@ -69,11 +69,11 @@ const MeasurementList = React.createClass({
render() {
return (
<div className="measurement-list">
<div className="query-editor__list-header">
<input className="query-editor__filter" ref="filterText" placeholder="Filter Measurements..." type="text" value={this.state.filterText} onChange={this.handleFilterText} onKeyUp={this.handleEscape} />
<div>
{this.props.query.database ? <div className="qeditor--list-header">
<input className="qeditor--filter" ref="filterText" placeholder="Filter Measurements..." type="text" value={this.state.filterText} onChange={this.handleFilterText} onKeyUp={this.handleEscape} />
<span className="icon search"></span>
</div>
</div> : null }
{this.renderList()}
</div>
);
@ -81,17 +81,17 @@ const MeasurementList = React.createClass({
renderList() {
if (!this.props.query.database) {
return <div className="query-editor__empty">No database selected.</div>;
return <div className="qeditor--empty">No <strong>Database</strong> selected</div>;
}
const measurements = this.state.measurements.filter((m) => m.match(this.state.filterText));
return (
<ul className="query-editor__list">
<ul className="qeditor--list">
{measurements.map((measurement) => {
const isActive = measurement === this.props.query.measurement;
return (
<li className={classNames('query-editor__list-item query-editor__list-radio', {active: isActive})} key={measurement} onClick={_.wrap(measurement, this.props.onChooseMeasurement)}>{measurement}</li>
<li className={classNames('qeditor--list-item qeditor--list-radio', {active: isActive})} key={measurement} onClick={_.wrap(measurement, this.props.onChooseMeasurement)}>{measurement}</li>
);
})}
</ul>

View File

@ -63,16 +63,18 @@ const MultiSelectDropdown = React.createClass({
render() {
const {localSelectedItems} = this.state;
const {isOpen} = this.state;
const labelText = isOpen ? "0 Selected" : "Apply Function";
return (
<div className="dropdown multi-select-dropdown">
<div onClick={this.toggleMenu} className="btn btn-xs btn-info dropdown-toggle multi-select-dropdown__toggle" type="button">
<div className={classNames('dropdown multi-select-dropdown', {open: isOpen})}>
<div onClick={this.toggleMenu} className="btn btn-xs btn-info dropdown-toggle" type="button">
<span className="multi-select-dropdown__label">
{
localSelectedItems.length ? localSelectedItems.map((s) => s).join(', ') : 'Apply Function'
localSelectedItems.length ? localSelectedItems.map((s) => s).join(', ') : labelText
}
</span>
<span className="caret multi-select-dropdown__caret"></span>
<span className="caret"></span>
</div>
{this.renderMenu()}
</div>
@ -81,14 +83,12 @@ const MultiSelectDropdown = React.createClass({
renderMenu() {
const {items} = this.props;
const {isOpen} = this.state;
if (!isOpen) {
return null;
}
return (
<div className="dropdown-options">
<li className="multi-select-dropdown__apply" onClick={this.onApplyFunctions}>
<div className="btn btn-xs btn-info btn-block">Apply</div>
</li>
<ul className="dropdown-menu multi-select-dropdown__menu" aria-labelledby="dropdownMenu1">
{items.map((listItem, i) => {
return (
@ -97,9 +97,6 @@ const MultiSelectDropdown = React.createClass({
</li>
);
})}
<li className="multi-select-dropdown__apply" onClick={this.onApplyFunctions}>
<div className="btn btn-sm btn-primary btn-block">Apply</div>
</li>
</ul>
</div>
);

View File

@ -35,14 +35,12 @@ const PanelBuilder = React.createClass({
return (
<div className="panel-builder" style={{width}}>
<div className="panel-builder__tab-content">
<div className="panel-builder__item btn btn-block btn-primary" onClick={this.handleCreateExploer}><span className="icon graphline"></span>&nbsp;&nbsp;Create Graph</div>
<ExplorerList
actions={actions}
setActivePanel={this.props.setActivePanel}
activePanelID={this.props.activePanelID}
/>
</div>
<div className="btn btn-block btn-primary" onClick={this.handleCreateExploer}><span className="icon graphline"></span>&nbsp;&nbsp;Create Graph</div>
<ExplorerList
actions={actions}
setActivePanel={this.props.setActivePanel}
activePanelID={this.props.activePanelID}
/>
</div>
);
},

View File

@ -96,8 +96,8 @@ const QueryEditor = React.createClass({
const statement = query.rawText || selectStatement(timeRange, query) || `SELECT "fields" FROM "db"."rp"."measurement"`;
return (
<div className="query-editor">
<div className="query-editor__code">
<div className="explorer--tab-contents">
<div className="qeditor--query-preview">
<pre className={classNames("", {"rq-mode": query.rawText})}><code>{statement}</code></pre>
</div>
{this.renderEditor()}
@ -108,7 +108,7 @@ const QueryEditor = React.createClass({
renderEditor() {
if (this.props.query.rawText) {
return (
<div className="generic-empty-state query-editor-empty-state">
<div className="qeditor--empty">
<p className="margin-bottom-zero">
<span className="icon alert-triangle"></span>
&nbsp;Only editable in the <strong>Raw Query</strong> tab.
@ -120,12 +120,12 @@ const QueryEditor = React.createClass({
const {activeTab} = this.state;
return (
<div>
<div className="query-editor__tabs">
<div className="query-editor__tabs-heading">Schema Explorer</div>
<div onClick={_.wrap(DB_TAB, this.handleClickTab)} className={classNames("query-editor__tab", {active: activeTab === DB_TAB})}>Databases</div>
<div onClick={_.wrap(MEASUREMENTS_TAB, this.handleClickTab)} className={classNames("query-editor__tab", {active: activeTab === MEASUREMENTS_TAB})}>Measurements</div>
<div onClick={_.wrap(FIELDS_TAB, this.handleClickTab)} className={classNames("query-editor__tab", {active: activeTab === FIELDS_TAB})}>Fields</div>
<div onClick={_.wrap(TAGS_TAB, this.handleClickTab)} className={classNames("query-editor__tab", {active: activeTab === TAGS_TAB})}>Tags</div>
<div className="qeditor--tabs">
<div className="qeditor--tabs-heading">Schema Explorer</div>
<div onClick={_.wrap(DB_TAB, this.handleClickTab)} className={classNames("qeditor--tab", {active: activeTab === DB_TAB})}>Databases</div>
<div onClick={_.wrap(MEASUREMENTS_TAB, this.handleClickTab)} className={classNames("qeditor--tab", {active: activeTab === MEASUREMENTS_TAB})}>Measurements</div>
<div onClick={_.wrap(FIELDS_TAB, this.handleClickTab)} className={classNames("qeditor--tab", {active: activeTab === FIELDS_TAB})}>Fields</div>
<div onClick={_.wrap(TAGS_TAB, this.handleClickTab)} className={classNames("qeditor--tab", {active: activeTab === TAGS_TAB})}>Tags</div>
</div>
{this.renderList()}
</div>
@ -169,7 +169,7 @@ const QueryEditor = React.createClass({
/>
);
default:
return <ul className="query-editor__list"></ul>;
return <ul className="qeditor--list"></ul>;
}
},
});

View File

@ -9,6 +9,7 @@ const QueryTabItem = React.createClass({
}).isRequired,
onSelect: PropTypes.func.isRequired,
onDelete: PropTypes.func.isRequired,
queryTabText: PropTypes.string,
},
handleSelect() {
@ -22,8 +23,9 @@ const QueryTabItem = React.createClass({
render() {
return (
<div className={classNames('explorer__tab', {active: this.props.isActive})} onClick={this.handleSelect}>
{this.props.query.rawText ? 'Raw Query' : 'Query'} <span className="explorer__tab-delete" onClick={this.handleDelete}><span className="icon remove"></span></span>
<div className={classNames('explorer--tab', {active: this.props.isActive})} onClick={this.handleSelect}>
<span className="explorer--tab-label">{this.props.query.rawText ? 'Raw Text' : this.props.queryTabText}</span>
<span className="explorer--tab-delete" onClick={this.handleDelete}></span>
</div>
);
},

View File

@ -71,12 +71,12 @@ const TagList = React.createClass({
return (
<div>
<div className="query-editor__list-header">
<div className="tag-list__toggle">
<div onClick={this.handleAcceptReject} className={cx("tag-list__toggle-btn", {active: query.areTagsAccepted})}>Accept</div>
<div onClick={this.handleAcceptReject} className={cx("tag-list__toggle-btn", {active: !query.areTagsAccepted})}>Reject</div>
{(!query.database || !query.measurement || !query.retentionPolicy) ? null : <div className="qeditor--list-header">
<div className="toggle toggle-sm">
<div onClick={this.handleAcceptReject} className={cx("toggle-btn", {active: query.areTagsAccepted})}>Accept</div>
<div onClick={this.handleAcceptReject} className={cx("toggle-btn", {active: !query.areTagsAccepted})}>Reject</div>
</div>
</div>
</div>}
{this.renderList()}
</div>
);
@ -85,11 +85,11 @@ const TagList = React.createClass({
renderList() {
const {database, measurement, retentionPolicy} = this.props.query;
if (!database || !measurement || !retentionPolicy) {
return <div className="query-editor__empty">No measurement selected.</div>;
return <div className="qeditor--empty">No <strong>Measurement</strong> selected</div>;
}
return (
<ul className="query-editor__list">
<ul className="qeditor--list">
{_.map(this.state.tags, (tagValues, tagKey) => {
return (
<TagListItem

View File

@ -62,7 +62,7 @@ const TagListItem = React.createClass({
</div>
<ul className="tag-value-list">
{filtered.map((v) => {
const cx = classNames('tag-value-list__item query-editor__list-item', {active: selectedTagValues.indexOf(v) > -1});
const cx = classNames('tag-value-list__item qeditor--list-item', {active: selectedTagValues.indexOf(v) > -1});
return (
<li className={cx} onClick={_.wrap(v, this.handleChoose)} key={v}>
<div className="tag-value-list__checkbox"></div>
@ -81,7 +81,7 @@ const TagListItem = React.createClass({
},
render() {
const itemClasses = classNames("query-editor__list-item tag-list__item", {open: this.state.isOpen});
const itemClasses = classNames("qeditor--list-item tag-list__item", {open: this.state.isOpen});
return (
<div>
<li className={itemClasses} onClick={this.handleClickKey}>

View File

@ -60,19 +60,19 @@ const Visualization = React.createClass({
const autoRefreshMs = 10000;
return (
<div ref={(p) => this.panel = p} className={classNames("graph-panel", {active: isActive})}>
<div className="graph-panel__bar">
<div className="graph-panel__title">
{/* <span className="icon caret-right"></span> */}{name || "Graph"}
<div ref={(p) => this.panel = p} className={classNames("graph", {active: isActive})}>
<div className="graph-heading">
<div className="graph-title">
{name || "Graph"}
</div>
<div className="graph-panel__left">
<ul className="graph-panel__tabs">
<li onClick={this.handleToggleView} className={classNames("graph-panel__tab", {active: isGraphInView})}>Graph</li>
<li onClick={this.handleToggleView} className={classNames("graph-panel__tab", {active: !isGraphInView})}>Table</li>
<div className="graph-actions">
<ul className="toggle toggle-sm">
<li onClick={this.handleToggleView} className={classNames("toggle-btn ", {active: isGraphInView})}>Graph</li>
<li onClick={this.handleToggleView} className={classNames("toggle-btn ", {active: !isGraphInView})}>Table</li>
</ul>
</div>
</div>
<div className="graph-panel__graph-container">
<div className="graph-container">
{isGraphInView ? (
<RefreshingLineGraph
queries={queries}

View File

@ -112,26 +112,28 @@ const Header = React.createClass({
{text: 'Delete', icon: 'trash', target: '#deleteExplorerModal', handler: this.openDeleteExplorerModal},
];
return (
<div className="page-header data-explorer__header">
<div className="page-header__left">
<h1>Explorer</h1>
</div>
<div className="page-header__right">
<h1>Session:</h1>
<Dropdown
className="sessions-dropdown"
items={dropdownItems}
actions={dropdownActions}
onChoose={this.handleChooseExplorer}
selected={this.getName(selectedExplorer)}
/>
<div className="btn btn-sm btn-primary sessions-dropdown__btn" onClick={this.handleCreateExploration}>New</div>
<h1>Source:</h1>
<div className="source-indicator">
<span className="icon cpu"></span>
{this.context.source.name}
<div className="page-header">
<div className="page-header__container">
<div className="page-header__left">
<h1>Explorer</h1>
</div>
<div className="page-header__right">
<h1>Session:</h1>
<Dropdown
className="sessions-dropdown"
items={dropdownItems}
actions={dropdownActions}
onChoose={this.handleChooseExplorer}
selected={this.getName(selectedExplorer)}
/>
<div className="btn btn-sm btn-primary sessions-dropdown__btn" onClick={this.handleCreateExploration}>New</div>
<h1>Source:</h1>
<div className="source-indicator">
<span className="icon cpu"></span>
{this.context.source.name}
</div>
<TimeRangeDropdown onChooseTimeRange={this.handleChooseTimeRange} selected={this.findSelected(timeRange)} />
</div>
<TimeRangeDropdown onChooseTimeRange={this.handleChooseTimeRange} selected={this.findSelected(timeRange)} />
</div>
<DeleteExplorerModal onConfirm={this.confirmDeleteExplorer} />
<EditExplorerModal onConfirm={this.confirmEditExplorer} />

View File

@ -115,8 +115,8 @@ export default function AutoRefresh(ComposedComponent) {
}
return (
<div className="graph-panel__graph-empty">
<h3 className="deluxe">No results</h3>
<div className="graph-empty">
<p>No Results</p>
</div>
);
},

View File

@ -97,7 +97,7 @@ export const LayoutRenderer = React.createClass({
return (
<div key={cell.i}>
<h2 className="hosts-graph-heading">{cell.name}</h2>
<div className="hosts-graph graph-panel__graph-container">
<div className="hosts-graph graph-container">
<RefreshingSingleStat queries={[qs[0]]} autoRefresh={autoRefreshMs} />
</div>
</div>
@ -107,7 +107,7 @@ export const LayoutRenderer = React.createClass({
return (
<div key={cell.i}>
<h2 className="hosts-graph-heading">{cell.name}</h2>
<div className="hosts-graph graph-panel__graph-container">
<div className="hosts-graph graph-container">
<RefreshingLineGraph queries={qs} autoRefresh={autoRefreshMs} showSingleStat={cell.type === "line-plus-single-stat"} />
</div>
</div>

View File

@ -52,8 +52,8 @@ export default React.createClass({
// If data for this graph is being fetched for the first time, show a graph-wide spinner.
if (isFetchingInitially) {
return (
<div className="graph-panel__graph-fetching">
<h3 className="graph-panel__spinner" />
<div className="graph-fetching">
<h3 className="graph-spinner" />
</div>
);
}

View File

@ -62,7 +62,7 @@ const ResizeContainer = React.createClass({
const handle = <ResizeHandle isDragging={isDragging} onHandleStartDrag={this.handleStartDrag} />;
return (
<div className="resize-container main-content" onMouseLeave={this.handleMouseLeave} onMouseUp={this.handleStopDrag} onMouseMove={this.handleDrag} ref="resizeContainer" >
<div className="resize-container page-contents" onMouseLeave={this.handleMouseLeave} onMouseUp={this.handleStopDrag} onMouseMove={this.handleDrag} ref="resizeContainer" >
{left}
{handle}
{right}

View File

@ -1,3 +0,0 @@
.main {
font-family: sans-serif;
}

View File

@ -1 +0,0 @@
$group-by-time-dropdown-width: 7em;

View File

@ -1,143 +1,180 @@
.explorer {
display: block;
background-color: $g6-smoke;
border-radius: $radius;
margin-bottom: 6px;
display: block;
background-color: $g3-castle;
border-radius: $radius;
margin-bottom: 6px;
transition: background-color 0.25s ease;
&__header {
background-color: $g6-smoke;
align-items: center;
text-align: center;
display: flex;
height: 3em;
padding: 1em;
cursor: pointer;
justify-content: space-between;
border-radius: $radius;
&:hover {
background-color: $g4-onyx;
}
&-name {
color: $g13-mist;
font-weight: 400;
font-size: 16px;
position: relative;
padding-left: 24px;
transition: color 0.25s ease;
// For when an explorer item is open
&.active {
background-color: $g4-onyx;
.explorer__header {
&-name {
color: $g20-white;
.icon {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%) rotate(0deg);
font-size: 0.75em;
transition: transform 0.25s ease;
}
&:hover {
color: $g20-white;
}
}
&-delete,
&-rename {
color: $g9-mountain;
transition: color 0.25s ease;
}
&-delete:hover {
color: $c-dreamsicle;
}
&-rename:hover {
color: $g20-white;
}
}
// For when an explorer item is open
&.active {
.explorer__header {
&-name {
color: $g20-white;
font-weight: 600;
.icon {
transform: translateY(-50%) rotate(90deg);
}
}
}
}
// Tabs
&__tabs {
display: flex;
background-color: $g6-smoke;
padding: 2px 1em 0 1em;
}
&__tab {
white-space: nowrap;
color: $g13-mist;
background: $g7-graphite;
height: 30px;
line-height: 30px;
margin-right: 2px;
border-radius: $radius $radius 0 0;
cursor: pointer;
padding: 0 8px 0 8px;
transition:
color 0.25s ease,
background-color 0.25s ease;
&.active {
background: $g8-storm;
color: $g18-cloud;
font-weight: 600;
}
> span.icon.plus {
font-size: 12px;
position: relative;
top: -1px;
}
&:hover {
color: $g18-cloud;
background-color: $g8-storm;
}
&-delete {
right: -2px;
font-size: 10px;
margin-left: 0px;
width: 16px;
height: 16px;
border-radius: 50%;
background-color: transparent;
display: inline-block;
vertical-align: text-top;
position: relative;
color: $g10-wolf;
transition:
color 0.25s ease,
background-color 0.25s ease;
span.icon {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-54%,-50%);
}
&:hover {
background-color: $c-dreamsicle;
color: $g20-white;
}
}
}
.icon {
transform: translateY(-50%) rotate(90deg);
}
}
}
}
}
// Explorer Header Bar
.explorer--header {
align-items: center;
text-align: center;
display: flex;
height: 36px;
padding: 0 11px;
cursor: pointer;
align-items: center;
justify-content: space-between;
border-radius: $radius;
}
.explorer--name {
color: $g13-mist;
font-weight: 600;
font-size: 14px;
position: relative;
padding-left: 16px;
transition: color 0.25s ease;
.icon.caret-right {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%) rotate(0deg);
font-size: 0.75em;
transition: transform 0.25s ease;
}
&:hover {
color: $g17-whisper;
}
}
.explorer--actions {
display: flex;
align-items: center;
}
.explorer--action {
width: 24px;
height: 24px;
border: 0;
background-color: transparent;
color: $g9-mountain;
margin-left: 2px;
transition: color 0.25s ease;
&:hover {
cursor: pointer;
color: $g18-cloud;
}
}
// Tabs
.explorer--tabs {
display: flex;
background-color: $g4-onyx;
padding: 0 11px;
}
.explorer--tab {
display: flex;
align-items: center;
color: $g11-sidewalk;
background: $g5-pepper;
height: 28px;
margin-right: 2px;
border-radius: $radius $radius 0 0;
cursor: pointer;
padding: 0 8px 0 8px;
transition:
color 0.25s ease,
background-color 0.25s ease;
&:hover {
color: $g18-cloud;
background-color: $g6-smoke;
}
&.active {
background: $g6-smoke;
color: $g15-platinum;
}
> span.icon.plus {
font-size: 12px;
position: relative;
top: -1px;
}
&-delete {
margin: 0 -4px 0 1px;
width: 16px;
height: 16px;
background-color: transparent;
display: inline-block;
vertical-align: text-top;
position: relative;
&:before,
&:after {
display: block;
content: '';
width: 8px;
height: 2px;
background-color: $g8-storm;
transition:
background-color 0.25s ease;
position: absolute;
top: 50%;
left: 50%;
}
&:before {
transform: translate(-50%,-50%) rotate(45deg);
}
&:after {
transform: translate(-50%,-50%) rotate(-45deg);
}
&:hover {
&:before,
&:after {
background-color: $c-dreamsicle;
}
}
}
}
.explorer--tab-label {
display: inline-block;
font-size: 12px;
font-weight: 600;
white-space: nowrap;
overflow: hidden;
max-width: 177px;
text-overflow: ellipsis;
}
/*
Tab Contents
-------------------------------------------
*/
.explorer--tab-contents {
padding: 6px;
background-color: $g6-smoke;
border-radius: 0 0 $radius $radius;
}
/* Time Range Selector */
.time-range-dropdown {
display: inline-block;
display: inline-block;
.dropdown-toggle {
width: 160px;
}
.dropdown-toggle {
width: 160px;
}
}
.explorer__header-actions {
@ -149,7 +186,7 @@
}
.alert.alert-rawquery {
border-color: $g5-pepper;
border-color: $g6-smoke;
color: $g12-forge;
border-color: $g5-pepper;
border-color: $g6-smoke;
color: $g12-forge;
}

View File

@ -0,0 +1,24 @@
.group-by-time-dropdown .dropdown-toggle {
width: 70px;
}
.group-by-time {
display: flex;
align-items: center;
p {
padding: 0 6px;
margin: 0;
height: 30px;
line-height: 26px;
font-size: 13px;
color: $g11-sidewalk;
font-weight: 500;
border-radius: 3px 0 0 3px;
border-style: solid;
border-color: $g5-pepper;
border-width: 2px;
}
.dropdown-toggle {
border-radius: 0px 3px 3px 0;
}
}

View File

@ -10,9 +10,6 @@
margin: 0 16px 0 0;
border-radius: 0 3px 3px 0;
}
.group-by-time-dropdown .dropdown-toggle {
width: $group-by-time-dropdown-width;
}
.source-indicator {
padding: 0 9px;
border: 0;

View File

@ -1,24 +1,57 @@
.multi-select-dropdown {
&__menu {
display: block !important;
}
&__toggle {
display: block !important;
width: 14em;
}
&__label {
text-overflow: ellipsis;
width: 85%;
display: block;
overflow: hidden;
}
&__caret {
position: absolute;
right: 9px;
top: 50%;
transform: translateY(-50%);
.dropdown-toggle {
width: 150px;
}
&__apply {
margin: 10px 0 0 0;
margin: 0;
transition:
opacity 0.25s ease;
opacity: 0;
@include gradient-h($c-ocean, $c-pool);
border-radius: 3px 3px 0 0;
padding: 9px;
& + .dropdown-menu {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
}
.dropdown-menu {
opacity: 0;
display: block !important;
transition: opacity 0.25s ease;
}
.dropdown-options {
width: 100%;
position: absolute;
top: 100%;
left: 0;
visibility: hidden;
transition-property: all;
}
/* Styling Active State of items */
.dropdown-menu > li.active > a {
outline: none;
&,
&:focus,
&:active,
&:active:focus {
color: $g20-white !important;
background: $c-sapphire;
background: -moz-linear-gradient(left, $c-sapphire 0%, $c-pool 100%) !important;
background: -webkit-linear-gradient(left, $c-sapphire 0%,$c-pool 100%) !important;
background: linear-gradient(to right, $c-sapphire 0%,$c-pool 100%) !important;
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$c-sapphire', endColorstr='$c-pool',GradientType=1 ) !important;
}
}
}
/* Open State */
.multi-select-dropdown.open {
.dropdown-options {
visibility: visible;
}
.dropdown-menu,
.multi-select-dropdown__apply {
opacity: 1;
}
}

View File

@ -1,42 +1,12 @@
.panel-builder {
width: 399px;
overflow-x: hidden;
background: $g1-raven;
background: -moz-linear-gradient(top, $g5-pepper 0%, $g1-raven 100%);
background: -webkit-linear-gradient(top, $g5-pepper 0%,$g1-raven 100%);
background: linear-gradient(to bottom, $g5-pepper 0%,$g1-raven 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='$g5-pepper', endColorstr='$g1-raven',GradientType=0 );
padding: $explorer-page-padding;
@include gradient-v($g2-kevlar,$g0-obsidian);
@include custom-scrollbar($g2-kevlar,$c-pool);
&__tabs {
display: flex;
text-align: center;
padding: $explorer-page-padding $explorer-page-padding 0 $explorer-page-padding;
background: $g3-castle;
}
&__tab {
padding: 18px 0 9px 0px;
flex: 1;
background: $g3-castle;
cursor: pointer;
font-weight: 400;
font-size: 20px;
color: $g12-forge;
line-height: calc(60px - $explorer-page-padding - 2px);
border-radius: 4px 4px 0 0;
transition: color 0.25s ease;
&:hover {
color: $g20-white;
}
&.active {
background-color: $g5-pepper;
color: $g20-white;
}
}
&__tab-content {
padding: $explorer-page-padding;
}
&__item {
> .btn {
margin-bottom: 6px;
}
}
}

View File

@ -1,108 +1,53 @@
.checkbox.checked {
background-color: gainsboro !important;
}
/*
Query Editor Styles
-------------------------------------------------
Abbreviated as "qeditor"
*/
$query-editor-gutter: 16px;
$query-editor-tab-inactive: $g5-pepper;
$query-editor-tab-active: $g6-smoke;
$query-editor-height: 35vh;
$query-editor-tab-inactive: $g2-kevlar;
$query-editor-tab-active: $g3-castle;
$query-editor-height: 250px;
.query-editor {
padding: 0.5em;
background-color: $g8-storm;
border-radius: 0 0 $radius $radius;
.qeditor--query-preview {
position: relative;
&__code {
position: relative;
pre {
white-space: pre-wrap;
border: 0;
background-color: $query-editor-tab-inactive;
font-weight: 600;
color: $c-comet;
border-radius: $radius-small $radius-small 0 0;
border-bottom: 2px solid $g6-smoke;
margin-bottom: 0;
overflow: auto;
min-height: 3.25em;
code {
white-space: pre-wrap;
line-height: 1.5em;
}
// Custom Scrollbar styles, pretty sure these only work in chrome
&::-webkit-scrollbar {
width: 14px;
border-top-right-radius: $radius;
&-button {
background-color: $query-editor-tab-inactive;
}
&-track {
background-color: $query-editor-tab-inactive;
border-top-right-radius: $radius;
}
&-track-piece {
background-color: $query-editor-tab-inactive;
border-top-right-radius: $radius;
}
&-thumb {
background-color: $c-comet;
border: 4px solid $query-editor-tab-inactive;
border-radius: 7px;
}
&-corner {
background-color: $query-editor-tab-inactive;
}
}
&::-webkit-resizer {
background-color: $query-editor-tab-inactive;
}
&.rq-mode {
color: $c-honeydew;
&::-webkit-scrollbar-thumb {
background-color: $c-honeydew;
}
}
}
}
// Tabs for switching between queries
&__tab {
text-align: center;
pre {
padding: 9px;
white-space: pre-wrap;
border: 0;
background-color: $query-editor-tab-inactive;
color: $g13-mist;
height: 30px;
padding: 0 9.5px;
line-height: 30px;
font-size: 14px;
font-weight: 600;
color: $c-comet;
border-radius: $radius-small $radius-small 0 0;
margin-right: 2px;
transition:
color 0.25s ease,
background-color 0.25s ease;
border-bottom: 2px solid $query-editor-tab-active;
margin-bottom: 0;
overflow: auto;
min-height: 3.25em;
@include custom-scrollbar($query-editor-tab-inactive, $c-pool);
&.active {
background-color: $query-editor-tab-active;
color: $g20-white;
code {
white-space: pre-wrap;
line-height: 1.5em;
}
&:hover {
cursor: pointer;
color: $g20-white;
&.rq-mode {
color: $c-rainforest;
@include custom-scrollbar($query-editor-tab-inactive, $c-rainforest);
}
}
&__tabs {
display: flex;
width: 100%;
justify-content: flex-start;
padding: 8px 9.5px 0 9.5px;
background-color: $query-editor-tab-inactive;
flex-wrap: wrap;
}
&__tabs-heading {
}
// Tabs for switching between queries
.qeditor--tabs {
display: flex;
width: 100%;
justify-content: flex-start;
padding: 8px 9px 0 9px;
background-color: $query-editor-tab-inactive;
flex-wrap: wrap;
&-heading {
flex-basis: 100%;
width: 100%;
font-size: 12px;
@ -112,392 +57,205 @@ $query-editor-height: 35vh;
text-transform: uppercase;
letter-spacing: 0.3px;
}
}
.qeditor--tab {
text-align: center;
background-color: $query-editor-tab-inactive;
color: $g13-mist;
height: 28px;
padding: 0 9px;
line-height: 28px;
font-size: 12px;
font-weight: 600;
border-radius: $radius-small $radius-small 0 0;
margin-right: 2px;
transition:
color 0.25s ease,
background-color 0.25s ease;
// List of options
&__list {
margin: 0;
padding: 9.5px 0 0 0;
background-color: $g6-smoke;
border-radius: 0 0 $radius-small $radius-small;
min-height: $query-editor-height;
max-height: 80vh;
overflow: auto;
// Custom Scrollbar styles, pretty sure these only work in chrome
&::-webkit-scrollbar {
width: 14px;
border-bottom-right-radius: $radius;
&-button {
background-color: $g6-smoke;
}
&-track {
background-color: $g6-smoke;
border-bottom-right-radius: $radius;
}
&-track-piece {
background-color: $g5-pepper;
border: 4px solid $g6-smoke;
border-radius: 7px;
}
&-thumb {
background-color: $g8-storm;
border: 4px solid $g6-smoke;
border-radius: 7px;
}
&-corner {
background-color: $g6-smoke;
}
}
&::-webkit-resizer {
background-color: $g6-smoke;
}
&-item {
color: $g13-mist;
list-style-type: none;
margin: 0;
font-size: 13px;
padding: 4px 9.5px 4px 19px;
transition:
color 0.25s ease,
background-color 0.25s ease;
&:hover {
background-color: $g7-graphite;
color: $g20-white;
cursor: pointer;
}
}
&-radio {
&.active {
color: $g20-white;
background-color: $g7-graphite;
font-weight: 600;
}
}
&-checkbox {
display: flex;
align-items: center;
justify-content: space-between;
&.checked {
color: $g20-white;
font-weight: 600;
// Animate checked state
.query-editor__list-checkbox__checkbox {
&:before {
opacity: 1;
transform: translate(-50%,-50%) scale(0.4,0.4);
}
}
// Fade in & out dropdowns when checked
.query-editor__hidden-dropdown {
visibility: visible;
.dropdown {
opacity: 1;
}
}
}
.dropdown {
.btn.dropdown-toggle {
text-align: left;
background-color: $g5-pepper;
border-color: $g5-pepper;
color: $g13-mist !important;
&:hover {
background-color: $g6-smoke;
border-color: $g6-smoke;
color: $g20-white !important;
}
&:active,
&:active:hover,
&:active:focus,
&.active {
color: $g20-white !important;
background-color: $g7-graphite;
border-color: $g6-smoke;
}
}
.dropdown-menu {
width: 100%;
min-width: 100%;
max-width: 100%;
background-color: $g5-pepper;
li {
margin-bottom: 2px;
&:last-child {
margin-bottom: 0;
}
}
li > a {
font-size: 13px;
padding-left: 31px;
position: relative;
&:hover {
background-color: $g6-smoke;
}
// Checkbox background
&:after {
content: '';
position: absolute;
top: 50%;
left: 5px;
transform: translateY(-50%);
background-color: $g4-onyx;
border-radius: 2px;
width: 16px;
height: 16px;
z-index: 1;
transition: background-color 0.25s ease;
}
// Checkbox check
&:before {
opacity: 0;
content: '';
position: absolute;
top: 50%;
left: 13px;
transform: translate(-50%,-50%);
background-color: $c-pool;
border-radius: 50%;
width: 20px;
height: 20px;
z-index: 2;
transition: all 0.25s ease;
}
}
li.active > a {
background: none;
background-color: $g7-graphite;
// Checkbox background
&:after {
background-color: $g6-smoke;
}
// Checkbox check
&:before {
opacity: 1;
transform: translate(-50%,-50%) scale(0.4,0.4);
}
}
}
}
&__checkbox {
position: relative;
padding-left: 24px;
&:before {
z-index: 2;
content: '';
position: absolute;
top: 50%;
left: 8px;
transform: translate(-50%,-50%);
width: 20px;
height: 20px;
opacity: 0;
background-color: $c-pool;
border-radius: 50%;
transition:
transform 0.25s ease,
opacity 0.25s ease;
}
&:after {
content: '';
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
width: 16px;
height: 16px;
background-color: $g5-pepper;
border-radius: 3px;
z-index: 1;
}
}
}
&-header {
position: relative;
background-color: $g6-smoke;
padding: 9.5px 19px 0px 19px;
}
}
// List empty state
&__empty {
text-align: center;
color: $g13-mist;
display: inline-block;
width: 100%;
padding: 18px 0;
min-height: $query-editor-height;
max-height: 80vh;
background-color: $g7-graphite;
border-radius: 0 0 $radius $radius;
}
// Hidden dropdowns
&__hidden-dropdown {
visibility: hidden;
transition: all 0.3s all;
.dropdown {
transition: opacity 0.3s ease;
opacity: 0;
}
}
// Filter list results
&__filter {
position: relative;
width: 100%;
display: block;
background-color: $g5-pepper;
border: 2px solid $g5-pepper;
color: $g13-mist;
height: 30px;
border-radius: 15px;
font-size: 13px;
padding-left: 38px;
outline: none;
&:hover {
cursor: pointer;
color: $g20-white;
font-weight: 700;
}
&.active {
background-color: $query-editor-tab-active;
color: $g20-white;
}
}
// List of options
.qeditor--list {
margin: 0;
padding: 9.5px 0 0 0;
background-color: $query-editor-tab-active;
border-radius: 0 0 $radius-small $radius-small;
min-height: $query-editor-height;
&-item {
color: $g11-sidewalk;
list-style-type: none;
margin: 0;
font-size: 12px;
padding: 4px 9px 4px 18px;
transition:
border-color 0.25s ease,
color 0.25s ease,
background-color 0.25s ease;
&:focus {
border-color: $c-pool;
& + .icon {
color: $g20-white;
&:hover {
background-color: $g4-onyx;
color: $g17-whisper;
cursor: pointer;
}
}
&-radio {
&.active {
color: $g20-white;
background-color: $g4-onyx;
font-weight: 600;
}
}
&-checkbox {
display: flex;
align-items: center;
justify-content: space-between;
&.checked {
color: $g20-white;
font-weight: 600;
// Animate checked state
.qeditor--list-checkbox__checkbox {
&:before {
opacity: 1;
transform: translate(-50%,-50%) scale(0.4,0.4);
}
}
// Fade in & out dropdowns when checked
.qeditor--hidden-dropdown {
visibility: visible;
.dropdown {
opacity: 1;
}
}
}
&::-webkit-input-placeholder {
color: $g10-wolf;
font-weight: 500;
}
&:-moz-placeholder { /* Firefox 18- */
color: $g10-wolf;
font-weight: 500;
}
&::-moz-placeholder { /* Firefox 19+ */
color: $g10-wolf;
font-weight: 500;
}
&:-ms-input-placeholder {
color: $g10-wolf;
font-weight: 500;
}
+ .icon {
position: absolute;
top: calc(50% + 5px);
left: calc(19px * 2);
transform: translateY(-50%);
color: $g10-wolf;
transition: color 0.25s ease;
font-size: 12px;
z-index: 2;
&__checkbox {
position: relative;
padding-left: 24px;
&:before {
z-index: 2;
content: '';
position: absolute;
top: 50%;
left: 8px;
transform: translate(-50%,-50%);
width: 20px;
height: 20px;
opacity: 0;
background-color: $c-pool;
border-radius: 50%;
transition:
transform 0.25s ease,
opacity 0.25s ease;
}
&:after {
content: '';
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
width: 16px;
height: 16px;
background-color: $g2-kevlar;
border-radius: 3px;
z-index: 1;
}
}
}
&-header {
position: relative;
background-color: $query-editor-tab-active;
padding: 8px 18px 0px 18px;
}
}
// Warning for converting to raw query
&__warning {
// List empty state
.qeditor--empty {
text-align: center;
color: $g10-wolf;
display: inline-block;
width: 100%;
padding: 18px 0;
height: $query-editor-height;
background-color: $query-editor-tab-active;
border-radius: 0 0 $radius $radius;
}
// Hidden dropdowns
.qeditor--hidden-dropdown {
visibility: hidden;
transition: all 0.3s all;
.dropdown {
transition: opacity 0.3s ease;
opacity: 0;
transition: opacity 0.35s ease;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(56,56,70,0.8);
z-index: 999;
border-radius: $radius-small $radius-small 0 0;
border-bottom: 2px solid $g6-smoke;
display: flex;
justify-content: center;
align-items: center;
&:hover {
opacity: 1;
}
}
}
.field {
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
&.active {
background-color: gainsboro !important;
}
}
.group-by-time {
display: flex;
align-items: baseline;
}
.group-by-time-dropdown {
width: $group-by-time-dropdown-width;
.caret {
position: absolute;
top: calc(50% + 1px);
right: 13px;
transform: translateY(-50%);
}
.dropdown-toggle {
text-align: left;
width: 100%;
background-color: $g5-pepper;
border-color: $g5-pepper;
color: $g13-mist !important;
&:hover {
color: $g20-white !important;
background-color: $g7-graphite;
border-color: $g6-smoke;
}
&:active,
&:active:hover,
&:active:focus,
&.active {
color: $g20-white !important;
background-color: $g7-graphite;
border-color: $g6-smoke;
}
}
.dropdown-menu {
width: $group-by-time-dropdown-width;
min-width: 2em; // Override bootstrap min-width
}
}
.group-by-time-dropdown-label {
// Filter list results
.qeditor--filter {
position: relative;
width: 100%;
display: block;
background-color: $g3-castle;
border: 2px solid $g6-smoke;
color: $g13-mist;
margin-right: 4px;
}
height: 30px;
border-radius: 15px;
font-size: 13px;
padding-left: 38px;
outline: none;
color: $g20-white;
font-weight: 700;
transition:
border-color 0.25s ease,
color 0.25s ease,
background-color 0.25s ease;
.query-editor-empty-state {
color: $g17-whisper;
&:focus {
border-color: $c-pool;
& + .icon {
color: $g20-white;
.icon {
font-size: 1em;
}
}
}
&::-webkit-input-placeholder {
color: $g10-wolf;
font-weight: 500;
}
&:-moz-placeholder { /* Firefox 18- */
color: $g10-wolf;
font-weight: 500;
}
&::-moz-placeholder { /* Firefox 19+ */
color: $g10-wolf;
font-weight: 500;
}
&:-ms-input-placeholder {
color: $g10-wolf;
font-weight: 500;
}
+ .icon {
position: absolute;
top: calc(50% + 5px);
left: calc(19px * 2);
transform: translateY(-50%);
color: $g10-wolf;
transition: color 0.25s ease;
font-size: 12px;
z-index: 2;
}
}

View File

@ -20,7 +20,7 @@
justify-content: flex-start;
.badge {
background-color: $g5-pepper;
background-color: $g2-kevlar;
color: $c-pool;
margin-left: 5px;
}
@ -46,7 +46,7 @@
&__checkbox {
width: 16px;
height: 16px;
background-color: $g5-pepper;
background-color: $g2-kevlar;
border-radius: 3px;
position: relative;
margin-right: 8px;
@ -76,7 +76,7 @@
align-items: center;
&.active {
background: $g7-graphite;
background: $g4-onyx;
color: $g20-white;
font-weight: 600;
@ -90,7 +90,7 @@
position: relative;
width: 100%;
display: block;
background-color: $g5-pepper;
background-color: $g3-castle;
border: 2px solid $g5-pepper;
color: $g13-mist;
height: 24px;
@ -173,40 +173,4 @@
border-color: $c-laser;
}
}
}
.tag-list__toggle {
width: 170px;
display: flex;
&-btn {
border: 2px solid $g7-graphite;
background-color: $g5-pepper;
color: $g10-wolf;
border-radius: 3px 0 0 3px;
&:last-child {
border-radius: 0 3px 3px 0;
border-left: 0;
}
width: 50%;
height: 30px;
line-height: 26px;
text-align: center;
transition:
color 0.25s ease,
background-color 0.25s ease;
&:hover {
color: $g20-white;
background-color: $g6-smoke;
cursor: pointer;
}
&.active {
background-color: $g7-graphite;
color: $g20-white;
font-weight: 600;
}
}
}
}

View File

@ -1,142 +1,114 @@
$graph-panel__tab-height: 44px;
$graph-panel__tab-offset: 8px;
$graph-bg-color: $g3-castle;
$graph-active-color: $g4-onyx;
$graph-radius: 4px;
$dygraphs-legend-offset: 32px;
.graph-panel {
.graph {
position: relative;
margin-bottom: 18px;
transition: box-shadow 0.3s ease;
&.active {
.graph-panel__title {
color: $g20-white;
}
}
&:last-child {
margin-bottom: 100%;
}
}
.graph-heading {
background-color: $graph-bg-color;
border-radius: $graph-radius $graph-radius 0 0;
display: flex;
align-items: center;
justify-content: space-between;
height: 44px;
padding: 0 16px;
transition:
background-color 0.25s ease;
&__view-selector {
cursor: pointer;
&.active {
color: $g20-white;
}
}
&__bar {
background-color: $g5-pepper;
border-radius: 4px 4px 0 0;
display: flex;
align-items: center;
justify-content: space-between;
height: $graph-panel__tab-height;
padding: 0 16px;
transition:
background-color 0.25s ease;
}
&__left {
display: flex;
align-items: center;
}
&__title {
font-size: 16px;
color: $g13-mist;
font-weight: 500;
margin-right: 16px;
transition:
color 0.25s ease;
.icon {
font-size: 12px;
margin-right: 8px;
position: relative;
top: -1px;
}
}
&__tabs {
padding: 0;
margin: $graph-panel__tab-offset 0 0 0;
list-style: none;
display: flex;
}
&__tab {
background-color: $g5-pepper;
color: $g10-wolf;
height: $graph-panel__tab-height - $graph-panel__tab-offset;
line-height: $graph-panel__tab-height - $graph-panel__tab-offset - 5px;
border-radius: 4px 4px 0 0;
margin-right: 2px;
padding: 0 14px;
font-weight: 500;
transition:
background-color 0.25s ease,
color 0.25s ease;
&:hover {
cursor: pointer;
color: $g13-mist;
background-color: $g4-onyx;
}
&.active {
background-color: $g3-castle;
color: $g20-white;
}
}
&__graph-container {
background-color: $g3-castle;
border-radius: 0 0 4px 4px;
padding: 8px 16px;
position: relative;
height: 316px;
}
&__graph-empty {
width: 100%;
height: 300px;
display: flex;
align-items: center;
justify-content: center;
> * {
margin: 0;
color: $g8-storm;
}
}
&__graph-fetching {
width: 100%;
height: 320px;
display: flex;
align-items: center;
justify-content: center;
}
&__spinner {
width: 121px;
height: 121px;
background-image: url(assets/images/laser-spinner.png);
background-size: 100% 100%;
background-position: center center;
background-repeat: no-repeat;
animation: graph-panel-spinner 1s infinite linear;
}
&__spinner--small {
width: 58px;
height: 58px;
background-image: url(assets/images/laser-spinner.png);
background-size: 100% 100%;
background-position: center center;
background-repeat: no-repeat;
animation: graph-panel-spinner 1s infinite linear;
position: absolute;
left: 0;
bottom: 0;
right: 0;
top: 0;
margin: auto;
.toggle {
margin: 0;
}
}
.graph-title {
font-size: 14px;
color: $g13-mist;
font-weight: 600;
margin-right: 16px;
transition:
color 0.25s ease;
}
.graph-actions {
display: flex;
align-items: center;
}
.graph-container {
background-color: $graph-bg-color;
border-radius: 0 0 $graph-radius $graph-radius;
padding: 8px 16px;
position: relative;
height: 316px;
transition:
background-color 0.25s ease;
}
/* Active State */
.graph.active {
.graph-heading,
.graph-container {
background-color: $graph-active-color;
}
.graph-title {
color: $g20-white;
}
}
.graph-empty {
width: 100%;
height: 300px;
display: flex;
align-items: center;
justify-content: center;
align-content: center;
> p {
font-size: 28px;
font-weight: 300;
margin: 0;
text-align: center;
color: $g8-storm;
}
}
.graph-fetching {
width: 100%;
height: 320px;
display: flex;
align-items: center;
justify-content: center;
}
.graph-spinner {
width: 121px;
height: 121px;
background-image: url(assets/images/laser-spinner.png);
background-size: 100% 100%;
background-position: center center;
background-repeat: no-repeat;
animation: graph-panel-spinner 1s infinite linear;
}
.graph-spinner--small {
width: 58px;
height: 58px;
background-image: url(assets/images/laser-spinner.png);
background-size: 100% 100%;
background-position: center center;
background-repeat: no-repeat;
animation: graph-panel-spinner 1s infinite linear;
position: absolute;
left: 0;
bottom: 0;
right: 0;
top: 0;
margin: auto;
}
@keyframes graph-panel-spinner {
0% {
transform: rotate(0deg);

View File

@ -13,50 +13,20 @@
left: 0;
background-color: $g1-raven;
&__header {
margin-bottom: 0;
background-color: $g0-obsidian;
color: $g15-platinum;
position: absolute;
top: 0;
left: 0;
width: 100%;
.page-header {
padding-left: $explorer-page-padding;
padding-right: $explorer-page-padding;
justify-content: space-between;
padding-right: ($explorer-page-padding + $scrollbar-width);
}
&-container {
height: 100%;
position: absolute;
width: 100%;
}
.controls {
padding: 5px;
display: flex;
align-items: center;
justify-content: center;
}
/* Sessions Dropdown Styles */
.chronograf-header__left {
flex-direction: row;
align-items: center;
}
.dropdown-title {
white-space: nowrap;
.page-header__container {
max-width: 100%;
}
}
.main-content {
.resize-container.page-contents {
overflow: hidden;
display: flex;
flex-direction: row;
align-items: stretch;
position: absolute;
left: 0;
top: $chronograf-page-header-height;
height: calc(100% - #{$chronograf-page-header-height});
width: 100%;
}
.panels {

View File

@ -1,5 +1,4 @@
@import 'base/reset';
@import 'base/sizes';
@import 'layout/main';
@ -7,6 +6,7 @@
@import 'components/PanelBuilder';
@import 'components/Explorer';
@import 'components/MultiSelectDropdown';
@import 'components/GroupByTimeDropdown';
@import 'components/TagList';
@import 'components/Resizer';
@import 'components/Header';

View File

@ -21,7 +21,7 @@
66% { transform: translate(-50%,-50%) scale(1.75); background-color: $g7-graphite; }
100% { transform: translate(-50%,-50%) scale(1,1); }
}
.graph-panel__graph-container.hosts-graph {
.graph-container.hosts-graph {
padding: 8px 16px;
.single-stat {

View File

@ -172,8 +172,8 @@
min-height: 70px;
max-height: 290px;
overflow: auto;
@include custom-scrollbar($c-pool,$c-laser);
@include gradient-h($c-ocean,$c-pool);
@include custom-scrollbar($c-pool, $c-laser);
@include gradient-h($c-ocean, $c-pool);
box-shadow: 0 2px 5px 0.6px fade-out($g0-obsidian, 0.8);
> li {
@ -181,7 +181,7 @@
font-size: 0px;
&:hover {
@include gradient-h($c-laser,$c-pool);
@include gradient-h($c-laser, $c-pool);
}
}
> li > a {
@ -202,6 +202,13 @@
background-color: transparent;
color: $g20-white !important;
}
&:active,
&:active:focus {
@include gradient-h($c-sapphire, $c-pool);
}
&:focus {
@include gradient-h($c-ocean, $c-pool);
}
}
> li:last-child a {
border-radius: 0 0 3px 3px;
@ -211,11 +218,11 @@
}
}
.dropdown.dropdown-kapacitor .dropdown-menu {
@include custom-scrollbar($c-rainforest,$c-honeydew);
@include gradient-h($c-pool,$c-rainforest);
@include custom-scrollbar($c-rainforest, $c-honeydew);
@include gradient-h($c-pool, $c-rainforest);
> li:hover {
@include gradient-h($c-laser,$c-rainforest);
@include gradient-h($c-laser, $c-rainforest);
}
> li > a {
color: $c-mint !important;
@ -225,11 +232,11 @@
}
}
.dropdown.dropdown-chronograf .dropdown-menu {
@include custom-scrollbar($c-comet,$c-potassium);
@include gradient-h($c-ocean,$c-comet);
@include custom-scrollbar($c-comet, $c-potassium);
@include gradient-h($c-ocean, $c-comet);
> li:hover {
@include gradient-h($c-laser,$c-comet);
@include gradient-h($c-laser, $c-comet);
}
> li > a {
color: $c-cremedeviolette !important;
@ -367,4 +374,60 @@ code {
span {
display: none;
}
}
/*
Dark Toggles
----------------------------------------------
*/
$toggle-height-sm: 30px;
$toggle-font-sm: 13px;
$toggle-padding-sm: 9px;
$toggle-height-md: 30px;
$toggle-font-md: 13px;
$toggle-padding-md: 9px;
$toggle-border: 2px;
.toggle {
display: inline-block;
width: auto;
padding: $toggle-border;
border-radius: 3px;
background-color: $g5-pepper;
font-size: 0;
}
.toggle-btn {
border: 0;
border-radius: 1px;
display: inline-block;
vertical-align: middle;
width: auto;
background-color: $g3-castle;
color: $g11-sidewalk;
transition:
background-color 0.25s,
color 0.25s;
&:hover {
cursor: pointer;
color: $g14-chromium;
background-color: $g4-onyx;
}
&.active {
background-color: $g5-pepper;
color: $g18-cloud;
}
}
.toggle-sm {
height: $toggle-height-sm;
.toggle-btn {
height: ($toggle-height-sm - ($toggle-border * 2));
line-height: ($toggle-height-sm - ($toggle-border * 2));
padding: 0 $toggle-padding-sm;
font-size: $toggle-font-sm;
font-weight: 600;
}
}

View File

@ -7,7 +7,7 @@ $g0-obsidian: #0f0e15;
$g1-raven: #1c1c21;
$g2-kevlar: #202028;
$g3-castle: #292933;
$g4-onyx: #2C2C38;
$g4-onyx: #31313d;
$g5-pepper: #383846;
$g6-smoke: #434453;
$g7-graphite: #545667;

View File

@ -43,12 +43,12 @@ $scrollbar-width: 16px;
}
&-track-piece {
background-color: $trackColor;
border: ($scrollbar-width / 4) solid $trackColor;
border: 6px solid $trackColor;
border-radius: ($scrollbar-width / 2);
}
&-thumb {
background-color: $handleColor;
border: ($scrollbar-width / 4) solid $trackColor;
border: 6px solid $trackColor;
border-radius: ($scrollbar-width / 2);
}
&-corner {
@ -56,6 +56,6 @@ $scrollbar-width: 16px;
}
}
&::-webkit-resizer {
background-color: $trackColor;
background-color: $trackColor;
}
}