Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Path: blob/master/src/packages/next/components/landing/cocalc-com-features.tsx
Views: 687
/*1* This file is part of CoCalc: Copyright © 2023 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import { Button, Col, Grid, Row } from "antd";6import { join } from "path";7import { useEffect, useState } from "react";8import { SOFTWARE_ENVIRONMENT_ICON } from "@cocalc/frontend/project/settings/software-consts";9import { DOC_AI } from "@cocalc/util/consts/ui";10import { COLORS } from "@cocalc/util/theme";11import Path from "components/app/path";12import DemoCell from "components/demo-cell";13import { AvailableTools, Tool } from "components/landing/available-tools";14import Info from "components/landing/info";15import { CSS, Paragraph, Text } from "components/misc";16import A from "components/misc/A";17import ChatGPTHelp from "components/openai/chatgpt-help";18import {19Testimonial,20TestimonialComponent,21twoRandomTestimonials,22} from "components/testimonials";23import basePath from "lib/base-path";24import { useCustomize } from "lib/customize";25import assignments from "public/features/cocalc-course-assignments-2019.png";26import RTC from "public/features/cocalc-real-time-jupyter.png";27import ComputeServers from "./compute-servers";28import { LANDING_HEADER_LEVEL } from "./constants";2930// NOTE: This component is only rendered if the onCoCalcCom customization variable is "true"31export function CoCalcComFeatures() {32const {33siteName = "CoCalc",34openaiEnabled,35sandboxProjectId,36jupyterApiEnabled,37shareServer = false,38onCoCalcCom,39} = useCustomize();40const width = Grid.useBreakpoint();4142// to avoid next-js hydration errors43const [testimonials, setTestimonials] =44useState<[Testimonial, Testimonial]>();4546useEffect(() => {47setTestimonials(twoRandomTestimonials());48}, []);4950function renderCollaboration(): JSX.Element {51return (52<Info53level={LANDING_HEADER_LEVEL}54title="Realtime Collaboration Using Your Favorite Tools"55icon="users"56image={RTC}57anchor="a-realtimesync"58alt={"Two browser windows editing the same Jupyter notebook"}59style={{ backgroundColor: COLORS.ANTD_BG_BLUE_L }}60belowWide={true}61icons={[62{ icon: "jupyter", link: "/features/jupyter-notebook" },63{ icon: "tex", title: "LaTeX", link: "/features/latex-editor" },64{ icon: "slides", title: "Whiteboard", link: "/features/whiteboard" },65]}66>67<Paragraph>68With {siteName}, you can easily collaborate with colleagues, students,69and friends to edit computational documents. We support{" "}70<A href={"/features/jupyter-notebook"}>71<strong>Jupyter Notebooks</strong>72</A>73, <A href={"/features/latex-editor"}>LaTeX files</A>,{" "}74<A href="/features/sage">SageMath Worksheets</A>,{" "}75<A href={"/features/whiteboard"}>Computational Whiteboards</A>, and76much more. We have an{" "}77<A href={"https://doc.cocalc.com/why.html#open-world-approach"}>78open world approach79</A>{" "}80giving users as much flexibility in choosing software and hardware as81possible.82</Paragraph>8384<Paragraph>85You and your collaborators use the same per-project environment, which86provides consistent results, synchronized file changes, and automatic87revision history so that you can go back in time when you need to88discover what changed and when. {renderShareServer()}89</Paragraph>9091<Paragraph>92Forget the frustration of sending files back and forth between your93collaborators, wasting time reviewing changes, and merging documents.{" "}94<A href={"/auth/sign-up"}>Get started with {siteName} today.</A>95</Paragraph>96</Info>97);98}99100function renderTeaching() {101return (102<Info103level={LANDING_HEADER_LEVEL}104title="Integrated Course Management System"105icon="graduation-cap"106image={assignments}107anchor="a-teaching"108alt={"Two browser windows editing the same Jupyter notebook"}109style={{ backgroundColor: COLORS.ANTD_BG_BLUE_L }}110icons={[111{112icon: "users",113title: "Course Management",114link: "https://doc.cocalc.com/teaching-instructors.html",115},116{117icon: "graduation-cap",118title: "NBGrader",119link: "https://doc.cocalc.com/teaching-nbgrader.html",120},121{ icon: "slides", title: "Slides", link: "/features/whiteboard" },122]}123>124<Paragraph>125You can think of {siteName} as{" "}126<Text strong>virtual computer lab</Text> in the cloud. It takes away127the pain of teaching scientific software.128</Paragraph>129<Paragraph>130<Text strong>Hassle-free assignments</Text>: {siteName} keeps all131files well organized! Due to real-time synchronization you never have132to deal with multiple versions of the same file. There is even support133for{" "}134<A href={"https://doc.cocalc.com/teaching-nbgrader.html"}>135automated grading via NBGrader136</A>137.138</Paragraph>139<Paragraph>140<Text strong>Pre-installed Software</Text> like in a computer lab,{" "}141<A href={"/software"}>all software you need</A> is already installed142and ready to use.143</Paragraph>144<Paragraph>145<Text strong>Real-time Collaboration</Text> allows you to virtually146look students over their shoulders. You can check their work directly147and help them by editing the file or using side-chat communication.148</Paragraph>149<Paragraph>150<Button151onClick={() =>152(window.location.href = join(basePath, "/features/teaching"))153}154>155More about teaching on {siteName}156</Button>157</Paragraph>158</Info>159);160}161162function renderSandbox() {163if (!sandboxProjectId) return;164return (165<Info166level={LANDING_HEADER_LEVEL}167title={<>The Public {siteName} Sandbox</>}168icon="share-square"169anchor="a-sandbox"170style={{ backgroundColor: COLORS.GRAY_LLL }}171>172<Path173style={{ marginBottom: "15px" }}174project_id={sandboxProjectId}175description="Public Sandbox"176/>177</Info>178);179}180181function renderShareServer() {182if (!shareServer) return;183184return (185<>186{" "}187You can even publish your {siteName} creations to share with anyone via188the built-in <A href={"/share/public_paths/page/1"}>share server</A>.189</>190);191}192193function renderMore(): JSX.Element {194const text = {195software: `All available software`,196whiteboard: `Computational whiteboard`,197features: `Features overview`,198};199const software = (200<Paragraph style={{ textAlign: "center" }}>201<Button202onClick={() => (window.location.href = join(basePath, "/software"))}203title={text.software}204>205{text.software}206</Button>207</Paragraph>208);209const whiteboard = (210<Paragraph style={{ textAlign: "center" }}>211<Button212onClick={() =>213(window.location.href = join(basePath, "/features/whiteboard"))214}215title={text.whiteboard}216>217{text.whiteboard}218</Button>219</Paragraph>220);221const features = (222<Paragraph style={{ textAlign: "center" }}>223<Button224onClick={() => (window.location.href = join(basePath, "/features"))}225title={text.features}226>227{text.features}228</Button>229</Paragraph>230);231return (232<Info233level={LANDING_HEADER_LEVEL}234title="Much More …"235icon="wrench"236anchor="more"237style={{ backgroundColor: COLORS.YELL_LLL }}238>239<Row>240<Col md={8}>241<Tool242icon={SOFTWARE_ENVIRONMENT_ICON}243href="/software"244title="Available Software"245alt="Available Software"246>247<Paragraph>248{siteName} comes with a variety of software pre-installed,249including250<A href={"/features/python"}>Python</A>,{" "}251<A href={"/features/sage"}>SageMath</A>,{" "}252<A href={"/features/r-statistical-software"}>R</A> and{" "}253<A href={"/features/julia"}>Julia</A> . You can{" "}254<A255href={"https://doc.cocalc.com/howto/install-python-lib.html"}256>257install additional software258</A>{" "}259directly in your project as well.260</Paragraph>261{!width.md && software}262</Tool>263</Col>264<Col md={8}>265<Tool266icon="layout"267href="/features/whiteboard"268title="Computational Whiteboard"269alt="Computational Whiteboard"270>271<Paragraph>272Use a full featured collaborative whiteboard – with support for273Jupyter notebook cells – to express and share your ideas.274</Paragraph>275{!width.md && whiteboard}276</Tool>277</Col>278<Col md={8}>279<Tool280icon="wrench"281href="/features"282alt="Features"283title="Feature Overview"284>285<Paragraph>286{siteName} offers a variety of features to make your life287easier. You can find a list of all features{" "}288<A href="/features">here</A>.289</Paragraph>290{!width.md && features}291</Tool>292</Col>293{width.md && (294<>295<Col md={8}>{software}</Col>296<Col md={8}>{whiteboard}</Col>297<Col md={8}>{features}</Col>298</>299)}300</Row>301</Info>302);303}304305function renderAvailableProducts(): JSX.Element {306const txtCol = COLORS.GRAY_LL;307const toolCol = "white";308309const link: CSS = {310color: "white",311fontWeight: "bold",312} as const;313314const bottom: CSS = {315color: txtCol,316textAlign: "center",317fontSize: "150%",318} as const;319320const urlProducts = "/pricing/products";321const urlCourses = "/pricing/courses";322const urlOnprem = "/pricing/onprem";323324const productsLink = (325<Paragraph style={bottom}>326<Button327ghost328size="large"329style={{ fontWeight: "bold" }}330onClick={() => (window.location.href = join(basePath, urlProducts))}331title={"Products Overview"}332>333Products Overview334</Button>335</Paragraph>336);337338const courseLink = (339<Paragraph style={bottom}>340<Button341ghost342size="large"343style={{ fontWeight: "bold" }}344onClick={() => (window.location.href = join(basePath, urlCourses))}345title={"Course Licenses"}346>347Course Licenses348</Button>349</Paragraph>350);351352const onpremLink = (353<Paragraph style={bottom}>354<Button355ghost356size="large"357style={{ fontWeight: "bold" }}358onClick={() => (window.location.href = join(basePath, urlOnprem))}359title={"On-Premises Offerings"}360>361On-Premises Offerings362</Button>363</Paragraph>364);365366return (367<Info368level={LANDING_HEADER_LEVEL}369title="Solutions"370icon="shopping-cart"371anchor="products"372style={{ backgroundColor: COLORS.BLUE_D }}373textStyle={{ color: COLORS.GRAY_LL }}374>375<Row>376<Col md={8}>377<Tool378icon="server"379href={urlProducts}380title="Online Service with GPUs"381alt="Online Service"382textStyle={{ color: toolCol }}383>384<Paragraph style={{ color: txtCol }}>385You can start using {siteName} online for free today.{" "}386<A href={"/auth/sign-up"} style={link}>387Create an account388</A>389, open your{" "}390<A style={link} href={"https://doc.cocalc.com/trial.html"}>391trial project392</A>{" "}393and{" "}394<A395style={link}396href={"https://doc.cocalc.com/getting-started.html"}397>398start exploring399</A>{" "}400{siteName}.401</Paragraph>402<Paragraph style={{ color: txtCol }}>403Upgrade your projects to unlock internet access, better hosting404quality, and other upgrades by purchasing a{" "}405<A style={link} href={"/store/site-license"}>406license407</A>{" "}408or upgrade via{" "}409<A style={link} href={"https://doc.cocalc.com/paygo.html"}>410pay-as-you-go411</A>{" "}412and use GPUs and HPC resources via{" "}413<A414style={link}415href={"https://doc.cocalc.com/compute_server.html"}416>417compute servers418</A>419!420</Paragraph>421{!width.md && productsLink}422</Tool>423</Col>424<Col md={8}>425<Tool426icon="graduation-cap"427href={urlCourses}428title="Teach a Course"429alt="Teach a Course"430textStyle={{ color: toolCol }}431>432<Paragraph style={{ color: txtCol }}>433You can{" "}434<A style={link} href="/features/teaching">435teach a course436</A>{" "}437on {siteName} online!438</Paragraph>439<Paragraph style={{ color: txtCol }}>440The{" "}441<A style={link} href="pricing/courses">442course license options443</A>{" "}444are very flexible: they range from small professional training445up to large university courses. The students can pay {siteName}{" "}446directly, or you can pay on their behalf, and it is easy to447change a license at any time if you need more resources or the448number of students changes.449</Paragraph>450{!width.md && courseLink}451</Tool>452</Col>453<Col md={8}>454<Tool455icon="network-wired"456href={urlOnprem}457alt="On-Premises"458title={"On-Premises"}459textStyle={{ color: toolCol }}460>461<Paragraph style={{ color: txtCol }}>462It is very easy to run {siteName} on your own computer or463cluster. The available options are:464<ol>465<li>466Make your computer available in a {siteName} project via an{" "}467<A468style={link}469href={"https://doc.cocalc.com/compute_server.html"}470>471on-prem compute server472</A>473.474</li>475<li>476Deploy a highly scalable variant of {siteName} on your{" "}477<strong>Kubernetes cluster</strong> via{" "}478<A style={link} href="https://onprem.cocalc.com/">479<strong>CoCalc OnPrem</strong>480</A>481.482</li>483</ol>484</Paragraph>485{!width.md && onpremLink}486</Tool>487</Col>488{width.md && (489<>490<Col md={8}>{productsLink}</Col>491<Col md={8}>{courseLink}</Col>492<Col md={8}>{onpremLink}</Col>493</>494)}495</Row>496</Info>497);498}499500function renderTestimonials() {501if (!testimonials) return;502const [t1, t2] = testimonials;503return (504<Info505level={LANDING_HEADER_LEVEL}506title="Testimonials"507icon="comment"508anchor="testimonials"509style={{ backgroundColor: COLORS.BS_GREEN_LL }}510>511<Row gutter={[15, 15]}>512<Col md={12}>513<TestimonialComponent testimonial={t1} />514</Col>515<Col md={12}>516<TestimonialComponent testimonial={t2} />517</Col>518<Col md={24} style={{ textAlign: "center" }}>519<Button520onClick={() =>521(window.location.href = join(basePath, "/testimonials"))522}523title={`More testimonials from users of ${siteName}`}524>525More testimonials526</Button>527</Col>528</Row>529</Info>530);531}532533function renderChatGPT() {534if (!openaiEnabled || !onCoCalcCom) return;535return (536<Info537level={LANDING_HEADER_LEVEL}538title="Extensive Generative AI Integration"539icon="robot"540imageComponent={<ChatGPTHelp size="large" tag={"index"} />}541anchor="a-realtimesync"542alt={"Two browser windows editing the same Jupyter notebook"}543style={{ backgroundColor: COLORS.ANTD_BG_BLUE_L }}544>545<Paragraph>546A wide range of{" "}547<A href={DOC_AI}>Generative AI Large Language Models</A> are highly548integrated into {siteName}. This helps you{" "}549<A href={`${DOC_AI}#jupyter-notebooks`}>fix errors</A>, generate code550or LaTeX snippets, summarize documents, and much more.551</Paragraph>552</Info>553);554}555556function renderDemoCell() {557if (!jupyterApiEnabled) return;558559return (560<Info561level={LANDING_HEADER_LEVEL}562title="Many Programming Languages"563icon="flow-chart"564imageComponent={<DemoCell tag={"sage"} style={{ width: "100%" }} />}565anchor="a-realtimesync"566alt={"Two browser windows editing the same Jupyter notebook"}567style={{ backgroundColor: COLORS.YELL_LLL }}568icons={[569{ icon: "julia", link: "/features/julia" },570{ icon: "linux", link: "/features/linux" },571{ icon: "python", link: "/features/python" },572{ icon: "r", link: "/features/r-statistical-software" },573{ icon: "sagemath", title: "SageMath", link: "/features/sage" },574{ icon: "octave", link: "/features/octave" },575]}576>577<Paragraph>578{siteName} supports many{" "}579<A href={"/software"}>programming languages</A>. Edit the demo cell on580the left and evaluate it by pressing "Run". You can also select a581different "kernel", i.e. the programming language that is used to582evaluate the cell.583</Paragraph>584</Info>585);586}587588return (589<>590<ComputeServers />591{renderChatGPT()}592{renderDemoCell()}593{renderSandbox()}594{renderCollaboration()}595<AvailableTools style={{ backgroundColor: COLORS.YELL_LLL }} />596{renderTeaching()}597{renderMore()}598{renderTestimonials()}599{renderAvailableProducts()}600</>601);602}603604605