Remove more files supporting the old web front-end
228
Cargo.lock
generated
@ -77,23 +77,6 @@ dependencies = [
|
||||
"opaque-debug 0.3.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ahash"
|
||||
version = "0.4.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e"
|
||||
|
||||
[[package]]
|
||||
name = "ahash"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "796540673305a66d127804eef19ad696f1f204b8c1025aaca4958c17eab32877"
|
||||
dependencies = [
|
||||
"getrandom 0.2.2",
|
||||
"once_cell",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ahash"
|
||||
version = "0.7.4"
|
||||
@ -378,17 +361,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-rustls"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f38092e8f467f47aadaff680903c7cbfeee7926b058d7f40af2dd4c878fbdee"
|
||||
dependencies = [
|
||||
"futures-lite",
|
||||
"rustls 0.18.1",
|
||||
"webpki",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-rustls"
|
||||
version = "0.2.0"
|
||||
@ -396,7 +368,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c86f33abd5a4f3e2d6d9251a9e0c6a7e52eb1113caf893dae8429bf4a53f378"
|
||||
dependencies = [
|
||||
"futures-lite",
|
||||
"rustls 0.19.1",
|
||||
"rustls",
|
||||
"webpki",
|
||||
]
|
||||
|
||||
@ -421,17 +393,6 @@ dependencies = [
|
||||
"sha2 0.9.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-sqlx-session"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b66fb8c6ffbf26cdba6705c36f086b6f02f0b4778b6a348134302a2a00730bc"
|
||||
dependencies = [
|
||||
"async-session",
|
||||
"async-std",
|
||||
"sqlx 0.4.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "async-sse"
|
||||
version = "4.1.0"
|
||||
@ -488,7 +449,7 @@ checksum = "2f23d769dbf1838d5df5156e7b1ad404f4c463d1ac2c6aeb6cd943630f8a8400"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-io",
|
||||
"rustls 0.19.1",
|
||||
"rustls",
|
||||
"webpki",
|
||||
"webpki-roots",
|
||||
]
|
||||
@ -831,28 +792,6 @@ version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
|
||||
|
||||
[[package]]
|
||||
name = "cargo-platform"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0226944a63d1bf35a3b5f948dd7c59e263db83695c9e8bffc4037de02e30f1d7"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cargo_metadata"
|
||||
version = "0.12.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7714a157da7991e23d90686b9524b9e12e0407a108647f52e9328f4b3d51ac7f"
|
||||
dependencies = [
|
||||
"cargo-platform",
|
||||
"semver 0.11.0",
|
||||
"semver-parser 0.10.2",
|
||||
"serde",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.67"
|
||||
@ -1094,7 +1033,6 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-io",
|
||||
"async-sqlx-session",
|
||||
"async-std",
|
||||
"async-trait",
|
||||
"async-tungstenite",
|
||||
@ -1125,13 +1063,12 @@ dependencies = [
|
||||
"project",
|
||||
"rand 0.8.3",
|
||||
"rpc",
|
||||
"rust-embed",
|
||||
"scrypt",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"settings",
|
||||
"sha-1 0.9.6",
|
||||
"sqlx 0.5.5",
|
||||
"sqlx",
|
||||
"surf",
|
||||
"theme",
|
||||
"tide",
|
||||
@ -2467,9 +2404,6 @@ name = "hashbrown"
|
||||
version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
|
||||
dependencies = [
|
||||
"ahash 0.4.7",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
@ -2477,16 +2411,7 @@ version = "0.11.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
|
||||
dependencies = [
|
||||
"ahash 0.7.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashlink"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d99cf782f0dc4372d26846bec3de7804ceb5df083c2d4462c0b8d2330e894fa8"
|
||||
dependencies = [
|
||||
"hashbrown 0.9.1",
|
||||
"ahash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4408,20 +4333,7 @@ version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
|
||||
dependencies = [
|
||||
"semver 0.9.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls"
|
||||
version = "0.18.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5d1126dcf58e93cee7d098dbda643b5f92ed724f1f6a63007c1116eed6700c81"
|
||||
dependencies = [
|
||||
"base64 0.12.3",
|
||||
"log",
|
||||
"ring",
|
||||
"sct",
|
||||
"webpki",
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4601,17 +4513,7 @@ version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
|
||||
dependencies = [
|
||||
"semver-parser 0.7.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6"
|
||||
dependencies = [
|
||||
"semver-parser 0.10.2",
|
||||
"serde",
|
||||
"semver-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4620,15 +4522,6 @@ version = "0.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||
|
||||
[[package]]
|
||||
name = "semver-parser"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7"
|
||||
dependencies = [
|
||||
"pest",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.125"
|
||||
@ -5029,73 +4922,14 @@ dependencies = [
|
||||
"unicode_categories",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e1a98f9bf17b690f026b6fec565293a995b46dfbd6293debcb654dcffd2d1b34"
|
||||
dependencies = [
|
||||
"sqlx-core 0.4.2",
|
||||
"sqlx-macros 0.4.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx"
|
||||
version = "0.5.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ba82f79b31f30acebf19905bcd8b978f46891b9d0723f578447361a8910b6584"
|
||||
dependencies = [
|
||||
"sqlx-core 0.5.5",
|
||||
"sqlx-macros 0.5.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx-core"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "36bb6a2ca3345a86493bc3b71eabc2c6c16a8bb1aa476cf5303bee27f67627d7"
|
||||
dependencies = [
|
||||
"ahash 0.6.3",
|
||||
"atoi",
|
||||
"base64 0.13.0",
|
||||
"bitflags",
|
||||
"byteorder",
|
||||
"bytes 0.5.6",
|
||||
"chrono",
|
||||
"crc",
|
||||
"crossbeam-channel 0.5.0",
|
||||
"crossbeam-queue",
|
||||
"crossbeam-utils 0.8.2",
|
||||
"either",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"hashlink 0.6.0",
|
||||
"hex",
|
||||
"hmac 0.10.1",
|
||||
"itoa 0.4.7",
|
||||
"libc",
|
||||
"log",
|
||||
"md-5",
|
||||
"memchr",
|
||||
"once_cell",
|
||||
"parking_lot",
|
||||
"percent-encoding",
|
||||
"rand 0.7.3",
|
||||
"rustls 0.18.1",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sha-1 0.9.6",
|
||||
"sha2 0.9.5",
|
||||
"smallvec",
|
||||
"sqlformat",
|
||||
"sqlx-rt 0.2.0",
|
||||
"stringprep",
|
||||
"thiserror",
|
||||
"url",
|
||||
"webpki",
|
||||
"webpki-roots",
|
||||
"whoami",
|
||||
"sqlx-core",
|
||||
"sqlx-macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5104,7 +4938,7 @@ version = "0.5.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f23af36748ec8ea8d49ef8499839907be41b0b1178a4e82b8cb45d29f531dc9"
|
||||
dependencies = [
|
||||
"ahash 0.7.4",
|
||||
"ahash",
|
||||
"atoi",
|
||||
"base64 0.13.0",
|
||||
"bitflags",
|
||||
@ -5119,7 +4953,7 @@ dependencies = [
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"hashlink 0.7.0",
|
||||
"hashlink",
|
||||
"hex",
|
||||
"hmac 0.10.1",
|
||||
"itoa 0.4.7",
|
||||
@ -5131,14 +4965,14 @@ dependencies = [
|
||||
"parking_lot",
|
||||
"percent-encoding",
|
||||
"rand 0.8.3",
|
||||
"rustls 0.19.1",
|
||||
"rustls",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"sha-1 0.9.6",
|
||||
"sha2 0.9.5",
|
||||
"smallvec",
|
||||
"sqlformat",
|
||||
"sqlx-rt 0.5.5",
|
||||
"sqlx-rt",
|
||||
"stringprep",
|
||||
"thiserror",
|
||||
"time 0.2.27",
|
||||
@ -5149,28 +4983,6 @@ dependencies = [
|
||||
"whoami",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx-macros"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2b5ada8b3b565331275ce913368565a273a74faf2a34da58c4dc010ce3286844"
|
||||
dependencies = [
|
||||
"cargo_metadata",
|
||||
"dotenv",
|
||||
"either",
|
||||
"futures",
|
||||
"heck 0.3.3",
|
||||
"lazy_static",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"serde_json",
|
||||
"sha2 0.9.5",
|
||||
"sqlx-core 0.4.2",
|
||||
"sqlx-rt 0.2.0",
|
||||
"syn",
|
||||
"url",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx-macros"
|
||||
version = "0.5.5"
|
||||
@ -5185,29 +4997,19 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"sha2 0.9.5",
|
||||
"sqlx-core 0.5.5",
|
||||
"sqlx-rt 0.5.5",
|
||||
"sqlx-core",
|
||||
"sqlx-rt",
|
||||
"syn",
|
||||
"url",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx-rt"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63fc5454c9dd7aaea3a0eeeb65ca40d06d0d8e7413a8184f7c3a3ffa5056190b"
|
||||
dependencies = [
|
||||
"async-rustls 0.1.2",
|
||||
"async-std",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sqlx-rt"
|
||||
version = "0.5.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8199b421ecf3493ee9ef3e7bc90c904844cfb2ea7ea2f57347a93f52bfd3e057"
|
||||
dependencies = [
|
||||
"async-rustls 0.2.0",
|
||||
"async-rustls",
|
||||
"async-std",
|
||||
]
|
||||
|
||||
|
@ -37,7 +37,6 @@ oauth2 = { version = "4.0.0", default_features = false }
|
||||
oauth2-surf = "0.1.1"
|
||||
parking_lot = "0.11.1"
|
||||
rand = "0.8"
|
||||
rust-embed = { version = "6.3", features = ["include-exclude"] }
|
||||
scrypt = "0.7"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = "1.0"
|
||||
@ -48,11 +47,6 @@ tide-compress = "0.9.0"
|
||||
time = "0.2"
|
||||
toml = "0.5.8"
|
||||
|
||||
[dependencies.async-sqlx-session]
|
||||
version = "0.3.0"
|
||||
features = ["pg", "rustls"]
|
||||
default-features = false
|
||||
|
||||
[dependencies.sqlx]
|
||||
version = "0.5.2"
|
||||
features = ["runtime-async-std-rustls", "postgres", "time", "uuid"]
|
||||
|
@ -1,17 +1,5 @@
|
||||
# Zed Server
|
||||
|
||||
This crate is what we run at https://zed.dev.
|
||||
This crate is what we run at https://collab.zed.dev.
|
||||
|
||||
It contains our web presence as well as the backend logic for collaboration, to which we connect from the Zed client via a websocket.
|
||||
|
||||
## Templates
|
||||
|
||||
We use handlebars templates that are interpreted at runtime. When running in debug mode, you can change templates and see the latest content without restarting the server. This is enabled by the `rust-embed` crate, which we use to access the contents of the `/templates` folder at runtime. In debug mode it reads contents from the file system, but in release the templates will be embedded in the server binary.
|
||||
|
||||
## Static assets
|
||||
|
||||
We also use `rust-embed` to access the contents of the `/static` folder via the `/static/*` route. The app will pick up changes to the contents of this folder when running in debug mode.
|
||||
|
||||
## CSS
|
||||
|
||||
This site uses Tailwind CSS, which means our stylesheets don't need to change very frequently. We check `static/styles.css` into the repository, but it's actually compiled from `/styles.css` via `script/build-css`. This script runs the Tailwind compilation flow to regenerate `static/styles.css` via PostCSS.
|
||||
It contains our back-end logic for collaboration, to which we connect from the Zed client via a websocket after authenticating via https://zed.dev, which is a separate repo running on Vercel.
|
||||
|
Before Width: | Height: | Size: 15 KiB |
@ -1,29 +0,0 @@
|
||||
use anyhow::anyhow;
|
||||
use rust_embed::RustEmbed;
|
||||
use tide::{http::mime, Server};
|
||||
|
||||
#[derive(RustEmbed)]
|
||||
#[folder = "static"]
|
||||
struct Static;
|
||||
|
||||
pub fn add_routes(app: &mut Server<()>) {
|
||||
app.at("/*path").get(get_static_asset);
|
||||
}
|
||||
|
||||
async fn get_static_asset(request: tide::Request<()>) -> tide::Result {
|
||||
let path = request.param("path").unwrap();
|
||||
let content = Static::get(path).ok_or_else(|| anyhow!("asset not found at {}", path))?;
|
||||
|
||||
let content_type = if path.starts_with("svg") {
|
||||
mime::SVG
|
||||
} else if path.starts_with("styles") {
|
||||
mime::CSS
|
||||
} else {
|
||||
mime::BYTE_STREAM
|
||||
};
|
||||
|
||||
Ok(tide::Response::builder(200)
|
||||
.content_type(content_type)
|
||||
.body(content.data.as_ref())
|
||||
.build())
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
use anyhow::Context;
|
||||
use anyhow::Result;
|
||||
pub use async_sqlx_session::PostgresSessionStore as SessionStore;
|
||||
use async_std::task::{block_on, yield_now};
|
||||
use async_trait::async_trait;
|
||||
use serde::Serialize;
|
||||
|
@ -1 +0,0 @@
|
||||
|
@ -1,26 +1,5 @@
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
pub struct Release {
|
||||
pub tag_name: String,
|
||||
pub name: String,
|
||||
pub body: String,
|
||||
pub draft: bool,
|
||||
pub assets: Vec<Asset>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, Serialize)]
|
||||
pub struct Asset {
|
||||
pub name: String,
|
||||
pub url: String,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct Installation {
|
||||
#[allow(unused)]
|
||||
id: usize,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
pub struct User {
|
||||
pub login: String,
|
||||
|
@ -1,10 +1,8 @@
|
||||
mod api;
|
||||
mod assets;
|
||||
mod auth;
|
||||
mod db;
|
||||
mod env;
|
||||
mod errors;
|
||||
mod expiring;
|
||||
mod github;
|
||||
mod rpc;
|
||||
|
||||
@ -12,36 +10,21 @@ use ::rpc::Peer;
|
||||
use async_std::net::TcpListener;
|
||||
use async_trait::async_trait;
|
||||
use db::{Db, PostgresDb};
|
||||
use handlebars::Handlebars;
|
||||
use parking_lot::RwLock;
|
||||
use rust_embed::RustEmbed;
|
||||
use serde::Deserialize;
|
||||
use std::sync::Arc;
|
||||
use surf::http::cookies::SameSite;
|
||||
use tide::sessions::SessionMiddleware;
|
||||
use tide_compress::CompressMiddleware;
|
||||
|
||||
type Request = tide::Request<Arc<AppState>>;
|
||||
|
||||
#[derive(RustEmbed)]
|
||||
#[folder = "templates"]
|
||||
struct Templates;
|
||||
|
||||
#[derive(Default, Deserialize)]
|
||||
pub struct Config {
|
||||
pub http_port: u16,
|
||||
pub database_url: String,
|
||||
pub session_secret: String,
|
||||
pub github_app_id: usize,
|
||||
pub github_client_id: String,
|
||||
pub github_client_secret: String,
|
||||
pub github_private_key: String,
|
||||
pub api_token: String,
|
||||
}
|
||||
|
||||
pub struct AppState {
|
||||
db: Arc<dyn Db>,
|
||||
handlebars: RwLock<Handlebars<'static>>,
|
||||
config: Config,
|
||||
}
|
||||
|
||||
@ -51,27 +34,10 @@ impl AppState {
|
||||
|
||||
let this = Self {
|
||||
db: Arc::new(db),
|
||||
handlebars: Default::default(),
|
||||
config,
|
||||
};
|
||||
this.register_partials();
|
||||
Ok(Arc::new(this))
|
||||
}
|
||||
|
||||
fn register_partials(&self) {
|
||||
for path in Templates::iter() {
|
||||
if let Some(partial_name) = path
|
||||
.strip_prefix("partials/")
|
||||
.and_then(|path| path.strip_suffix(".hbs"))
|
||||
{
|
||||
let partial = Templates::get(path.as_ref()).unwrap();
|
||||
self.handlebars
|
||||
.write()
|
||||
.register_partial(partial_name, std::str::from_utf8(&partial.data).unwrap())
|
||||
.unwrap()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
@ -120,26 +86,12 @@ pub async fn run_server(
|
||||
) -> tide::Result<()> {
|
||||
let mut web = tide::with_state(state.clone());
|
||||
web.with(CompressMiddleware::new());
|
||||
web.with(
|
||||
SessionMiddleware::new(
|
||||
db::SessionStore::new_with_table_name(&state.config.database_url, "sessions")
|
||||
.await
|
||||
.unwrap(),
|
||||
state.config.session_secret.as_bytes(),
|
||||
)
|
||||
.with_same_site_policy(SameSite::Lax), // Required obtain our session in /auth_callback
|
||||
);
|
||||
api::add_routes(&mut web);
|
||||
|
||||
let mut assets = tide::new();
|
||||
assets.with(CompressMiddleware::new());
|
||||
assets::add_routes(&mut assets);
|
||||
|
||||
let mut app = tide::with_state(state.clone());
|
||||
rpc::add_routes(&mut app, &rpc);
|
||||
|
||||
app.at("/").nest(web);
|
||||
app.at("/static").nest(assets);
|
||||
|
||||
app.listen(listener).await?;
|
||||
|
||||
|
@ -1,54 +0,0 @@
|
||||
use crate::{
|
||||
auth::RequestExt as _, github::Release, AppState, LayoutData, Request, RequestExt as _,
|
||||
};
|
||||
use comrak::ComrakOptions;
|
||||
use serde::Serialize;
|
||||
use std::sync::Arc;
|
||||
use tide::http::mime;
|
||||
|
||||
pub fn add_routes(releases: &mut tide::Server<Arc<AppState>>) {
|
||||
releases.at("/releases").get(get_releases);
|
||||
}
|
||||
|
||||
async fn get_releases(mut request: Request) -> tide::Result {
|
||||
#[derive(Serialize)]
|
||||
struct ReleasesData {
|
||||
#[serde(flatten)]
|
||||
layout: Arc<LayoutData>,
|
||||
releases: Option<Vec<Release>>,
|
||||
}
|
||||
|
||||
let mut data = ReleasesData {
|
||||
layout: request.layout_data().await?,
|
||||
releases: None,
|
||||
};
|
||||
|
||||
if let Some(user) = request.current_user().await? {
|
||||
if user.is_insider {
|
||||
data.releases = Some(
|
||||
request
|
||||
.state()
|
||||
.repo_client
|
||||
.releases()
|
||||
.await?
|
||||
.into_iter()
|
||||
.filter_map(|mut release| {
|
||||
if release.draft {
|
||||
None
|
||||
} else {
|
||||
let mut options = ComrakOptions::default();
|
||||
options.render.unsafe_ = true; // Allow raw HTML in the markup. We control these release notes anyway.
|
||||
release.body = comrak::markdown_to_html(&release.body, &options);
|
||||
Some(release)
|
||||
}
|
||||
})
|
||||
.collect(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(tide::Response::builder(200)
|
||||
.body(request.state().render_template("releases.hbs", &data)?)
|
||||
.content_type(mime::HTML)
|
||||
.build())
|
||||
}
|
@ -5728,11 +5728,9 @@ mod tests {
|
||||
|
||||
async fn build_app_state(test_db: &TestDb) -> Arc<AppState> {
|
||||
let mut config = Config::default();
|
||||
config.session_secret = "a".repeat(32);
|
||||
config.database_url = test_db.url.clone();
|
||||
Arc::new(AppState {
|
||||
db: test_db.db().clone(),
|
||||
handlebars: Default::default(),
|
||||
config,
|
||||
})
|
||||
}
|
||||
|
@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig>
|
||||
<msapplication>
|
||||
<tile>
|
||||
<square150x150logo src="/static/images/mstile-150x150.png"/>
|
||||
<TileColor>#000000</TileColor>
|
||||
</tile>
|
||||
</msapplication>
|
||||
</browserconfig>
|
Before Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 662 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 12 KiB |
@ -1,14 +0,0 @@
|
||||
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<style>
|
||||
path {
|
||||
fill: #000000;
|
||||
}
|
||||
@media ( prefers-color-scheme: dark ) {
|
||||
path {
|
||||
fill: #FFFFFF;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M256 0C114.615 0 0 114.615 0 256C0 397.385 114.615 512 256 512C397.385 512 512 397.385 512 256C512 114.615 397.385 0 256 0ZM256 64C149.961 64 64 149.961 64 256C64 362.039 149.961 448 256 448C362.039 448 448 362.039 448 256C448 149.961 362.039 64 256 64Z"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M160 160L376 160L238 304H304L352 352H136L274 208H208L160 160Z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 695 B |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 2.4 KiB |
@ -1,19 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
<style>
|
||||
path {
|
||||
fill: #000000;
|
||||
}
|
||||
@media ( prefers-color-scheme: dark ) {
|
||||
path {
|
||||
fill: #FFFFFF;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M256 0C114.615 0 0 114.615 0 256C0 397.385 114.615 512 256 512C397.385 512 512 397.385 512 256C512 114.615 397.385 0 256 0ZM256 64C149.961 64 64 149.961 64 256C64 362.039 149.961 448 256 448C362.039 448 448 362.039 448 256C448 149.961 362.039 64 256 64Z"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M160 160L376 160L238 304H304L352 352H136L274 208H208L160 160Z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 918 B |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 11 KiB |
@ -1,253 +0,0 @@
|
||||
article.prose {
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
article.prose,
|
||||
.type-prose {
|
||||
font-family: "Spectral", "Constantia", "Lucida Bright", "Lucidabright", "Lucida Serif", "Lucida", "DejaVu Serif", "Bitstream Vera Serif", "Liberation Serif", "Georgia", "serif", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", serif;
|
||||
letter-spacing: -0.05rem;
|
||||
}
|
||||
|
||||
article.prose h1,
|
||||
article.prose h2,
|
||||
article.prose h3,
|
||||
article.prose h4,
|
||||
.type-prose h1,
|
||||
.type-prose h2,
|
||||
.type-prose h3,
|
||||
.type-prose h4 {
|
||||
margin: 3rem 0 1rem 0;
|
||||
}
|
||||
|
||||
article.prose h1,
|
||||
.type-prose h1 {
|
||||
font-size: 2.25rem;
|
||||
line-height: 2.5rem;
|
||||
}
|
||||
|
||||
article.prose h2,
|
||||
.type-prose h2 {
|
||||
font-size: 1.875rem;
|
||||
line-height: 2.25rem;
|
||||
}
|
||||
|
||||
article.prose h3,
|
||||
.type-prose h3 {
|
||||
font-size: 1.6rem;
|
||||
line-height: 2rem;
|
||||
}
|
||||
|
||||
article.prose h4,
|
||||
.type-prose h4 {
|
||||
font-size: 1.4rem;
|
||||
line-height: 1.75rem;
|
||||
}
|
||||
|
||||
article.prose p,
|
||||
article.prose li,
|
||||
article.prose a,
|
||||
.type-prose p,
|
||||
.type-prose li,
|
||||
.type-prose a {
|
||||
color: #eee;
|
||||
font-size: 1.3rem;
|
||||
line-height: 2.1rem;
|
||||
}
|
||||
|
||||
article.prose a:not(img),
|
||||
.type-prose a:not(img) {
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 4px;
|
||||
}
|
||||
|
||||
article.prose strong,
|
||||
.type-prose strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
article.prose i,
|
||||
.type-prose i {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
article.prose p:not(:last-of-type),
|
||||
.type-prose p:not(:last-of-type) {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
article.prose img,
|
||||
article.prose pre,
|
||||
.type-prose img,
|
||||
.type-prose pre {
|
||||
margin: 1.5rem 0;
|
||||
}
|
||||
|
||||
article.prose ul,
|
||||
.type-prose ul {
|
||||
margin-left: 1.5rem;
|
||||
}
|
||||
|
||||
article.prose ul li,
|
||||
.type-prose ul li {
|
||||
list-style-type: disc;
|
||||
list-style-position: outside;
|
||||
}
|
||||
|
||||
article.prose ul li:not(:last-of-type),
|
||||
.type-prose ul li:not(:last-of-type) {
|
||||
margin-bottom: 0.2rem;
|
||||
}
|
||||
|
||||
article.prose code,
|
||||
.type-prose code {
|
||||
font-family: "JetBrains Mono", "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", "Courier New", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", monospace;
|
||||
font-size: 0.96rem;
|
||||
letter-spacing: 0rem;
|
||||
}
|
||||
|
||||
article.prose :not(pre) > code,
|
||||
.type-prose :not(pre) > code {
|
||||
padding: 0.2rem 0.4rem;
|
||||
}
|
||||
|
||||
article.prose pre,
|
||||
.type-prose pre {
|
||||
padding: 0.8rem;
|
||||
}
|
||||
|
||||
article.prose pre,
|
||||
article.prose :not(pre) > code,
|
||||
.type-prose pre,
|
||||
.type-prose :not(pre) > code {
|
||||
border-radius: 4px;
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
/* Code Highlighting Styles
|
||||
/* Based on PrismJS 1.25.0
|
||||
https://prismjs.com/download.html#themes=prism-twilight&languages=markup+css+clike+javascript+bash+c+cpp+rust+scss */
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
color: #ddd;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: normal;
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
-webkit-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
}
|
||||
|
||||
/* Code blocks */
|
||||
pre[class*="language-"]::-moz-selection {
|
||||
/* Firefox */
|
||||
background: #3b57bc33;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::selection {
|
||||
/* Safari */
|
||||
background: #3b57bc33;
|
||||
}
|
||||
|
||||
/* Text Selection colour */
|
||||
pre[class*="language-"]::-moz-selection,
|
||||
pre[class*="language-"] ::-moz-selection,
|
||||
code[class*="language-"]::-moz-selection,
|
||||
code[class*="language-"] ::-moz-selection {
|
||||
text-shadow: none;
|
||||
background: #3b57bc33;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::selection,
|
||||
pre[class*="language-"] ::selection,
|
||||
code[class*="language-"]::selection,
|
||||
code[class*="language-"] ::selection {
|
||||
text-shadow: none;
|
||||
background: #3b57bc33;
|
||||
}
|
||||
|
||||
.token.comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: #9cdcfe;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.token.namespace {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.token.tag,
|
||||
.token.boolean,
|
||||
.token.number,
|
||||
.token.deleted {
|
||||
color: #b5cea8;
|
||||
}
|
||||
|
||||
.token.keyword,
|
||||
.token.property,
|
||||
.token.selector,
|
||||
.token.constant,
|
||||
.token.symbol,
|
||||
.token.builtin {
|
||||
color: #0086c0;
|
||||
/* #F9EE98 */
|
||||
}
|
||||
|
||||
.token.attr-name,
|
||||
.token.attr-value,
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url,
|
||||
.language-css .token.string,
|
||||
.style .token.string,
|
||||
.token.variable,
|
||||
.token.inserted {
|
||||
color: #4e94ce;
|
||||
}
|
||||
|
||||
.token.atrule {
|
||||
color: #4ec9b0;
|
||||
}
|
||||
|
||||
.token.regex,
|
||||
.token.important {
|
||||
color: #dcdcaa;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
/* Markup */
|
||||
.language-markup .token.tag,
|
||||
.language-markup .token.attr-name,
|
||||
.language-markup .token.punctuation {
|
||||
color: #4e94ce;
|
||||
}
|
||||
|
||||
/* Make the tokens sit above the line highlight so the colours don't look faded. */
|
||||
.token {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
/*# sourceMappingURL=prose.css.map */
|
@ -1,260 +0,0 @@
|
||||
// Style prose by hand
|
||||
// add .prose to any <article> to activate prose styles
|
||||
// or .type-prose to any element
|
||||
|
||||
article.prose {
|
||||
margin-bottom: 2.5rem;
|
||||
}
|
||||
|
||||
article.prose,
|
||||
.type-prose {
|
||||
font-family: "Spectral", "Constantia", "Lucida Bright", "Lucidabright",
|
||||
"Lucida Serif", "Lucida", "DejaVu Serif", "Bitstream Vera Serif",
|
||||
"Liberation Serif", "Georgia", "serif", "Apple Color Emoji",
|
||||
"Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", serif;
|
||||
letter-spacing: -0.05rem;
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4 {
|
||||
margin: 3rem 0 1rem 0;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2.25rem;
|
||||
line-height: 2.5rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.875rem;
|
||||
line-height: 2.25rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.6rem;
|
||||
line-height: 2rem;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.4rem;
|
||||
line-height: 1.75rem;
|
||||
}
|
||||
|
||||
p,
|
||||
li,
|
||||
a {
|
||||
color: #eee;
|
||||
font-size: 1.3rem;
|
||||
line-height: 2.1rem;
|
||||
}
|
||||
|
||||
a:not(img) {
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 4px;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
i {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
p:not(:last-of-type) {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
img,
|
||||
pre {
|
||||
margin: 1.5rem 0;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin-left: 1.5rem;
|
||||
}
|
||||
|
||||
ul li {
|
||||
list-style-type: disc;
|
||||
list-style-position: outside;
|
||||
&:not(:last-of-type) {
|
||||
margin-bottom: 0.2rem;
|
||||
}
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: "JetBrains Mono", "Andale Mono WT", "Andale Mono",
|
||||
"Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono",
|
||||
"Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L",
|
||||
"Courier New", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
|
||||
"Noto Color Emoji", monospace;
|
||||
font-size: 0.96rem;
|
||||
letter-spacing: 0rem;
|
||||
}
|
||||
|
||||
:not(pre) > code {
|
||||
padding: 0.2rem 0.4rem;
|
||||
}
|
||||
|
||||
pre {
|
||||
padding: 0.8rem;
|
||||
}
|
||||
|
||||
pre,
|
||||
:not(pre) > code {
|
||||
border-radius: 4px;
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Code Highlighting Styles
|
||||
/* Based on PrismJS 1.25.0
|
||||
https://prismjs.com/download.html#themes=prism-twilight&languages=markup+css+clike+javascript+bash+c+cpp+rust+scss */
|
||||
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
color: #ddd;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: normal;
|
||||
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
}
|
||||
|
||||
/* Code blocks */
|
||||
pre[class*="language-"] {
|
||||
// Language specific code block styles
|
||||
}
|
||||
|
||||
pre[class*="language-"]::-moz-selection {
|
||||
/* Firefox */
|
||||
background: #3b57bc33;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::selection {
|
||||
/* Safari */
|
||||
background: #3b57bc33;
|
||||
}
|
||||
|
||||
/* Text Selection colour */
|
||||
pre[class*="language-"]::-moz-selection,
|
||||
pre[class*="language-"] ::-moz-selection,
|
||||
code[class*="language-"]::-moz-selection,
|
||||
code[class*="language-"] ::-moz-selection {
|
||||
text-shadow: none;
|
||||
background: #3b57bc33;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::selection,
|
||||
pre[class*="language-"] ::selection,
|
||||
code[class*="language-"]::selection,
|
||||
code[class*="language-"] ::selection {
|
||||
text-shadow: none;
|
||||
background: #3b57bc33;
|
||||
}
|
||||
|
||||
.token.comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: #9cdcfe;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.token.namespace {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.token.tag,
|
||||
.token.boolean,
|
||||
.token.number,
|
||||
.token.deleted {
|
||||
color: #b5cea8;
|
||||
}
|
||||
|
||||
.token.keyword,
|
||||
.token.property,
|
||||
.token.selector,
|
||||
.token.constant,
|
||||
.token.symbol,
|
||||
.token.builtin {
|
||||
color: #0086c0; /* #F9EE98 */
|
||||
}
|
||||
|
||||
.token.attr-name,
|
||||
.token.attr-value,
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url,
|
||||
.language-css .token.string,
|
||||
.style .token.string,
|
||||
.token.variable,
|
||||
.token.inserted {
|
||||
color: #4e94ce;
|
||||
}
|
||||
|
||||
.token.atrule {
|
||||
color: #4ec9b0;
|
||||
}
|
||||
|
||||
.token.regex,
|
||||
.token.important {
|
||||
color: #dcdcaa;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
/* Markup */
|
||||
.language-markup .token.tag,
|
||||
.language-markup .token.attr-name,
|
||||
.language-markup .token.punctuation {
|
||||
color: #4e94ce;
|
||||
}
|
||||
|
||||
/* Make the tokens sit above the line highlight so the colours don't look faded. */
|
||||
.token {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
// TODO: Style line highlights
|
||||
|
||||
// .line-highlight.line-highlight {
|
||||
// background: hsla(0, 0%, 33%, 0.25); /* #545454 */
|
||||
// background: linear-gradient(to right, hsla(0, 0%, 33%, .1) 70%, hsla(0, 0%, 33%, 0)); /* #545454 */
|
||||
// border-bottom: 1px dashed hsl(0, 0%, 33%); /* #545454 */
|
||||
// border-top: 1px dashed hsl(0, 0%, 33%); /* #545454 */
|
||||
// margin-top: 0.75em; /* Same as .prism’s padding-top */
|
||||
// z-index: 0;
|
||||
// }
|
||||
|
||||
// .line-highlight.line-highlight:before,
|
||||
// .line-highlight.line-highlight[data-end]:after {
|
||||
// background-color: hsl(215, 15%, 59%); /* #8794A6 */
|
||||
// color: hsl(24, 20%, 95%); /* #F5F2F0 */
|
||||
// }
|
@ -1,18 +0,0 @@
|
||||
{
|
||||
"name": "Zed – a lightning fast, collaborative code editor written natively in Rust",
|
||||
"short_name": "Zed",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/static/android-chrome-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/static/android-chrome-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"theme_color": "#000",
|
||||
"background_color": "#000"
|
||||
}
|
Before Width: | Height: | Size: 11 KiB |
@ -1,136 +0,0 @@
|
||||
/* This file is compiled to /assets/styles/tailwind.css via script/tailwind */
|
||||
|
||||
@import url("https://fonts.googleapis.com/css2?family=Spectral:ital,wght@0,200;0,300;1,200;1,300&display=swap");
|
||||
@import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100;0,300;0,600;1,100;1,300;1,600&display=swap");
|
||||
|
||||
@tailwind base;
|
||||
@tailwind components;
|
||||
@tailwind utilities;
|
||||
|
||||
@layer base {
|
||||
html {
|
||||
font-size: 110%;
|
||||
text-rendering: geometricPrecision;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1024px) {
|
||||
html {
|
||||
font-size: 125%;
|
||||
}
|
||||
}
|
||||
|
||||
h1 {
|
||||
@apply text-4xl;
|
||||
@apply tracking-tighter;
|
||||
}
|
||||
h2 {
|
||||
@apply text-3xl;
|
||||
@apply tracking-tighter;
|
||||
}
|
||||
h3 {
|
||||
@apply text-2xl;
|
||||
@apply tracking-tighter;
|
||||
}
|
||||
h4 {
|
||||
@apply text-xl;
|
||||
}
|
||||
|
||||
.underline,
|
||||
.hover\:underline:hover {
|
||||
text-underline-offset: 6px;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1024px) {
|
||||
.text-columns-2 {
|
||||
column-count: 2;
|
||||
column-gap: 3rem;
|
||||
}
|
||||
|
||||
}
|
||||
.site-nav a:not(.active) .nav-active-arrow {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.site-nav a.active .nav-active-arrow {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.site-mobile-nav a.active {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.text-columns-2 {
|
||||
-webkit-column-break-inside: avoid;
|
||||
page-break-inside: avoid;
|
||||
break-inside: avoid;
|
||||
}
|
||||
|
||||
.text-columns-2 p {
|
||||
break-inside: avoid;
|
||||
}
|
||||
|
||||
.alternate-bg:nth-of-type(even) {
|
||||
background-color: rgba(255,255,255,0.06);
|
||||
}
|
||||
|
||||
/* div:not(.type-prose) code {
|
||||
background-color: rgba(255,255,255,0.15);
|
||||
padding: 0px 4px;
|
||||
border-radius: 2px;
|
||||
color: #eee;
|
||||
} */
|
||||
|
||||
/* This fixes scrollbar jump */
|
||||
@media screen and (min-width: 960px) {
|
||||
html {
|
||||
margin-left: calc(100vw - 100%);
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
:root {
|
||||
--color: white;
|
||||
--disabled: #959495;
|
||||
}
|
||||
|
||||
.checkbox {
|
||||
color: var(--color);
|
||||
}
|
||||
|
||||
.checkbox--disabled {
|
||||
color: var(--disabled);
|
||||
}
|
||||
|
||||
.checkbox__control {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.checkbox__control svg {
|
||||
transform: scale(0);
|
||||
transform-origin: center center;
|
||||
}
|
||||
|
||||
.checkbox__brackets {
|
||||
left: -1px;
|
||||
top: -1px;
|
||||
}
|
||||
|
||||
.checkbox__input input {
|
||||
opacity: 0;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.checkbox__input input:focus + .checkbox__control {
|
||||
box-shadow: 0 0 0 2px #000, 0 0 0 4px #3b57bc99
|
||||
}
|
||||
|
||||
.checkbox__input input:checked + .checkbox__control svg {
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
.checkbox__input input:disabled + .checkbox__control {
|
||||
color: var(--disabled);
|
||||
}
|
||||
}
|
@ -1,105 +0,0 @@
|
||||
{{#> layout }}
|
||||
<script>
|
||||
window.addEventListener("DOMContentLoaded", function () {
|
||||
let users = document.getElementById("users");
|
||||
if (users) {
|
||||
users.addEventListener("change", async function (event) {
|
||||
const action = event.target.getAttribute("action");
|
||||
if (action) {
|
||||
console.log(action, event.target.checked);
|
||||
const response = await fetch(action, {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ admin: event.target.checked })
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<div class="h-screen text-white border-r border-white text-main font-extralight">
|
||||
<div class="flex flex-row items-center justify-between p-5 border-b border-white pl-7 pr-7 admin-nav">
|
||||
<h1 class="font-display font-extralight">Admin</h1>
|
||||
<ul class="flex flex-row">
|
||||
<li><a href="#userlist"
|
||||
class="mr-4 leading-relaxed no-underline lowercase text-main hover:underline">Users</a></li>
|
||||
<li><a href="#signuplist"
|
||||
class="leading-relaxed no-underline lowercase text-main hover:underline">Signups</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<h2 id="userlist" class="pt-10 mb-5 text-white pl-7 pr-7 font-display font-extralight">Users</h2>
|
||||
|
||||
<div class="flex flex-col w-full pb-5 font-mono text-xs" id="users">
|
||||
<div class="flex flex-row pl-5 pr-10 font-bold">
|
||||
<p class="w-1/3 p-2">Github Username</p>
|
||||
<p class="w-32 p-2 text-center">Admin</p>
|
||||
<p class="w-24 p-2"> </p>
|
||||
</div>
|
||||
<div class="flex flex-col pl-5 pr-10 text-gray-100">
|
||||
<form action="/admin/users" method="post" class="m-0">
|
||||
<div class="flex flex-row items-center">
|
||||
<p class="w-1/3 p-2"><input class="block w-full p-2 text-xs bg-transparent border border-white"
|
||||
type="text" name="github_login" required minlength="4" placeholder="@github_handle"></p>
|
||||
<p class="w-32 p-2 text-center"><input type="checkbox" id="admin" name="admin" value="true"></p>
|
||||
<p class="w-24 p-2"><button class="underline hover:no-underline">Add</button></p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col w-full pb-10 font-mono text-xs border-b border-white">
|
||||
<div class="flex flex-row pl-5 pr-10 font-bold">
|
||||
<p class="w-1/3 p-2">Github Username</p>
|
||||
<p class="w-32 p-2 text-center">Admin</p>
|
||||
<p class="w-24 p-2"> </p>
|
||||
</div>
|
||||
{{#each users}}
|
||||
<div class="flex flex-col pl-5 pr-10 text-gray-100 alternate-bg">
|
||||
<form action="/admin/users/{{id}}/delete" method="post" class="m-0">
|
||||
<div class="flex flex-row items-center">
|
||||
<p class="w-1/3 p-2">{{github_login}}</p>
|
||||
<p class="w-32 p-2 text-center"><input action="/admin/users/{{id}}" type="checkbox" {{#if
|
||||
admin}}checked{{/if}}></p>
|
||||
<p class="w-24 p-2"><button class="underline hover:no-underline">Remove</button></p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
|
||||
<h2 class="pt-10 mb-5 text-white pl-7 pr-7 font-display font-extralight">Signups</h2>
|
||||
|
||||
<div class="flex flex-col w-full pb-10 font-mono text-xs border-b border-white">
|
||||
|
||||
<div class="flex flex-row justify-between pl-5 pr-10 font-bold">
|
||||
<p class="w-1/5 p-2">Email</p>
|
||||
<p class="w-1/5 p-2">Github</p>
|
||||
<p class="w-24 p-2 text-center">Releases</p>
|
||||
<p class="w-24 p-2 text-center">Updates</p>
|
||||
<p class="w-24 p-2 text-center">Community</p>
|
||||
<p class="w-24 p-2 text-right">Remove</p>
|
||||
</div>
|
||||
{{#each signups}}
|
||||
<div class="flex flex-col pb-1 pl-5 pr-10 text-gray-100 alternate-bg">
|
||||
<form action="/admin/signups/{{id}}/delete" method="post" class="m-0">
|
||||
<div class="flex flex-row items-center justify-between">
|
||||
<p class="w-1/5 p-2 pb-1">{{email_address}}</p>
|
||||
<p class="w-1/5 p-2 pb-1">{{github_login}}</p>
|
||||
<p class="w-24 p-2 pb-1 text-center">{{#if wants_releases}}[✓]{{else}}[ ]{{/if}}</p>
|
||||
<p class="w-24 p-2 pb-1 text-center">{{#if wants_updates}}[✓]{{else}}[ ]{{/if}}</p>
|
||||
<p class="w-24 p-2 pb-1 text-center">{{#if wants_community}}[✓]{{else}}[ ]{{/if}}</p>
|
||||
<p class="w-24 p-2 pb-1 text-right"><button
|
||||
class="text-lg text-gray-500 hover:text-white">×</button></p>
|
||||
</div>
|
||||
</form>
|
||||
<p class="max-w-full p-2 pt-0 overflow-hidden leading-normal text-gray-400 max-h-5 whitespace-nowrap overflow-ellipsis"
|
||||
title="{{about}}">{{about}}</p>
|
||||
</div>
|
||||
{{/each}}
|
||||
</div>
|
||||
</div>
|
||||
{{/layout}}
|
@ -1,20 +0,0 @@
|
||||
{{#> layout }}
|
||||
|
||||
<div class="max-w-screen-lg p-5 mx-auto font-extralight text-main lg:p-20">
|
||||
<h1 class="mb-10 text-4xl text-white font-display font-extralight">
|
||||
We think there's a better way to write code—and we've been working for more than a decade to bring it into existence.
|
||||
</h1>
|
||||
<p class="mt-5 leading-relaxed">Zed is looking for a Rust engineer to help us advance the art of code editing. We're currently three engineers and a designer developing a new editor with a focus on performance, clean design, and collaboration.</p>
|
||||
<p class="mt-5 leading-relaxed">We're working on exciting technologies, including a custom, GPU-accelerated UI framework, heavy use of parallelism and persistent data structures, conflict-free replicated data types, and an incremental parsing framework called Tree-sitter that was created by one of our founders.</p>
|
||||
<p class="mt-5 leading-relaxed">Our codebase consists of about 60,000 lines of well-factored, thoroughly-tested Rust that compiles quickly. In addition to the Zed editor, we're also developing a server-side component to facilitate collaboration that tightly integrates with the client.</p>
|
||||
<p class="mt-10 leading-relaxed">We'd love to hear from you if you're excited to build the world's best code editor and meet this description:</p>
|
||||
<ul class="mt-10 mb-16 leading-relaxed">
|
||||
<li class="mt-5 leading-relaxed">You're experienced in Rust. You've developed a substantial piece of software or meaningfully contributed to an open source project.</li>
|
||||
<li class="mt-5 leading-relaxed">You'd be excited to to pair program with us multiple times a week to learn the codebase.</li>
|
||||
<li class="mt-5 leading-relaxed">You know how to maintain code quality while being pragmatic and prioritizing the needs of the customer.</li>
|
||||
<li class="mt-5 leading-relaxed">You know how to write performant software, including algorithmic analysis and profile-driven optimization.</li>
|
||||
<li class="mt-5 leading-relaxed">Bonus: You have experience working on code editors, compilers, distributed systems, CRDTs, or real-time graphics.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{{/layout}}
|
@ -1,107 +0,0 @@
|
||||
{{#> layout }}
|
||||
|
||||
<div class="max-w-screen-lg p-5 mx-auto font-extralight text-main lg:p-20">
|
||||
<h1 class="mb-10 font-display font-extralight">We’re building a community of passionate developers & advocates.</h1>
|
||||
|
||||
<p class="mt-5 leading-relaxed">If you would like to get involved early, sign up below and we will let you know when our developer community opens!</p>
|
||||
|
||||
<form action="/signups" method="post" class="max-w-screen-md mt-10">
|
||||
<ul>
|
||||
<li class="flex flex-row mt-5 text-lg">
|
||||
<span class="relative w-6 mt-2 mr-5 checkbox__input">
|
||||
<span class="absolute z-0 block checkbox__brackets">
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg" focusable="false">
|
||||
<path d="M8 0H0V32H8V31H1V1H8V0Z" fill="white"/>
|
||||
<path d="M24 31H31V1H24V0H32V32H24V31Z" fill="white"/>
|
||||
</svg>
|
||||
</span>
|
||||
<input class="absolute z-10" type="checkbox" value=true name="wants_releases">
|
||||
<span class="flex items-center justify-center checkbox__control">
|
||||
<svg width="12" height="11" viewBox="0 0 12 11" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||||
<path d="M1 6.38905L4.33333 9.72239L11 0.833496" fill='none' stroke='currentColor' stroke-width="1" stroke-linecap="round"/>
|
||||
</svg>
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<div class="flex-1 mt-1">
|
||||
<label for="wants_releases">
|
||||
<span class="radio__label">Let me know when there is a beta release I can try.</span>
|
||||
</label>
|
||||
<p class="text-sm leading-6 text-gray-300">
|
||||
We'll put you on the list to play with an early beta and let you know when Zed launches.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="flex flex-row mt-5 text-lg">
|
||||
<span class="relative w-6 mt-2 mr-5 checkbox__input">
|
||||
<span class="absolute z-0 block checkbox__brackets">
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg" focusable="false">
|
||||
<path d="M8 0H0V32H8V31H1V1H8V0Z" fill="white"/>
|
||||
<path d="M24 31H31V1H24V0H32V32H24V31Z" fill="white"/>
|
||||
</svg>
|
||||
</span>
|
||||
|
||||
<input class="absolute z-10" type="checkbox" value=true name="wants_updates">
|
||||
<span class="flex items-center justify-center checkbox__control">
|
||||
<svg width="12" height="11" viewBox="0 0 12 11" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||||
<path d="M1 6.38905L4.33333 9.72239L11 0.833496" fill='none' stroke='currentColor' stroke-width="1" stroke-linecap="round"/>
|
||||
</svg>
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<div class="flex-1 mt-1">
|
||||
<label for="wants_updates">
|
||||
<span class="radio__label">I’m interested in following Zed's development</span>
|
||||
</label>
|
||||
<p class="text-sm leading-6 text-gray-300">
|
||||
We'll send you occasional updates about our progress and share what we're learning along the way.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
<li class="flex flex-row mt-5 text-lg">
|
||||
<span class="relative w-6 mt-2 mr-5 checkbox__input">
|
||||
<span class="absolute z-0 block checkbox__brackets">
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg" focusable="false">
|
||||
<path d="M8 0H0V32H8V31H1V1H8V0Z" fill="white"/>
|
||||
<path d="M24 31H31V1H24V0H32V32H24V31Z" fill="white"/>
|
||||
</svg>
|
||||
</span>
|
||||
|
||||
<input class="absolute z-10" type="checkbox" value=true name="wants_community">
|
||||
|
||||
<span class="flex items-center justify-center checkbox__control">
|
||||
<svg width="12" height="11" viewBox="0 0 12 11" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false">
|
||||
<path d="M1 6.38905L4.33333 9.72239L11 0.833496" fill='none' stroke='currentColor' stroke-width="1" stroke-linecap="round"/>
|
||||
</svg>
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<div class="flex-1 mt-1">
|
||||
<label for="wants_community">
|
||||
<span class="radio__label">I want to test early releases & join the Zed community</span>
|
||||
</label>
|
||||
<p class="text-sm leading-6 text-gray-300">
|
||||
We'll add you to the waitlist to receive early builds and ask you to help us by testing them out.
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="lg:flex lg:flex-row lg:mt-10">
|
||||
<input class="block w-full p-5 mt-10 bg-transparent border border-white font-extralight lg:mt-0 lg:mr-5" type="text" id="form-email" name="email_address" required minlength="4" placeholder="Your email">
|
||||
|
||||
<input class="block w-full p-5 mt-5 bg-transparent border border-white font-extralight lg:mt-0" type="text" id="form-gh" name="github_login" placeholder="Github Username">
|
||||
</div>
|
||||
|
||||
<textarea class="block w-full h-40 p-5 mt-5 leading-relaxed bg-transparent border border-white font-extralight" type="text" name="about" placeholder="Tell us a bit about yourself and your interest in Zed. What does your dream code-editing experience look like? What do you love or hate about your current editor?"></textarea>
|
||||
|
||||
<button class="block mt-10 text-lg opacity-100 font-extralight hover:opacity-80">
|
||||
Join the waitlist →
|
||||
</button>
|
||||
|
||||
<p class="mt-10 text-sm leading-relaxed text-gray-500">
|
||||
We're not gonna spam you—You can expect an email every 1 to 3 months from us if you sign up for updates, and occasional emails about beta releases.
|
||||
</p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
{{/layout}}
|
@ -1,41 +0,0 @@
|
||||
{{#> layout }}
|
||||
|
||||
<div class="bg-white">
|
||||
<div class="container mx-auto py-12 px-8 md:px-12">
|
||||
<h1 class="text-4xl font-black font-display mb-8">Bypassing code signing restrictions</h1>
|
||||
<div class="lg:flex lg:flex-row items-start">
|
||||
<div class="prose xl:prose-xl lg:mr-12">
|
||||
<p>
|
||||
We haven't yet applied to Apple for the required certificate to sign our application bundle, which
|
||||
means there's a small speed bump when you run our app.
|
||||
</p>
|
||||
<p>
|
||||
Instead of double-clicking the app, right click it and choose Open.
|
||||
</p>
|
||||
<p>
|
||||
You need to attempt open the app <b>twice</b>. On the second attempt, you should see the option
|
||||
to open the application anyway in the dialog.
|
||||
</p>
|
||||
</div>
|
||||
<img class="float-1 lg:w-1/3 object-contain mt-8 lg:mt-0" alt="Screen Shot 2021-06-02 at 2 38 12 PM"
|
||||
src="https://user-images.githubusercontent.com/1789/120550754-86514480-c3b2-11eb-8995-32f5eea79664.png">
|
||||
<img class="float-1 lg:w-1/3 object-contain -ml-10 lg:ml-0 lg:-mt-10"
|
||||
alt="Screen Shot 2021-06-02 at 2 38 19 PM"
|
||||
src="https://user-images.githubusercontent.com/1789/120550759-88b39e80-c3b2-11eb-88e2-ddfc1b1c7a03.png">
|
||||
</div>
|
||||
|
||||
<h1 class="text-4xl font-black font-display my-8">Key bindings</h1>
|
||||
<div class="prose">
|
||||
<dl>
|
||||
<dt>
|
||||
<pre>cmd-shift-L</pre>
|
||||
</dt>
|
||||
<dd>
|
||||
Split selection into lines
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{/layout}}
|
@ -1,15 +0,0 @@
|
||||
{{#> layout }}
|
||||
|
||||
<div class="max-w-screen-lg p-10 mx-auto text-main font-extralight lg:p-20">
|
||||
<article class="max-w-xl">
|
||||
<h1 class="mb-5 text-4xl text-white font-display font-extralight">Sorry!</h1>
|
||||
<p class="mb-5 leading-relaxed">
|
||||
Looks like we encountered a {{status}} error: {{reason}}
|
||||
</p>
|
||||
<p class="leading-relaxed">
|
||||
Try refreshing or going <a class="underline hover:no-underline" href="/">home</a>.
|
||||
</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
{{/layout}}
|
@ -1,110 +0,0 @@
|
||||
{{#> layout }}
|
||||
|
||||
<div class="max-w-screen-lg p-5 mx-auto text-gray-200 font-extralight text-main lg:p-20">
|
||||
<article class="">
|
||||
<h1 class="mb-10 text-4xl leading-tight text-white font-display font-extralight">Introducing Zed—A lightning-fast, collaborative code editor written in Rust.</h1>
|
||||
<p class="mt-5 leading-relaxed">
|
||||
We think there's a better way to write code, and it starts with the following assumptions:
|
||||
</p>
|
||||
|
||||
<h3 class="mt-10 leading-tight text-white font-display font-extralight">Mission-critical tools should be hyper-responsive.</h3>
|
||||
|
||||
<p class="mt-3 leading-relaxed">
|
||||
When you move the cursor or type a character, you should see pixels on the next refresh of your display—every time. Even sub-perceptual pauses add up over the course of a day to create unnecessary stress.
|
||||
</p>
|
||||
|
||||
<p class="mt-5 leading-relaxed">
|
||||
Joyful coding starts with an editor that stays out of your way.
|
||||
</p>
|
||||
|
||||
<h3 class="mt-10 leading-tight text-white font-display font-extralight">Real-time collaboration produces better software.</h3>
|
||||
|
||||
<p class="mt-3 leading-relaxed">
|
||||
Pull requests have their place, but sometimes you just want to code together. It's more fun than code review, builds trust between colleagues, and it's one of the best ways to distribute knowledge through a team. But it has to be easy.
|
||||
</p>
|
||||
|
||||
<p class="mt-5 leading-relaxed">
|
||||
If you want someone's perspective on a piece of code, it should be as easy as sending a message to pull them into your working copy and start coding.
|
||||
</p>
|
||||
|
||||
<h3 class="mt-10 leading-tight text-white font-display font-extralight">Conversations about software should happen close to the code.</h3>
|
||||
|
||||
<p class="mt-3 leading-relaxed">
|
||||
If you want to talk about code on GitHub you have to commit and push it first, and pasting code into a chat application sucks.
|
||||
</p>
|
||||
|
||||
<p class="mt-5 leading-relaxed">
|
||||
By treating keystrokes as the fundamental unit of change and integrating chat into the editor, we can make it easy to have a conversation about any line of code in any working copy–whether it was committed last year or just typed ten seconds ago.
|
||||
</p>
|
||||
|
||||
<h3 class="mt-10 leading-tight text-white font-display font-extralight">Our goal is to make you as efficient as possible.</h3>
|
||||
|
||||
<p class="mt-3 leading-relaxed">
|
||||
If you're living in a tool for hours every day, you want it to disappear. Every pixel must carry its weight, and the software you're creating should always be the focus. So we constantly ask ourselves how we can maximize signal and minimize noise.
|
||||
</p>
|
||||
|
||||
<p class="mt-5 leading-relaxed">
|
||||
Do we need an icon? Do we need a gradient? We all want to achieve mastery. Our goal is to find the most efficient way to accomplish each coding task and make it accessible. We will never dumb things down.
|
||||
</p>
|
||||
|
||||
<p class="mt-10 mb-10 leading-relaxed">———</p>
|
||||
|
||||
<p class="mt-5 leading-relaxed">
|
||||
We're looking to add another engineer to the team. Want to help us build the future? <a href="/careers">Join us</a>.
|
||||
</p>
|
||||
|
||||
<p class="mt-10 mb-10 leading-relaxed">———</p>
|
||||
|
||||
<h2 class="mt-16 mb-5 leading-tight text-white font-display font-extralight">Under the hood</h2>
|
||||
|
||||
<article class="leading-relaxed">
|
||||
<h3 class="mt-10 leading-tight text-white font-display font-extralight">Building in Rust</h3>
|
||||
<p class="mt-3">Rust offers expressivity and developer productivity rivaling languages that depend on a VM, while simultaneously offering the control required to fully utilize the underlying hardware.</p>
|
||||
|
||||
<p class="mt-5">Rust's unique ownership model is a challenge at the beginning, but once you internalize it, you can write extremely efficient multi-core code without fear of invoking undefined behavior.</p>
|
||||
|
||||
<p class="mt-5">It also makes it straightforward to call directly into the C-based APIs of the operating system. Rust makes it possible for a small team to build a complex product quickly, and Zed wouldn't have been possible without it.</p>
|
||||
|
||||
<p class="mt-5">In the past, to write software with this performant you would need to use C++. Rust, for the first time, enables us to write software at that level as a very small team.</p>
|
||||
</article>
|
||||
|
||||
<article class="leading-relaxed">
|
||||
<h3 class="mt-10 mb-4 leading-tight text-white font-display font-extralight">A new GPU-powered UI framework</h3>
|
||||
<p class="mt-3">We originally planned to use Electron as a convenient means of delivering a cross-platform GUI for Zed, while building the core of the application in Rust. But at every turn, we found that web technology was the bottleneck in achieving amazing performance. Finally, we decided to take full control and simply build a GPU-powered UI framework that met our needs.</p>
|
||||
|
||||
<p class="mt-5"></p>We call it GPUI.</p>
|
||||
|
||||
<p class="mt-5">We took a lot of inspiration from Mozilla's Webrender project. The key insight was that modern graphics hardware can render complex 3D graphics at high frame rates, so why not use it to render relatively simple 2D user interfaces with an immediate mode architecture? </p>
|
||||
|
||||
<p class="mt-5">Rust's ownership model required us to rethink much of what we learned in other UI programming paradigms, but the result is a framework that's productive to use and remarkably easy to reason about.</p>
|
||||
|
||||
<p class="mt-5">It's liberating to control every pixel, and it's a rush to push those pixels at lightning speed.</p>
|
||||
</article>
|
||||
|
||||
<article class="leading-relaxed">
|
||||
<h3 class="mt-10 mb-4 leading-tight text-white font-display font-extralight">Conflict-free replicated data types</h3>
|
||||
|
||||
<p class="mt-3">Real-time collaborative editing presents the illusion that multiple people are editing the same buffer. In reality, each collaborator maintains their own personal replica of the buffer to which they can apply local edits immediately without network latency.</p>
|
||||
|
||||
<p class="mt-5">After being applied locally, edits are transmitted to collaborators over the network, whose copies may have also changed in the meantime. This means that as participants edit together, their replicas continuously diverge and reconverge. Turns out this is a tricky problem.</p>
|
||||
|
||||
<p class="mt-5">To solve it, we're using conflict-free replicated data types, which have emerged in the last decade as a general framework for achieving eventual consistency in a variety of circumstances.</p>
|
||||
|
||||
<p class="mt-5">Making Zed's buffers CRDTs allows for collaborative editing, but it also helps us reason about concurrent change so that we can push work into background threads and keep the UI thread responsive.</p>
|
||||
</article>
|
||||
|
||||
<article class="leading-relaxed">
|
||||
<h3 class="mt-10 mb-4 leading-tight text-white font-display font-extralight">Tree-sitter</h3>
|
||||
|
||||
<p class="mt-3">We plan to integrate with the Language Server Protocol to support advanced IDE features, but we also think it's important for a code editor to have a rich, native understanding of syntax.</p>
|
||||
|
||||
<p class="mt-5">That's why we built Tree-sitter, a fast, general, incremental parsing library that can provide Zed with syntax trees for over 50 languages. Tree-sitter already powers production functionality on GitHub, and we'll use it to deliver syntactically-precise syntax highlighting, tree-based selection and cursor navigation, robust auto-indent support, symbolic navigation, and more.</p>
|
||||
</article>
|
||||
|
||||
<p class="mt-10 mb-10 leading-relaxed">———</p>
|
||||
|
||||
<p class="mt-5 leading-relaxed">Excited about what we are building? <a class="underline hover:no-underline" href="/community">Sign up for updates</a> to follow along in our development process.</p>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
{{/layout}}
|
@ -1,199 +0,0 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.86, maximum-scale=5.0, minimum-scale=0.86">
|
||||
|
||||
<link rel="mask-icon" href="/static/images/favicon.svg" color="#000000">
|
||||
<link rel="alternate icon" type="image/png" href="/static/images/favicon.png">
|
||||
<link rel="shortcut icon" href="/static/images/favicon.svg">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/static/images/apple-touch-icon.png">
|
||||
<link rel="manifest" href="/static/site.webmanifest">
|
||||
|
||||
<link rel="stylesheet" href="/static/styles.css">
|
||||
<link rel="stylesheet" href="/static/prose.css">
|
||||
|
||||
<link rel="mask-icon" href="/static/images/safari-pinned-tab.svg" color="#000000">
|
||||
<meta name="msapplication-TileColor" content="#000000">
|
||||
<meta name="msapplication-config" content="/static/browserconfig.xml">
|
||||
<meta name="theme-color" content="#000">
|
||||
|
||||
<!-- Open Graph stuff -->
|
||||
<meta name="twitter:card" content="summary" />
|
||||
<meta property="twitter:image" content="/static/images/zed-twitter-image.png" />
|
||||
<meta name="twitter:image:alt" content="An image of Zed's logo, sharp Z inside a circle, in white on a black background." />
|
||||
<meta property="og:url" content="https://zed.dev/" />
|
||||
<meta property="og:title" content="Introducing Zed" />
|
||||
<meta property="og:description" content="A lightning-fast, collaborative code editor written in Rust." />
|
||||
<meta property="og:image" content="/static/images/zed-og-image.png" />
|
||||
<meta property="og:type" content="website" />
|
||||
|
||||
<title>Zed</title>
|
||||
|
||||
</head>
|
||||
|
||||
<body class="box-border font-light bg-black font-body text-main">
|
||||
<main class="container flex flex-col mx-auto lg:bg-white lg:flex-none lg:grid lg:min-h-full lg:grid-cols-4 max-w-screen-2xl lg:gap-x-px text-gray-50">
|
||||
<nav id="mobile-nav" class="p-5 pt-10 pb-5 bg-black font-extralight lg:hidden site-mobile-nav">
|
||||
<div class="flex flex-row justify-between">
|
||||
<a href="/" class="block hover:opacity-80">
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16 0C7.16344 0 0 7.16344 0 16C0 24.8366 7.16344 32 16 32C24.8366 32 32 24.8366 32 16C32 7.16344 24.8366 0 16 0ZM16 4C9.37258 4 4 9.37258 4 16C4 22.6274 9.37258 28 16 28C22.6274 28 28 22.6274 28 16C28 9.37258 22.6274 4 16 4Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 10L23.5 10L14.875 19H19L22 22H8.5L17.125 13H13L10 10Z" fill="white"/>
|
||||
</svg>
|
||||
</a>
|
||||
<div class="flex flex-row">
|
||||
{{#if current_user}}
|
||||
|
||||
<form id="sign_out" action="/sign_out" method="post" class="inline m-0 text-gray-500 font-extralight">
|
||||
<button class="text-lg leading-relaxed √ no-underline font-extralight hover:underline">Log Out</button>
|
||||
</form>
|
||||
|
||||
{{else}}
|
||||
|
||||
<!-- Otherwise let user log in -->
|
||||
<a href=" /sign_in"
|
||||
class="text-lg leading-relaxed text-gray-500">
|
||||
Log in
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-row flex-wrap mt-10">
|
||||
<a href="/" class="mr-2 text-lg leading-relaxed">
|
||||
Meet Zed <span class="pt-1 mr-1 text-lg text-gray-500">·</span>
|
||||
</a>
|
||||
<a href="/team" class="mr-2 text-lg leading-relaxed">
|
||||
The Team <span class="pt-1 mr-1 text-lg text-gray-500">·</span>
|
||||
</a>
|
||||
|
||||
<a href="/community" class="mr-2 text-lg leading-relaxed">
|
||||
Waitlist
|
||||
</a>
|
||||
{{#if current_user}}
|
||||
<a href="/releases" class="mr-2 text-lg leading-relaxed">
|
||||
<span class="pt-1 mr-1 text-lg text-gray-500">·</span> Releases
|
||||
</a>
|
||||
|
||||
{{#if current_user.is_admin }}
|
||||
<a href="/admin" class="inline-block mr-2 text-lg leading-relaxed">
|
||||
<span class="pt-1 mr-1 text-lg text-gray-500">·</span> Manage Users
|
||||
</a>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<!-- If user is logged in AND -->
|
||||
<!-- If user is at least an insider -->
|
||||
{{#if current_user}}
|
||||
|
||||
<!-- AND If user is an admin -->
|
||||
|
||||
|
||||
{{/if}}
|
||||
</nav>
|
||||
|
||||
<nav id="nav" class="hidden p-10 pt-20 bg-black lg:flex lg:flex-col font-extralight site-nav">
|
||||
<a href="/" class="block hover:opacity-80">
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M16 0C7.16344 0 0 7.16344 0 16C0 24.8366 7.16344 32 16 32C24.8366 32 32 24.8366 32 16C32 7.16344 24.8366 0 16 0ZM16 4C9.37258 4 4 9.37258 4 16C4 22.6274 9.37258 28 16 28C22.6274 28 28 22.6274 28 16C28 9.37258 22.6274 4 16 4Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 10L23.5 10L14.875 19H19L22 22H8.5L17.125 13H13L10 10Z" fill="white"/>
|
||||
</svg>
|
||||
</a>
|
||||
<div class="flex flex-col mt-10 font-mono">
|
||||
<a href="/" class="relative mt-2 text-base no-underline lowercase hover:underline">
|
||||
<span class="absolute items-center justify-center hidden h-full align-middle nav-active-arrow -left-7">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10.1594 12.1606C10.0309 12.0567 9.96803 11.8899 9.96803 11.7204C9.96803 11.5509 10.0321 11.3846 10.1603 11.2564L12.7596 8.65813H1.6562C1.29392 8.65813 1 8.36284 1 7.97732C1 7.63829 1.29392 7.34573 1.6562 7.34573H12.7596L10.1613 4.74747C9.90501 4.49114 9.90501 4.07596 10.1613 3.81949C10.4177 3.56303 10.8328 3.56317 11.0893 3.81949L14.8078 7.53794C15.0641 7.79427 15.0641 8.20945 14.8078 8.46592L11.0893 12.1844C10.832 12.4395 10.4164 12.4395 10.1594 12.1606Z" fill="white"/></svg>
|
||||
</span>
|
||||
Meet Zed
|
||||
</a>
|
||||
<a href="/team" class="relative mt-2 text-base no-underline lowercase hover:underline">
|
||||
<span class="absolute items-center justify-center hidden h-full align-middle nav-active-arrow -left-7">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10.1594 12.1606C10.0309 12.0567 9.96803 11.8899 9.96803 11.7204C9.96803 11.5509 10.0321 11.3846 10.1603 11.2564L12.7596 8.65813H1.6562C1.29392 8.65813 1 8.36284 1 7.97732C1 7.63829 1.29392 7.34573 1.6562 7.34573H12.7596L10.1613 4.74747C9.90501 4.49114 9.90501 4.07596 10.1613 3.81949C10.4177 3.56303 10.8328 3.56317 11.0893 3.81949L14.8078 7.53794C15.0641 7.79427 15.0641 8.20945 14.8078 8.46592L11.0893 12.1844C10.832 12.4395 10.4164 12.4395 10.1594 12.1606Z" fill="white"/></svg>
|
||||
</span>
|
||||
The Team
|
||||
</a>
|
||||
<a href="/careers" class="relative mt-2 text-base no-underline lowercase hover:underline">
|
||||
<span class="absolute items-center justify-center hidden h-full align-middle nav-active-arrow -left-7">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10.1594 12.1606C10.0309 12.0567 9.96803 11.8899 9.96803 11.7204C9.96803 11.5509 10.0321 11.3846 10.1603 11.2564L12.7596 8.65813H1.6562C1.29392 8.65813 1 8.36284 1 7.97732C1 7.63829 1.29392 7.34573 1.6562 7.34573H12.7596L10.1613 4.74747C9.90501 4.49114 9.90501 4.07596 10.1613 3.81949C10.4177 3.56303 10.8328 3.56317 11.0893 3.81949L14.8078 7.53794C15.0641 7.79427 15.0641 8.20945 14.8078 8.46592L11.0893 12.1844C10.832 12.4395 10.4164 12.4395 10.1594 12.1606Z" fill="white"/></svg>
|
||||
</span>
|
||||
Careers
|
||||
</a>
|
||||
<a href="/community" class="relative mt-2 text-base no-underline lowercase hover:underline">
|
||||
<span class="absolute items-center justify-center hidden h-full align-middle nav-active-arrow -left-7">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10.1594 12.1606C10.0309 12.0567 9.96803 11.8899 9.96803 11.7204C9.96803 11.5509 10.0321 11.3846 10.1603 11.2564L12.7596 8.65813H1.6562C1.29392 8.65813 1 8.36284 1 7.97732C1 7.63829 1.29392 7.34573 1.6562 7.34573H12.7596L10.1613 4.74747C9.90501 4.49114 9.90501 4.07596 10.1613 3.81949C10.4177 3.56303 10.8328 3.56317 11.0893 3.81949L14.8078 7.53794C15.0641 7.79427 15.0641 8.20945 14.8078 8.46592L11.0893 12.1844C10.832 12.4395 10.4164 12.4395 10.1594 12.1606Z" fill="white"/></svg>
|
||||
</span>
|
||||
Waitlist
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- If user is logged in AND -->
|
||||
<!-- If user is at least an insider -->
|
||||
{{#if current_user}}
|
||||
<div class="flex flex-col mt-10 font-mono">
|
||||
<p class="text-xs tracking-widest uppercase opacity-50">Insiders</p>
|
||||
<a href="/releases" class="relative mt-2 text-base no-underline lowercase hover:underline">
|
||||
<span class="absolute items-center justify-center hidden h-full align-middle nav-active-arrow -left-7">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10.1594 12.1606C10.0309 12.0567 9.96803 11.8899 9.96803 11.7204C9.96803 11.5509 10.0321 11.3846 10.1603 11.2564L12.7596 8.65813H1.6562C1.29392 8.65813 1 8.36284 1 7.97732C1 7.63829 1.29392 7.34573 1.6562 7.34573H12.7596L10.1613 4.74747C9.90501 4.49114 9.90501 4.07596 10.1613 3.81949C10.4177 3.56303 10.8328 3.56317 11.0893 3.81949L14.8078 7.53794C15.0641 7.79427 15.0641 8.20945 14.8078 8.46592L11.0893 12.1844C10.832 12.4395 10.4164 12.4395 10.1594 12.1606Z" fill="white"/></svg>
|
||||
</span>
|
||||
Releases
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- AND If user is an admin -->
|
||||
{{#if current_user.is_admin }}
|
||||
<div class="flex flex-col mt-10 font-mono">
|
||||
<p class="text-xs tracking-widest uppercase opacity-50">Admin</p>
|
||||
<a href="/admin" class="relative inline-block mt-2 text-base no-underline lowercase hover:underline">
|
||||
<span class="absolute items-center justify-center hidden h-full align-middle nav-active-arrow -left-7">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10.1594 12.1606C10.0309 12.0567 9.96803 11.8899 9.96803 11.7204C9.96803 11.5509 10.0321 11.3846 10.1603 11.2564L12.7596 8.65813H1.6562C1.29392 8.65813 1 8.36284 1 7.97732C1 7.63829 1.29392 7.34573 1.6562 7.34573H12.7596L10.1613 4.74747C9.90501 4.49114 9.90501 4.07596 10.1613 3.81949C10.4177 3.56303 10.8328 3.56317 11.0893 3.81949L14.8078 7.53794C15.0641 7.79427 15.0641 8.20945 14.8078 8.46592L11.0893 12.1844C10.832 12.4395 10.4164 12.4395 10.1594 12.1606Z" fill="white"/></svg>
|
||||
</span>
|
||||
Manage
|
||||
</a>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="mt-10">
|
||||
<p class="text-base no-underline">@{{current_user.github_login}}</p>
|
||||
<form id="sign_out" action="/sign_out" method="post">
|
||||
<button class="mt-2 text-xs no-underline lowercase opacity-50 font-extralight hover:opacity-100">Sign out</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
{{else}}
|
||||
<!-- Otherwise let user log in -->
|
||||
<a href=" /sign_in"
|
||||
class="mt-10 text-base text-gray-400 no-underline lowercase hover:underline">
|
||||
Log in
|
||||
</a>
|
||||
{{/if}}
|
||||
</nav>
|
||||
|
||||
<div class="col-span-3 pb-20 bg-black">
|
||||
{{> @partial-block}}
|
||||
</div>
|
||||
</main>
|
||||
<script src="/static/prism.js"></script>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
const nav = document.getElementById('nav');
|
||||
const links = nav.getElementsByTagName('a');
|
||||
const currentPath = window.location.pathname;
|
||||
for (const link of links) {
|
||||
if (link.getAttribute('href') === currentPath) {
|
||||
link.classList.add('active');
|
||||
}
|
||||
}
|
||||
const mnav = document.getElementById('mobile-nav');
|
||||
const mlinks = mnav.getElementsByTagName('a');
|
||||
const mcurrentPath = window.location.pathname;
|
||||
for (const mlink of mlinks) {
|
||||
if (mlink.getAttribute('href') === mcurrentPath) {
|
||||
mlink.classList.add('active');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
</html>
|
@ -1,35 +0,0 @@
|
||||
{{#> layout }}
|
||||
|
||||
<div class="max-w-screen-lg p-5 mx-auto font-extralight text-main lg:p-20">
|
||||
{{#if current_user}}
|
||||
<h1 class="mb-10 font-display font-extralight">Releases</h1>
|
||||
<p class="mt-5 leading-relaxed">Zed is currently only available on macOS.</p>
|
||||
<p class="mt-5 mb-10 leading-relaxed">We are frequently shipping new versions, check back regularly to get the most recent version.</p>
|
||||
|
||||
{{#if releases}}
|
||||
|
||||
{{#each releases}}
|
||||
<article id="{{name}}" class="mb-20">
|
||||
<h3 class="mb-2 font-display font-extralight">{{name}}</h3>
|
||||
<div>
|
||||
<a class="text-sm underline opacity-80 hover:opacity-100" href="/releases/{{tag_name}}/{{assets.0.name}}">Download</a> · <a class="text-sm underline opacity-50 hover:opacity-100" href="https://github.com/zed-industries/zed/releases/tag/{{tag_name}}">Release Notes</a>
|
||||
</p>
|
||||
<div class="mt-10 type-prose">
|
||||
{{{body}}}
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
<p>———</p>
|
||||
</div>
|
||||
</article>
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
|
||||
{{else}}
|
||||
|
||||
<h1 class="mb-10 font-display font-extralight">Hold it!</h1>
|
||||
<p class="mt-5 leading-relaxed">You can't access this without <a href=" /sign_in" class="mt-5 leading-relaxed underline">logging in</a>.</p>
|
||||
<p class="mt-5 leading-relaxed">Try <a href="/community" class="mt-5 leading-relaxed underline">joining our community</a> to get access to updates & releases.</p>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{/layout}}
|
@ -1,18 +0,0 @@
|
||||
{{#> layout }}
|
||||
|
||||
<div class="max-w-screen-lg p-10 mx-auto font-extralight text-main lg:p-20">
|
||||
<h1 class="mb-10 font-display font-extralight">Thanks for signing up!</h1>
|
||||
<p class="mt-5 leading-relaxed">
|
||||
We'll add you to our list and let you know when we have something ready for you to try out.
|
||||
</p>
|
||||
|
||||
<p class="mt-5 leading-relaxed">
|
||||
Thanks for your interest!
|
||||
</p>
|
||||
|
||||
<a href="/" class="block mt-10 text-lg font-extralight underline opacity-100 hover:opacity-80">
|
||||
Back to Home
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{{/layout}}
|
@ -1,160 +0,0 @@
|
||||
{{#> layout }}
|
||||
|
||||
<div class="max-w-screen-lg p-5 mx-auto font-extralight text-main lg:p-20">
|
||||
<h1 class="mb-10 text-4xl text-white font-display font-extralight">
|
||||
We think there’s a better way to write code—and we've been working for more than a decade to bring it into existence.
|
||||
</h1>
|
||||
<p class="mt-5 leading-relaxed">
|
||||
Our first attempt was Atom, which we loved like a child but which ultimately fell short of our original vision. When we created Electron in 2012 to serve as Atom's runtime, there weren't a lot of great options for building cross-platform desktop apps.
|
||||
</p>
|
||||
<p class="mt-5 leading-relaxed">
|
||||
Had we tried to write Atom in C or C++, it never would have shipped, and we loved the idea of developers extending their editor with the familiar tools of JavaScript, HTML, and CSS.
|
||||
</p>
|
||||
<p class="mt-5 leading-relaxed">
|
||||
In the end, however, we reached the conclusion that the editor we wanted to use couldn't be built in a single-threaded scripting language. It was time to start over. Now we're back from the wilderness, this time with the knowledge and tools we need to execute without compromise.
|
||||
</p>
|
||||
<p class="mt-5 leading-relaxed">
|
||||
We're leveraging Rust, conflict-free replicated data types, and every core of your CPU and GPU to deliver an editor that will make coding more productive, fun, and collaborative. We look forward to sharing our best with you!
|
||||
</p>
|
||||
|
||||
<h1 class="mt-20 mb-5 text-4xl text-white font-display font-extralight">The Team</h1>
|
||||
<div class="">
|
||||
<article class="mb-10 bg-black">
|
||||
<div class="content">
|
||||
<h3 class="mb-2 font-display font-extralight">Nathan Sobo</h3>
|
||||
<div class="">
|
||||
<p class="mt-3 mb-3 leading-relaxed">Nathan joined GitHub in late 2011 to build the <a href="https://atom.io" class="underline hover:no-underline">Atom text editor</a>, and he led the Atom team until 2018.</p>
|
||||
|
||||
<p class="mt-3 mb-3 leading-relaxed">He also co-led development of <a href="https://teletype.atom.io" class="underline hover:no-underline">Teletype for Atom</a>, pioneering one of the first production uses of conflict-free replicated data types for collaborative text editing.</p>
|
||||
|
||||
<p class="mt-3 mb-3 leading-relaxed">He's been dreaming about building the world’s best text editor since he graduated from college, and is excited to finally have the knowledge, tools, and resources to achieve this vision.</p>
|
||||
|
||||
<div class="flex flex-row mt-6 mb-3">
|
||||
<a class="block mr-4 opacity-60 hover:opacity-100" href="https://github.com/nathansobo">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.68952 15.7016C6.68952 15.7823 6.59677 15.8468 6.47984 15.8468C6.34677 15.8589 6.25403 15.7944 6.25403 15.7016C6.25403 15.621 6.34677 15.5565 6.46371 15.5565C6.58468 15.5444 6.68952 15.6089 6.68952 15.7016ZM5.43548 15.5202C5.40726 15.6008 5.4879 15.6935 5.60887 15.7177C5.71371 15.7581 5.83468 15.7177 5.85887 15.6371C5.88306 15.5565 5.80645 15.4637 5.68548 15.4274C5.58065 15.3992 5.46371 15.4395 5.43548 15.5202ZM7.21774 15.4516C7.10081 15.4798 7.02016 15.5565 7.03226 15.6492C7.04435 15.7298 7.14919 15.7823 7.27016 15.754C7.3871 15.7258 7.46774 15.6492 7.45564 15.5685C7.44355 15.4919 7.33468 15.4395 7.21774 15.4516ZM9.87097 0C4.27823 0 0 4.24597 0 9.83871C0 14.3105 2.81452 18.1371 6.83468 19.4839C7.35081 19.5766 7.53226 19.2581 7.53226 18.996C7.53226 18.746 7.52016 17.3669 7.52016 16.5202C7.52016 16.5202 4.69758 17.125 4.10484 15.3185C4.10484 15.3185 3.64516 14.1452 2.98387 13.8427C2.98387 13.8427 2.06048 13.2097 3.04839 13.2218C3.04839 13.2218 4.05242 13.3024 4.60484 14.2621C5.4879 15.8185 6.96774 15.371 7.54435 15.1048C7.6371 14.4597 7.89919 14.0121 8.18952 13.746C5.93548 13.496 3.66129 13.1694 3.66129 9.29032C3.66129 8.18145 3.96774 7.625 4.6129 6.91532C4.50806 6.65323 4.16532 5.57258 4.71774 4.17742C5.56048 3.91532 7.5 5.26613 7.5 5.26613C8.30645 5.04032 9.17339 4.92339 10.0323 4.92339C10.8911 4.92339 11.7581 5.04032 12.5645 5.26613C12.5645 5.26613 14.504 3.91129 15.3468 4.17742C15.8992 5.57661 15.5565 6.65323 15.4516 6.91532C16.0968 7.62903 16.4919 8.18548 16.4919 9.29032C16.4919 13.1815 14.1169 13.4919 11.8629 13.746C12.2339 14.0645 12.5484 14.6694 12.5484 15.6169C12.5484 16.9758 12.5363 18.6573 12.5363 18.9879C12.5363 19.25 12.7218 19.5685 13.2339 19.4758C17.2661 18.1371 20 14.3105 20 9.83871C20 4.24597 15.4637 0 9.87097 0ZM3.91935 13.9073C3.86694 13.9476 3.87903 14.0403 3.94758 14.1169C4.0121 14.1815 4.10484 14.2097 4.15726 14.1573C4.20968 14.1169 4.19758 14.0242 4.12903 13.9476C4.06452 13.8831 3.97177 13.8548 3.91935 13.9073ZM3.48387 13.5806C3.45565 13.6331 3.49597 13.6976 3.57661 13.7379C3.64113 13.7782 3.72177 13.7661 3.75 13.7097C3.77823 13.6573 3.7379 13.5927 3.65726 13.5524C3.57661 13.5282 3.5121 13.5403 3.48387 13.5806ZM4.79032 15.0161C4.72581 15.0685 4.75 15.1895 4.84274 15.2661C4.93548 15.3589 5.05242 15.371 5.10484 15.3065C5.15726 15.254 5.13306 15.1331 5.05242 15.0565C4.96371 14.9637 4.84274 14.9516 4.79032 15.0161ZM4.33065 14.4234C4.26613 14.4637 4.26613 14.5685 4.33065 14.6613C4.39516 14.754 4.50403 14.7944 4.55645 14.754C4.62097 14.7016 4.62097 14.5968 4.55645 14.504C4.5 14.4113 4.39516 14.371 4.33065 14.4234Z" fill="white"/>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="block opacity-60 hover:opacity-100" href="https://twitter.com/nathansobo">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17.9442 5.92005C17.9569 6.0977 17.9569 6.2754 17.9569 6.45305C17.9569 11.8718 13.8326 18.1155 6.29444 18.1155C3.97209 18.1155 1.81473 17.4429 0 16.2754C0.329962 16.3135 0.64719 16.3262 0.989848 16.3262C2.90607 16.3262 4.67006 15.679 6.0787 14.5749C4.27666 14.5368 2.7665 13.3566 2.24618 11.7323C2.50001 11.7703 2.7538 11.7957 3.02032 11.7957C3.38833 11.7957 3.75638 11.7449 4.099 11.6561C2.22083 11.2754 0.812152 9.62565 0.812152 7.63326V7.58251C1.35782 7.88708 1.99239 8.07744 2.66493 8.10279C1.56087 7.36673 0.837542 6.1104 0.837542 4.68906C0.837542 3.92765 1.04055 3.22968 1.3959 2.62054C3.41369 5.10785 6.44671 6.7322 9.84769 6.90989C9.78426 6.60532 9.74617 6.28809 9.74617 5.97083C9.74617 3.71191 11.5736 1.87183 13.8452 1.87183C15.0254 1.87183 16.0914 2.36675 16.8401 3.16625C17.7665 2.98859 18.6548 2.64593 19.4416 2.1764C19.137 3.1282 18.4898 3.92769 17.6396 4.43527C18.4645 4.34648 19.264 4.11801 20 3.80078C19.4417 4.61293 18.7437 5.33625 17.9442 5.92005Z" fill="white"/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="mt-5 mb-3 leading-relaxed cursor-default">———</p>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<article class="mb-10 bg-black">
|
||||
<div class="content">
|
||||
<h3 class="mb-2 font-display font-extralight">Antonio Scandurra</h3>
|
||||
<div class="">
|
||||
<p class="mt-3 mb-3 leading-relaxed">Antonio joined the Atom team in 2014 while still in university after his outstanding open source contributions caught the attention of the team.</p>
|
||||
|
||||
<p class="mt-3 mb-3 leading-relaxed">He later joined Nathan in architecting <a href="https://teletype.atom.io" class="underline hover:no-underline">Teletype for Atom</a> and researching the foundations of what has turned into Zed.</p>
|
||||
|
||||
<p class="mt-3 mb-3 leading-relaxed">For the last two years, he’s become an expert in distributed systems and conflict-free replicated data types through the development of a real-time, distributed, conflict-free database implemented in Rust for <a href="https://ditto.live" class="underline hover:no-underline">Ditto</a>.</p>
|
||||
|
||||
<div class="flex flex-row mt-6 mb-3">
|
||||
<a class="block mr-4 opacity-60 hover:opacity-100" href="https://github.com/as-cii">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.68952 15.7016C6.68952 15.7823 6.59677 15.8468 6.47984 15.8468C6.34677 15.8589 6.25403 15.7944 6.25403 15.7016C6.25403 15.621 6.34677 15.5565 6.46371 15.5565C6.58468 15.5444 6.68952 15.6089 6.68952 15.7016ZM5.43548 15.5202C5.40726 15.6008 5.4879 15.6935 5.60887 15.7177C5.71371 15.7581 5.83468 15.7177 5.85887 15.6371C5.88306 15.5565 5.80645 15.4637 5.68548 15.4274C5.58065 15.3992 5.46371 15.4395 5.43548 15.5202ZM7.21774 15.4516C7.10081 15.4798 7.02016 15.5565 7.03226 15.6492C7.04435 15.7298 7.14919 15.7823 7.27016 15.754C7.3871 15.7258 7.46774 15.6492 7.45564 15.5685C7.44355 15.4919 7.33468 15.4395 7.21774 15.4516ZM9.87097 0C4.27823 0 0 4.24597 0 9.83871C0 14.3105 2.81452 18.1371 6.83468 19.4839C7.35081 19.5766 7.53226 19.2581 7.53226 18.996C7.53226 18.746 7.52016 17.3669 7.52016 16.5202C7.52016 16.5202 4.69758 17.125 4.10484 15.3185C4.10484 15.3185 3.64516 14.1452 2.98387 13.8427C2.98387 13.8427 2.06048 13.2097 3.04839 13.2218C3.04839 13.2218 4.05242 13.3024 4.60484 14.2621C5.4879 15.8185 6.96774 15.371 7.54435 15.1048C7.6371 14.4597 7.89919 14.0121 8.18952 13.746C5.93548 13.496 3.66129 13.1694 3.66129 9.29032C3.66129 8.18145 3.96774 7.625 4.6129 6.91532C4.50806 6.65323 4.16532 5.57258 4.71774 4.17742C5.56048 3.91532 7.5 5.26613 7.5 5.26613C8.30645 5.04032 9.17339 4.92339 10.0323 4.92339C10.8911 4.92339 11.7581 5.04032 12.5645 5.26613C12.5645 5.26613 14.504 3.91129 15.3468 4.17742C15.8992 5.57661 15.5565 6.65323 15.4516 6.91532C16.0968 7.62903 16.4919 8.18548 16.4919 9.29032C16.4919 13.1815 14.1169 13.4919 11.8629 13.746C12.2339 14.0645 12.5484 14.6694 12.5484 15.6169C12.5484 16.9758 12.5363 18.6573 12.5363 18.9879C12.5363 19.25 12.7218 19.5685 13.2339 19.4758C17.2661 18.1371 20 14.3105 20 9.83871C20 4.24597 15.4637 0 9.87097 0ZM3.91935 13.9073C3.86694 13.9476 3.87903 14.0403 3.94758 14.1169C4.0121 14.1815 4.10484 14.2097 4.15726 14.1573C4.20968 14.1169 4.19758 14.0242 4.12903 13.9476C4.06452 13.8831 3.97177 13.8548 3.91935 13.9073ZM3.48387 13.5806C3.45565 13.6331 3.49597 13.6976 3.57661 13.7379C3.64113 13.7782 3.72177 13.7661 3.75 13.7097C3.77823 13.6573 3.7379 13.5927 3.65726 13.5524C3.57661 13.5282 3.5121 13.5403 3.48387 13.5806ZM4.79032 15.0161C4.72581 15.0685 4.75 15.1895 4.84274 15.2661C4.93548 15.3589 5.05242 15.371 5.10484 15.3065C5.15726 15.254 5.13306 15.1331 5.05242 15.0565C4.96371 14.9637 4.84274 14.9516 4.79032 15.0161ZM4.33065 14.4234C4.26613 14.4637 4.26613 14.5685 4.33065 14.6613C4.39516 14.754 4.50403 14.7944 4.55645 14.754C4.62097 14.7016 4.62097 14.5968 4.55645 14.504C4.5 14.4113 4.39516 14.371 4.33065 14.4234Z" fill="white"/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="mt-5 mb-3 leading-relaxed cursor-default">———</p>
|
||||
</article>
|
||||
|
||||
<article class="mb-10 bg-black">
|
||||
<div class="content">
|
||||
<h3 class="mb-2 font-display font-extralight">Max Brunsfeld</h3>
|
||||
<div class="">
|
||||
<p class="mt-3 mb-3 leading-relaxed">Max joined the Atom team in 2013 after working at Pivotal Labs.</p>
|
||||
|
||||
<p class="mt-3 mb-3 leading-relaxed">While driving Atom towards its 1.0 launch during the day, Max spent nights and weekends building <a href="https://tree-sitter.github.io" class="underline hover:no-underline">Tree-sitter</a>, a blazing-fast and expressive incremental parsing framework that currently powers all code analysis at GitHub.</p>
|
||||
|
||||
<p class="mt-3 mb-3 leading-relaxed">Before leaving to start Zed, Max helped GitHub's semantic analysis team integrate Tree-sitter to support syntax highlighting and code navigation on <a href="https://github.com" class="underline hover:no-underline">github.com</a>.</p>
|
||||
|
||||
<div class="flex flex-row mt-6 mb-3">
|
||||
<a class="block mr-4 opacity-60 hover:opacity-100" href="https://github.com/maxbrunsfeld">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.68952 15.7016C6.68952 15.7823 6.59677 15.8468 6.47984 15.8468C6.34677 15.8589 6.25403 15.7944 6.25403 15.7016C6.25403 15.621 6.34677 15.5565 6.46371 15.5565C6.58468 15.5444 6.68952 15.6089 6.68952 15.7016ZM5.43548 15.5202C5.40726 15.6008 5.4879 15.6935 5.60887 15.7177C5.71371 15.7581 5.83468 15.7177 5.85887 15.6371C5.88306 15.5565 5.80645 15.4637 5.68548 15.4274C5.58065 15.3992 5.46371 15.4395 5.43548 15.5202ZM7.21774 15.4516C7.10081 15.4798 7.02016 15.5565 7.03226 15.6492C7.04435 15.7298 7.14919 15.7823 7.27016 15.754C7.3871 15.7258 7.46774 15.6492 7.45564 15.5685C7.44355 15.4919 7.33468 15.4395 7.21774 15.4516ZM9.87097 0C4.27823 0 0 4.24597 0 9.83871C0 14.3105 2.81452 18.1371 6.83468 19.4839C7.35081 19.5766 7.53226 19.2581 7.53226 18.996C7.53226 18.746 7.52016 17.3669 7.52016 16.5202C7.52016 16.5202 4.69758 17.125 4.10484 15.3185C4.10484 15.3185 3.64516 14.1452 2.98387 13.8427C2.98387 13.8427 2.06048 13.2097 3.04839 13.2218C3.04839 13.2218 4.05242 13.3024 4.60484 14.2621C5.4879 15.8185 6.96774 15.371 7.54435 15.1048C7.6371 14.4597 7.89919 14.0121 8.18952 13.746C5.93548 13.496 3.66129 13.1694 3.66129 9.29032C3.66129 8.18145 3.96774 7.625 4.6129 6.91532C4.50806 6.65323 4.16532 5.57258 4.71774 4.17742C5.56048 3.91532 7.5 5.26613 7.5 5.26613C8.30645 5.04032 9.17339 4.92339 10.0323 4.92339C10.8911 4.92339 11.7581 5.04032 12.5645 5.26613C12.5645 5.26613 14.504 3.91129 15.3468 4.17742C15.8992 5.57661 15.5565 6.65323 15.4516 6.91532C16.0968 7.62903 16.4919 8.18548 16.4919 9.29032C16.4919 13.1815 14.1169 13.4919 11.8629 13.746C12.2339 14.0645 12.5484 14.6694 12.5484 15.6169C12.5484 16.9758 12.5363 18.6573 12.5363 18.9879C12.5363 19.25 12.7218 19.5685 13.2339 19.4758C17.2661 18.1371 20 14.3105 20 9.83871C20 4.24597 15.4637 0 9.87097 0ZM3.91935 13.9073C3.86694 13.9476 3.87903 14.0403 3.94758 14.1169C4.0121 14.1815 4.10484 14.2097 4.15726 14.1573C4.20968 14.1169 4.19758 14.0242 4.12903 13.9476C4.06452 13.8831 3.97177 13.8548 3.91935 13.9073ZM3.48387 13.5806C3.45565 13.6331 3.49597 13.6976 3.57661 13.7379C3.64113 13.7782 3.72177 13.7661 3.75 13.7097C3.77823 13.6573 3.7379 13.5927 3.65726 13.5524C3.57661 13.5282 3.5121 13.5403 3.48387 13.5806ZM4.79032 15.0161C4.72581 15.0685 4.75 15.1895 4.84274 15.2661C4.93548 15.3589 5.05242 15.371 5.10484 15.3065C5.15726 15.254 5.13306 15.1331 5.05242 15.0565C4.96371 14.9637 4.84274 14.9516 4.79032 15.0161ZM4.33065 14.4234C4.26613 14.4637 4.26613 14.5685 4.33065 14.6613C4.39516 14.754 4.50403 14.7944 4.55645 14.754C4.62097 14.7016 4.62097 14.5968 4.55645 14.504C4.5 14.4113 4.39516 14.371 4.33065 14.4234Z" fill="white"/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="mt-5 mb-3 leading-relaxed cursor-default">———</p>
|
||||
</article>
|
||||
|
||||
<article class="mb-10 bg-black">
|
||||
<div class="content">
|
||||
<h3 class="mb-2 font-display font-extralight">Nate Butler</h3>
|
||||
<div class="">
|
||||
<p class="mt-3 mb-3 leading-relaxed">Nate joined the <a class="underline hover:no-underline" href="https://design.facebook.com/">Facebook</a> team in 2015 as a product designer on News Feed, after spending the previous few years working on sites like Format.com and Lookbook.com.</p>
|
||||
|
||||
<p class="mt-3 mb-3 leading-relaxed">He spent three years shipping creative tools and projects like Facebook Avatars. He later moved on to working on dev tools and design systems, focused on developer efficiency.</p>
|
||||
|
||||
<p class="mt-3 mb-3 leading-relaxed">Before leaving to join Zed, Nate spent his last year at Facebook developing a future vision for Stories.</p>
|
||||
|
||||
<div class="flex flex-row mt-6 mb-3">
|
||||
<a class="block mr-4 opacity-60 hover:opacity-100" href="https://github.com/iamnbutler">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6.68952 15.7016C6.68952 15.7823 6.59677 15.8468 6.47984 15.8468C6.34677 15.8589 6.25403 15.7944 6.25403 15.7016C6.25403 15.621 6.34677 15.5565 6.46371 15.5565C6.58468 15.5444 6.68952 15.6089 6.68952 15.7016ZM5.43548 15.5202C5.40726 15.6008 5.4879 15.6935 5.60887 15.7177C5.71371 15.7581 5.83468 15.7177 5.85887 15.6371C5.88306 15.5565 5.80645 15.4637 5.68548 15.4274C5.58065 15.3992 5.46371 15.4395 5.43548 15.5202ZM7.21774 15.4516C7.10081 15.4798 7.02016 15.5565 7.03226 15.6492C7.04435 15.7298 7.14919 15.7823 7.27016 15.754C7.3871 15.7258 7.46774 15.6492 7.45564 15.5685C7.44355 15.4919 7.33468 15.4395 7.21774 15.4516ZM9.87097 0C4.27823 0 0 4.24597 0 9.83871C0 14.3105 2.81452 18.1371 6.83468 19.4839C7.35081 19.5766 7.53226 19.2581 7.53226 18.996C7.53226 18.746 7.52016 17.3669 7.52016 16.5202C7.52016 16.5202 4.69758 17.125 4.10484 15.3185C4.10484 15.3185 3.64516 14.1452 2.98387 13.8427C2.98387 13.8427 2.06048 13.2097 3.04839 13.2218C3.04839 13.2218 4.05242 13.3024 4.60484 14.2621C5.4879 15.8185 6.96774 15.371 7.54435 15.1048C7.6371 14.4597 7.89919 14.0121 8.18952 13.746C5.93548 13.496 3.66129 13.1694 3.66129 9.29032C3.66129 8.18145 3.96774 7.625 4.6129 6.91532C4.50806 6.65323 4.16532 5.57258 4.71774 4.17742C5.56048 3.91532 7.5 5.26613 7.5 5.26613C8.30645 5.04032 9.17339 4.92339 10.0323 4.92339C10.8911 4.92339 11.7581 5.04032 12.5645 5.26613C12.5645 5.26613 14.504 3.91129 15.3468 4.17742C15.8992 5.57661 15.5565 6.65323 15.4516 6.91532C16.0968 7.62903 16.4919 8.18548 16.4919 9.29032C16.4919 13.1815 14.1169 13.4919 11.8629 13.746C12.2339 14.0645 12.5484 14.6694 12.5484 15.6169C12.5484 16.9758 12.5363 18.6573 12.5363 18.9879C12.5363 19.25 12.7218 19.5685 13.2339 19.4758C17.2661 18.1371 20 14.3105 20 9.83871C20 4.24597 15.4637 0 9.87097 0ZM3.91935 13.9073C3.86694 13.9476 3.87903 14.0403 3.94758 14.1169C4.0121 14.1815 4.10484 14.2097 4.15726 14.1573C4.20968 14.1169 4.19758 14.0242 4.12903 13.9476C4.06452 13.8831 3.97177 13.8548 3.91935 13.9073ZM3.48387 13.5806C3.45565 13.6331 3.49597 13.6976 3.57661 13.7379C3.64113 13.7782 3.72177 13.7661 3.75 13.7097C3.77823 13.6573 3.7379 13.5927 3.65726 13.5524C3.57661 13.5282 3.5121 13.5403 3.48387 13.5806ZM4.79032 15.0161C4.72581 15.0685 4.75 15.1895 4.84274 15.2661C4.93548 15.3589 5.05242 15.371 5.10484 15.3065C5.15726 15.254 5.13306 15.1331 5.05242 15.0565C4.96371 14.9637 4.84274 14.9516 4.79032 15.0161ZM4.33065 14.4234C4.26613 14.4637 4.26613 14.5685 4.33065 14.6613C4.39516 14.754 4.50403 14.7944 4.55645 14.754C4.62097 14.7016 4.62097 14.5968 4.55645 14.504C4.5 14.4113 4.39516 14.371 4.33065 14.4234Z" fill="white"/>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="block mr-4 opacity-60 hover:opacity-100" href="https://twitter.com/iamnbutler">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M17.9442 5.92005C17.9569 6.0977 17.9569 6.2754 17.9569 6.45305C17.9569 11.8718 13.8326 18.1155 6.29444 18.1155C3.97209 18.1155 1.81473 17.4429 0 16.2754C0.329962 16.3135 0.64719 16.3262 0.989848 16.3262C2.90607 16.3262 4.67006 15.679 6.0787 14.5749C4.27666 14.5368 2.7665 13.3566 2.24618 11.7323C2.50001 11.7703 2.7538 11.7957 3.02032 11.7957C3.38833 11.7957 3.75638 11.7449 4.099 11.6561C2.22083 11.2754 0.812152 9.62565 0.812152 7.63326V7.58251C1.35782 7.88708 1.99239 8.07744 2.66493 8.10279C1.56087 7.36673 0.837542 6.1104 0.837542 4.68906C0.837542 3.92765 1.04055 3.22968 1.3959 2.62054C3.41369 5.10785 6.44671 6.7322 9.84769 6.90989C9.78426 6.60532 9.74617 6.28809 9.74617 5.97083C9.74617 3.71191 11.5736 1.87183 13.8452 1.87183C15.0254 1.87183 16.0914 2.36675 16.8401 3.16625C17.7665 2.98859 18.6548 2.64593 19.4416 2.1764C19.137 3.1282 18.4898 3.92769 17.6396 4.43527C18.4645 4.34648 19.264 4.11801 20 3.80078C19.4417 4.61293 18.7437 5.33625 17.9442 5.92005Z" fill="white"/>
|
||||
</svg>
|
||||
</a>
|
||||
<a class="block opacity-60 hover:opacity-100" href="https://dribbble.com/iamnbutler">
|
||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10 0.3125C4.65828 0.3125 0.3125 4.65828 0.3125 10C0.3125 15.3417 4.65828 19.6875 10 19.6875C15.3417 19.6875 19.6875 15.3417 19.6875 10C19.6875 4.65828 15.3417 0.3125 10 0.3125ZM16.4051 4.77992C17.5575 6.18797 18.2554 7.98137 18.2736 9.93441C18.0008 9.87672 15.2651 9.32184 12.5118 9.66809C12.2871 9.11961 12.0751 8.63711 11.7846 8.04254C14.844 6.79344 16.2306 5.0159 16.4051 4.77992V4.77992ZM15.4852 3.82305C15.3364 4.03504 14.0908 5.70922 11.1484 6.81207C9.7925 4.32082 8.28965 2.27426 8.06094 1.96801C10.685 1.33547 13.4502 2.01762 15.4852 3.82305V3.82305ZM6.48207 2.52422C6.70023 2.8234 8.17887 4.8725 9.54992 7.30973C5.67934 8.33758 2.27023 8.32277 1.90016 8.31789C2.43672 5.7502 4.16711 3.61613 6.48207 2.52422ZM1.72539 10.0126C1.72539 9.92801 1.72707 9.84379 1.72961 9.75977C2.09164 9.76719 6.10148 9.81887 10.2338 8.58219C10.4706 9.04578 10.6969 9.51637 10.9046 9.98645C7.91246 10.8292 5.19391 13.2492 3.85262 15.5453C2.53102 14.0783 1.72539 12.1379 1.72539 10.0126ZM4.92098 16.5405C5.78531 14.7736 8.13105 12.4927 11.467 11.3547C12.6287 14.3736 13.1092 16.9036 13.2322 17.6296C10.5716 18.7629 7.37227 18.452 4.92098 16.5405V16.5405ZM14.6233 16.8721C14.5385 16.3687 14.0981 13.9464 13.0158 10.9723C15.6088 10.5573 17.8869 11.2367 18.17 11.3261C17.8012 13.6284 16.4796 15.6168 14.6233 16.8721Z" fill="white"/>
|
||||
</svg>
|
||||
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="mt-5 mb-3 leading-relaxed cursor-default">———</p>
|
||||
</article>
|
||||
|
||||
<article class="mb-10 bg-black">
|
||||
<div class="content">
|
||||
<h3 class="mb-2 font-display font-extralight">Want to join us?</h3>
|
||||
<div class="">
|
||||
<p class="mt-3 mb-3 leading-relaxed">We hope to bring a few more staff-level engineers in the near future. Come join us in building the next generation of software.</p>
|
||||
|
||||
<p class="mt-3 mb-3 leading-relaxed"><a class="underline hover:no-underline" href="mailto:nathan@zed.dev">Drop us a line</a>.</p>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
|
||||
<div class="mt-10 cursor-pointer opacity-30 hover:opacity-100">
|
||||
<a href="mailto:hi@zed.dev">
|
||||
<svg width="180" height="45" viewBox="0 0 180 45" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M26.1837 12.7355L31.4584 6.93335H0.99707V33.043M26.1837 12.7355H6.79922V27.2409M26.1837 12.7355L20.909 18.5377M20.909 18.5377H12.6014V22.2335M20.909 18.5377L12.997 27.2409M12.997 27.2409H21.3046V23.545M12.997 27.2409L7.72229 33.043M7.72229 33.043L2.44761 38.8452H32.9089V12.7355M7.72229 33.043H27.1068V18.5377" stroke="white" stroke-width="1.99449" stroke-linejoin="bevel"/>
|
||||
<path d="M50.931 18.0863V16.8687L57.2102 8.72726C57.4649 8.40892 57.7116 8.09854 57.9503 7.79612C58.205 7.4937 58.396 7.3027 58.5233 7.22312L54.4645 7.29474C53.9393 7.29474 53.5254 7.44595 53.223 7.74837C52.9365 8.03487 52.7216 8.42484 52.5784 8.91826C52.4351 9.39576 52.3237 9.93694 52.2441 10.5418H51.2414L51.5518 6.14873H61.0063V7.15149L54.751 15.4839C54.5441 15.7545 54.3452 15.9933 54.1542 16.2002C53.9791 16.4071 53.7562 16.622 53.4857 16.8448L57.6638 16.9403C58.2846 16.9403 58.77 16.7971 59.1202 16.5106C59.4704 16.2082 59.733 15.8102 59.9081 15.3168C60.0991 14.8075 60.2423 14.2424 60.3378 13.6217H61.2929L60.9825 18.0863H50.931Z" fill="white"/>
|
||||
<path d="M68.5203 18.4684C67.4062 18.4684 66.4034 18.2137 65.5121 17.7043C64.6366 17.1791 63.9442 16.4469 63.4349 15.5078C62.9256 14.5528 62.6709 13.4307 62.6709 12.1414C62.6709 11.0272 62.9176 9.98469 63.411 9.01376C63.9204 8.04283 64.6287 7.26291 65.5359 6.67399C66.4432 6.06915 67.4937 5.76673 68.6875 5.76673C69.356 5.76673 69.9847 5.87019 70.5736 6.07711C71.1784 6.28402 71.7117 6.61032 72.1732 7.05599C72.6507 7.48574 73.0248 8.05079 73.2954 8.75113C73.566 9.43556 73.7013 10.2712 73.7013 11.258L65.4882 11.4013C65.4882 12.4836 65.6076 13.4466 65.8463 14.2902C66.101 15.1338 66.5069 15.7864 67.0639 16.248C67.621 16.7095 68.3452 16.9403 69.2366 16.9403C69.6663 16.9403 70.12 16.8687 70.5975 16.7255C71.0909 16.5663 71.5525 16.3435 71.9822 16.057C72.4279 15.7705 72.802 15.4282 73.1044 15.0303L73.8445 15.675C73.367 16.3912 72.8179 16.9563 72.1971 17.3701C71.5764 17.768 70.9397 18.0466 70.2871 18.2057C69.6504 18.3808 69.0615 18.4684 68.5203 18.4684ZM65.5837 10.1598H71.0989C71.0989 9.55493 71.0113 9.01376 70.8362 8.53626C70.6771 8.04283 70.4224 7.65287 70.0722 7.36637C69.7221 7.07987 69.2764 6.93662 68.7352 6.93662C67.8916 6.93662 67.1992 7.2072 66.6581 7.74837C66.1169 8.27363 65.7588 9.07743 65.5837 10.1598Z" fill="white"/>
|
||||
<path d="M80.4106 18.4684C79.4396 18.4684 78.5722 18.2296 77.8082 17.7521C77.0601 17.2587 76.4632 16.5583 76.0175 15.6511C75.5878 14.7438 75.3729 13.6774 75.3729 12.4518C75.3729 11.1466 75.6276 9.99264 76.1369 8.98988C76.6462 7.98712 77.3625 7.19924 78.2857 6.62624C79.2088 6.05323 80.2594 5.76673 81.4372 5.76673C81.9306 5.76673 82.4002 5.8304 82.8458 5.95773C83.3074 6.06915 83.6894 6.20444 83.9919 6.36361V3.64183C83.9919 3.40308 83.9998 3.14045 84.0157 2.85395C84.0316 2.55153 84.0555 2.24115 84.0874 1.92282C83.8009 1.93873 83.5064 1.95465 83.204 1.97057C82.9016 1.98648 82.631 1.99444 82.3922 1.99444V0.729053C83.1085 0.729053 83.6735 0.69722 84.0874 0.633554C84.5171 0.553969 84.8434 0.466426 85.0662 0.370925C85.305 0.275425 85.4801 0.171965 85.5915 0.0605469H86.4749V15.1258C86.4749 15.3646 86.4669 15.6352 86.451 15.9376C86.4351 16.24 86.4112 16.5583 86.3794 16.8926C86.6659 16.8767 86.9524 16.8608 87.2389 16.8448C87.5254 16.8289 87.788 16.821 88.0268 16.821V18.0863H84.2306C84.1988 17.8635 84.1669 17.6566 84.1351 17.4656C84.1192 17.2746 84.1033 17.0836 84.0874 16.8926C83.6099 17.4019 83.0607 17.7919 82.44 18.0625C81.8192 18.3331 81.1427 18.4684 80.4106 18.4684ZM81.3895 16.9642C81.8829 16.9642 82.3604 16.8289 82.822 16.5583C83.2995 16.2877 83.6894 15.9455 83.9919 15.5317C83.9919 15.3248 83.9919 15.1099 83.9919 14.8871C83.9919 14.6642 83.9919 14.4255 83.9919 14.1708V7.67675C83.6894 7.45391 83.3313 7.28678 82.9175 7.17537C82.5195 7.04803 82.1057 6.98436 81.676 6.98436C80.896 6.98436 80.2355 7.21516 79.6943 7.67675C79.1691 8.12242 78.7791 8.73522 78.5244 9.51514C78.2698 10.2951 78.1504 11.1864 78.1663 12.1892C78.1981 13.0487 78.3334 13.8445 78.5722 14.5767C78.8109 15.3089 79.1611 15.8898 79.6227 16.3196C80.1002 16.7493 80.6891 16.9642 81.3895 16.9642Z" fill="white"/>
|
||||
<path d="M51.0504 38.4576C51.5279 38.4576 51.8621 38.3462 52.0531 38.1234C52.2441 37.9005 52.3556 37.5901 52.3874 37.1922C52.4351 36.7943 52.459 36.3327 52.459 35.8075V30.8653C52.459 30.5947 52.467 30.3241 52.4829 30.0535C52.4988 29.767 52.5227 29.4646 52.5545 29.1463C52.2839 29.1622 51.9974 29.1781 51.695 29.194C51.3926 29.194 51.114 29.202 50.8594 29.2179V27.9525C51.5756 27.9525 52.1407 27.9207 52.5545 27.857C52.9843 27.7774 53.3106 27.6899 53.5334 27.5944C53.7722 27.4989 53.9472 27.3954 54.0587 27.284H54.9659V36.4998C54.9659 36.7863 54.958 37.0808 54.942 37.3832C54.9261 37.6697 54.9022 37.9642 54.8704 38.2666C55.1251 38.2507 55.3798 38.2427 55.6344 38.2427C55.905 38.2268 56.1517 38.2109 56.3746 38.195V39.4604H51.0504V38.4576ZM53.605 25.0875C53.1912 25.0875 52.841 24.9363 52.5545 24.6338C52.268 24.3155 52.1248 23.9335 52.1248 23.4878C52.1248 23.0422 52.276 22.6681 52.5784 22.3657C52.8808 22.0474 53.223 21.8882 53.605 21.8882C54.0189 21.8882 54.3611 22.0474 54.6317 22.3657C54.9182 22.6681 55.0614 23.0422 55.0614 23.4878C55.0614 23.9335 54.9182 24.3155 54.6317 24.6338C54.3611 24.9363 54.0189 25.0875 53.605 25.0875Z" fill="white"/>
|
||||
<path d="M58.115 39.4604V38.4576C58.5925 38.4576 58.9268 38.3462 59.1178 38.1234C59.3088 37.9005 59.4202 37.5901 59.452 37.1922C59.4998 36.7943 59.5237 36.3327 59.5237 35.8075L59.5475 30.8414C59.5475 30.5867 59.5475 30.3162 59.5475 30.0296C59.5635 29.7272 59.5953 29.4328 59.643 29.1463C59.3565 29.1622 59.0621 29.1781 58.7597 29.194C58.4731 29.194 58.2026 29.202 57.9479 29.2179V27.9525C58.6642 27.9525 59.2212 27.9207 59.6192 27.857C60.033 27.7774 60.3434 27.6899 60.5503 27.5944C60.7731 27.4989 60.9403 27.3954 61.0517 27.284H61.9112C61.9271 27.4272 61.9351 27.5625 61.9351 27.6899C61.951 27.8172 61.9589 27.9525 61.9589 28.0958C61.9749 28.239 61.9908 28.4221 62.0067 28.6449C62.3569 28.3584 62.7389 28.1037 63.1527 27.8809C63.5665 27.658 63.9963 27.483 64.442 27.3556C64.9035 27.2124 65.3413 27.1407 65.7551 27.1407C67.1717 27.1407 68.1904 27.5705 68.8111 28.43C69.4478 29.2895 69.7661 30.6345 69.7661 32.4649V36.4998C69.7661 36.7863 69.7582 37.0808 69.7423 37.3832C69.7263 37.6697 69.7025 37.9642 69.6706 38.2666C69.9253 38.2507 70.18 38.2427 70.4346 38.2427C70.7052 38.2268 70.9519 38.2109 71.1748 38.195V39.4604H65.8506V38.4576C66.3281 38.4576 66.6624 38.3462 66.8534 38.1234C67.0444 37.9005 67.1558 37.5901 67.1876 37.1922C67.2354 36.7943 67.2592 36.3327 67.2592 35.8075V32.4649C67.2433 31.2075 67.0364 30.2604 66.6385 29.6238C66.2565 28.9871 65.6357 28.6767 64.7762 28.6926C64.2669 28.6926 63.7655 28.82 63.2721 29.0746C62.7786 29.3293 62.3648 29.6397 62.0306 30.0058C62.0306 30.1649 62.0306 30.34 62.0306 30.531C62.0306 30.7061 62.0306 30.8892 62.0306 31.0802V36.4998C62.0306 36.7863 62.0226 37.0808 62.0067 37.3832C61.9908 37.6697 61.9669 37.9642 61.9351 38.2666C62.1897 38.2507 62.4444 38.2427 62.6991 38.2427C62.9697 38.2268 63.2164 38.2109 63.4392 38.195V39.4604H58.115Z" fill="white"/>
|
||||
<path d="M76.8377 39.8424C75.8668 39.8424 74.9993 39.6036 74.2353 39.1261C73.4872 38.6327 72.8903 37.9324 72.4446 37.0251C72.0149 36.1178 71.8 35.0514 71.8 33.8258C71.8 32.5206 72.0547 31.3667 72.564 30.3639C73.0734 29.3611 73.7896 28.5733 74.7128 28.0003C75.636 27.4272 76.6865 27.1407 77.8643 27.1407C78.3577 27.1407 78.8273 27.2044 79.273 27.3317C79.7345 27.4432 80.1165 27.5785 80.419 27.7376V25.0159C80.419 24.7771 80.4269 24.5145 80.4428 24.228C80.4588 23.9255 80.4826 23.6152 80.5145 23.2968C80.228 23.3127 79.9335 23.3287 79.6311 23.3446C79.3287 23.3605 79.0581 23.3685 78.8193 23.3685V22.1031C79.5356 22.1031 80.1006 22.0712 80.5145 22.0076C80.9442 21.928 81.2705 21.8404 81.4934 21.7449C81.7321 21.6494 81.9072 21.546 82.0186 21.4346H82.902V36.4998C82.902 36.7386 82.894 37.0092 82.8781 37.3116C82.8622 37.614 82.8383 37.9324 82.8065 38.2666C83.093 38.2507 83.3795 38.2348 83.666 38.2189C83.9525 38.2029 84.2151 38.195 84.4539 38.195V39.4604H80.6577C80.6259 39.2375 80.5941 39.0306 80.5622 38.8396C80.5463 38.6486 80.5304 38.4576 80.5145 38.2666C80.037 38.7759 79.4878 39.1659 78.8671 39.4365C78.2463 39.7071 77.5699 39.8424 76.8377 39.8424ZM77.8166 38.3382C78.31 38.3382 78.7875 38.2029 79.2491 37.9324C79.7266 37.6618 80.1165 37.3196 80.419 36.9057C80.419 36.6988 80.419 36.4839 80.419 36.2611C80.419 36.0382 80.419 35.7995 80.419 35.5448V29.0508C80.1165 28.8279 79.7584 28.6608 79.3446 28.5494C78.9467 28.4221 78.5328 28.3584 78.1031 28.3584C77.3231 28.3584 76.6626 28.5892 76.1214 29.0508C75.5962 29.4964 75.2062 30.1092 74.9515 30.8892C74.6969 31.6691 74.5775 32.5604 74.5934 33.5632C74.6252 34.4227 74.7605 35.2185 74.9993 35.9507C75.238 36.6829 75.5882 37.2638 76.0498 37.6936C76.5273 38.1234 77.1162 38.3382 77.8166 38.3382Z" fill="white"/>
|
||||
<path d="M90.2002 39.8424C89.3088 39.8424 88.5687 39.6752 87.9798 39.341C87.4068 39.0067 86.977 38.4576 86.6905 37.6936C86.404 36.9137 86.2608 35.887 86.2608 34.6137V30.8653C86.2608 30.5947 86.2608 30.3162 86.2608 30.0296C86.2767 29.7272 86.3085 29.4328 86.3563 29.1463C86.0857 29.1622 85.7992 29.1781 85.4967 29.194C85.1943 29.194 84.9237 29.202 84.685 29.2179V27.9525H85.258C86.0538 27.9525 86.6507 27.8809 87.0486 27.7376C87.4466 27.5944 87.7251 27.4432 87.8843 27.284H88.7915V34.5659C88.7915 35.8234 88.9666 36.7625 89.3168 37.3832C89.667 38.004 90.2559 38.3064 91.0835 38.2905C91.6247 38.2905 92.142 38.1313 92.6354 37.813C93.1448 37.4946 93.5586 37.1206 93.8769 36.6908V31.0324C93.8769 30.6822 93.8849 30.3559 93.9008 30.0535C93.9167 29.7352 93.9486 29.4328 93.9963 29.1463C93.7098 29.1622 93.4154 29.1781 93.1129 29.194C92.8105 29.194 92.532 29.202 92.2773 29.2179V27.9525H92.9697C93.67 27.9525 94.2192 27.8809 94.6171 27.7376C95.015 27.5944 95.3015 27.4432 95.4766 27.284H96.3839L96.36 36.0701C96.36 36.3248 96.352 36.6749 96.3361 37.1206C96.3202 37.5504 96.2963 37.9324 96.2645 38.2666C96.5351 38.2507 96.8136 38.2348 97.1001 38.2189C97.4025 38.2029 97.6811 38.195 97.9357 38.195V39.4604H94.1396C94.1077 39.2057 94.0759 38.9669 94.0441 38.7441C94.0282 38.5213 94.0043 38.3064 93.9724 38.0995C93.479 38.5611 92.906 38.9669 92.2534 39.3171C91.6008 39.6673 90.9164 39.8424 90.2002 39.8424Z" fill="white"/>
|
||||
<path d="M104.681 39.8424C103.933 39.8424 103.24 39.7389 102.604 39.532C101.967 39.341 101.458 39.1102 101.076 38.8396L101.147 39.6275H99.8819L99.7626 35.521H100.765C100.797 36.1099 100.98 36.6431 101.314 37.1206C101.649 37.5981 102.078 37.9721 102.604 38.2427C103.145 38.5133 103.726 38.6486 104.347 38.6486C104.713 38.6486 105.071 38.5929 105.421 38.4815C105.771 38.3541 106.066 38.1711 106.304 37.9324C106.543 37.6777 106.663 37.3673 106.663 37.0012C106.663 36.6033 106.535 36.277 106.281 36.0223C106.042 35.7517 105.708 35.513 105.278 35.3061C104.864 35.0992 104.386 34.8922 103.845 34.6853C103.368 34.4943 102.882 34.2954 102.389 34.0884C101.911 33.8815 101.466 33.6348 101.052 33.3483C100.638 33.0618 100.312 32.7116 100.073 32.2978C99.8342 31.868 99.7148 31.3428 99.7148 30.722C99.7148 30.3559 99.7864 29.966 99.9297 29.5521C100.073 29.1224 100.304 28.7324 100.622 28.3823C100.94 28.0162 101.37 27.7217 101.911 27.4989C102.453 27.2601 103.121 27.1407 103.917 27.1407C104.347 27.1407 104.824 27.2124 105.349 27.3556C105.891 27.4989 106.392 27.7456 106.854 28.0958L106.83 27.2601H108.095V31.4622H107.068C107.021 30.9051 106.869 30.3878 106.615 29.9103C106.376 29.4328 106.034 29.0428 105.588 28.7404C105.142 28.438 104.601 28.2868 103.965 28.2868C103.344 28.2868 102.835 28.4459 102.437 28.7643C102.055 29.0667 101.864 29.4487 101.864 29.9103C101.864 30.3719 102.007 30.7459 102.293 31.0324C102.596 31.3189 102.986 31.5656 103.463 31.7725C103.941 31.9795 104.458 32.1864 105.015 32.3933C105.684 32.6639 106.312 32.9583 106.901 33.2767C107.49 33.595 107.968 33.9929 108.334 34.4704C108.7 34.9479 108.883 35.5528 108.883 36.285C108.883 37.0808 108.676 37.7493 108.262 38.2905C107.864 38.8157 107.347 39.2057 106.71 39.4604C106.074 39.715 105.397 39.8424 104.681 39.8424Z" fill="white"/>
|
||||
<path d="M114.893 39.8424C114.495 39.8424 114.097 39.7867 113.699 39.6752C113.301 39.5797 112.927 39.3808 112.577 39.0784C112.243 38.76 111.98 38.3064 111.789 37.7175C111.598 37.1286 111.503 36.3486 111.503 35.3777L111.55 28.8598H109.784V27.5228C110.213 27.5068 110.651 27.3477 111.097 27.0452C111.542 26.7428 111.932 26.3369 112.267 25.8276C112.601 25.3183 112.832 24.7691 112.959 24.1802H114.081V27.5228H117.758V28.7643L114.081 28.812L114.033 35.1867C114.033 35.7915 114.081 36.3248 114.177 36.7863C114.288 37.232 114.463 37.5822 114.702 37.8369C114.957 38.0756 115.299 38.195 115.729 38.195C116.095 38.195 116.469 38.0836 116.851 37.8607C117.249 37.6379 117.623 37.2718 117.973 36.7625L118.785 37.4787C118.403 38.0358 118.021 38.4735 117.639 38.7919C117.257 39.1102 116.89 39.341 116.54 39.4842C116.19 39.6434 115.872 39.7389 115.585 39.7707C115.299 39.8185 115.068 39.8424 114.893 39.8424Z" fill="white"/>
|
||||
<path d="M119.799 38.4576C120.276 38.4576 120.611 38.3462 120.802 38.1234C120.993 37.9005 121.104 37.5901 121.136 37.1922C121.184 36.7943 121.208 36.3327 121.208 35.8075V30.8414C121.208 30.5867 121.208 30.3162 121.208 30.0296C121.223 29.7272 121.255 29.4328 121.303 29.1463C121.032 29.1622 120.746 29.1781 120.444 29.194C120.141 29.194 119.863 29.202 119.608 29.2179V27.9525H120.42C121.088 27.9525 121.598 27.8809 121.948 27.7376C122.298 27.5944 122.553 27.4432 122.712 27.284H123.571C123.603 27.5068 123.627 27.8172 123.643 28.2151C123.659 28.6131 123.675 29.0587 123.691 29.5521C123.993 29.1065 124.343 28.7086 124.741 28.3584C125.139 27.9923 125.569 27.6978 126.03 27.475C126.508 27.2522 127.001 27.1407 127.511 27.1407C128.004 27.1407 128.426 27.276 128.776 27.5466C129.142 27.8013 129.325 28.2231 129.325 28.812C129.325 28.9712 129.277 29.1542 129.182 29.3611C129.102 29.5681 128.959 29.7511 128.752 29.9103C128.561 30.0535 128.299 30.1251 127.964 30.1251C127.63 30.1092 127.336 29.9819 127.081 29.7431C126.842 29.5044 126.731 29.1781 126.747 28.7643C126.365 28.7643 125.983 28.8836 125.601 29.1224C125.219 29.3452 124.86 29.6476 124.526 30.0296C124.208 30.4117 123.937 30.8255 123.714 31.2712V36.4998C123.714 36.7863 123.707 37.0808 123.691 37.3832C123.691 37.6697 123.667 37.9642 123.619 38.2666C123.874 38.2507 124.136 38.2427 124.407 38.2427C124.677 38.2268 124.924 38.2109 125.147 38.195V39.4604H119.799V38.4576Z" fill="white"/>
|
||||
<path d="M130.524 38.4576C131.002 38.4576 131.336 38.3462 131.527 38.1234C131.718 37.9005 131.829 37.5901 131.861 37.1922C131.909 36.7943 131.933 36.3327 131.933 35.8075V30.8653C131.933 30.5947 131.941 30.3241 131.957 30.0535C131.973 29.767 131.996 29.4646 132.028 29.1463C131.758 29.1622 131.471 29.1781 131.169 29.194C130.866 29.194 130.588 29.202 130.333 29.2179V27.9525C131.049 27.9525 131.614 27.9207 132.028 27.857C132.458 27.7774 132.784 27.6899 133.007 27.5944C133.246 27.4989 133.421 27.3954 133.532 27.284H134.44V36.4998C134.44 36.7863 134.432 37.0808 134.416 37.3832C134.4 37.6697 134.376 37.9642 134.344 38.2666C134.599 38.2507 134.853 38.2427 135.108 38.2427C135.379 38.2268 135.625 38.2109 135.848 38.195V39.4604H130.524V38.4576ZM133.079 25.0875C132.665 25.0875 132.315 24.9363 132.028 24.6338C131.742 24.3155 131.599 23.9335 131.599 23.4878C131.599 23.0422 131.75 22.6681 132.052 22.3657C132.355 22.0474 132.697 21.8882 133.079 21.8882C133.493 21.8882 133.835 22.0474 134.105 22.3657C134.392 22.6681 134.535 23.0422 134.535 23.4878C134.535 23.9335 134.392 24.3155 134.105 24.6338C133.835 24.9363 133.493 25.0875 133.079 25.0875Z" fill="white"/>
|
||||
<path d="M142.841 39.8424C141.727 39.8424 140.724 39.5877 139.833 39.0784C138.958 38.5531 138.265 37.8209 137.756 36.8818C137.247 35.9268 136.992 34.8047 136.992 33.5154C136.992 32.4013 137.239 31.3587 137.732 30.3878C138.241 29.4169 138.95 28.6369 139.857 28.048C140.764 27.4432 141.815 27.1407 143.008 27.1407C143.677 27.1407 144.306 27.2442 144.895 27.4511C145.499 27.658 146.033 27.9843 146.494 28.43C146.972 28.8598 147.346 29.4248 147.616 30.1251C147.887 30.8096 148.022 31.6452 148.022 32.6321L139.809 32.7753C139.809 33.8576 139.929 34.8206 140.167 35.6642C140.422 36.5078 140.828 37.1604 141.385 37.622C141.942 38.0836 142.666 38.3144 143.558 38.3144C143.987 38.3144 144.441 38.2427 144.918 38.0995C145.412 37.9403 145.873 37.7175 146.303 37.431C146.749 37.1445 147.123 36.8023 147.425 36.4043L148.165 37.049C147.688 37.7652 147.139 38.3303 146.518 38.7441C145.897 39.142 145.261 39.4206 144.608 39.5797C143.971 39.7548 143.382 39.8424 142.841 39.8424ZM139.905 31.5338H145.42C145.42 30.929 145.332 30.3878 145.157 29.9103C144.998 29.4169 144.743 29.0269 144.393 28.7404C144.043 28.4539 143.597 28.3106 143.056 28.3106C142.213 28.3106 141.52 28.5812 140.979 29.1224C140.438 29.6476 140.08 30.4514 139.905 31.5338Z" fill="white"/>
|
||||
<path d="M154.659 39.8424C153.911 39.8424 153.218 39.7389 152.582 39.532C151.945 39.341 151.436 39.1102 151.054 38.8396L151.125 39.6275H149.86L149.74 35.521H150.743C150.775 36.1099 150.958 36.6431 151.292 37.1206C151.627 37.5981 152.056 37.9721 152.582 38.2427C153.123 38.5133 153.704 38.6486 154.325 38.6486C154.691 38.6486 155.049 38.5929 155.399 38.4815C155.749 38.3541 156.044 38.1711 156.282 37.9324C156.521 37.6777 156.64 37.3673 156.64 37.0012C156.64 36.6033 156.513 36.277 156.258 36.0223C156.02 35.7517 155.685 35.513 155.256 35.3061C154.842 35.0992 154.364 34.8922 153.823 34.6853C153.346 34.4943 152.86 34.2954 152.367 34.0884C151.889 33.8815 151.444 33.6348 151.03 33.3483C150.616 33.0618 150.29 32.7116 150.051 32.2978C149.812 31.868 149.693 31.3428 149.693 30.722C149.693 30.3559 149.764 29.966 149.908 29.5521C150.051 29.1224 150.282 28.7324 150.6 28.3823C150.918 28.0162 151.348 27.7217 151.889 27.4989C152.43 27.2601 153.099 27.1407 153.895 27.1407C154.325 27.1407 154.802 27.2124 155.327 27.3556C155.868 27.4989 156.37 27.7456 156.831 28.0958L156.808 27.2601H158.073V31.4622H157.046C156.999 30.9051 156.847 30.3878 156.593 29.9103C156.354 29.4328 156.012 29.0428 155.566 28.7404C155.12 28.438 154.579 28.2868 153.943 28.2868C153.322 28.2868 152.812 28.4459 152.415 28.7643C152.033 29.0667 151.842 29.4487 151.842 29.9103C151.842 30.3719 151.985 30.7459 152.271 31.0324C152.574 31.3189 152.964 31.5656 153.441 31.7725C153.919 31.9795 154.436 32.1864 154.993 32.3933C155.662 32.6639 156.29 32.9583 156.879 33.2767C157.468 33.595 157.946 33.9929 158.312 34.4704C158.678 34.9479 158.861 35.5528 158.861 36.285C158.861 37.0808 158.654 37.7493 158.24 38.2905C157.842 38.8157 157.325 39.2057 156.688 39.4604C156.052 39.715 155.375 39.8424 154.659 39.8424Z" fill="white"/>
|
||||
<path d="M162.65 39.8424C162.221 39.8424 161.855 39.6832 161.552 39.3649C161.266 39.0465 161.122 38.6566 161.122 38.195C161.122 37.7493 161.274 37.3673 161.576 37.049C161.894 36.7147 162.253 36.5476 162.65 36.5476C163.08 36.5476 163.438 36.7147 163.725 37.049C164.011 37.3673 164.155 37.7493 164.155 38.195C164.155 38.6566 164.003 39.0465 163.701 39.3649C163.414 39.6832 163.064 39.8424 162.65 39.8424Z" fill="white"/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{{/layout}}
|