The Scientific sofTware Research for User experience, Design, Engagement, and Learning project (STRUDEL) is a planning framework and design system that empowers people to build effective user interfaces for scientific software.
strudel-web contains the code and content for the public-facing STRUDEL website. The code in this repo is deployed as the STRUDEL staging website. When ready for production, the Copy Build to Production Repo GitHub action copies the code over to the strudel-web-prod repo and deploys it to the production site.
- Repo Overview
- Contributing and Deploying
- Creating and Editing Content
- Installing Locally
- About STRUDEL
| Location | Description |
|---|---|
/config |
Contains strudel-config.json which defines the navigation link structure and connects markdown files to pages. |
/content |
Contains markdown (.mdx) files that can be turned into pages. |
/content/images |
Contains images that are used in markdown files or other areas of the website. |
/src/components |
React components that are reused across the website. |
/src/gatsby-theme-material-ui-top-layout |
Contains theme.ts which configures the material ui theme for the site (e.g. palette, spacing, component defaults). |
/src/pages |
Gatsby Page components that are automatically added to the routing tree (but not the navigation config). |
This guide is for STRUDEL team members who have permission to create branches and run GitHub actions.
You can do this from the command line or from the github branches page. Make sure that you source the new branch from the latest version of the main branch by running the following from the main branch:
git pull origin main
git checkout -b update/my-new-branch
Update any markdown, config, or typescript files that you need to.
Request that changes from your branch get merged into the main branch.
If the PR thread indicates that there are not conflicts, then you are ready for step 6. If there are conflicts, first try to run the following from your update branch:
git merge origin main
(This may be equivalent to "Update your branch from main" if you are using a git GUI)
If you are not able to manage the conflicts, reach out for help before continuing 😄.
If there are no conflicts and you are ready, merge the PR into the main branch and delete the update branch you made for your changes.
Merging the PR should kick off the Deploy Gatsby Site to Pages workflow automatically. Check the status of that workflow on its actions page. Once the workflow completes, go to https://strudel.science/strudel-web and make sure your changes are there and that there were no unintended consequences.
NOTE: This process is still a work in progress. Right now, this will not replace any content on the official strudel.science site.
If the staging websites looks good, go to the actions page for the Copy Build to Production Repo workflow. Click the "Run workflow" dropdown, ensure that the main branch is selected, then click the "Run workflow" button. This will create build files for the website and copy them to the strudel-web-prod repo. This will automatically trigger a new deployment to the production website at https://strudel.science.
Go to the the production website at https://strudel.science and confirm that everything looks as expected.
You're done!
There are two possible ways that content gets loaded into the website:
- Markdown (.mdx) files in the
contentdirectory - React page components in the
src/pagesdirectory
Files in the content directory can be used as source data for pages on the website. The subdirectories inside content are purely organizational and have no impact on the website, except for the images directory whose location gets referenced around the app.
The markdown files should all use the .mdx extension. MDX is a special kind of markdown file that can accept JSX code (e.g. React components, HTML) as well as regular markdown. Read more about MDX here.
For a markdown file to be turned into a page, you must add an id to the top of the file. To do this you use a YAML syntax called frontmatter which let's you add your own metadata to markdown files. For example, the comparison.mdx file in content/design-system/task-flows has the following at the top of the file:
---
id: 'task-flows-compare-data'
---
This is the syntax for adding metadata. Be sure to follow it exactly. The id can be any string value, but it is best to follow this convention for markdown pages: all lowercase kabob-case parent-section-filename.
To actually create a web page from the markdown file, you must add a page object to config/strudel-config.json. The strudel-config.json file determines the navigation links and structure that are rendered on the site as well as which markdown files are turned into pages.
If an object within the config's pages array has a markdownId, then the content of that page will be sourced from the markdown file in the content directory that has an id that matches the markdownId.
For example, take the following page object from strudel-config.json:
{
"name": "Comparison",
"path": "/design-system/task-flows/comparison",
"markdownId": "task-flows-compare-data",
"layoutComponent": "PageLayout"
},This tells the sidebar menu to render a link to "/design-system/task-flows/comparison" with the text "Comparison". It also looks for a markdown file in the content directory that has id: task-flows-compare-data. The layoutComponent property is telling the app which layout component to use to wrap the markdown content in.
The path you supply to the object should be the full absolute path to the URL that should render the page.
The pages array in strudel-config.json is an ordered nested array. The top-level objects are rendered as links in the top Navbar. Children of top-level objects are rendered in the sidebar for their respective parent section. Children of second-level objects are rendered in a collapsible menu within the sidebar. The config only supports three levels of nesting for pages.
React component files in the pages directory are automatically recognized by Gatsby as pages in the website. The filename and subdirectory names are used to create the path name in the app router. For example, the file pages/about/team.tsx would be rendered at the path /about/team. If the filename is index.tsx, then it will be rendered at the root path of the directory it is in. For example pages/index.tsx is the home page of the app rendered at the path /.
Inside your .tsx file you can build a TypeScript React component just as you normally would. You can import other components, add functions, load data, or anything else. The only requirement is that you make the component the default export. Learn more about React here. Below is a minimal example of a page component:
import * as React from 'react';
import BaseLayout from '../../components/layouts/BaseLayout';
const TeamPage: React.FC = () => {
return (
<BaseLayout>
<Typography variant="h1">My Team Page</Typography>
</BaseLayout>
);
};
export default TeamPageThis website is built with Gatsby, a React-based framework for building websites.
-
Prerequisites
-
Clone the repo and install dependencies
Clone the strudel repo onto your local machine.
git clone git@github.com:strudel-science/strudel-web.git
Navigate into the new strudel directory and install the dependencies.
cd strudel-web npm install --legacy-peer-depsThe
--legacy-peer-depsflag is required any time you usenpm installin this repo. This is because the gatsby-theme-material-ui library does not fully support gatsby 5.x.x yet, however there are currently no issues using them together. -
Start developing.
Start up the strudel site with gatsby.
npm start
-
Open the code and start customizing!
Your site is now running at http://localhost:8000!
Edit
src/pages/index.tsxto see your site update in real-time! -
Learn more
If you don't see your change reflected right away, you may need to cancel the running process (ctrl + C) and restart the app (npm start).
If new packages have been added to the project since since your last merge, you will need to run npm install --legacy-peer-deps to install the new packages.
If you've made configuration changes you may also need to run npm run clean aka (gatsby clean) before restarting the app.
The Scientific sofTware Research for User experience, Design, Engagement, and Learning project (STRUDEL) is a planning framework and design system for scientific software towards improving the usability and user interfaces. It is funded by the Alfred P. Sloan Foundation and is based at the Lawrence Berkeley National Laboratory.
The STRUDEL team includes:
- Lavanya Ramakrishnan (PI)
- Rajshree Deshmukh
- Dan Gunter
- Drew Paine
- Sarah Poon
- Cody O'Donnell