mirror of
https://github.com/quine-global/hyper.git
synced 2026-01-13 04:28:41 -09:00
1622 lines
106 KiB
HTML
1622 lines
106 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<title>Hyper™</title>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="initial-scale=1.0" />
|
|
<meta name="twitter:card" content="summary_large_image" />
|
|
<meta name="twitter:site" content="@zeithq" />
|
|
<meta name="og:title" content="Hyper™" />
|
|
<meta name="og:url" content="https://hyper.now.sh" />
|
|
<meta name="description" content="Hyper™: HTML/JS/CSS terminal" />
|
|
<meta name="og:description" content="Hyper™: HTML/JS/CSS terminal" />
|
|
<meta name="og:image" content="https://hyper.now.sh/static/hyper.png" />
|
|
<meta name="theme-color" content="#000000">
|
|
<link rel="dns-prefetch" href="https://cdn.zeit.co" />
|
|
<link rel="shortcut icon" href="favicon.png" />
|
|
<style>
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
text-rendering: geometricPrecision;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
body, html {
|
|
background: #000;
|
|
color: #ccc;
|
|
font: 12px Menlo, "DejaVu Sans Mono", "Lucida Console", monospace;
|
|
}
|
|
|
|
#header {
|
|
position: fixed;
|
|
top: 15px;
|
|
right: 20px;
|
|
z-index: 10000;
|
|
display: flex;
|
|
transition: all 0.3s ease;
|
|
transition-property: transform, opacity;
|
|
}
|
|
|
|
#header span {
|
|
color: #999;
|
|
font-family: -apple-system, BlinkMacSystemFont,
|
|
"Segoe UI", "Roboto", "Oxygen",
|
|
"Ubuntu", "Cantarell", "Fira Sans",
|
|
"Droid Sans", "Helvetica Neue", sans-serif;
|
|
display: flex;
|
|
align-items: center;
|
|
margin-right: 10px;
|
|
}
|
|
|
|
#header a {
|
|
color: #999;
|
|
text-decoration: none;
|
|
}
|
|
|
|
#header a img {
|
|
height: 16px;
|
|
margin-left: 6px;
|
|
margin-right: 4px;
|
|
}
|
|
|
|
#header a:hover {
|
|
color: #FF2E88;
|
|
}
|
|
|
|
#header a.download-link {
|
|
color: #FF2E88;
|
|
}
|
|
|
|
#header.hidden {
|
|
transform: translateY(-35px);
|
|
opacity: 0;
|
|
}
|
|
|
|
#logo {
|
|
position: absolute;
|
|
left: 0;
|
|
right: 0;
|
|
top: 0;
|
|
padding: 50px 0 40px;
|
|
font-family: -apple-system, BlinkMacSystemFont,
|
|
"Segoe UI", "Roboto", "Oxygen",
|
|
"Ubuntu", "Cantarell", "Fira Sans",
|
|
"Droid Sans", "Helvetica Neue", sans-serif;
|
|
text-align: center;
|
|
z-index: 1000;
|
|
}
|
|
|
|
#logo img {
|
|
display: block;
|
|
margin: 0 auto 10px;
|
|
}
|
|
|
|
#logo .title, #logo .subtitle {
|
|
padding: 3px 0;
|
|
}
|
|
|
|
#logo .title {
|
|
font-size: 16px;
|
|
}
|
|
|
|
#logo .title b {
|
|
font-weight: 500;
|
|
}
|
|
|
|
#logo .subtitle {
|
|
color: #9B9B9B;
|
|
}
|
|
|
|
#top {
|
|
height: 100vh;
|
|
width: 100vw;
|
|
position: relative;
|
|
text-align: center;
|
|
max-width: 100%;
|
|
}
|
|
|
|
#top .top-content {
|
|
position: absolute;
|
|
bottom: 20px;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
opacity: 0;
|
|
animation-name: arrow-appear;
|
|
animation-delay: 2s;
|
|
animation-duration: 500ms;
|
|
animation-timing-function: ease;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
.top-download {
|
|
position: relative;
|
|
bottom: 75px;
|
|
font-family: -apple-system, BlinkMacSystemFont,
|
|
"Segoe UI", "Roboto", "Oxygen",
|
|
"Ubuntu", "Cantarell", "Fira Sans",
|
|
"Droid Sans", "Helvetica Neue", sans-serif;
|
|
}
|
|
|
|
.download-button {
|
|
background: #50E3C2;
|
|
color: #494949;
|
|
height: 42px;
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 0 20px;
|
|
margin-bottom: 10px;
|
|
text-decoration: none;
|
|
transition: background .12s ease-in-out;
|
|
}
|
|
|
|
.download-button:hover {
|
|
background: #72EBD0;
|
|
}
|
|
|
|
.download-button svg {
|
|
color: #2EAA8F;
|
|
}
|
|
|
|
.download-button svg#fallback-icon {
|
|
margin-left: 10px;
|
|
}
|
|
|
|
.download-button svg:not(#fallback-icon) {
|
|
margin-right: 10px;
|
|
}
|
|
|
|
.download-button strong {
|
|
color: #000000;
|
|
}
|
|
|
|
#arrow {
|
|
position: absolute;
|
|
left: 50%;
|
|
margin-left: -9px;
|
|
bottom: 20px;
|
|
}
|
|
|
|
@keyframes arrow-appear {
|
|
from {
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
bottom: 0;
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
@keyframes arrow-video-finish {
|
|
from {
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
bottom: 0;
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
|
|
#video {
|
|
height: 100vh;
|
|
bottom: 0;
|
|
width: 100%;
|
|
position: absolute;
|
|
}
|
|
|
|
#video video {
|
|
height: 100%;
|
|
width: 100%;
|
|
}
|
|
|
|
#loading:before {
|
|
content: 'Loading...';
|
|
position: absolute;
|
|
display: block;
|
|
left: 0;
|
|
top: 50%;
|
|
right: 0;
|
|
color: #666;
|
|
opacity: 0;
|
|
animation-name: appear;
|
|
animation-delay: 2s;
|
|
animation-duration: 500ms;
|
|
animation-timing-function: ease;
|
|
animation-fill-mode: forwards;
|
|
}
|
|
|
|
@keyframes appear {
|
|
from {
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
#poster {
|
|
position: absolute;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
}
|
|
|
|
#poster img {
|
|
margin: auto;
|
|
}
|
|
|
|
#content {
|
|
max-width: 800px;
|
|
margin: auto;
|
|
}
|
|
|
|
#content a, .other-downloads a {
|
|
color: #FF2E88;
|
|
text-decoration: none;
|
|
border-bottom: 1px solid #FF2E88;
|
|
}
|
|
|
|
#content a:hover, .other-downloads a:hover {
|
|
background: #FF2E88;
|
|
color: #fff;
|
|
}
|
|
|
|
#content h2, #content h3 {
|
|
font-size: 12px;
|
|
font-weight: bold;
|
|
color: #ccc;
|
|
margin: 0 0 30px 0;
|
|
padding-top: 30px;
|
|
}
|
|
|
|
#content h2 a, #content h3 a {
|
|
color: #ccc;
|
|
border-bottom-width: 0;
|
|
}
|
|
|
|
#content p {
|
|
margin: 0 0 20px;
|
|
line-height: 18px;
|
|
}
|
|
|
|
#content h2:before {
|
|
content: '## ';
|
|
}
|
|
|
|
#content h3:before {
|
|
content: '### ';
|
|
}
|
|
|
|
#content code {
|
|
font: 12px Menlo, "DejaVu Sans Mono", "Lucida Console", monospace;
|
|
}
|
|
|
|
#content p code, #content li code, #content td code {
|
|
color: #fff;
|
|
}
|
|
|
|
#content p code:before, #content p code:after,
|
|
#content td code:before, #content td code:after,
|
|
#content li code:before, #content li code:after {
|
|
content: '`';
|
|
}
|
|
|
|
#content pre {
|
|
margin: 30px;
|
|
color: #50E3C2;
|
|
line-height: 18px;
|
|
}
|
|
|
|
#content table thead td {
|
|
color: #999;
|
|
font-size: 10px;
|
|
}
|
|
|
|
#content table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
}
|
|
|
|
#content td > table {
|
|
margin: 0;
|
|
}
|
|
|
|
#content table td {
|
|
vertical-align: top;
|
|
border: 1px solid #444;
|
|
line-height: 15px;
|
|
position: relative;
|
|
}
|
|
|
|
#content table td.highlighted:after {
|
|
position: absolute;
|
|
content: "";
|
|
border: 1px solid #50E3C2;
|
|
width: 100%;
|
|
height: 100%;
|
|
top: -1px;
|
|
left: -1px;
|
|
pointer-events: none;
|
|
}
|
|
|
|
#content table td.invisible-top-left {
|
|
border-top: 0;
|
|
border-left: 0;
|
|
}
|
|
|
|
#content #installation-table a {
|
|
border-bottom: none;
|
|
transition: color 0.3s ease;
|
|
}
|
|
|
|
#content #installation-table a:hover {
|
|
background: none;
|
|
color: #50E3C2;
|
|
}
|
|
|
|
#content #installation-table td:not(:first-child) {
|
|
text-align: center;
|
|
}
|
|
|
|
#content #installation-table td:not(.highlighted) img {
|
|
opacity: 0;
|
|
transition: opacity 0.3s ease;
|
|
}
|
|
|
|
#content #installation-table td a:hover img {
|
|
opacity: 1;
|
|
}
|
|
|
|
#content #installation-table td.highlighted a {
|
|
color: #50E3C2;
|
|
}
|
|
|
|
#content #installation-table {
|
|
color: #FFF;
|
|
}
|
|
|
|
#content #installation-table td[id^="td"] {
|
|
padding: 0;
|
|
}
|
|
|
|
#content #installation-table a {
|
|
display: block;
|
|
padding: 10px;
|
|
}
|
|
|
|
#content td.soon {
|
|
color: #555;
|
|
}
|
|
|
|
#content td {
|
|
padding: 10px;
|
|
}
|
|
|
|
#content table.config td:nth-child(2) {
|
|
width: 30%;
|
|
color: #999;
|
|
}
|
|
|
|
#content table.config tbody td:first-child {
|
|
color: #fff;
|
|
}
|
|
|
|
#content table.api tbody td:first-child {
|
|
color: #fff;
|
|
}
|
|
|
|
#content table.api > tbody > tr > td:nth-child(2) {
|
|
width: 13%;
|
|
}
|
|
|
|
#content table.api tbody tbody td:first-child {
|
|
width: 20%;
|
|
}
|
|
|
|
#content td > p:first-child {
|
|
margin-top: 0;
|
|
}
|
|
|
|
#content ul {
|
|
margin: 20px 10px;
|
|
}
|
|
|
|
#content ul li {
|
|
list-style-type: none;
|
|
line-height: 18px;
|
|
margin: 5px 0;
|
|
padding-left: 20px;
|
|
}
|
|
|
|
#content ul li:before {
|
|
content: '-';
|
|
color: #999;
|
|
position: absolute;
|
|
margin-left: -20px;
|
|
}
|
|
|
|
#content p b {
|
|
color: #fff;
|
|
}
|
|
|
|
@media screen and (max-height: 500px) {
|
|
.title {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
@media screen and (max-height: 550px) {
|
|
.title span {
|
|
display: none !important;
|
|
}
|
|
}
|
|
|
|
@media screen and (max-height: 650px) {
|
|
#logo img {
|
|
height: 50px;
|
|
width: auto;
|
|
padding: 0;
|
|
margin-top: 0;
|
|
}
|
|
}
|
|
|
|
@media screen and (max-height: 700px) {
|
|
#logo {
|
|
padding: 30px 0 0;
|
|
}
|
|
}
|
|
|
|
@media screen and (max-width: 800px) {
|
|
#content table {
|
|
margin-left: 0;
|
|
margin-right: 0;
|
|
}
|
|
#download-for {
|
|
display: none !important;
|
|
}
|
|
#header {
|
|
width:300px;
|
|
margin: 0 auto;
|
|
}
|
|
}
|
|
|
|
@media screen and (max-width: 700px) {
|
|
#header {
|
|
text-align: center;
|
|
padding: 20px 0;
|
|
position: static;
|
|
}
|
|
|
|
#video video {
|
|
display: none;
|
|
}
|
|
|
|
#video {
|
|
background: no-repeat center url('https://cdn.zeit.co/hyper/hyperapp.gif');
|
|
background-size: 100%;
|
|
height: 100vh;
|
|
}
|
|
|
|
#content {
|
|
padding: 20px;
|
|
}
|
|
|
|
|
|
pre {
|
|
white-space:pre-wrap; word-wrap:break-word; overflow:auto;
|
|
}
|
|
|
|
#content table {
|
|
margin-left: 0;
|
|
margin-right: 0;
|
|
}
|
|
|
|
#content table td {
|
|
width: 50% !important;
|
|
}
|
|
|
|
#content table td:nth-child(3) {
|
|
display: none;
|
|
}
|
|
|
|
#content .table-note:after {
|
|
margin: 15px 0;
|
|
content: "Please note: the complete table information is available in bigger resolutions!";
|
|
display: block;
|
|
color: #999;
|
|
}
|
|
|
|
#content img {
|
|
max-width: 100%;
|
|
height: auto;
|
|
}
|
|
|
|
#arrow {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
.is-hidden {
|
|
display: none;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="main">
|
|
<div id="header">
|
|
<span><a target="_blank" href="https://zeit.co">▲</a></span>
|
|
<span><a target="_blank" href="https://github.com/zeit/hyper/releases">Changelog</a></span>
|
|
<span><a target="_blank" href="https://github.com/zeit/hyper">GitHub</a></span>
|
|
<span>License: <b>MIT</b></span>
|
|
<span><span id="download-for">Download for:</span>
|
|
<a href="#installation" class="download-link"><img src="static/apple-logo.svg"/></a>
|
|
<a href="#installation" class="download-link"><img src="static/windows-logo.svg"/></a>
|
|
<a href="#installation" class="download-link"><img src="static/linux-logo.svg"/></a>
|
|
</span>
|
|
</div>
|
|
|
|
<div id="top">
|
|
<div id="loading"></div>
|
|
<div id="logo">
|
|
<img width='60' height='53' title='' alt='' src='data:image/gif;base64,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'>
|
|
|
|
<div class="title"><b>Hyper</b>™ <span style="font-size: 12px; display: block; margin-top: 6px; color: #999">JS/HTML/CSS Terminal</span></div>
|
|
</div>
|
|
<div id="video">
|
|
<video id="vid" src="https://cdn.zeit.co/hyper/hyperapp.mp4" height="100%" autoplay muted></video>
|
|
</div>
|
|
<div class="top-content">
|
|
<div class="top-download">
|
|
<a href="#installation" class="download-button">
|
|
<svg id="mac-os-icon" class="is-hidden" xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" fill-rule="evenodd">
|
|
<path d="M13.1092683,12.4146341 C12.8702439,12.9668293 12.5873171,13.475122 12.2595122,13.942439 C11.8126829,14.5795122 11.4468293,15.0204878 11.164878,15.2653659 C10.7278049,15.6673171 10.2595122,15.8731707 9.75804878,15.884878 C9.39804878,15.884878 8.96390244,15.782439 8.45853659,15.5746341 C7.9515122,15.3678049 7.48556098,15.2653659 7.0595122,15.2653659 C6.61268293,15.2653659 6.13346341,15.3678049 5.62087805,15.5746341 C5.1075122,15.782439 4.69395122,15.8907317 4.3777561,15.9014634 C3.89687805,15.9219512 3.41756098,15.7102439 2.93912195,15.2653659 C2.6337561,14.9990244 2.25180488,14.542439 1.7942439,13.8956098 C1.30331707,13.204878 0.899707317,12.4039024 0.583512195,11.4907317 C0.244878049,10.5043902 0.0751219512,9.54926829 0.0751219512,8.62458537 C0.0751219512,7.56536585 0.304,6.65180488 0.762439024,5.8862439 C1.12273171,5.27131707 1.60204878,4.7862439 2.20195122,4.43014634 C2.80185366,4.07404878 3.45004878,3.89258537 4.14809756,3.88097561 C4.53004878,3.88097561 5.03092683,3.99912195 5.65336585,4.23131707 C6.27404878,4.46429268 6.67258537,4.58243902 6.84731707,4.58243902 C6.97795122,4.58243902 7.42068293,4.44429268 8.17121951,4.16887805 C8.88097561,3.91346341 9.48,3.80770732 9.97073171,3.84936585 C11.3004878,3.95668293 12.2995122,4.48087805 12.9639024,5.42526829 C11.7746341,6.14585366 11.1863415,7.15512195 11.1980488,8.44985366 C11.2087805,9.45834146 11.5746341,10.297561 12.2936585,10.9639024 C12.6195122,11.2731707 12.9834146,11.5121951 13.3882927,11.6819512 C13.3004878,11.9365854 13.2078049,12.1804878 13.1092683,12.4146341 L13.1092683,12.4146341 Z M10.0595122,0.413658537 C10.0595122,1.20410732 9.77073171,1.94214634 9.19512195,2.62526829 C8.5004878,3.43736585 7.66029268,3.90663415 6.74917073,3.83258537 C6.73756098,3.7377561 6.73082927,3.63795122 6.73082927,3.53307317 C6.73082927,2.7742439 7.06117073,1.96214634 7.64780488,1.29814634 C7.94068293,0.96195122 8.31317073,0.682409756 8.76487805,0.459414634 C9.21560976,0.239746341 9.64195122,0.118263415 10.0429268,0.0974634146 C10.0546341,0.203131707 10.0595122,0.308809756 10.0595122,0.41364878 L10.0595122,0.413658537 Z"/>
|
|
</svg>
|
|
<svg id="linux-icon" class="is-hidden" xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" fill-rule="evenodd">
|
|
<g><path d="M13.4703444,13.3930607 C13.4050383,13.3179586 13.311977,13.2461219 13.194426,13.1742852 C13.1764668,13.1628566 13.1274872,13.1334688 13.0474872,13.0893872 C12.9674872,13.0453056 12.9038138,13.0061219 12.8548342,12.9734688 C12.8074872,12.9408158 12.7454464,12.8836729 12.6670791,12.8036729 C12.5903444,12.7236729 12.5283036,12.638775 12.4842219,12.548979 C12.4401403,12.4591831 12.3960587,12.3399994 12.3552423,12.1881627 C12.3127934,12.036326 12.2899362,11.8681627 12.2834056,11.6836729 C12.2001403,11.7555096 12.154426,11.8959178 12.1446301,12.1081627 C12.1348342,12.318775 12.1805485,12.5342852 12.2785077,12.7546933 C12.3764668,12.9751015 12.5234056,13.1171423 12.7209566,13.1840811 C12.911977,13.2493872 13.0638138,13.3195913 13.1813648,13.3930607 C13.2972832,13.4681627 13.3723852,13.551428 13.4050383,13.6477545 C13.4376913,13.7424484 13.3821811,13.8453056 13.2401403,13.956326 C13.0964668,14.0657137 12.8678954,14.1751015 12.5527934,14.2828566 C12.1185077,14.431428 11.8099362,14.558775 11.6287117,14.6616321 C11.4474872,14.7661219 11.1813648,14.9636729 10.8303444,15.2559178 C10.591977,15.4518362 10.3389158,15.5579586 10.0711607,15.5726525 C9.80340561,15.5873464 9.58626275,15.4893872 9.41973214,15.278775 C9.25320153,15.0681627 9.19932398,14.7677545 9.25973214,14.3808158 C9.3723852,13.636326 9.37075255,13.0567341 9.25156888,12.6404076 C9.156875,12.313877 9.13565051,12.0248974 9.18952806,11.7751015 C9.24340561,11.5253056 9.32667092,11.3799994 9.43932398,11.3375505 C9.55197704,11.2951015 9.67442602,11.3848974 9.80503826,11.6053056 C9.81646683,11.6346933 9.84422194,11.6934688 9.88503826,11.7799994 C9.92748724,11.8665301 9.9601403,11.9269382 9.98789541,11.9628566 C10.0140179,11.998775 10.0548342,12.0444892 10.1087117,12.1016321 C10.1625893,12.158775 10.2295281,12.1979586 10.3095281,12.2224484 C10.3895281,12.2469382 10.4842219,12.2616321 10.5903444,12.2665301 C10.7927934,12.2730607 10.9740179,12.2306117 11.1356505,12.1408158 C11.2956505,12.0510198 11.4164668,11.951428 11.4964668,11.8420403 C11.5764668,11.7310198 11.6564668,11.6265301 11.7380995,11.5253056 C11.8180995,11.4240811 11.8883036,11.3669382 11.9487117,11.3555096 C12.0140179,11.3440811 12.074426,11.278775 12.1266709,11.1595913 C12.1805485,11.0404076 12.2164668,10.8755096 12.234426,10.6648974 C12.2523852,10.4542852 12.2376913,10.2012239 12.1903444,9.91061169 C12.1005485,9.39306067 11.9242219,8.8248974 11.6597321,8.20448924 C11.3952423,7.58571373 11.0980995,7.10081577 10.7715689,6.74979536 C10.1821811,6.12448924 9.78707908,5.47632597 9.5846301,4.80367291 C9.37728316,4.09510148 9.28748724,3.45836679 9.316875,2.89346883 C9.34626275,2.48857087 9.25809949,2.0493872 9.05401786,1.57591781 C8.84993622,1.10244842 8.57565051,0.741632095 8.23769132,0.491836177 C8.02381377,0.331836177 7.75769132,0.207754544 7.44258928,0.121223932 C7.12748724,0.0346933194 6.8123852,-0.00449035409 6.49565051,0.000407605092 C6.10871173,0.000407605092 5.79850765,0.0624484214 5.56667092,0.188162707 C5.08993622,0.444489238 4.77483418,0.754693319 4.61973214,1.12040761 C4.4646301,1.48612189 4.39279337,1.93673414 4.40585459,2.47224434 C4.43034439,3.65101985 4.47769132,4.57346883 4.54952806,5.23959128 C4.46626275,5.54979536 4.09728316,6.1293872 3.44258928,6.97999944 C3.32340561,7.09918312 3.20748724,7.25918312 3.09483418,7.46163209 C2.98218112,7.66408107 2.8923852,7.84530556 2.82707908,8.00693822 C2.76177296,8.16693822 2.67360969,8.40040761 2.56422194,8.70244842 C2.45483418,9.00612189 2.37483418,9.21999944 2.32748724,9.34571373 C2.28503826,9.45346883 2.21973214,9.57755046 2.13156888,9.72122393 C2.04177296,9.86326475 1.96993622,10.0036729 1.91769132,10.1408158 C1.86381377,10.2779586 1.83442602,10.4330607 1.82789541,10.6044892 C1.82136479,10.7351015 1.82789541,10.8477545 1.84585459,10.9440811 C1.87034439,11.0877545 1.91442602,11.1318362 1.97973214,11.0779586 C2.24748724,10.8755096 2.58381377,10.9946933 2.98871173,11.4355096 C3.27442602,11.7457137 3.77728316,12.4657137 4.49728316,13.5955096 C4.55605867,13.6967341 4.61646683,13.8044892 4.67524234,13.9220403 C4.73565051,14.0379586 4.79116071,14.1930607 4.84503826,14.3857137 C4.89891581,14.5799994 4.92177296,14.7530607 4.91197704,14.9081627 C4.90218112,15.0632647 4.83524234,15.2053056 4.70626275,15.3359178 C4.57891581,15.4665301 4.38626275,15.5497954 4.12993622,15.5857137 C3.99279337,15.6036729 3.82789541,15.5922443 3.63360969,15.5497954 C3.44095663,15.5073464 3.19442602,15.4404076 2.89728316,15.3440811 C2.6001403,15.2493872 2.37973214,15.1840811 2.23605867,15.1481627 C2.02707908,15.1008158 1.73156888,15.0404076 1.34789541,14.9653056 C0.964221937,14.8902035 0.712793365,14.836326 0.593609692,14.8004076 C0.391160712,14.7465301 0.281772957,14.6697954 0.263813773,14.5685709 C0.24585459,14.4853056 0.288303569,14.3416321 0.389528059,14.1408158 C0.490752549,13.9383668 0.541364794,13.7930607 0.541364794,13.7032647 C0.547895406,13.6379586 0.5446301,13.5726525 0.533201529,13.5073464 C0.521772957,13.4420403 0.508711733,13.391428 0.492385202,13.3555096 C0.477691324,13.3195913 0.451568875,13.2657137 0.415650508,13.1955096 C0.379732141,13.1236729 0.356874998,13.0697954 0.343813773,13.0355096 C0.236058671,12.7857137 0.221364794,12.6159178 0.299732141,12.5261219 C0.353609692,12.4493872 0.480956631,12.4183668 0.68340561,12.436326 C0.98707908,12.4657137 1.23360969,12.4216321 1.4246301,12.3024484 C1.73973214,12.1065301 1.83605867,11.7897954 1.71034439,11.3555096 C1.71034439,11.5579586 1.67442602,11.7097954 1.60258928,11.8110198 C1.53075255,11.9122443 1.40667092,12.0167341 1.22707908,12.1228566 C1.12585459,12.1816321 0.947895406,12.2175505 0.691568875,12.2306117 C0.435242345,12.2420403 0.265446426,12.2844892 0.18218112,12.356326 C0.12340561,12.4102035 0.0907525489,12.4902035 0.0891198959,12.5979586 C0.0858545898,12.7057137 0.0989158142,12.8134688 0.129936222,12.9244892 C0.159323978,13.033877 0.188711733,13.1612239 0.219732141,13.3032647 C0.249119896,13.4469382 0.26218112,13.5661219 0.255650508,13.6608158 C0.249119896,13.7261219 0.195242345,13.8877545 0.0956505081,14.1473464 C-0.00557398168,14.4069382 -0.0267984715,14.6044892 0.0336096918,14.7416321 C0.0629974469,14.8069382 0.113609692,14.8657137 0.185446426,14.916326 C0.257283161,14.9669382 0.356874998,15.0093872 0.484221937,15.0453056 C0.611568875,15.0812239 0.729119896,15.108979 0.836874998,15.1302035 C0.9446301,15.151428 1.09320153,15.1775505 1.28258928,15.2102035 C1.47360969,15.2428566 1.62544643,15.2706117 1.73809949,15.2951015 C2.11850765,15.3718362 2.55279337,15.5008158 3.04095663,15.678775 C3.5291199,15.8567341 3.85891581,15.9497954 4.03197704,15.9546933 C4.19850765,15.9612239 4.35850765,15.9269382 4.51034439,15.8518362 C4.66218112,15.7767341 4.79116071,15.6934688 4.89891581,15.5971423 C5.00667092,15.5024484 5.16503826,15.4126525 5.37728316,15.3293872 C5.58789541,15.2461219 5.8246301,15.2020403 6.08748724,15.1955096 C6.20667092,15.188979 6.37973214,15.1824484 6.60503826,15.1726525 C6.83197704,15.1644892 7.0001403,15.1595913 7.11442602,15.1595913 C7.62707908,15.1595913 8.0123852,15.1628566 8.27524234,15.1677545 C8.45320153,15.1742852 8.59360969,15.2020403 8.69483418,15.2526525 C8.79605867,15.3032647 8.86136479,15.3620403 8.89075255,15.4273464 C8.9201403,15.4926525 8.9691199,15.5693872 9.03769132,15.6542852 C9.10626275,15.7408158 9.19442602,15.8110198 9.30054847,15.8632647 C9.52585459,15.9710198 9.79197704,16.0134688 10.0956505,15.9922443 C10.399324,15.9710198 10.601773,15.913877 10.7029974,15.8175505 C10.8695281,15.6575505 11.0948342,15.4665301 11.3772832,15.2461219 C11.6597321,15.0257137 11.914426,14.8591831 12.1413648,14.7465301 C12.1887117,14.7220403 12.2687117,14.6844892 12.3829974,14.6306117 C12.4956505,14.5767341 12.591977,14.5310198 12.6687117,14.4918362 C12.7454464,14.4526525 12.8401403,14.4036729 12.9495281,14.3448974 C13.0605485,14.2844892 13.1487117,14.2306117 13.2172832,14.1799994 C13.2858546,14.1293872 13.3560587,14.0722443 13.4262628,14.0053056 C13.4980995,13.9399994 13.5438138,13.8746933 13.5650383,13.8093872 C13.5862628,13.7440811 13.5927934,13.6771423 13.5878954,13.6085709 C13.5715689,13.5383668 13.5356505,13.4665301 13.4703444,13.3930607 Z M8.68503826,4.76285658 C8.70299745,4.75142801 8.71442602,4.74653005 8.72095663,4.74979536 C8.72748724,4.75306067 8.73891581,4.76448924 8.756875,4.78571373 C8.77483418,4.80693822 8.79116071,4.82653005 8.80585459,4.84448924 C8.82054847,4.86244842 8.84177296,4.88693822 8.86789541,4.91632597 C8.89401786,4.94571373 8.92340561,4.97020352 8.95279337,4.98816271 C8.98871173,5.0126525 9.03116071,5.02897903 9.08177296,5.0371423 C9.1323852,5.04530556 9.17156888,5.06163209 9.19769132,5.08122393 C9.22381377,5.10244842 9.24340561,5.13673414 9.25646683,5.18408107 C9.26789541,5.2493872 9.25809949,5.30979536 9.22544643,5.36204026 C9.19279337,5.41591781 9.14871173,5.43877495 9.09646683,5.43387699 C8.98871173,5.4093872 8.87279337,5.31632597 8.74871173,5.15306067 C8.62299745,4.98816271 8.60177296,4.85918312 8.68503826,4.76285658 Z M7.57809949,1.29510148 C7.60748724,1.25591781 7.62544643,1.2248974 7.63197704,1.20204026 C7.64340561,1.16612189 7.64503826,1.12857087 7.636875,1.09101985 C7.62707908,1.05183618 7.63034439,1.01428516 7.64503826,0.975101483 C7.65973214,0.935917809 7.69401786,0.914693319 7.74789541,0.908162707 C7.80177296,0.908162707 7.87360969,0.95224434 7.96177296,1.04204026 C7.97973214,1.05346883 8.00748724,1.07142801 8.04667092,1.09591781 C8.08585459,1.12040761 8.11197704,1.13999944 8.12667092,1.15795863 C8.14136479,1.17591781 8.14952806,1.19061169 8.14952806,1.20204026 C8.13809949,1.23142801 8.11034439,1.2526525 8.06952806,1.26408107 C8.02871173,1.27550965 7.98299745,1.28204026 7.93565051,1.28204026 C7.88830357,1.28204026 7.86054847,1.28530556 7.85565051,1.29020352 C7.80830357,1.30816271 7.76258928,1.33428516 7.72177296,1.37020352 C7.68095663,1.40612189 7.64667092,1.43224434 7.62381377,1.45020352 C7.59932398,1.46816271 7.57646683,1.46816271 7.55197704,1.45020352 C7.52748724,1.41428516 7.51932398,1.38979536 7.52585459,1.37510148 C7.53075255,1.36040761 7.54871173,1.33428516 7.57809949,1.29510148 Z M3.25646683,7.97755046 C3.29728316,7.93020352 3.32830357,7.89101985 3.34626275,7.86163209 C3.36422194,7.83224434 3.38054847,7.79142801 3.39524234,7.74081577 C3.40993622,7.69020352 3.42299745,7.6526525 3.43605867,7.62979536 C3.44748724,7.60530556 3.46544643,7.5971423 3.48993622,7.60367291 C3.50136479,7.60040761 3.51116071,7.60693822 3.51605867,7.62163209 C3.52258928,7.63632597 3.52422194,7.64448924 3.52422194,7.64448924 L3.52422194,7.67061169 C3.52422194,7.67877495 3.52258928,7.69183618 3.51932398,7.70653005 C3.51605867,7.72122393 3.51116071,7.73428516 3.50626275,7.74734638 C3.49973214,7.75877495 3.49483418,7.77673414 3.48830357,7.80122393 C3.48177296,7.82571373 3.476875,7.84530556 3.47034439,7.86326475 C3.44585459,7.92367291 3.40993622,7.97591781 3.35932398,8.02326475 C3.30871173,8.07061169 3.27116071,8.09183618 3.24830357,8.08530556 C3.2123852,8.07224434 3.21565051,8.03632597 3.25646683,7.97755046 Z M9.09646683,13.4861219 C9.08503826,13.6771423 9.04422194,13.9448974 8.97565051,14.2893872 C8.90707908,14.633877 8.8646301,14.8640811 8.84667092,14.9767341 C8.72095663,14.9702035 8.65075255,14.9244892 8.63279337,14.8379586 C8.61483418,14.751428 8.63279337,14.6404076 8.68667092,14.5032647 C8.81728316,14.1048974 8.88585459,13.8306117 8.8923852,13.6820403 C8.90381377,13.4077545 8.87442602,13.2526525 8.80258928,13.2183668 C8.73728316,13.1710198 8.63605867,13.2608158 8.49891581,13.4861219 C8.23605867,13.9155096 7.71034439,14.1734688 6.91850765,14.2632647 C6.20503826,14.3579586 5.71034439,14.2518362 5.43605867,13.9416321 C5.37728316,13.8991831 5.316875,13.8926525 5.25809949,13.918775 C5.19932398,13.9448974 5.1601403,13.9742852 5.14218112,14.0036729 C5.13565051,14.0151015 5.14218112,14.0330607 5.1601403,14.0575505 C5.17809949,14.0820403 5.20585459,14.116326 5.24503826,14.1653056 C5.28422194,14.2126525 5.31524234,14.2599994 5.33809949,14.308979 C5.56993622,14.713877 5.54871173,14.9881627 5.27605867,15.1302035 C5.27605867,14.8559178 5.25483418,14.6469382 5.21401786,14.5016321 C5.17156888,14.356326 5.08830357,14.1946933 4.96422194,14.0199994 C4.83850765,13.8436729 4.75360969,13.711428 4.7046301,13.6232647 C4.88258928,13.6053056 5.01809949,13.5367341 5.11116071,13.4175505 C5.20422194,13.2983668 5.24503826,13.1710198 5.236875,13.033877 C5.22707908,12.8967341 5.17646683,12.7840811 5.0801403,12.6942852 C5.02626275,12.6404076 4.75034439,12.4134688 4.2491199,12.0118362 C3.74952806,11.6102035 3.43932398,11.3408158 3.3201403,11.2036729 C3.29565051,11.1791831 3.22544643,11.1204076 3.10626275,11.0257137 C2.98707908,10.9310198 2.91197704,10.8477545 2.88258928,10.7759178 C2.60830357,10.1751015 2.57891581,9.68040761 2.79279337,9.29346883 L2.82871173,9.2493872 C2.85809949,9.24285658 2.86136479,9.29673414 2.836875,9.4093872 C2.80095663,9.57591781 2.78952806,9.74244842 2.80095663,9.90897903 C2.82544643,10.2844892 2.93156888,10.5636729 3.12258928,10.7481627 C3.24830357,10.873877 3.33320153,10.8640811 3.38218112,10.7220403 C3.41809949,10.6746933 3.43442602,10.4983668 3.43116071,10.1946933 C3.42789541,9.89101985 3.43279337,9.68530556 3.44422194,9.57918312 C3.49156888,9.23959128 3.63360969,8.81999944 3.86871173,8.32040761 C4.10381377,7.82081577 4.28993622,7.55306067 4.42707908,7.5171423 C4.31932398,7.34408107 4.28503826,7.15632597 4.32422194,6.95387699 C4.36340561,6.75142801 4.42544643,6.57836679 4.51197704,6.43632597 C4.59850765,6.29428516 4.68667092,6.12775454 4.77483418,5.94163209 C4.8646301,5.75387699 4.90871173,5.58571373 4.90871173,5.4371423 C4.90871173,5.39632597 4.91197704,5.36530556 4.91850765,5.34734638 C4.93646683,5.29346883 5.01156888,5.35877495 5.14218112,5.54326475 C5.39197704,5.91224434 5.57973214,6.1293872 5.70544643,6.19469332 C5.83605867,6.26653005 5.98136479,6.26326475 6.14299745,6.1848974 C6.30299745,6.10816271 6.50218112,5.97918312 6.73728316,5.80122393 C6.9723852,5.62326475 7.17320153,5.49101985 7.33973214,5.40775454 C7.35769132,5.40122393 7.38544643,5.38816271 7.4246301,5.36693822 C7.46381377,5.34571373 7.49320153,5.33101985 7.51442602,5.32285658 C7.53565051,5.31469332 7.56177296,5.29999944 7.59442602,5.28204026 C7.62707908,5.26408107 7.65156888,5.2493872 7.66952806,5.23795863 C7.68748724,5.22653005 7.70544643,5.21183618 7.72340561,5.1971423 C7.74136479,5.18244842 7.75279337,5.16775454 7.75932398,5.15306067 C7.76585459,5.13836679 7.7691199,5.12530556 7.7691199,5.11224434 C7.75769132,5.05836679 7.73156888,5.02571373 7.6923852,5.01428516 C7.65320153,5.00285658 7.60095663,5.0093872 7.53565051,5.0371423 C7.47034439,5.06326475 7.396875,5.09918312 7.316875,5.1448974 C7.236875,5.18897903 7.14707908,5.23959128 7.0491199,5.29673414 C6.95116071,5.35387699 6.85156888,5.40612189 6.75034439,5.45346883 C6.6491199,5.50081577 6.54136479,5.54326475 6.42871173,5.57918312 C6.31605867,5.61510148 6.20830357,5.63632597 6.10707908,5.64122393 C5.85728316,5.64775454 5.65809949,5.58244842 5.50952806,5.44530556 C5.41483418,5.35550965 5.36422194,5.29999944 5.35769132,5.27550965 C5.35116071,5.25101985 5.37891581,5.24612189 5.43769132,5.25755046 C5.75932398,5.29999944 5.99442602,5.3048974 6.14299745,5.27550965 C6.29809949,5.25101985 6.50544643,5.18244842 6.76830357,5.06979536 C6.82218112,5.04530556 6.95769132,4.98816271 7.17483418,4.89510148 C7.39197704,4.80367291 7.5601403,4.73836679 7.67932398,4.70244842 C7.75116071,4.68448924 7.8001403,4.65673414 7.82626275,4.61755046 C7.8523852,4.57836679 7.86218112,4.54244842 7.8523852,4.50979536 C7.84422194,4.4771423 7.8246301,4.45101985 7.79360969,4.43469332 C7.72830357,4.39877495 7.66789541,4.42326475 7.61565051,4.50653005 C7.58626275,4.56040761 7.52258928,4.6126525 7.42789541,4.66326475 C7.33320153,4.71387699 7.24503826,4.75306067 7.16503826,4.77918312 C7.08503826,4.80530556 6.98218112,4.83795863 6.85646683,4.87224434 C6.73075255,4.90816271 6.66381377,4.9293872 6.65075255,4.93428516 C6.32422194,5.03550965 6.02054847,5.07959128 5.73973214,5.06816271 C5.6091199,5.06163209 5.50299745,5.04367291 5.42299745,5.0093872 C5.34299745,4.97673414 5.28748724,4.93755046 5.25809949,4.89346883 C5.22871173,4.8493872 5.18136479,4.79224434 5.11442602,4.72367291 C5.0491199,4.65510148 4.97401786,4.59795863 4.89075255,4.54897903 C4.83197704,4.51959128 4.8091199,4.46571373 4.82381377,4.38897903 C4.83850765,4.31224434 4.88422194,4.23061169 4.96258928,4.14734638 C4.9691199,4.14081577 5.02952806,4.1048974 5.14544643,4.03632597 C5.26136479,3.96775454 5.34299745,3.89755046 5.39034439,3.82571373 C5.44422194,3.74244842 5.53565051,3.65591781 5.66626275,3.56612189 C5.67279337,3.54163209 5.67605867,3.47632597 5.67932398,3.37020352 C5.68258928,3.26244842 5.65320153,3.14653005 5.59442602,3.02244842 C5.53565051,2.89673414 5.45401786,2.83469332 5.35279337,2.83469332 C5.2091199,2.82816271 5.10952806,2.87061169 5.0491199,2.96040761 C4.99034439,3.05020352 4.96258928,3.15959128 4.9691199,3.29020352 C4.97565051,3.40285658 5.00340561,3.50244842 5.05401786,3.58897903 C5.1046301,3.67550965 5.15034439,3.71795863 5.19279337,3.71795863 C5.25809949,3.71142801 5.27932398,3.73591781 5.25483418,3.78979536 C5.21891581,3.85510148 5.17156888,3.89755046 5.11116071,3.91550965 C5.06871173,3.92693822 5.02299745,3.88775454 4.9723852,3.79469332 C4.92177296,3.70163209 4.88258928,3.59061169 4.85646683,3.45999944 C4.83034439,3.3293872 4.81891581,3.21836679 4.82544643,3.13020352 C4.836875,2.94571373 4.88585459,2.7693872 4.9723852,2.59959128 C5.05891581,2.42979536 5.18299745,2.34816271 5.34299745,2.35469332 C5.50952806,2.36122393 5.64340561,2.46244842 5.7446301,2.65836679 C5.84585459,2.85428516 5.89320153,3.12204026 5.88830357,3.46163209 C5.90626275,3.50408107 5.95197704,3.51877495 6.02707908,3.50571373 C6.10218112,3.49428516 6.2001403,3.4926525 6.32095663,3.50081577 C6.44340561,3.50897903 6.52993622,3.54163209 6.58381377,3.59387699 C6.59034439,3.59387699 6.59360969,3.54979536 6.59360969,3.45999944 C6.48585459,2.71061169 6.75197704,2.31061169 7.38871173,2.26326475 C7.48340561,2.28122393 7.56340561,2.30408107 7.63034439,2.33020352 C7.69565051,2.35632597 7.76585459,2.40204026 7.84095663,2.46408107 C7.91605867,2.52612189 7.97809949,2.61755046 8.02871173,2.73673414 C8.07932398,2.85591781 8.1201403,3.00448924 8.14952806,3.18244842 L8.14952806,3.51224434 C8.14952806,3.70326475 8.11034439,3.8093872 8.03360969,3.83387699 C7.90789541,3.87632597 7.81973214,3.87469332 7.76585459,3.82897903 C7.71197704,3.7848974 7.71850765,3.7048974 7.78381377,3.59224434 C7.84258928,3.44367291 7.83116071,3.27061169 7.74789541,3.07469332 C7.6646301,2.87877495 7.51279337,2.78897903 7.2923852,2.80693822 C7.14381377,2.81346883 7.03605867,2.89346883 6.97075255,3.04857087 C6.90544643,3.20367291 6.88095663,3.35550965 6.89891581,3.50408107 C6.916875,3.6526525 6.94952806,3.73101985 6.996875,3.73591781 C7.03279337,3.74244842 7.13891581,3.78979536 7.31360969,3.87959128 C7.48993622,3.9693872 7.62218112,4.02163209 7.71034439,4.03959128 C7.94218112,4.08693822 8.07442602,4.16204026 8.10707908,4.26326475 C8.13973214,4.36448924 8.12667092,4.51142801 8.06626275,4.70571373 C8.00585459,4.89999944 7.98952806,5.05836679 8.0123852,5.18408107 C8.036875,5.31469332 8.08095663,5.43387699 8.14626275,5.54163209 C8.21156888,5.6493872 8.28177296,5.74734638 8.35524234,5.83550965 C8.43034439,5.92530556 8.516875,6.09183618 8.61809949,6.33510148 C8.71932398,6.57836679 8.81075255,6.88530556 8.89401786,7.25428516 C8.90054847,7.26081577 8.92177296,7.28040761 8.96095663,7.31632597 C9.0001403,7.35224434 9.03769132,7.39632597 9.076875,7.45020352 C9.11605867,7.50408107 9.16177296,7.57591781 9.21565051,7.66897903 C9.26952806,7.76204026 9.32667092,7.89591781 9.39034439,8.07550965 C9.4523852,8.25346883 9.51116071,8.45918312 9.56503826,8.69101985 C9.63034439,8.96530556 9.6646301,9.28367291 9.66789541,9.64612189 C9.67116071,10.0085709 9.69401786,10.2583668 9.73973214,10.3922443 C9.78381377,10.5261219 9.89973214,10.5816321 10.0842219,10.5571423 C10.3160587,10.5457137 10.4646301,10.4199994 10.5299362,10.1816321 C10.7258546,9.49101985 10.5658546,8.66326475 10.0483036,7.69999944 C9.8523852,7.32448924 9.68258928,7.07795863 9.53891581,6.95877495 C9.74789541,7.07795863 9.96177296,7.30163209 10.1821811,7.62816271 C10.4025893,7.95632597 10.5413648,8.26163209 10.601773,8.54734638 C10.6083036,8.57673414 10.6246301,8.65673414 10.6507525,8.78408107 C10.676875,8.91142801 10.6932015,8.98653005 10.6948342,9.00775454 C10.6980995,9.02897903 10.7095281,9.0893872 10.7307525,9.19061169 C10.751977,9.29183618 10.761773,9.3571423 10.761773,9.38653005 C10.761773,9.41591781 10.7650383,9.47469332 10.7715689,9.56122393 C10.7780995,9.64775454 10.7764668,9.71469332 10.7666709,9.76204026 C10.756875,9.8093872 10.7487117,9.87306067 10.7405485,9.95469332 C10.7307525,10.0346933 10.7160587,10.1130607 10.6964668,10.1865301 C10.6752423,10.2616321 10.6540179,10.3432647 10.6295281,10.431428 C10.9560587,10.5751015 11.1209566,10.6991831 11.1209566,10.8069382 C10.9985077,10.7073464 10.8189158,10.6404076 10.5870791,10.6077545 C10.3552423,10.5751015 10.1397321,10.6061219 9.94054847,10.7008158 C9.74136479,10.7955096 9.63850765,10.953877 9.63197704,11.1742852 C9.41809949,11.1742852 9.26626275,11.2281627 9.17646683,11.3342852 C9.04585459,11.4893872 8.97728316,11.6983668 8.97075255,11.9644892 C8.96422194,12.228979 8.98707908,12.5179586 9.03769132,12.8297954 C9.08830357,13.1432647 9.10789541,13.3604076 9.09646683,13.4861219 Z M5.35442602,3.13836679 C5.33646683,3.13183618 5.32177296,3.11387699 5.31034439,3.08448924 C5.31034439,3.03061169 5.33646683,3.0093872 5.39034439,3.02244842 C5.42626275,3.03387699 5.46054847,3.07959128 5.49320153,3.15632597 C5.52585459,3.23306067 5.53401786,3.32285658 5.51605867,3.42408107 C5.51605867,3.44204026 5.50789541,3.45020352 5.48993622,3.45020352 C5.4246301,3.45020352 5.4001403,3.39142801 5.41809949,3.27224434 C5.43605867,3.18244842 5.41483418,3.13836679 5.35442602,3.13836679 Z M7.66789541,3.28204026 L7.64993622,3.30816271 C7.60258928,3.33755046 7.57809949,3.34408107 7.57809949,3.32612189 C7.55360969,3.16612189 7.50136479,3.07306067 7.41809949,3.04857087 L7.38218112,3.03061169 C7.33973214,2.99469332 7.36095663,2.97346883 7.44422194,2.96857087 C7.46218112,2.96204026 7.48830357,2.97183618 7.52422194,2.99469332 C7.5601403,3.01918312 7.59279337,3.05510148 7.62218112,3.10571373 C7.65320153,3.15795863 7.66789541,3.21510148 7.66789541,3.28204026 Z"/><path fill="#000000"/><path fill="#000000"/></g>
|
|
</svg>
|
|
<svg id="windows-icon" class="is-hidden" xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16" fill="currentColor" fill-rule="evenodd">
|
|
<path d="M0,2.26533478 L6.53869277,1.37757635 L6.54155105,7.66524117 L0.0059730822,7.70234465 L0,2.26533478 Z M6.53557797,8.38970261 L6.54065326,14.6828472 L0.00507528763,13.78707 L0.00470884087,8.34749015 L6.53557797,8.38970261 Z M7.32822064,1.26144186 L15.9979845,0 L15.9979845,7.58527313 L7.32822064,7.65388892 L7.32822064,1.26144186 Z M16,8.44888407 L15.9979662,16 L7.32820232,14.7801313 L7.31605461,8.43474628 L16,8.44888407 Z"/>
|
|
</svg>
|
|
<span id="download-button-text">
|
|
<strong>Download Hyper</strong>
|
|
</span>
|
|
<svg id="fallback-icon" class="is-hidden" width="17px" height="13px" viewBox="0 0 17 13" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="square"><g id="hyper.is" transform="translate(-1082.000000, -471.000000)" stroke="currentColor"><g id="Group" transform="translate(1081.000000, 471.000000)"><path d="M1.5,5.5 L1.5,11.5" id="Line"></path><path d="M17.5,5.5 L17.5,11.5" id="Line"></path><path d="M9.5,0.5 L9.5,7.57106781" id="Line"></path><path d="M6.5,5 L9.32842712,7.82842712" id="Line"></path><path d="M9.5,5 L12.3284271,7.82842712" id="Line" transform="translate(10.914214, 6.414214) scale(-1, 1) translate(-10.914214, -6.414214) "></path><path d="M1.5,12 L17.5,12" id="Line"></path></g></g></g>
|
|
</svg>
|
|
</a>
|
|
<span class="other-downloads"><a href="#installation">Other platforms</a></span>
|
|
</div>
|
|
|
|
<div id="arrow"><a href="#installation"><img src="static/arrow.svg" width="18" /></a></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="content">
|
|
<h2 id="installation"><a href="#installation">Installation</a></h2>
|
|
|
|
<table id="installation-table" class="offset-header">
|
|
<tr>
|
|
<td style="width: 33.333%" class="invisible-top-left"></td>
|
|
<td style="width: 33.333%">32-bit</td>
|
|
<td style="width: 33.333%">64-bit</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>macOS</b> (.dmg)</td>
|
|
<td id="td-mac-os" colspan="2">
|
|
<a href="https://hyper-updates.now.sh/download/mac">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>Windows</b> (.exe)</td>
|
|
<td class="soon">COMING SOON</td>
|
|
<td id="td-win">
|
|
<a href="https://hyper-updates.now.sh/download/win">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>Debian</b> (.deb)</td>
|
|
<td class="soon">COMING SOON</td>
|
|
<td id="td-debian">
|
|
<a href="https://hyper-updates.now.sh/download/linux_deb">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>Fedora</b> (.rpm)</td>
|
|
<td class="soon">COMING SOON</td>
|
|
<td id="td-fedora">
|
|
<a href="https://hyper-updates.now.sh/download/linux_rpm">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><b>Other Linux distros</b> (.AppImage)</td>
|
|
<td class="soon">COMING SOON</td>
|
|
<td id="td-appimage" colspan="2">
|
|
<a href="https://github.com/zeit/hyper/releases/download/1.2.0/hyper-1.2.0-x86_64-linux.AppImage">DOWNLOAD <img src="static/download-icon.svg"/></a>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<h2 id="hashtag-goals"><a href="#hashtag-goals">Project goals</a></h2>
|
|
|
|
<p> The goal of the project is to create a beautiful and extensible experience
|
|
for command-line interface users, built on open web standards.</p>
|
|
|
|
<p>In the beginning, our focus will be primarily around speed, stability and
|
|
the development of the correct API for extension authors.</p>
|
|
|
|
<p>In the future, we anticipate the community will come up with
|
|
innovative additions to enhance what could be the simplest,
|
|
most powerful and well-tested interface for productivity.</p>
|
|
|
|
<h2 id="extensions"><a href="#extensions">Extensions</a></h2>
|
|
|
|
<p>Extensions are available on npm. We encourage everyone to
|
|
include <code>hyper</code> in the <code>keywords</code>
|
|
field in <code>package.json</code>.</p>
|
|
|
|
<pre><code>$ npm search hyper</code></pre>
|
|
|
|
<p>Then edit <code>~/.hyper.js</code> and add it to <code>plugins</code></p>
|
|
|
|
<pre><code>module.exports = {
|
|
|
|
config: { /*... */ },
|
|
|
|
plugins: [
|
|
<b>"hyperpower"</b>
|
|
]
|
|
|
|
};</code></pre>
|
|
|
|
<p><code>Hyper</code> will show a notification when your modules are
|
|
installed to <code>~/.hyper_plugins</code>.</p>
|
|
|
|
<p>You can also take a look at
|
|
<a href="https://github.com/bnb/awesome-hyper">Awesome Hyper</a>
|
|
for a curated list of plugins and resources.</p>
|
|
|
|
<h2 id="cfg"><a href="#cfg">Configuration</a></h2>
|
|
|
|
<p>The <code>config</code> object seen above in <code>~/.hyper.js</code>
|
|
admits the following</p>
|
|
|
|
<table class="config">
|
|
<thead>
|
|
<tr>
|
|
<td>Property</td>
|
|
<td>Default</td>
|
|
<td>Description</td>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>"fontSize"</td>
|
|
<td>12</td>
|
|
<td>The default size in pixels for the terminal</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"fontFamily"</td>
|
|
<td>"Menlo, DejaVu Sans Mono, Lucida Console, monospace"</td>
|
|
<td>The font family to use with optional fallbacks</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"cursorColor"</td>
|
|
<td>"#F81CE5"</td>
|
|
<td>The color of the caret in the terminal</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"cursorShape"</td>
|
|
<td>"BLOCK"</td>
|
|
<td>The shape of the caret in the terminal. Available options are: 'BEAM', 'UNDERLINE', 'BLOCK'</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"cursorBlink"</td>
|
|
<td>"false"</td>
|
|
<td>If true, cursor will blink</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"foregroundColor"</td>
|
|
<td>"#fff"</td>
|
|
<td>The color of the main text of the terminal</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"backgroundColor"</td>
|
|
<td>"#000"</td>
|
|
<td>The color and opacity of the window and main terminal background</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"borderColor"</td>
|
|
<td>"#333"</td>
|
|
<td>The color of the main window border and tab bar</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"css"</td>
|
|
<td>""</td>
|
|
<td>Custom CSS to include in the main window</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"termCSS"</td>
|
|
<td>""</td>
|
|
<td>Custom CSS to include in the terminal window</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"padding"</td>
|
|
<td>"12px 14px"</td>
|
|
<td>CSS padding values for the space around each term</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"colors"</td>
|
|
<td>{ black: "#000000", red: "#ff0000", ... }</td>
|
|
<td>A list of overrides for the color palette. The names of the keys represent the "ANSI 16", which can all be seen <a href="https://github.com/zeit/hyper/blob/aaed99abac97a3d6b1766f194522a69e8a994bcb/lib/utils/colors.js">in the default config</a>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"shell"</td>
|
|
<td>""</td>
|
|
<td>A path to a custom shell to run when Hyper starts a new session</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"npmRegistry"</td>
|
|
<td>npm get registry</td>
|
|
<td>Override the npm registry URL to use when installing plugins</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"windowSize"</td>
|
|
<td>null</td>
|
|
<td>The default width/height in pixels of a new window e.g. [540, 380]</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"copyOnSelect"</td>
|
|
<td>false</td>
|
|
<td>If true, selected text will automatically be copied to the clipboard</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"bell"</td>
|
|
<td>"SOUND"</td>
|
|
<td>System bell configuration. Available options are: "SOUND", false</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"bellSoundURL"</td>
|
|
<td>"lib-resource:hterm/audio/bell"</td>
|
|
<td>The URL of the bell sound to use, used only if "bell" is set to "SOUND"</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"modifierKeys"</td>
|
|
<td>
|
|
{
|
|
cmdIsMeta: false,
|
|
altIsMeta: false
|
|
}
|
|
</td>
|
|
<td>Change the behaviour of modifier keys to act as meta key</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"showHamburgerMenu"</td>
|
|
<td>""</td>
|
|
<td>
|
|
Change the visibility of the hamburger menu. Available options
|
|
are: true, false
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>"showWindowControls"</td>
|
|
<td>""</td>
|
|
<td>
|
|
Change the position/visibility of the window controls.
|
|
Available options are: true, false, "left"
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<span class="table-note"></span>
|
|
|
|
<h2 id="extensions-api"><a href="#extensions-api">Extensions API</a></h2>
|
|
|
|
<p>Extensions are universal Node.js modules loaded by both
|
|
Electron and the renderer process.</p>
|
|
|
|
<p>The extension system is designed around <b>composition</b>
|
|
of the APIs we use to build the terminal: <code>React</code>
|
|
components and <code>Redux</code> actions.</p>
|
|
|
|
<p>Instead of exposing a custom API method or parameter for
|
|
every possible customization point, we allow you to intercept
|
|
and compose every bit of functionality!</p>
|
|
|
|
<p>The only knowledge that is therefore required to successfully
|
|
extend <code>Hyper</code> is that of its underlying open
|
|
source libraries.</p>
|
|
|
|
<p>Your module has to expose at least one of these methods:.</p>
|
|
|
|
<table class="api">
|
|
<thead>
|
|
<tr>
|
|
<td>Method</td>
|
|
<td>Invoked from</td>
|
|
<td>Description</td>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>onApp</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p>Invoked when the app first loads. If a plugin reloads,
|
|
it's invoked again with the existing app.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>app</code></td>
|
|
<td>The electron app.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>onWindow</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p>Invoked when each window is created. If a plugin reloads,
|
|
it's invoked again with the existing windows.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>window</code></td>
|
|
<td>An electron <code>BrowserWindow</code>.</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>onUnload</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p>Invoked when a plugin is removed by the user.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>app</code></td>
|
|
<td>The electron app.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>decorateConfig</code></td>
|
|
<td>Electron / Renderer</td>
|
|
<td>
|
|
<p><b>v0.5.0+</b>. Allows you to decorate the user's configuration.<br>
|
|
Useful for themeing or custom parameters for your
|
|
plugin.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>config</code></td>
|
|
<td>The <code>config</code> object</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>decorateEnv</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p><b>v0.7.0+</b>. Allows you to decorate the user's environment
|
|
by returning a modified environment object.
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>environment</code></td>
|
|
<td>The <code>environment</code> object</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>decorateMenu</code></td>
|
|
<td>Electron</td>
|
|
<td>
|
|
<p>Invoked with the Electron's <code>Menu</code> template.
|
|
If a plugin reloads, it's called again and the menu
|
|
is refreshed.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>menu</code></td>
|
|
<td>The menu template object</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>onRendererLoad</code></td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Invoked when a plugin is first loaded or subsequently
|
|
reloaded in each window.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tr>
|
|
<tbody>
|
|
<td><code>window</code></td>
|
|
<td>The window object</td>
|
|
</tbody>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>onRendererUnload</code></td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Invoked when a plugin is being unloaded.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tr>
|
|
<tbody>
|
|
<td><code>window</code></td>
|
|
<td>The window object</td>
|
|
</tbody>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>middleware</code></td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>A custom Redux middleware that can intercept any
|
|
action. Subsequently we invoke the <code>thunk</code>
|
|
middleware, which means your middleware can
|
|
<code>next</code> thunks.</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>reduceUI</code><br><code>reduceSessions</code><br><code>reduceTermGroups</code></td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>A custom reducer for the <code>ui</code>, <code>sessions</code> or <code>termgroups</code> state shape.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>state</code></td>
|
|
<td>The Redux state object</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>action</code></td>
|
|
<td>The action object</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>getTermGroupProps</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Passes down props from <code><Terms></code>
|
|
to the <code><TermGroup></code> component. Must return
|
|
the composed props object.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>uid</code></td>
|
|
<td>TermGroup uid</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>parentProps</code></td>
|
|
<td>Props form the parent component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>props</code></td>
|
|
<td>The existing properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>getTermProps</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Passes down props from <code><TermGroup></code>
|
|
to the <code><Term></code> component. Must return
|
|
the composed props object.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>uid</code></td>
|
|
<td>Term uid</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>parentProps</code></td>
|
|
<td>Props form the parent component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>props</code></td>
|
|
<td>The existing properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>getTabsProps</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Passes down props to <code><Tabs></code>
|
|
to the <code><Header></code> component. Must return
|
|
the composed props object.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>parentProps</code></td>
|
|
<td>Props form the parent component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>props</code></td>
|
|
<td>The existing properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>getTabProps</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Passes down props to <code><Tab></code>
|
|
to the <code><Tabs></code> component. Must return
|
|
the composed props object.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>uid</code></td>
|
|
<td>Tab / Term uid</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>parentProps</code></td>
|
|
<td>Props form the parent component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>props</code></td>
|
|
<td>The existing properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>mapHyperState</code><br>
|
|
<code>mapTermsState</code><br>
|
|
<code>mapHeaderState</code><br>
|
|
<code>mapNotificationsState</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>A custom mapper for the state properties that
|
|
<a href="https://github.com/zeit/hyper/tree/master/lib/containers" target="_blank">container components</a> receive. Note that for children components to
|
|
get these properties, you have to pass them down using the corresponding
|
|
methods (like <code>getTermProps</code>).</p><p> Must
|
|
return an extended object of the map passed.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>state</code></td>
|
|
<td>The <code>Redux</code> global state</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>map</code></td>
|
|
<td>The existing map of properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>mapHyperDispatch</code><br>
|
|
<code>mapTermsDispatch</code><br>
|
|
<code>mapHeaderDispatch</code><br>
|
|
<code>mapNotificationsDispatch</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>A custom mapper for the dispatch properties. Must
|
|
return an extended object of the map passed.</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>dispatch</code></td>
|
|
<td>The Redux dispatch function</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>map</code></td>
|
|
<td>The existing map of properties that will be
|
|
passed to the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<code>decorateHyper</code><br>
|
|
<code>decorateTerms</code><br>
|
|
<code>decorateTerm</code><br>
|
|
<code>decorateHeader</code><br>
|
|
<code>decorateTabs</code><br>
|
|
<code>decorateTab</code>
|
|
</td>
|
|
<td>Renderer</td>
|
|
<td>
|
|
<p>Invoked with the <code>React</code> <code>Component</code>
|
|
to decorate. Must return a Higher Order Component.</p>
|
|
<p>Parameters:</p>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>Hyper</code></td>
|
|
<td>The <code>React</code> <code>Component</code>
|
|
constructor.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>env</code></td>
|
|
<td>A collection of useful module references for
|
|
building components. <a href="#decorating-components">See below</a></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<span class="table-note"></span>
|
|
|
|
<h3 id="extensions-module-loading"><a href="#extensions-module-loading">Module loading</a></h3>
|
|
|
|
<p>The user can hot-load and hot-reload plugins by pressing
|
|
Command + R (refresh). Please strive to make plugins that don't
|
|
require a complete restart of the application to work.</p>
|
|
|
|
<p>In the future we might do this automatically.</p>
|
|
|
|
<p>When developing, you can add your plugin to
|
|
<code>~/.hyper_plugins/local</code> and then specify it
|
|
under the <code>localPlugins</code> array in <code>~/.hyper.js</code>.
|
|
|
|
We load new plugins:
|
|
<ul>
|
|
<li>Periodically (every few hours)</li>
|
|
<li>When changes are made to the configuration file
|
|
(<code>plugins</code> or <code>localPlugins</code>)</li>
|
|
<li>When the user clicks Plugins > Update all now</li>
|
|
</ul>
|
|
|
|
<p>The process of reloading involves</p>
|
|
<ul>
|
|
<li>Running <code>npm prune</code> and <code>npm install</code>
|
|
in <code>~/.hyper_plugins</code>.</li>
|
|
<li>Pruning the <code>require.cache</code> in both electron
|
|
and the renderer process</li>
|
|
<li>Invoking <code>on*<code> methods on the existing instances
|
|
and re-rendering components with the fresh decorations in place.</li>
|
|
</ul>
|
|
|
|
<p>Note: on the main process, plugins are registered as
|
|
soon as possible (we fire <code>onLoad</code>).
|
|
On the browser, it's up to the user to trigger their load by
|
|
pressing command+R. We put the user in control of the loading
|
|
in this way to prevent them from losing critical work by
|
|
extensions that reset state or don't preserve it correctly.</p>
|
|
|
|
<h3 id="decorating-components"><a href="#decorating-components">Decorating components</a></h3>
|
|
|
|
<p>We give you the ability to provide a higher order component
|
|
for every piece of the <code>Hyper</code> UI.<br> Its structure
|
|
is as follows:</p>
|
|
|
|
<pre><code><Hyper>
|
|
<Header>
|
|
<Tabs>
|
|
<Tab /> ...
|
|
</Tabs>
|
|
</Header>
|
|
<Terms>
|
|
<Term /> ...
|
|
</Terms>
|
|
<Notifications>
|
|
<Notification /> ...
|
|
</Notifications>
|
|
</Hyper></code></pre>
|
|
|
|
<p>All the <code>decorate*</code> methods receive the following
|
|
references in an object passed as the second parameter:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>React</code></td>
|
|
<td>The entire React namespace.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>notify</code></td>
|
|
<td>A helper function that shows a desktop notification.
|
|
The first parameter is the title and the second is the optional
|
|
body of the notification.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>Notification</code></td>
|
|
<td>The <code>Notification</code> component in case you
|
|
want to re-use it.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>All the components accept the following two properties
|
|
to extend their markup:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>customChildren</code></td>
|
|
<td>An array of <code>Element</code> or a single
|
|
<code>Element</code> to insert at the bottom
|
|
of the component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>customChildrenBefore</code></td>
|
|
<td>The same as the above property, but inserted
|
|
as the first child element(s) of the component.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>We encourage you to maintain compatibility with other decorators.
|
|
Since many can be set, don't assume that yours is the only one.
|
|
For example, if you're passing children, compose potential existing
|
|
values:</p>
|
|
|
|
<pre><code>render () {
|
|
const customChildren = Array.from(this.props.customChildren)
|
|
.concat(<p>My new child</p>);
|
|
return <Tab {...this.props} customChildren={customChildren} />
|
|
}</code></pre>
|
|
|
|
|
|
<h3 id="actions-and-effects"><a href="#actions-and-effects">Actions and Effects</a></h3>
|
|
|
|
<p>All the <a href="https://github.com/zeit/hyper/tree/master/lib/actions"
|
|
target="_blank">Redux actions</a> are available for you to
|
|
handle through your middleware and reducers. For an example, refer to the <a href="#hyperpower">Hyperpower</a> reference plugin.</p>
|
|
|
|
<p>Side effects occur in two fundamental forms:</p>
|
|
<ul>
|
|
<li>Some actions dispatch other actions based on state.</li>
|
|
<li>Some actions do async work by communicating over the RPC
|
|
channel to the main process</li>
|
|
</ul>
|
|
|
|
<p>In all cases, the side effect is passed as
|
|
the <code>effect</code> key in the action and later handled
|
|
by our middleware.</p>
|
|
|
|
<p>This means that you can override, compose or completely
|
|
eliminate effects! In other words, this is how you can
|
|
change the default functionality or behavior of the app.</p>
|
|
|
|
<p>As an example, consider the action we use to increase
|
|
the font size when you press <code>Command+=</code>:</p>
|
|
|
|
<pre><code>export function increaseFontSize () {
|
|
return (dispatch, getState) => {
|
|
dispatch({
|
|
type: UI_FONT_SIZE_INCR,
|
|
effect () {
|
|
const state = getState();
|
|
const old = state.ui.fontSizeOverride || state.ui.fontSize;
|
|
const value = old + 1;
|
|
dispatch({
|
|
type: UI_FONT_SIZE_SET,
|
|
value
|
|
});
|
|
}
|
|
});
|
|
};
|
|
}</code></pre>
|
|
|
|
<h3 id="hterm"><a href="#hterm">The underlying terminal</a></h3>
|
|
|
|
<p><code>Hyper</code> achieves a lot of its speed and functionality
|
|
thanks to the power of <a target="_blank" href="https://chromium.googlesource.com/apps/libapps/+/master/hterm">hterm</a> underneath,
|
|
the terminal emulator of the Chromium project.</p>
|
|
|
|
<p>To access the terminal object, you can supply
|
|
a <code>onTerminal</code> property to the <code><Term></code>
|
|
component.</p>
|
|
|
|
<h3 id="additional-apis"><a href="#additional-apis">Additional APIs</a></h3>
|
|
|
|
<p>The Electron <code>app</code> objects are extended with the following properties:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>config</code></td>
|
|
<td>An <code>Object</code> with the <code>config</code> block
|
|
from <code>~/.hyper.js</code>.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>plugins</code></td>
|
|
<td>An <code>Object</code> with helpers for plugins.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>getWindows</code></td>
|
|
<td>A <code>Function</code> that returns an <code>Set</code>
|
|
of all the open windows.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>createWindow</code></td>
|
|
<td>A <code>Function</code> that will create a new window. Accepts an
|
|
optional <code>callback</code> that will be passed as the new window's
|
|
<code>init</code> callback.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>Electron <code>BrowserWindow</code> objects are extended
|
|
with the following parameters:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>rpc</code></td>
|
|
<td>An <code>EventEmitter</code> that allows for communication
|
|
with the window process.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>sessions</code></td>
|
|
<td>A <code>Map</code> of <code>Session</code>
|
|
objects which hold the communication with each
|
|
term's pty..</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>Renderer windows are similarly extended with:</p>
|
|
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>rpc</code></td>
|
|
<td>An <code>EventEmitter</code> that allows for communication
|
|
with the window process.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>store</code></td>
|
|
<td>The Redux <code>Store</code> object. This allows
|
|
access to <code>dispatch</code> actions or read the global
|
|
state with <code>getState</code>.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>The <code>rpc</code> object is symmetrical between browser
|
|
and renderer process. The API is the same as Node.js,
|
|
with the exception that it only admits a single object
|
|
as its parameters only:</p>
|
|
|
|
<pre><code>window.rpc.emit('hi there', {
|
|
some: 'payload',
|
|
any: [
|
|
'object',
|
|
'here'
|
|
]
|
|
});</code></pre>
|
|
|
|
<h3 id="hyperyellow"><a href="#hyperyellow">Example theme: Hyperyellow</a></h3>
|
|
|
|
<p>The following extension simply alters the config to add CSS
|
|
and yellow colors! Here's the <a target="_blank" href="https://github.com/zeit/hyperyellow/blob/29c4ac9748be74d7ad587b7077758ef26f6ce5c2/index.js#L1">code</a>.</p>
|
|
|
|
<p style="text-align: center"><img src="static/hyperyellow.gif" width="446" height="333" /></p>
|
|
|
|
<p>Themes are simply plugins! Only one hook, <code>decorateConfig</code>
|
|
is needed:</p>
|
|
|
|
<pre><code>exports.decorateConfig = (config) => {
|
|
return Object.assign({}, config, {
|
|
borderColor: 'yellow',
|
|
cursorColor: 'yellow',
|
|
css: `
|
|
${config.css || ''}
|
|
.tabs_nav .tabs_list .tab_text {
|
|
color: yellow;
|
|
}
|
|
.tabs_nav .tabs_title {
|
|
color: yellow;
|
|
}
|
|
`
|
|
});
|
|
}</code></pre>
|
|
|
|
<p>I grabbed the class names by inspecting the term with
|
|
Devtools, which you can trigger from <code>View -> Toggle Developer Tools</code>.
|
|
When you do so, notice that some classes are automatically generated and
|
|
followed by a random nonce (e.g.: <code>term_13hv8io</code>). Ignore those: they change with every new window!</p>
|
|
|
|
<p>Notice the emphasis on playing nice with other extensions.
|
|
Specifically, we create a new object, extend only the keys we
|
|
are interested in, and we <b>compose</b> the CSS to preserve
|
|
the user's setting and that of other authors':</p>
|
|
|
|
<pre><code>return Object.assign({}, config, {
|
|
css: `
|
|
${config.css || ''}
|
|
/* your css here */
|
|
`
|
|
});</code></pre>
|
|
|
|
<h3 id="hyperpower"><a href="#hyperpower">Example extension: Hyperpower</a></h3>
|
|
|
|
<p>The following extension renders particles as the
|
|
caret moves:</p>
|
|
|
|
<p style="text-align: center"><img src="https://cloud.githubusercontent.com/assets/13041/16820268/13c9bfe6-4905-11e6-8fe4-baf8fc8d9293.gif" width="457" height="340" /></p>
|
|
|
|
<p>Let's walk through <a target="_blank"
|
|
href="https://github.com/zeit/hyperpower/blob/master/index.js">its code</a>.
|
|
<br>First, we intercept the Redux action <code>SESSION_ADD_DATA</code>. See the whole list of them <a target="_blank" href="https://github.com/zeit/hyper/tree/master/lib/actions">here</a>.</p>
|
|
|
|
<pre><code>exports.middleware = (store) => (next) => (action) => {
|
|
if ('SESSION_ADD_DATA' === action.type) {
|
|
const { data } = action;
|
|
if (/bash: wow: command not found/.test(data)) {
|
|
store.dispatch({
|
|
type: 'WOW_MODE_TOGGLE'
|
|
});
|
|
} else {
|
|
next(action);
|
|
}
|
|
} else {
|
|
next(action);
|
|
}
|
|
};</code></pre>
|
|
|
|
<p>Notice that we don't re-dispatch the action, which means
|
|
we never render the output of the command to the terminal. Instead, we dispatch an action of our own, which we grab
|
|
in the <code>uiReducer</code>and later map:</p>
|
|
|
|
<pre><code>exports.reduceUI = (state, action) => {
|
|
switch (action.type) {
|
|
case 'WOW_MODE_TOGGLE':
|
|
return state.set('wowMode', !state.wowMode);
|
|
}
|
|
return state;
|
|
};
|
|
|
|
exports.mapTermsState = (state, map) => {
|
|
return Object.assign(map, {
|
|
wowMode: state.ui.wowMode
|
|
});
|
|
};</code></pre>
|
|
|
|
<p>We then want to decorate the <code><Term></code> component
|
|
so that we can access the underlying caret.</p>
|
|
|
|
<p>However, <code><Term></code> is not a container that
|
|
we can map props to. So we use <code>getTermProps</code> to
|
|
pass the property further down:</p>
|
|
|
|
<pre><code>exports.getTermProps = (uid, parentProps, props) => {
|
|
return Object.assign(props, {
|
|
wowMode: parentProps.wowMode
|
|
});
|
|
}</code></pre>
|
|
|
|
<p>The extension then <a href="https://github.com/zeit/hyperpower/blob/82a09148e176584458829fdd8877fbc003fbb5b4/index.js#L51" target="_blank">returns</a> a higher order component to
|
|
wrap <code><Term></code>. Notice we pass the <code>onTerminal</code>
|
|
property to access the underlying hterm object:</p>
|
|
|
|
<pre><code>render () {
|
|
return React.createElement(Term, Object.assign({}, this.props, {
|
|
onTerminal: this._onTerminal
|
|
}));
|
|
}</code></pre>
|
|
|
|
<h2 id="credits"><a href="#credits">Credits</a></h2>
|
|
|
|
<p>Authored by <b>Guillermo Rauch</b> - <a href="https://twitter.com/rauchg" target="_blank">@rauchg</a>.<br />
|
|
Brought to you by <a href="https://zeit.co"><span style="font-size: 16px">▲</span>ZEIT</a>. Hosted on <a target="_blank" href="https://zeit.co/now">now</a>.</p>
|
|
|
|
<p>Special thanks to the following people:</p>
|
|
<ul>
|
|
<li>Jeff Haynies for his work on polish for general terminal behavior.</li>
|
|
<li>Nuno Campos for his work on zooming and configuration.</li>
|
|
<li>Leo Lamprecht and Johan Brook for their excellent UI improvements.</li>
|
|
<li>Harrison Harnisch for our nice default color palette.</li>
|
|
<li>Fernando Montoya for his feedback and patches.</li>
|
|
<li>Matias Tucci for his work on the auto updater.</li>
|
|
<li>Sebastian Markbage for his insight on the higher-order component extensibility API.</li>
|
|
<li>Joel Besada for his editor particles <a target="_blank" href="https://github.com/codeinthedark/editor/pull/1">idea</a> and Zero Cho for his reference implementation.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<script>
|
|
document.getElementById('vid').playbackRate = 1.7;
|
|
document.getElementById('vid').onended = function () {
|
|
document.getElementById('top-content').style.animationDelay = '100ms';
|
|
document.getElementById('top-content').style.animationName = 'arrow-video-finish';
|
|
}
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
var userAgent = navigator.userAgent;
|
|
var downloadButton = document.getElementsByClassName('download-button')[0];
|
|
var downloadButtonText = document.getElementById('download-button-text');
|
|
|
|
if (/Mac/.test(userAgent) && !/iPhone/.test(userAgent) && !/iPad/.test(userAgent)) {
|
|
downloadButton.setAttribute('href', 'https://hyper-updates.now.sh/download/mac');
|
|
downloadButtonText.innerHTML += ' for <strong>macOS</strong>';
|
|
document.getElementById('td-mac-os').classList.add('highlighted');
|
|
document.getElementById('mac-os-icon').classList.remove('is-hidden');
|
|
} else if (/Windows/.test(userAgent)) {
|
|
downloadButton.setAttribute('href', 'https://hyper-updates.now.sh/download/win');
|
|
downloadButtonText.innerHTML += ' for <strong>Windows</strong>';
|
|
document.getElementById('td-win').classList.add('highlighted');
|
|
document.getElementById('windows-icon').classList.remove('is-hidden');
|
|
} else if (/Linux/.test(userAgent) && !/Android/.test(userAgent)) {
|
|
document.getElementById('linux-icon').classList.remove('is-hidden');
|
|
if (/Ubuntu/.test(userAgent)) { // needs to be improved with other debian distros
|
|
downloadButton.setAttribute('href', 'https://hyper-updates.now.sh/download/linux_deb');
|
|
downloadButtonText.innerHTML += ' for <strong>Debian</strong>';
|
|
document.getElementById('td-debian').classList.add('highlighted');
|
|
} else if (/Fedora/.test(userAgent)) {
|
|
downloadButton.setAttribute('href', 'https://hyper-updates.now.sh/download/linux_rpm');
|
|
downloadButtonText.innerHTML += ' for <strong>Fedora</strong>';
|
|
document.getElementById('td-fedora').classList.add('highlighted');
|
|
} else {
|
|
downloadButton.setAttribute('href', 'https://github.com/zeit/hyper/releases/download/1.2.0/hyper-1.2.0-x86_64-linux.AppImage');
|
|
downloadButtonText.innerHTML += ' for <strong>Linux</strong>';
|
|
document.getElementById('td-appimage').classList.add('highlighted');
|
|
}
|
|
} else {
|
|
document.getElementById('fallback-icon').classList.remove('is-hidden');
|
|
document.getElementsByClassName('other-downloads')[0].classList.add('is-hidden');
|
|
}
|
|
});
|
|
var header = document.getElementById('header');
|
|
window.addEventListener('scroll', function () {
|
|
if (window.scrollY > 200) {
|
|
header.classList.add('hidden');
|
|
} else {
|
|
header.classList.remove('hidden');
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|