diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index bb617bbf5..cf9526384 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -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 diff --git a/LICENSE b/LICENSE index 9214afbb2..a6509367e 100644 --- a/LICENSE +++ b/LICENSE @@ -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 diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index ef2765d4f..51178e60e 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -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" diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 2913c9f5f..d24cfffb8 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -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": [] }, diff --git a/apps/desktop/src-tauri/tauri.linux.conf.json b/apps/desktop/src-tauri/tauri.linux.conf.json index d90d8c7c3..2bd5348e7 100644 --- a/apps/desktop/src-tauri/tauri.linux.conf.json +++ b/apps/desktop/src-tauri/tauri.linux.conf.json @@ -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": [] }, diff --git a/apps/landing/.gitignore b/apps/landing/.gitignore index a547bf36d..bdc778ebc 100644 --- a/apps/landing/.gitignore +++ b/apps/landing/.gitignore @@ -22,3 +22,6 @@ dist-ssr *.njsproj *.sln *.sw? + +# Env +.env \ No newline at end of file diff --git a/apps/landing/index.html b/apps/landing/index.html index 1375b2e8d..13ef683df 100644 --- a/apps/landing/index.html +++ b/apps/landing/index.html @@ -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" /> - + diff --git a/apps/landing/package.json b/apps/landing/package.json index ec58883db..81ba2cecb 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -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", diff --git a/apps/landing/src/assets/images/investors/TOM.jpg b/apps/landing/src/assets/images/investors/TOM.jpg new file mode 100644 index 000000000..c4be0752d Binary files /dev/null and b/apps/landing/src/assets/images/investors/TOM.jpg differ diff --git a/apps/landing/src/assets/images/investors/augusto.jpg b/apps/landing/src/assets/images/investors/augusto.jpg new file mode 100644 index 000000000..1e011a161 Binary files /dev/null and b/apps/landing/src/assets/images/investors/augusto.jpg differ diff --git a/apps/landing/src/assets/images/investors/austen.jpg b/apps/landing/src/assets/images/investors/austen.jpg new file mode 100644 index 000000000..9739ca0d2 Binary files /dev/null and b/apps/landing/src/assets/images/investors/austen.jpg differ diff --git a/apps/landing/src/assets/images/investors/davidmytton.jpg b/apps/landing/src/assets/images/investors/davidmytton.jpg new file mode 100644 index 000000000..b3f81a730 Binary files /dev/null and b/apps/landing/src/assets/images/investors/davidmytton.jpg differ diff --git a/apps/landing/src/assets/images/investors/guillermo.jpg b/apps/landing/src/assets/images/investors/guillermo.jpg new file mode 100644 index 000000000..0c9f4d181 Binary files /dev/null and b/apps/landing/src/assets/images/investors/guillermo.jpg differ diff --git a/apps/landing/src/assets/images/investors/haoyuan.jpg b/apps/landing/src/assets/images/investors/haoyuan.jpg new file mode 100644 index 000000000..b600d7cd8 Binary files /dev/null and b/apps/landing/src/assets/images/investors/haoyuan.jpg differ diff --git a/apps/landing/src/assets/images/investors/josephjacks.jpg b/apps/landing/src/assets/images/investors/josephjacks.jpg new file mode 100644 index 000000000..e86903fb0 Binary files /dev/null and b/apps/landing/src/assets/images/investors/josephjacks.jpg differ diff --git a/apps/landing/src/assets/images/investors/justinhoffman.jpg b/apps/landing/src/assets/images/investors/justinhoffman.jpg new file mode 100644 index 000000000..fe967359d Binary files /dev/null and b/apps/landing/src/assets/images/investors/justinhoffman.jpg differ diff --git a/apps/landing/src/assets/images/investors/lesterlee.jpg b/apps/landing/src/assets/images/investors/lesterlee.jpg new file mode 100644 index 000000000..eea82fdca Binary files /dev/null and b/apps/landing/src/assets/images/investors/lesterlee.jpg differ diff --git a/apps/landing/src/assets/images/investors/naval.jpg b/apps/landing/src/assets/images/investors/naval.jpg new file mode 100644 index 000000000..10906f8dd Binary files /dev/null and b/apps/landing/src/assets/images/investors/naval.jpg differ diff --git a/apps/landing/src/assets/images/investors/naveen.jpg b/apps/landing/src/assets/images/investors/naveen.jpg new file mode 100644 index 000000000..4ec7d74c0 Binary files /dev/null and b/apps/landing/src/assets/images/investors/naveen.jpg differ diff --git a/apps/landing/src/assets/images/investors/neha.jpg b/apps/landing/src/assets/images/investors/neha.jpg new file mode 100644 index 000000000..ca57a9a9a Binary files /dev/null and b/apps/landing/src/assets/images/investors/neha.jpg differ diff --git a/apps/landing/src/assets/images/investors/peer.jpg b/apps/landing/src/assets/images/investors/peer.jpg new file mode 100644 index 000000000..a76f31f84 Binary files /dev/null and b/apps/landing/src/assets/images/investors/peer.jpg differ diff --git a/apps/landing/src/assets/images/investors/rywalker.jpg b/apps/landing/src/assets/images/investors/rywalker.jpg new file mode 100644 index 000000000..045523f4a Binary files /dev/null and b/apps/landing/src/assets/images/investors/rywalker.jpg differ diff --git a/apps/landing/src/assets/images/investors/sanjay.jpg b/apps/landing/src/assets/images/investors/sanjay.jpg new file mode 100644 index 000000000..90e8816e7 Binary files /dev/null and b/apps/landing/src/assets/images/investors/sanjay.jpg differ diff --git a/apps/landing/src/assets/images/investors/sharma.jpg b/apps/landing/src/assets/images/investors/sharma.jpg new file mode 100644 index 000000000..edb8aaae3 Binary files /dev/null and b/apps/landing/src/assets/images/investors/sharma.jpg differ diff --git a/apps/landing/src/assets/images/investors/tobiaslutke.jpg b/apps/landing/src/assets/images/investors/tobiaslutke.jpg new file mode 100644 index 000000000..1eeac93af Binary files /dev/null and b/apps/landing/src/assets/images/investors/tobiaslutke.jpg differ diff --git a/apps/landing/src/assets/images/investors/zacharysmith.jpg b/apps/landing/src/assets/images/investors/zacharysmith.jpg new file mode 100644 index 000000000..098cfdc52 Binary files /dev/null and b/apps/landing/src/assets/images/investors/zacharysmith.jpg differ diff --git a/apps/landing/src/assets/images/team/benja.jpg b/apps/landing/src/assets/images/team/benja.jpg new file mode 100644 index 000000000..4cad84924 Binary files /dev/null and b/apps/landing/src/assets/images/team/benja.jpg differ diff --git a/apps/landing/src/assets/images/team/brendan.jpg b/apps/landing/src/assets/images/team/brendan.jpg new file mode 100644 index 000000000..79b7cef6c Binary files /dev/null and b/apps/landing/src/assets/images/team/brendan.jpg differ diff --git a/apps/landing/src/assets/images/team/haden.jpg b/apps/landing/src/assets/images/team/haden.jpg new file mode 100644 index 000000000..6a4959482 Binary files /dev/null and b/apps/landing/src/assets/images/team/haden.jpg differ diff --git a/apps/landing/src/assets/images/team/haris.jpg b/apps/landing/src/assets/images/team/haris.jpg new file mode 100644 index 000000000..7e97fef1c Binary files /dev/null and b/apps/landing/src/assets/images/team/haris.jpg differ diff --git a/apps/landing/src/assets/images/team/jamie.jpg b/apps/landing/src/assets/images/team/jamie.jpg new file mode 100644 index 000000000..c89fcb376 Binary files /dev/null and b/apps/landing/src/assets/images/team/jamie.jpg differ diff --git a/apps/landing/src/assets/images/team/oscar.jpg b/apps/landing/src/assets/images/team/oscar.jpg new file mode 100644 index 000000000..6cd8f0e69 Binary files /dev/null and b/apps/landing/src/assets/images/team/oscar.jpg differ diff --git a/apps/landing/src/components/BlogTag.tsx b/apps/landing/src/components/BlogTag.tsx new file mode 100644 index 000000000..502195590 --- /dev/null +++ b/apps/landing/src/components/BlogTag.tsx @@ -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 ( + 0xffffff / 2 ? '#000' : '#fff' + }} + > + {props.tag.name} + + ); +}; diff --git a/apps/landing/src/components/Footer.tsx b/apps/landing/src/components/Footer.tsx index 409a1f4cc..7a794ec7c 100644 --- a/apps/landing/src/components/Footer.tsx +++ b/apps/landing/src/components/Footer.tsx @@ -26,7 +26,7 @@ export function Footer() {

