New team page (#229)

* Wrote blog

* feat: implement new team page

* refactor: reusable link comp

* chore: update images

* perf: compress images

* refactor: update link

* refactor: update icons, remove white border in favor or rounded corners, add investors

* changes to roles

* team changes

* refactor: add a few changes

* style: slightly better styling

* update team images paths

* use proper image element

* update haris to match team style + keep constant

* improve team member styling

* use vite import pattern

* team tweaks

* fix brendan crop

* fix text and gradient color to match brand colors

* engineer not developer!!!

* add annoucement banner since this can not be merged until post annoucement anyway

* fade in stuff

* better copy

* better haris.jpg

* style: slight update to styling

* Update apps/landing/src/pages/team.tsx

* update my image

* chore: remove unused log

* Update team.tsx

* use incorp'd name everywhere

* update team credits

* hoist headings in credits

* consistent marketing copy in cargo

* fix types

* style tweaks

* blog updates

* blog title tweaks

* fix demo

* jj said lets round it up

Co-authored-by: Lu Hill <email@lewie.me>
Co-authored-by: Jamie Pine <ijamespine@me.com>
Co-authored-by: maxichrome <maxichrome@users.noreply.github.com>
Co-authored-by: xPolar <50601857+xPolar@users.noreply.github.com>
This commit is contained in:
Benjamin Akar 2022-06-14 22:13:09 +02:00 committed by GitHub
parent 79fa96c3bd
commit 6a9f3f05d5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
51 changed files with 710 additions and 102 deletions

View file

@ -60,7 +60,7 @@ representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[hello@jamiepine.com](mailto:hello@jamiepine.com).
[jamie@spacedrive.com](mailto:jamie@spacedrive.com).
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the

View file

@ -1,4 +1,4 @@
Copyright (c) 2021-present Jamie Pine.
Copyright (c) 2021-present Spacedrive Technology Inc.
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

View file

@ -1,8 +1,8 @@
[package]
name = "spacedrive"
version = "0.1.0"
description = "The next gen private virtual filesystem."
authors = ["Jamie Pine"]
description = "The universal file manager."
authors = ["Spacedrive Technology Inc."]
license = ""
repository = "https://github.com/spacedriveapp/spacedrive"
default-run = "spacedrive"

View file

@ -24,9 +24,9 @@
],
"resources": [],
"externalBin": [],
"copyright": "Jamie Pine",
"shortDescription": "The Universal File Explorer",
"longDescription": "A cross-platform file explorer, powered by an open source virtual distributed filesystem.",
"copyright": "Spacedrive Technology Inc.",
"shortDescription": "The universal file manager.",
"longDescription": "A cross-platform universal file explorer, powered by an open-source virtual distributed filesystem.",
"deb": {
"depends": []
},

View file

@ -17,9 +17,9 @@
"icon": ["icons/icon.icns"],
"resources": [],
"externalBin": [],
"copyright": "Jamie Pine",
"shortDescription": "Your personal virtual cloud.",
"longDescription": "Spacedrive is an open source virtual filesystem, a personal cloud powered by your everyday devices. Feature-rich benefits of the cloud, only its owned and hosted by you with security, privacy and ownership as a foundation. Spacedrive makes it possible to create a limitless directory of your digital life that will stand the test of time.",
"copyright": "Spacedrive Technology Inc.",
"shortDescription": "The universal file manager.",
"longDescription": "A cross-platform universal file explorer, powered by an open-source virtual distributed filesystem.",
"deb": {
"depends": []
},

View file

@ -22,3 +22,6 @@ dist-ssr
*.njsproj
*.sln
*.sw?
# Env
.env

View file

@ -18,7 +18,7 @@
name="keywords"
content="files,file manager,spacedrive,file explorer,vdfs,distributed filesystem,cas,content addressable storage,virtual filesystem,photos app, video organizer,video encoder,tags,tag based filesystem"
/>
<meta name="author" content="Jamie Pine" />
<meta name="author" content="Spacedrive Technology Inc." />
<meta name="robots" content="index, follow" />
</head>
<body>

View file

