mirror of
https://github.com/balena-io/etcher.git
synced 2025-04-24 23:37:18 +00:00
146 lines
3.6 KiB
TypeScript
146 lines
3.6 KiB
TypeScript
/*
|
|
* Copyright 2016 balena.io
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import * as Color from 'color';
|
|
import * as React from 'react';
|
|
import { ProgressBar } from 'rendition';
|
|
import { css, default as styled, keyframes } from 'styled-components';
|
|
|
|
import { StepButton, StepSelection } from '../../styled-components';
|
|
import { colors } from '../../theme';
|
|
|
|
const darkenForegroundStripes = 0.18;
|
|
const desaturateForegroundStripes = 0.2;
|
|
const progressButtonStripesForegroundColor = Color(colors.primary.background)
|
|
.darken(darkenForegroundStripes)
|
|
.desaturate(desaturateForegroundStripes)
|
|
.string();
|
|
|
|
const desaturateBackgroundStripes = 0.05;
|
|
const progressButtonStripesBackgroundColor = Color(colors.primary.background)
|
|
.desaturate(desaturateBackgroundStripes)
|
|
.string();
|
|
|
|
const ProgressButtonStripes = keyframes`
|
|
0% {
|
|
background-position: 0 0;
|
|
}
|
|
|
|
100% {
|
|
background-position: 20px 20px;
|
|
}
|
|
`;
|
|
|
|
const ProgressButtonStripesRule = css`
|
|
${ProgressButtonStripes} 1s linear infinite;
|
|
`;
|
|
|
|
const FlashProgressBar = styled(ProgressBar)`
|
|
> div {
|
|
width: 200px;
|
|
height: 48px;
|
|
color: white !important;
|
|
text-shadow: none !important;
|
|
}
|
|
|
|
width: 200px;
|
|
height: 48px;
|
|
font-size: 16px;
|
|
line-height: 48px;
|
|
|
|
background: ${Color(colors.warning.background)
|
|
.darken(darkenForegroundStripes)
|
|
.string()};
|
|
`;
|
|
|
|
const FlashProgressBarValidating = styled(FlashProgressBar)`
|
|
// Notice that we add 0.01 to certain gradient stop positions.
|
|
// That workarounds a Chrome rendering issue where diagonal
|
|
// lines look spiky.
|
|
// See https://github.com/balena-io/etcher/issues/472
|
|
|
|
background-image: -webkit-gradient(
|
|
linear,
|
|
0 0,
|
|
100% 100%,
|
|
color-stop(0.25, ${progressButtonStripesForegroundColor}),
|
|
color-stop(0.26, ${progressButtonStripesBackgroundColor}),
|
|
color-stop(0.5, ${progressButtonStripesBackgroundColor}),
|
|
color-stop(0.51, ${progressButtonStripesForegroundColor}),
|
|
color-stop(0.75, ${progressButtonStripesForegroundColor}),
|
|
color-stop(0.76, ${progressButtonStripesBackgroundColor}),
|
|
to(${progressButtonStripesBackgroundColor})
|
|
);
|
|
|
|
background-color: white;
|
|
|
|
animation: ${ProgressButtonStripesRule};
|
|
overflow: hidden;
|
|
|
|
background-size: 20px 20px;
|
|
`;
|
|
|
|
interface ProgressButtonProps {
|
|
striped: boolean;
|
|
active: boolean;
|
|
percentage: number;
|
|
label: string;
|
|
disabled: boolean;
|
|
callback: () => any;
|
|
}
|
|
|
|
/**
|
|
* Progress Button component
|
|
*/
|
|
export class ProgressButton extends React.Component<ProgressButtonProps> {
|
|
public render() {
|
|
if (this.props.active) {
|
|
if (this.props.striped) {
|
|
return (
|
|
<StepSelection>
|
|
<FlashProgressBarValidating
|
|
primary
|
|
emphasized
|
|
value={this.props.percentage}
|
|
>
|
|
{this.props.label}
|
|
</FlashProgressBarValidating>
|
|
</StepSelection>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<StepSelection>
|
|
<FlashProgressBar warning emphasized value={this.props.percentage}>
|
|
{this.props.label}
|
|
</FlashProgressBar>
|
|
</StepSelection>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<StepSelection>
|
|
<StepButton
|
|
onClick={this.props.callback}
|
|
disabled={this.props.disabled}
|
|
>
|
|
{this.props.label}
|
|
</StepButton>
|
|
</StepSelection>
|
|
);
|
|
}
|
|
}
|