Spacedrive

-

© Copyright 2022 Jamie Pine

+

© Copyright 2022 Spacedrive Technology Inc.

@@ -58,7 +58,7 @@ export function Footer() { Mission Changelog - Blog + Blog

Downloads

diff --git a/apps/landing/src/components/Markdown.tsx b/apps/landing/src/components/Markdown.tsx index 582f0bb0a..54d814e40 100644 --- a/apps/landing/src/components/Markdown.tsx +++ b/apps/landing/src/components/Markdown.tsx @@ -13,7 +13,7 @@ function MarkdownPage(props: MarkdownPageProps) { Prism.highlightAll(); }, []); return ( -
+
{props.children}
diff --git a/apps/landing/src/components/NavBar.tsx b/apps/landing/src/components/NavBar.tsx index 1636eec42..6293d31a6 100644 --- a/apps/landing/src/components/NavBar.tsx +++ b/apps/landing/src/components/NavBar.tsx @@ -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' )} > -
+ (window.location.href = '/blog'), + selected: window.location.href.includes('/blog') + }, { name: 'Roadmap', icon: MapIcon, diff --git a/apps/landing/src/components/TeamMember.tsx b/apps/landing/src/components/TeamMember.tsx new file mode 100644 index 000000000..64491b73c --- /dev/null +++ b/apps/landing/src/components/TeamMember.tsx @@ -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 ( + + {props.children} + + ); +} + +export function TeamMember(props: TeamMemberProps) { + const size = props.investmentRound ? 144 : 111; + + return ( +
+ {`Portrait +

{props.name}

+

+ {props.role} +

+ {props.investmentRound && ( +

{props.investmentRound}

+ )} +
+ {props.socials?.twitter && ( + + + + )} + {props.socials?.github && ( + + + + )} + {props.socials?.twitch && ( + + + + )} +
+
+ ); +} diff --git a/apps/landing/src/main.tsx b/apps/landing/src/main.tsx index 06a336a0b..8182ffb53 100644 --- a/apps/landing/src/main.tsx +++ b/apps/landing/src/main.tsx @@ -23,7 +23,7 @@ function App() { -
+
{useRoutes(routes)}
diff --git a/apps/landing/src/pages/blog/[slug].tsx b/apps/landing/src/pages/blog/[slug].tsx new file mode 100644 index 000000000..ed9612216 --- /dev/null +++ b/apps/landing/src/pages/blog/[slug].tsx @@ -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(null); + + useEffect(() => { + const get = async () => { + let slug = window.location.pathname.split('/blog/')[1]; + const post = await getPost(slug); + setPost(post); + }; + get(); + Prism.highlightAll(); + }, []); + + return ( +
+ {post && ( + <> +
+
+ +
+
+
+

+ {post?.title} +

+

+ by {post?.primary_author?.name} ·{' '} + {new Date(post?.published_at ?? '').toLocaleDateString()} +

+
+
+ {post?.tags?.map((tag: Tag) => { + return ; + })} +
+
+
+ + )} +
+ ); +} + +export default MarkdownPage; diff --git a/apps/landing/src/pages/blog/index.tsx b/apps/landing/src/pages/blog/index.tsx new file mode 100644 index 000000000..93486bc8a --- /dev/null +++ b/apps/landing/src/pages/blog/index.tsx @@ -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([]); + + useEffect(() => { + const get = async () => { + const posts: PostsOrPages | never[] = await getPosts(); + setPosts(posts); + }; + get(); + }, []); + + return ( +
+
+

Blog

+

Get the latest from Spacedrive.

+
+
+ {posts.map((post: PostOrPage) => { + return ( +
{ + 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 && ( + + )} +
+

{post.title}

+ {post.reading_time} minute read. +

{post.excerpt}

+

+ by {post.primary_author?.name} ·{' '} + {new Date(post.published_at ?? '').toLocaleDateString()} +

+
+ {post.tags?.map((tag: Tag) => { + return ; + })} +
+
+
+ ); + })} +
+
+ ); +} + +export default Page; diff --git a/apps/landing/src/pages/blog/posts.ts b/apps/landing/src/pages/blog/posts.ts new file mode 100644 index 000000000..37653f82a --- /dev/null +++ b/apps/landing/src/pages/blog/posts.ts @@ -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); +} diff --git a/apps/landing/src/pages/index.tsx b/apps/landing/src/pages/index.tsx index bf700040b..f42b66a28 100644 --- a/apps/landing/src/pages/index.tsx +++ b/apps/landing/src/pages/index.tsx @@ -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() { <>