@ -17,6 +17,7 @@
"@sd/interface": "workspace:*",
"@sd/ui": "workspace:*",
"@tailwindcss/typography": "^0.5.2",
"@tryghost/content-api": "^1.11.0",
"@types/compression": "^1.7.2",
"@types/express": "^4.17.13",
"clsx": "^1.1.1",
@ -37,12 +38,14 @@
},
"devDependencies": {
"@babel/preset-react": "^7.17.12",
"@tailwindcss/line-clamp": "^0.4.0",
"@types/lodash": "^4.14.182",
"@types/node": "^17.0.36",
"@types/prismjs": "^1.26.0",
"@types/react": "^18.0.9",
"@types/react-dom": "^18.0.5",
"@types/react-helmet": "^6.1.5",
"@types/tryghost__content-api": "^1.3.10",
"@vitejs/plugin-react": "^1.3.2",
"autoprefixer": "^10.4.7",
"nodemon": "^2.0.16",

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

View file

@ -0,0 +1,21 @@
import { Tag } from '@tryghost/content-api';
import clsx from 'clsx';
import React from 'react';
export interface BlogTagProps {
tag: Tag;
}
export const BlogTag = (props: BlogTagProps) => {
return (
<span
className={`px-2 py-0.5 rounded-md text-gray-500 text-sm bg-gray-550`}
style={{
backgroundColor: props.tag.accent_color + '' ?? '',
color: parseInt(props.tag.accent_color?.slice(1) ?? '', 16) > 0xffffff / 2 ? '#000' : '#fff'
}}
>
{props.tag.name}
</span>
);
};

View file

@ -26,7 +26,7 @@ export function Footer() {
<AppLogo className="w-10 h-10 mb-5" />
<h3 className="mb-1 text-xl font-bold">Spacedrive</h3>
<p className="text-sm text-gray-350">&copy; Copyright 2022 Jamie Pine</p>
<p className="text-sm text-gray-350">&copy; Copyright 2022 Spacedrive Technology Inc.</p>
<div className="flex flex-row mt-6 mb-10 space-x-3">
<FooterLink link="https://twitter.com/spacedriveapp">
<Twitter />
@ -58,7 +58,7 @@ export function Footer() {
Mission
</FooterLink>
<FooterLink link="/changelog">Changelog</FooterLink>
<FooterLink link="https://blog.spacedrive.com">Blog</FooterLink>
<FooterLink link="/blog">Blog</FooterLink>
</div>
<div className="flex flex-col col-span-1 space-y-2 pointer-events-none">
<h3 className="mb-1 text-xs font-bold uppercase">Downloads</h3>

View file

@ -13,7 +13,7 @@ function MarkdownPage(props: MarkdownPageProps) {
Prism.highlightAll();
}, []);
return (
<div className="container max-w-4xl p-4 mt-32 mb-20">
<div className="sm:container max-w-4xl p-4 mt-32 mb-20">
<article id="content" className="m-auto prose lg:prose-xs dark:prose-invert">
{props.children}
</article>

View file

@ -9,7 +9,7 @@ import {
import { Discord, Github } from '@icons-pack/react-simple-icons';
import { Button, Dropdown } from '@sd/ui';
import clsx from 'clsx';
import { Link, List, MapPin, Question } from 'phosphor-react';
import { BookmarkSimple, Link, List, MapPin } from 'phosphor-react';
import React, { useEffect, useState } from 'react';
import { ReactComponent as AppLogo } from '../assets/app-logo.svg';
@ -48,7 +48,7 @@ export default function NavBar() {
: 'border-gray-550 bg-gray-750 bg-opacity-80 backdrop-blur'
)}
>
<div className="container relative flex items-center h-full px-5 m-auto">
<div className="relative flex items-center h-full px-5 m-auto sm:container">
<a href="/" className="absolute flex flex-row items-center">
<AppLogo className="z-30 w-8 h-8 mr-3" />
<h3 className="text-xl font-bold text-white">
@ -61,9 +61,8 @@ export default function NavBar() {
<NavLink link="/roadmap">Roadmap</NavLink>
<NavLink link="/faq">FAQ</NavLink>
<NavLink link="/team">Team</NavLink>
<NavLink link="https://spacedrive.hashnode.dev">Blog</NavLink>
{/* <NavLink link="/change-log">Changelog</NavLink>
<NavLink link="/privacy">Privacy</NavLink> */}
<NavLink link="/blog">Blog</NavLink>
{/* <NavLink link="/jobs">Jobs</NavLink> */}
</div>
<Dropdown
className="absolute block h-6 w-44 top-2 right-4 lg:hidden"
@ -82,6 +81,12 @@ export default function NavBar() {
}
],
[
{
name: 'Blog',
icon: BookmarkSimple,
onPress: () => (window.location.href = '/blog'),
selected: window.location.href.includes('/blog')
},
{
name: 'Roadmap',
icon: MapIcon,

View file

@ -0,0 +1,93 @@
import { Github, Twitch, Twitter } from '@icons-pack/react-simple-icons';
import clsx from 'clsx';
import React from 'react';
export interface TeamMemberProps {
// Name of team member
name: string;
// Member's role
role: string;
// Member's avatar
image: string;
// Socials
socials?: {
twitter?: string;
twitch?: string;
github?: string;
};
// Which round an investor joined at
investmentRound?: string;
}
interface LinkProps {
// Elements inside anchor tag
children: React.ReactNode;
// Anchor href
href: string;
}
function Link(props: LinkProps) {
return (
<a
className="duration-300 hover:scale-105 hover:opacity-80"
href={props.href}
rel="noreferer"
target="_blank"
>
{props.children}
</a>
);
}
export function TeamMember(props: TeamMemberProps) {
const size = props.investmentRound ? 144 : 111;
return (
<div className="flex flex-col">
<img
src={new URL(`../assets/images/${props.image}`, import.meta.url).href}
role="img"
alt={`Portrait of ${props.name}`}
width={size}
height={size}
className={clsx('inline-flex m-0 rounded-md', {
'w-32 h-32 !xs:w-36 !xs:h-36 !sm:w-40 !sm:h-40': !props.investmentRound,
'lg:w-28 lg:h-28': props.investmentRound
})}
/>
<h3 className="mt-4 mb-0 text-base">{props.name}</h3>
<p
className={clsx('text-xs', {
'mb-0': props.investmentRound
})}
>
{props.role}
</p>
{props.investmentRound && (
<p className="mt-0 mb-0 text-sm font-semibold text-gray-450">{props.investmentRound}</p>
)}
<div className="flex flex-row mt-3 space-x-2">
{props.socials?.twitter && (
<Link href={props.socials.twitter}>
<Twitter className="w-[20px] h-[20px]" />
</Link>
)}
{props.socials?.github && (
<Link href={props.socials.github}>
<Github className="w-[20px] h-[20px]" />
</Link>
)}
{props.socials?.twitch && (
<Link href={props.socials.twitch}>
<Twitch className="w-[20px] h-[20px]" />
</Link>
)}
</div>
</div>
);
}

View file

@ -23,7 +23,7 @@ function App() {
</Button>
<NavBar />
<div className="container z-10 flex flex-col items-center px-4 mx-auto overflow-x-hidden sm:overflow-x-visible ">
<div className="sm:container w-full z-10 flex flex-col items-center px-4 mx-auto overflow-x-hidden sm:overflow-x-visible ">
{useRoutes(routes)}
<Footer />
</div>

View file

@ -0,0 +1,60 @@
import { PostOrPage, Tag } from '@tryghost/content-api';
import Prism from 'prismjs';
import 'prismjs/components/prism-rust';
import React, { useEffect, useState } from 'react';
import '../../atom-one.css';
import { BlogTag } from '../../components/BlogTag';
import { getPost } from './posts';
function MarkdownPage() {
const [post, setPost] = useState<PostOrPage | null>(null);
useEffect(() => {
const get = async () => {
let slug = window.location.pathname.split('/blog/')[1];
const post = await getPost(slug);
setPost(post);
};
get();
Prism.highlightAll();
}, []);
return (
<div className="container max-w-4xl p-4 m-auto mt-8 mb-20 prose lg:prose-xs dark:prose-invert">
{post && (
<>
<figure>
<figcaption
dangerouslySetInnerHTML={{ __html: post.feature_image_caption as any }}
></figcaption>
<img src={post?.feature_image as string} alt="" className="rounded-xl" />
</figure>
<section className="flex flex-wrap gap-4 px-8 -mx-8 rounded-xl">
<div className="flex-grow">
<h1 className="m-0 text-2xl leading-snug sm:leading-normal sm:text-4xl">
{post?.title}
</h1>
<p className="m-0 mt-2">
by <b>{post?.primary_author?.name}</b> &middot;{' '}
{new Date(post?.published_at ?? '').toLocaleDateString()}
</p>
</div>
<div className="flex flex-wrap gap-2">
{post?.tags?.map((tag: Tag) => {
return <BlogTag tag={tag} />;
})}
</div>
</section>
<article
id="content"
className="text-lg"
dangerouslySetInnerHTML={{ __html: post.html as string }}
></article>
</>
)}
</div>
);
}
export default MarkdownPage;

View file

@ -0,0 +1,67 @@
import { PostOrPage, PostsOrPages, Tag } from '@tryghost/content-api';
import React, { useEffect, useState } from 'react';
import { BlogTag } from '../../components/BlogTag';
import { blogEnabled, getPosts } from './posts';
function Page() {
if (!blogEnabled) {
window.location.href = '/';
return <></>;
}
const [posts, setPosts] = useState<PostsOrPages | never[]>([]);
useEffect(() => {
const get = async () => {
const posts: PostsOrPages | never[] = await getPosts();
setPosts(posts);
};
get();
}, []);
return (
<div className="container flex flex-col max-w-4xl gap-20 p-4 m-auto mt-32 mb-20 prose lg:prose-xs dark:prose-invert">
<section>
<h1 className="m-0">Blog</h1>
<p className="">Get the latest from Spacedrive.</p>
</section>
<section className="grid grid-cols-1 gap-4 sm:grid-cols-1 lg:grid-cols-1">
{posts.map((post: PostOrPage) => {
return (
<div
onClick={() => {
window.location.href = `/blog/${post.slug}`;
}}
className="relative z-0 flex flex-col gap-2 mb-8 overflow-hidden transition-colors border border-gray-500 cursor-pointer rounded-xl"
>
{post.feature_image && (
<img
src={post.feature_image}
alt=""
className="inset-0 object-cover w-full m-0 h-96 -z-10 rounded-t-xl"
/>
)}
<div className="p-8">
<h2 className="m-0 text-4xl">{post.title}</h2>
<small className="m-0">{post.reading_time} minute read.</small>
<p className="my-2 line-clamp-3">{post.excerpt}</p>
<p className="m-0 text-white">
by {post.primary_author?.name} &middot;{' '}
{new Date(post.published_at ?? '').toLocaleDateString()}
</p>
<div className="flex flex-wrap gap-2 mt-4">
{post.tags?.map((tag: Tag) => {
return <BlogTag tag={tag} />;
})}
</div>
</div>
</div>
);
})}
</section>
</div>
);
}
export default Page;

View file

@ -0,0 +1,41 @@
import GhostContentAPI from '@tryghost/content-api';
// Ghost key is a public key
const ghostKey = import.meta.env.VITE_CONTENT_API_KEY;
const ghostURL = import.meta.env.VITE_API_URL;
export const blogEnabled = ghostURL && ghostKey;
export const api = blogEnabled
? new GhostContentAPI({
url: ghostURL,
key: ghostKey,
version: 'v4'
})
: null;
export async function getPosts() {
if (!api) {
return [];
}
const posts = await api.posts
.browse({
include: ['tags', 'authors']
})
.catch(() => []);
return posts;
}
export async function getPost(slug: string) {
if (!api) {
return null;
}
return await api.posts
.read(
{ slug },
{
include: ['tags', 'authors']
}
)
.catch(() => null);
}

View file

@ -6,6 +6,7 @@ import { ReactComponent as Info } from '../../../../packages/interface/src/asset
import AppEmbed from '../components/AppEmbed';
import { Bubbles } from '../components/Bubbles';
import HomeCTA from '../components/HomeCTA';
import NewBanner from '../components/NewBanner';
interface SectionProps {
orientation: 'left' | 'right';
@ -78,18 +79,18 @@ function Page() {
<>
<div className="mt-22 lg:mt-28" id="content" aria-hidden="true" />
<div className="mt-24 lg:mt-5" />
{/* <NewBanner
headline="Spacedrive raises $1.9M led by OSS Capital"
href="https://spacedrive.hashnode.dev/spacedrive-funding-announcement"
<NewBanner
headline="Spacedrive raises $2M led by OSS Capital"
href="https://spacedrive.com/blog/spacedrive-funding-announcement"
link="Read post"
/> */}
/>
{unsubscribedFromWaitlist && (
<div
className={
'-mt-8 flex flex-row items-center bg-opacity-20 border-2 my-2 px-2 rounded-md bg-green-800 border-green-900'
}
>
<Info className="fill-green-500 w-5 mr-1" />
<Info className="w-5 mr-1 fill-green-500" />
<p className={'text-sm text-green-500'}>You have been unsubscribed from the waitlist</p>
</div>
)}

View file

@ -1,8 +1,183 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { ReactComponent as Content } from '~/docs/product/credits.md';
import { ReactComponent as ArrowRight } from '../../../../packages/interface/src/assets/svg/arrow-right.svg';
import Markdown from '../components/Markdown';
import { TeamMember, TeamMemberProps } from '../components/TeamMember';
const teamMembers: Array<TeamMemberProps> = [
{
name: 'Jamie Pine',
role: 'Founder, Engineer & Designer',
image: 'team/jamie.jpg',
socials: {
twitter: 'https://twitter.com/jamiepine',
twitch: 'https://twitch.tv/jamiepinelive',
github: 'https://github.com/jamiepine'
}
},
{
name: 'Brendan Allan',
role: 'Rust Backend Engineer',
image: 'team/brendan.jpg',
socials: {
twitter: 'https://twitter.com/brendonovichdev',
twitch: 'https://twitch.tv/brendonovich',
github: 'https://github.com/brendonovich'
}
},
{
name: 'Oscar Beaumont',
role: 'Rust Backend Engineer',
image: 'team/oscar.jpg',
socials: {
twitter: 'https://twitter.com/oscartbeaumont',
twitch: 'https://twitch.tv/oscartbeaumont',
github: 'https://github.com/oscartbeaumont'
}
},
{
name: 'Haden Fletcher',
role: 'Engineer & Designer',
image: 'team/haden.jpg',
socials: {
twitter: 'https://twitter.com/heymaxichrome',
twitch: 'https://twitch.tv/maxichrome',
github: 'https://github.com/maxichrome'
}
},
{
name: 'Benjamin Akar',
role: 'Engineer & Designer',
image: 'team/benja.jpg',
socials: {
twitter: 'https://twitter.com/benjaminakar',
twitch: 'https://twitch.tv/akawr',
github: 'https://github.com/benja'
}
},
{
name: 'Haris Mehrzad',
role: 'Engineer Intern',
image: 'team/haris.jpg',
socials: {
twitter: 'https://twitter.com/xPolarrr',
twitch: 'https://twitch.tv/polar_dev',
github: 'https://github.com/xPolar'
}
}
];
const investors: Array<TeamMemberProps> = [
{
name: 'Joseph Jacks',
role: 'Founder, OSSC',
investmentRound: 'Lead Seed',
image: 'investors/josephjacks.jpg'
},
{
name: 'Guillermo Rauch',
role: 'CEO, Vercel',
investmentRound: 'Co-Lead Seed',
image: 'investors/guillermo.jpg'
},
{
name: 'Naval Ravikant',
role: 'Founder, AngelList',
investmentRound: 'Co-Lead Seed',
image: 'investors/naval.jpg'
},
{
name: 'Neha Narkhede',
role: 'Confluent, Apache Kafka',
investmentRound: 'Seed',
image: 'investors/neha.jpg'
},
{
name: 'Austen Allred',
role: 'CEO, Bloom Institute of Technology',
investmentRound: 'Seed',
image: 'investors/austen.jpg'
},
{
name: 'Tom Preston-Werner',
role: 'Founder, GitHub',
investmentRound: 'Seed',
image: 'investors/TOM.jpg'
},
{
name: 'Tobias Lütke',
role: 'CEO, Shopify',
investmentRound: 'Seed',
image: 'investors/tobiaslutke.jpg'
},
{
name: 'Justin Hoffman',
role: 'Former VP Sales, Elasticsearch',
investmentRound: 'Seed',
image: 'investors/justinhoffman.jpg'
},
{
name: 'Ry Walker',
role: 'Founder, Astronomer',
investmentRound: 'Seed',
image: 'investors/rywalker.jpg'
},
{
name: 'Zachary Smith',
role: 'Head of Edge Infrastructure, Equinix',
investmentRound: 'Seed',
image: 'investors/zacharysmith.jpg'
},
{
name: 'Sanjay Poonen',
role: 'Former COO, VMware',
investmentRound: 'Seed',
image: 'investors/sanjay.jpg'
},
{
name: 'David Mytton',
role: 'CEO, console.dev',
investmentRound: 'Seed',
image: 'investors/davidmytton.jpg'
},
{
name: 'Peer Richelsen',
role: 'CEO, Cal.com',
investmentRound: 'Seed',
image: 'investors/peer.jpg'
},
{
name: 'Lester Lee',
role: 'Founder, Slapdash',
investmentRound: 'Seed',
image: 'investors/lesterlee.jpg'
},
{
name: 'Haoyuan Li',
role: 'Founder, Alluxio',
investmentRound: 'Seed',
image: 'investors/haoyuan.jpg'
},
{
name: 'Augusto Marietti',
role: 'CEO, Kong',
investmentRound: 'Seed',
image: 'investors/augusto.jpg'
},
{
name: 'Vijay Sharma',
role: 'CEO, Belong',
investmentRound: 'Seed',
image: 'investors/sharma.jpg'
},
{
name: 'Naveen R',
role: 'Founder, NocoDB',
investmentRound: 'Seed',
image: 'investors/naveen.jpg'
}
];
function Page() {
return (
@ -11,8 +186,66 @@ function Page() {
<title>Our Team - Spacedrive</title>
<meta name="description" content="Who's behind Spacedrive?" />
</Helmet>
<div className="team-page">
<Content />
<div className="relative team-page">
<div
className="absolute -top-60 -right-[400px] opacity-60 w-[1000px] h-[800px] fade-in"
style={{
background:
'linear-gradient(180deg, rgba(180, 180, 180, 0.76) 0%, rgba(19, 4, 168, 0.41) 95.73%)',
filter: 'blur(300px)',
transform: 'rotate(56.81deg)'
}}
></div>
<div className="relative z-10">
<h1 className="text-5xl leading-snug fade-in-heading ">
We believe file management should be <span className="title-gradient">universal</span>.
</h1>
<p className="text-gray-400 animation-delay-2 fade-in-heading ">
Your priceless personal data shouldn't be stuck in a device ecosystem. It should be OS
agnostic, permanent and owned by you.
</p>
<p className="text-gray-400 animation-delay-2 fade-in-heading ">
The data we create daily is our legacythat will long outlive us. Open source technology
is the only way to ensure we retain absolute control over the files that define our
lives, at unlimited scale.
</p>
<a
href="/faq"
className="flex flex-row items-center text-gray-400 duration-150 animation-delay-3 fade-in-heading hover:text-white text-underline underline-offset-4"
>
<ArrowRight className="mr-2" />
Read more
</a>
<div className="fade-in-heading animation-delay-5">
<h2 className="mt-10 text-2xl leading-relaxed sm:mt-20 ">Meet the team</h2>
<div className="grid grid-cols-2 my-10 xs:grid-cols-3 sm:grid-cols-4 gap-x-5 gap-y-10">
{teamMembers.map((member) => (
<TeamMember key={member.name} {...member} />
))}
</div>
<p className="text-sm text-gray-400">
... and all the awesome{' '}
<a
href="https://github.com/spacedriveapp/spacedrive/graphs/contributors"
target="_blank"
rel="noreferer"
className="duration-200 oss-credit-gradient hover:opacity-75"
>
open source contributors
</a>{' '}
on GitHub.
</p>
<h2 className="mt-10 mb-2 text-2xl leading-relaxed sm:mt-20 ">Our investors</h2>
<p className="text-sm text-gray-400 ">
We're backed by some of the greatest leaders in the technology industry.
</p>
<div className="grid grid-cols-3 my-10 sm:grid-cols-5 gap-x-5 gap-y-10">
{investors.map((investor) => (
<TeamMember key={investor.name + investor.investmentRound} {...investor} />
))}
</div>
</div>
</div>
</div>
</Markdown>
);

View file

@ -7,6 +7,20 @@ html {
}
}
.title-gradient {
background: linear-gradient(94.79deg, #e86aff 33.64%, #53afff 68.78%), #ffffff;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.oss-credit-gradient {
background: linear-gradient(90.85deg, #ffffff 8.44%, #d1d1d1 21.35%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.landing-img {
background-image: url('/app.png');
background-size: contain;
@ -47,6 +61,12 @@ html {
.animation-delay-3 {
animation-delay: 700ms;
}
.animation-delay-4 {
animation-delay: 1000ms;
}
.animation-delay-5 {
animation-delay: 1200ms;
}
@keyframes fadeInDown {
from {

View file

@ -1,8 +1,8 @@
[package]
name = "sdcore"
version = "0.1.0"
description = "A virtual distributed filesystem."
authors = ["Jamie Pine"]
description = "Virtual distributed filesystem engine that powers Spacedrive."
authors = ["Spacedrive Technology Inc."]
license = "GNU GENERAL PUBLIC LICENSE"
repository = "https://github.com/spacedriveapp/spacedrive"
edition = "2021"

View file

@ -1,16 +1,16 @@
## Spacedrive
# Spacedrive
_&copy; Copyright 2022-Present Jamie Pine_
Copyright &copy; 2022-present Spacedrive Technology Inc.
### Business contact
## Business contact
hello@jamiepine.com
jamie@spacedrive.com
### Developers
## Developers
Jamie Pine, Brendonovich, Oscar Beaumont
Jamie Pine, Brendan Allan, Oscar Beaumont, Haden Fletcher, Benjamin Akar, Haris Mehrzad, and all other contributors displayed below!
### Contributors
## Contributors
<a href="https://github.com/spacedriveapp/spacedrive/graphs/contributors">
<img

View file

@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.5 8H13.5" stroke="#979BAE" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9 3.5L13.5 8L9 12.5" stroke="#979BAE" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 288 B

View file

@ -109,9 +109,12 @@ export const Sidebar: React.FC<SidebarProps> = (props) => {
variant: 'gray'
}}
// buttonIcon={<Book weight="bold" className="w-4 h-4 mt-0.5 mr-1" />}
buttonText={clientState?.node_name || 'Loading...'}
buttonText={clientState?.node_name || 'My Library'}
items={[
[{ name: clientState?.node_name || '', selected: true }, { name: 'Private Library' }],
[
{ name: clientState?.node_name || 'My Library', selected: true },
{ name: 'Private Library' }
],
[
{ name: 'Library Settings', icon: CogIcon },
{ name: 'Add Library', icon: PlusIcon },

View file

@ -206,19 +206,19 @@ export const OverviewScreen = () => {
</div>
</div>
<div className="flex flex-col pb-4 space-y-4">
{nodeState && (
<Device
name={nodeState?.node_name ?? 'This Device'}
size="1.4TB"
runningJob={{ amount: 65, task: 'Generating preview media' }}
locations={[
{ name: 'Pictures', folder: true },
{ name: 'Downloads', folder: true },
{ name: 'Minecraft', folder: true }
]}
type="laptop"
/>
)}
<Device
name={`James' MacBook Pro`}
size="1TB"
locations={[
{ name: 'Documents', folder: true },
{ name: 'Movies', folder: true },
{ name: 'Downloads', folder: true },
{ name: 'Minecraft', folder: true },
{ name: 'Projects', folder: true },
{ name: 'Notes', folder: true }
]}
type="desktop"
/>
<Device
name={`James' iPhone 12`}
size="47.7GB"

View file

@ -1,6 +1,6 @@
// const colors = require('tailwindcss/colors');
// const plugin = require('tailwindcss/plugin');
// const defaultTheme = require('tailwindcss/defaultTheme');
const defaultTheme = require('tailwindcss/defaultTheme');
module.exports = function (app, options) {
let config = {
@ -11,6 +11,10 @@ module.exports = function (app, options) {
darkMode: app == 'landing' ? 'class' : 'class',
mode: 'jit',
theme: {
screens: {
xs: '475px',
...defaultTheme.screens
},
// fontFamily: {
// sans: ['Inter', 'ui-sans-serif', 'system-ui'],
// serif: ['Inter', 'ui-serif', 'Georgia'],
@ -120,6 +124,7 @@ module.exports = function (app, options) {
};
if (app === 'landing') {
config.plugins.push(require('@tailwindcss/typography'));
config.plugins.push(require('@tailwindcss/line-clamp'));
}
return config;
};

View file

@ -76,7 +76,9 @@ importers:
'@sd/core': workspace:*
'@sd/interface': workspace:*
'@sd/ui': workspace:*
'@tailwindcss/line-clamp': ^0.4.0
'@tailwindcss/typography': ^0.5.2
'@tryghost/content-api': ^1.11.0
'@types/compression': ^1.7.2
'@types/express': ^4.17.13
'@types/lodash': ^4.14.182
@ -85,6 +87,7 @@ importers:
'@types/react': ^18.0.9
'@types/react-dom': ^18.0.5
'@types/react-helmet': ^6.1.5
'@types/tryghost__content-api': ^1.3.10
'@vitejs/plugin-react': ^1.3.2
autoprefixer: ^10.4.7
clsx: ^1.1.1
@ -125,6 +128,7 @@ importers:
'@sd/interface': link:../../packages/interface
'@sd/ui': link:../../packages/ui
'@tailwindcss/typography': 0.5.2
'@tryghost/content-api': 1.11.0
'@types/compression': 1.7.2
'@types/express': 4.17.13
clsx: 1.1.1
@ -137,19 +141,21 @@ importers:
react-device-detect: 2.2.2_ef5jwxihqo6n7gxfmzogljlgcm
react-dom: 18.1.0_react@18.1.0
react-helmet: 6.1.0_react@18.1.0
react-hook-form: 7.31.3_react@18.1.0
react-hook-form: 7.32.0_react@18.1.0
react-router-dom: 6.3.0_ef5jwxihqo6n7gxfmzogljlgcm
react-tsparticles: 2.0.6_react@18.1.0
simple-icons: 7.0.0
tsparticles: 2.0.6
devDependencies:
'@babel/preset-react': 7.17.12
'@tailwindcss/line-clamp': 0.4.0
'@types/lodash': 4.14.182
'@types/node': 17.0.36
'@types/prismjs': 1.26.0
'@types/react': 18.0.9
'@types/react-dom': 18.0.5
'@types/react-helmet': 6.1.5
'@types/tryghost__content-api': 1.3.10
'@vitejs/plugin-react': 1.3.2
autoprefixer: 10.4.7_postcss@8.4.14
nodemon: 2.0.16
@ -4835,6 +4841,12 @@ packages:
defer-to-connect: 2.0.1
dev: true
/@tailwindcss/line-clamp/0.4.0:
resolution: {integrity: sha512-HQZo6gfx1D0+DU3nWlNLD5iA6Ef4JAXh0LeD8lOGrJwEDBwwJNKQza6WoXhhY1uQrxOuU8ROxV7CqiQV4CoiLw==}
peerDependencies:
tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1'
dev: true
/@tailwindcss/typography/0.5.2:
resolution: {integrity: sha512-coq8DBABRPFcVhVIk6IbKyyHUt7YTEC/C992tatFB+yEx5WGBQrCgsSFjxHUr8AWXphWckadVJbominEduYBqw==}
peerDependencies:
@ -4994,6 +5006,14 @@ packages:
- supports-color
dev: true
/@tryghost/content-api/1.11.0:
resolution: {integrity: sha512-0JTlp5Ln4BfCJzCYuT2X3MC9ZupIkRtzZaHpf9KZw7O8uOsRnO9RwjItN+lwvkoLIesMzfgrZd/tBJ4BAzeBrg==}
dependencies:
axios: 0.27.2
transitivePeerDependencies:
- debug
dev: false
/@tsconfig/node10/1.0.8:
resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==}
dev: true
@ -5383,6 +5403,10 @@ packages:
resolution: {integrity: sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==}
dev: true
/@types/tryghost__content-api/1.3.10:
resolution: {integrity: sha512-aHEqp9IVTcVQKJwjWrUW0UzCkziUzJSIUF0E9IjPc5DIGakZHRPin2jh9SPuJfBXawlJmVVjJn71wyiRhha1Iw==}
dev: true
/@types/uglify-js/3.13.2:
resolution: {integrity: sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q==}
dependencies:
@ -6200,7 +6224,6 @@ packages:
/asynckit/0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
dev: true
/at-least-node/1.0.0:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
@ -6267,6 +6290,15 @@ packages:
engines: {node: '>= 0.4'}
dev: true
/axios/0.27.2:
resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
dependencies:
follow-redirects: 1.15.1
form-data: 4.0.0
transitivePeerDependencies:
- debug
dev: false
/babel-loader/8.2.5_@babel+core@7.18.2:
resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==}
engines: {node: '>= 8.9'}
@ -6796,7 +6828,7 @@ packages:
dev: true
/buffer-equal/0.0.1:
resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==}
resolution: {integrity: sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=}
engines: {node: '>=0.4.0'}
dev: true
@ -7346,7 +7378,6 @@ packages:
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
dev: true
/comma-separated-tokens/1.0.8:
resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
@ -8096,7 +8127,6 @@ packages:
/delayed-stream/1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dev: true
/delegates/1.0.0:
resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
@ -9441,6 +9471,16 @@ packages:
tslib: 1.14.1
dev: true
/follow-redirects/1.15.1:
resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
dev: false
/for-each/0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
dependencies:
@ -9562,6 +9602,15 @@ packages:
mime-types: 2.1.35
dev: true
/form-data/4.0.0:
resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/format/0.2.2:
resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
engines: {node: '>=0.4.x'}
@ -9807,7 +9856,7 @@ packages:
dev: true
/github-from-package/0.0.0:
resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
resolution: {integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=}
dev: true
/github-slugger/1.4.0:
@ -12650,7 +12699,7 @@ packages:
engines: {node: '>= 0.8'}
/once/1.4.0:
resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
dependencies:
wrappy: 1.0.2
@ -13077,7 +13126,7 @@ packages:
dev: true
/path-is-absolute/1.0.1:
resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=}
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
/path-key/2.0.1:
@ -13488,7 +13537,7 @@ packages:
dev: true
/prepend-http/2.0.0:
resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=}
resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
engines: {node: '>=4'}
dev: true
@ -13957,8 +14006,8 @@ packages:
react-side-effect: 2.1.1_react@18.1.0
dev: false
/react-hook-form/7.31.3_react@18.1.0:
resolution: {integrity: sha512-NVZdCWViIWXXXlQ3jxVQH0NuNfwPf8A/0KvuCxrM9qxtP1qYosfR2ZudarziFrVOC7eTUbWbm1T4OyYCwv9oSQ==}
/react-hook-form/7.32.0_react@18.1.0:
resolution: {integrity: sha512-AFUwl9MwVVnZZsFZW7Egc8PVyWem6c6/9FBq29Acsikm+8ecJCkqOn2Tl48GApFnXBgoBBEHC3zosjYvPfsGNg==}
engines: {node: '>=12.22.0'}
peerDependencies:
react: ^16.8.0 || ^17 || ^18
@ -14272,7 +14321,7 @@ packages:
dev: true
/read-pkg-up/1.0.1:
resolution: {integrity: sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=}
resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==}
engines: {node: '>=0.10.0'}
dependencies:
find-up: 1.1.2
@ -14289,7 +14338,7 @@ packages:
dev: true
/read-pkg/1.1.0:
resolution: {integrity: sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=}
resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==}
engines: {node: '>=0.10.0'}
dependencies:
load-json-file: 1.1.0
@ -14363,7 +14412,7 @@ packages:
picomatch: 2.3.1
/redent/1.0.0:
resolution: {integrity: sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=}
resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==}
engines: {node: '>=0.10.0'}
dependencies:
indent-string: 2.1.0
@ -14568,7 +14617,7 @@ packages:
dev: true
/repeating/2.0.1:
resolution: {integrity: sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=}
resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==}
engines: {node: '>=0.10.0'}
dependencies:
is-finite: 1.1.0
@ -14612,7 +14661,7 @@ packages:
supports-preserve-symlinks-flag: 1.0.0
/responselike/1.0.2:
resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=}
resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
dependencies:
lowercase-keys: 1.0.1
dev: true
@ -14870,7 +14919,7 @@ packages:
dev: true
/semver-compare/1.0.0:
resolution: {integrity: sha1-De4hahyUGrN+nvsXiPavxf9VN/w=}
resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
dev: true
/semver-diff/3.1.1:
@ -14886,7 +14935,7 @@ packages:
dev: true
/semver-truncate/1.1.2:
resolution: {integrity: sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=}
resolution: {integrity: sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==}
engines: {node: '>=0.10.0'}
dependencies:
semver: 5.7.1
@ -15073,7 +15122,7 @@ packages:
dev: true
/shebang-command/1.2.0:
resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=}
resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
engines: {node: '>=0.10.0'}
dependencies:
shebang-regex: 1.0.0
@ -15087,7 +15136,7 @@ packages:
dev: true
/shebang-regex/1.0.0:
resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=}
resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
engines: {node: '>=0.10.0'}
dev: true
@ -15129,7 +15178,7 @@ packages:
dev: false
/simple-swizzle/0.2.2:
resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=}
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
dependencies:
is-arrayish: 0.3.2
dev: true
@ -15186,21 +15235,21 @@ packages:
dev: true
/sort-keys-length/1.0.1:
resolution: {integrity: sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=}
resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==}
engines: {node: '>=0.10.0'}
dependencies:
sort-keys: 1.1.2
dev: true
/sort-keys/1.1.2:
resolution: {integrity: sha1-RBttTTRnmPG05J6JIK37oOVD+a0=}
resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==}
engines: {node: '>=0.10.0'}
dependencies:
is-plain-obj: 1.1.0
dev: true
/sort-keys/2.0.0:
resolution: {integrity: sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=}
resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==}
engines: {node: '>=4'}
dependencies:
is-plain-obj: 1.1.0
@ -15311,7 +15360,7 @@ packages:
dev: true
/squeak/1.3.0:
resolution: {integrity: sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=}
resolution: {integrity: sha512-YQL1ulInM+ev8nXX7vfXsCsDh6IqXlrremc1hzi77776BtpWgYJUMto3UM05GSAaGzJgWekszjoKDrVNB5XG+A==}
engines: {node: '>=0.10.0'}
dependencies:
chalk: 1.1.3
@ -15429,12 +15478,12 @@ packages:
dev: true
/strict-uri-encode/1.1.0:
resolution: {integrity: sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=}
resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
engines: {node: '>=0.10.0'}
dev: true
/string-width/1.0.2:
resolution: {integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=}
resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==}
engines: {node: '>=0.10.0'}
dependencies:
code-point-at: 1.1.0
@ -15524,7 +15573,7 @@ packages:
dev: true
/strip-ansi/3.0.1:
resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=}
resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==}
engines: {node: '>=0.10.0'}
dependencies:
ansi-regex: 2.1.1
@ -15543,7 +15592,7 @@ packages:
dev: true
/strip-bom/2.0.0:
resolution: {integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=}
resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==}
engines: {node: '>=0.10.0'}
dependencies:
is-utf8: 0.2.1
@ -15561,7 +15610,7 @@ packages:
dev: true
/strip-eof/1.0.0:
resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=}
resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==}
engines: {node: '>=0.10.0'}
dev: true
@ -15571,7 +15620,7 @@ packages:
dev: true
/strip-indent/1.0.1:
resolution: {integrity: sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=}
resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==}
engines: {node: '>=0.10.0'}
hasBin: true
dependencies:
@ -15586,7 +15635,7 @@ packages:
dev: true
/strip-json-comments/2.0.1:
resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=}
resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
engines: {node: '>=0.10.0'}
dev: true
@ -15651,7 +15700,7 @@ packages:
dev: true
/supports-color/2.0.0:
resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=}
resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==}
engines: {node: '>=0.8.0'}
dev: true
@ -15837,12 +15886,12 @@ packages:
dev: true
/temp-dir/1.0.0:
resolution: {integrity: sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=}
resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==}
engines: {node: '>=4'}
dev: true
/tempfile/2.0.0:
resolution: {integrity: sha1-awRGhWqbERTRhW/8vlCczLCXcmU=}
resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==}
engines: {node: '>=4'}
dependencies:
temp-dir: 1.0.0
@ -15947,7 +15996,7 @@ packages:
dev: false
/through/2.3.8:
resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=}
resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
dev: true
/through2/2.0.5:
@ -15958,7 +16007,7 @@ packages:
dev: true
/timed-out/4.0.1:
resolution: {integrity: sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=}
resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
engines: {node: '>=0.10.0'}
dev: true
@ -16074,12 +16123,12 @@ packages:
dev: true
/trim-newlines/1.0.0:
resolution: {integrity: sha1-WIeWa7WCpFA6QetST301ARgVphM=}
resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==}
engines: {node: '>=0.10.0'}
dev: true
/trim-repeated/1.0.0:
resolution: {integrity: sha1-42RqLqTokTEr9+rObPsFOAvAHCE=}
resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==}
engines: {node: '>=0.10.0'}
dependencies:
escape-string-regexp: 1.0.5
@ -16454,7 +16503,7 @@ packages:
dev: true
/tunnel-agent/0.6.0:
resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=}
resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
dependencies:
safe-buffer: 5.2.1
dev: true
@ -16906,21 +16955,21 @@ packages:
dev: true
/url-parse-lax/1.0.0:
resolution: {integrity: sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=}
resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==}
engines: {node: '>=0.10.0'}
dependencies:
prepend-http: 1.0.4
dev: true
/url-parse-lax/3.0.0:
resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=}
resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==}
engines: {node: '>=4'}
dependencies:
prepend-http: 2.0.0
dev: true
/url-to-options/1.0.1:
resolution: {integrity: sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=}
resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==}
engines: {node: '>= 4'}
dev: true
@ -17213,7 +17262,7 @@ packages:
vite: ^2.6.0
dependencies:
'@svgr/core': 6.2.1
vite: 2.9.9_sass@1.52.1
vite: 2.9.9
transitivePeerDependencies:
- supports-color
dev: true
@ -17319,7 +17368,7 @@ packages:
dev: true
/wcwidth/1.0.1:
resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=}
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
dependencies:
defaults: 1.0.3
dev: true
@ -17598,7 +17647,7 @@ packages:
dev: true
/wrappy/1.0.2:
resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=}
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
/write-file-atomic/3.0.3:
resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
@ -17658,7 +17707,7 @@ packages:
dev: true
/xml-parse-from-string/1.0.1:
resolution: {integrity: sha1-qQKekp09vN7RafPG4oI42VpdWig=}
resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==}
dev: true
/xml2js/0.4.23:
@ -17688,7 +17737,7 @@ packages:
dev: true
/yallist/2.1.2:
resolution: {integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=}
resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
dev: true
/yallist/3.1.1:
@ -17745,7 +17794,7 @@ packages:
dev: true
/yauzl/2.10.0:
resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=}
resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
dependencies:
buffer-crc32: 0.2.13
fd-slicer: 1.1.0