Skip to content

Commit

Permalink
Merge branch 'main' into tobbe-rsc-rsa-extract-fetch
Browse files Browse the repository at this point in the history
  • Loading branch information
Tobbe authored Sep 25, 2024
2 parents c1cac80 + 6ee01ce commit 349f80b
Show file tree
Hide file tree
Showing 251 changed files with 98,969 additions and 65 deletions.
28 changes: 14 additions & 14 deletions docs/docs/tutorial/chapter0/what-is-redwood.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ You can also prerender pages that contain variables pulled from the URL, like th

This is Redwood's version of static site generation, aka SSG.

#### Accessibility

Redwood includes a couple of components to [aid screen readers](https://redwoodjs.com/docs/accessibility) in properly navigating your app. The `<RouteAnnouncement>` component tells a screen reader to read something aloud, even though it isn't visible in the browser. And the `<RouteFocus>` tells a reader to skip verbose navigation options at the top of a page and get to the content.

### Authentication

The `<PrivateSet>` route limits access to users that are authenticated, but how do they authenticate? Redwood includes integrations to many popular third party authentication hosts (including [Auth0](https://auth0.com/), [Supabase](https://supabase.com/docs/guides/auth) and [Clerk](https://clerk.com/)). You can also [host your own auth](https://redwoodjs.com/docs/auth/dbauth), or write your own [custom authentication](https://redwoodjs.com/docs/auth/custom) option. If going self-hosted, we include login, signup, and reset password pages, as well as the option to include TouchID/FaceID and third party biometric readers!
Expand All @@ -76,13 +80,13 @@ The homepage is accessible _without_ being logged in, browsing to `/` will load

Redwood uses GraphQL as the glue between the front- and backends: whenever you want data from the server/database, you're going to retrieve it via GraphQL. Now, we could have just given you raw access to some GraphQL library and let you make those calls yourself. We use [Apollo Client](https://www.apollographql.com/apollo-client) on the frontend and Apollo provides hooks like [useQuery()](https://www.apollographql.com/tutorials/lift-off-part1/10-the-usequery-hook) and [useMutation()](https://www.apollographql.com/tutorials/lift-off-part4/08-the-usemutation-hook) to retrieve and set data, respectively. But Redwood has a much deeper integration.

What if you could have a component that was not only responsible for its own display _but even its own data retrieval_? Meaning everything that component needed in order to display itself could all be self-contained. That includes the code to display while the data is loading, or if something goes wrong. These kinds of uber-components are real, and Redwood calls "cells."
What if you could have a component that was not only responsible for its own display _but even its own data retrieval_? Meaning everything that component needed in order to display itself could all be self-contained. That includes the code to display while the data is loading, or if something goes wrong. These kinds of uber-components are real, and Redwood calls them "cells."

### Cells

A cell is still just a React component (also called a [single file component](https://www.swyx.io/react-sfcs-here)), it just happens to follow a couple of conventions that make it work as described above:

1. The name of the file ends in `Cell"
1. The name of the file ends in "Cell"
2. The file exports several named components, at the very least one named `QUERY` and another named `Success`
3. The file can optionally export several other components, like `Loading`, `Failure` and `Empty`. You can probably guess what those are for!

Expand Down Expand Up @@ -138,10 +142,6 @@ You can also directly manipulate the cache to add or remove entries, or even use

If you're familiar with GraphQL then you know that on the backend you define the structure of data that GraphQL queries will return with "resolvers." But GraphQL itself doesn't know anything about talking to databases. How does the raw data in the database make it into those resolvers? That's where our next package comes in.

### Accessibility

Redwood includes a couple of components to [aid screen readers](https://redwoodjs.com/docs/accessibility) in properly navigating your app. The `<RouteAnnouncement>` component tells a screen reader to read something aloud, even though it isn't visible in the browser. And the `<RouteFocus>` tells a reader to skip verbose navigation options at the top of a page and get to the content.

## The Backend

Now we're into the backend code in the `api` directory.
Expand Down Expand Up @@ -311,16 +311,16 @@ The entire framework is ([strictly](https://redwoodjs.com/docs/typescript/strict

Redwood's job doesn't end until your application is deployed to the world! That's why we include deploy commands and config to get your app running on the most popular hosts (whether they are serverless or traditional server infrastructure) including:

- [AWS](https://aws.amazon.com/)
- [Vercel](https://vercel.com/)
- [Google Cloud](https://cloud.google.com/)
- [Azure](https://azure.microsoft.com/en-us/)
- [Render](https://render.com/)
- [Flightcontrol](https://www.flightcontrol.dev/)
- [Netlify](https://www.netlify.com/)
- [Coherence (GWC/AWS)](https://www.withcoherence.com/)
- [Flightcontrol.dev (AWS)](https://www.flightcontrol.dev?ref=redwood)
- [Edg.io](https://edg.io)
- [Netlify.com](https://www.netlify.com/)
- [Render.com](https://render.com)
- [Serverless.com](https://serverless.com)
- [Vercel.com](https://vercel.com)
- anywhere [Docker](https://www.docker.com) is accepted

You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy).
* You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy)!

## Coming Soon

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,16 +309,15 @@ The entire framework is ([strictly](https://redwoodjs.com/docs/typescript/strict

Redwood's job doesn't end until your application is deployed to the world! That's why we include deploy commands and config to get your app running on the most popular hosts (whether they are serverless or traditional server infrastructure) including:

* [AWS](https://aws.amazon.com/)
* [Vercel](https://vercel.com/)
* [Google Cloud](https://cloud.google.com/)
* [Azure](https://azure.microsoft.com/en-us/)
* [Render](https://render.com/)
* [Flightcontrol](https://www.flightcontrol.dev/)
* [Netlify](https://www.netlify.com/)
* anywhere [Docker](https://www.docker.com) is accepted

You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy).
- [Coherence (GWC/AWS)](https://www.withcoherence.com/)
- [Flightcontrol.dev (AWS)](https://www.flightcontrol.dev?ref=redwood)
- [Edg.io](https://edg.io)
- [Netlify.com](https://www.netlify.com/)
- [Render.com](https://render.com)
- [Serverless.com](https://serverless.com)
- [Vercel.com](https://vercel.com)

* You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy)!

## Coming Soon

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,17 +309,15 @@ The entire framework is ([strictly](https://redwoodjs.com/docs/typescript/strict

Redwood's job doesn't end until your application is deployed to the world! That's why we include deploy commands and config to get your app running on the most popular hosts (whether they are serverless or traditional server infrastructure) including:

* [AWS](https://aws.amazon.com/)
* [Vercel](https://vercel.com/)
* [Google Cloud](https://cloud.google.com/)
* [Azure](https://azure.microsoft.com/en-us/)
* [Render](https://render.com/)
* [Flightcontrol](https://www.flightcontrol.dev/)
* [Netlify](https://www.netlify.com/)
* anywhere [Docker](https://www.docker.com) is accepted

You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy).

- [Coherence (GWC/AWS)](https://www.withcoherence.com/)
- [Flightcontrol.dev (AWS)](https://www.flightcontrol.dev?ref=redwood)
- [Edg.io](https://edg.io)
- [Netlify.com](https://www.netlify.com/)
- [Render.com](https://render.com)
- [Serverless.com](https://serverless.com)
- [Vercel.com](https://vercel.com)

* You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy)!
## Coming Soon

Redwood is still in active development, and we're working on some [features](https://community.redwoodjs.com/c/experimental-features/25) that are on the cutting edge of the React ecosystem:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,17 +309,15 @@ The entire framework is ([strictly](https://redwoodjs.com/docs/typescript/strict

Redwood's job doesn't end until your application is deployed to the world! That's why we include deploy commands and config to get your app running on the most popular hosts (whether they are serverless or traditional server infrastructure) including:

* [AWS](https://aws.amazon.com/)
* [Vercel](https://vercel.com/)
* [Google Cloud](https://cloud.google.com/)
* [Azure](https://azure.microsoft.com/en-us/)
* [Render](https://render.com/)
* [Flightcontrol](https://www.flightcontrol.dev/)
* [Netlify](https://www.netlify.com/)
* anywhere [Docker](https://www.docker.com) is accepted

You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy).

- [Coherence (GWC/AWS)](https://www.withcoherence.com/)
- [Flightcontrol.dev (AWS)](https://www.flightcontrol.dev?ref=redwood)
- [Edg.io](https://edg.io)
- [Netlify.com](https://www.netlify.com/)
- [Render.com](https://render.com)
- [Serverless.com](https://serverless.com)
- [Vercel.com](https://vercel.com)

* You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy)!
## Coming Soon

Redwood is still in active development, and we're working on some [features](https://community.redwoodjs.com/c/experimental-features/25) that are on the cutting edge of the React ecosystem:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,17 +311,16 @@ The entire framework is ([strictly](https://redwoodjs.com/docs/typescript/strict

Redwood's job doesn't end until your application is deployed to the world! That's why we include deploy commands and config to get your app running on the most popular hosts (whether they are serverless or traditional server infrastructure) including:

- [AWS](https://aws.amazon.com/)
- [Vercel](https://vercel.com/)
- [Google Cloud](https://cloud.google.com/)
- [Azure](https://azure.microsoft.com/en-us/)
- [Render](https://render.com/)
- [Flightcontrol](https://www.flightcontrol.dev/)
- [Netlify](https://www.netlify.com/)
- [Coherence (GWC/AWS)](https://www.withcoherence.com/)
- [Flightcontrol.dev (AWS)](https://www.flightcontrol.dev?ref=redwood)
- [Edg.io](https://edg.io)
- [Netlify.com](https://www.netlify.com/)
- [Render.com](https://render.com)
- [Serverless.com](https://serverless.com)
- [Vercel.com](https://vercel.com)
- anywhere [Docker](https://www.docker.com) is accepted

You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy).

* You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy)!
## Coming Soon

Redwood is still in active development, and we're working on some [features](https://community.redwoodjs.com/c/experimental-features/25) that are on the cutting edge of the React ecosystem:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,17 +311,16 @@ The entire framework is ([strictly](https://redwoodjs.com/docs/typescript/strict

Redwood's job doesn't end until your application is deployed to the world! That's why we include deploy commands and config to get your app running on the most popular hosts (whether they are serverless or traditional server infrastructure) including:

- [AWS](https://aws.amazon.com/)
- [Vercel](https://vercel.com/)
- [Google Cloud](https://cloud.google.com/)
- [Azure](https://azure.microsoft.com/en-us/)
- [Render](https://render.com/)
- [Flightcontrol](https://www.flightcontrol.dev/)
- [Netlify](https://www.netlify.com/)
- [Coherence (GWC/AWS)](https://www.withcoherence.com/)
- [Flightcontrol.dev (AWS)](https://www.flightcontrol.dev?ref=redwood)
- [Edg.io](https://edg.io)
- [Netlify.com](https://www.netlify.com/)
- [Render.com](https://render.com)
- [Serverless.com](https://serverless.com)
- [Vercel.com](https://vercel.com)
- anywhere [Docker](https://www.docker.com) is accepted

You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy).

* You can even deploy to your own server via SSH commands (we call that our [Baremetal](../../deploy/baremetal.md) deploy)!
## Coming Soon

Redwood is still in active development, and we're working on some [features](https://community.redwoodjs.com/c/experimental-features/25) that are on the cutting edge of the React ecosystem:
Expand Down
5 changes: 5 additions & 0 deletions docs/versioned_docs/version-8.2/ReactPlayer.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use client'

import ReactPlayer from 'react-player'

export default ReactPlayer
170 changes: 170 additions & 0 deletions docs/versioned_docs/version-8.2/a11y.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
---
slug: accessibility
description: Accessibility is a core feature that's built-in
---

# Accessibility (aka a11y)

We built Redwood to make building websites more accessible (we write all the config so you don't have to), but Redwood's also built to help you make more accessible websites.
Accessibility shouldn't be a nice-to-have.
It should be a given from the start.
A core feature that's built-in and well-supported.

There's a lot of great tooling out there that'll not only help you build accessible websites, but also help you learn exactly what that means.

> **Does tooling obviate the need for manual testing?**
>
> No—even with all the tooling in the world, manual testing is still important, especially for accessibility.
> But just because tooling doesn't catch everything doesn't mean it's not valuable.
> It'd be much harder to learn what to look for without it.
## Accessible Routing

For single-page applications (SPAs), accessibility starts with the router.
Without a full-page refresh, you just can't be sure that things like announcements and focus are being taken care of the way they're supposed to be.
Here's a great example of [how disorienting SPAs can be to screen-reader users](https://www.youtube.com/watch?v=NKTdNv8JpuM).
On navigation, nothing's announced.
The lack of an announcement isn't just buggy behavior—it's broken.

Normally, the onus would be on you as a developer to announce to screen-reader users that they've navigated somewhere new.
That's a lot to ask—and hard to get right—especially when you're just trying to build your app.

Luckily, if you're writing thoughtful content and marking it up semantically, there's nothing you have to do!
The router automatically announces pages on navigation, and looks for announcements in this order:

1. The `RouteAnnouncement` component
2. The page's `<h1>`
3. `document.title`
4. `location.pathname`

The reason for this order is that announcements should be as specific as possible.
more specific usually means more descriptive, and more descriptive usually means that users can not only orient themselves and navigate through the content, but also find it again.

> If you're not sure if your content is descriptive enough, see the [W3 guidelines](https://www.w3.org/WAI/WCAG21/Techniques/general/G88.html).
Even though Redwood looks for a `RouteAnnouncement` component first, you don't have to have one on every page—it's more than ok for the `<h1>` to be what's announced.
`RouteAnnouncement` is there for when the situation calls for a custom announcement.

### `RouteAnnouncement`

The way `RouteAnnouncement` works is simple: its children will be announced.
Note that this can be something on the page or can be something that's visually hidden using the `visuallyHidden` prop:

```jsx title="web/src/pages/HomePage/HomePage.js"
import { RouteAnnouncement } from '@redwoodjs/router'

const HomePage = () => {
return (
// This will still be visible
<RouteAnnouncement>
<h1>Welcome to my site!</h1>
</RouteAnnouncement>
)
}

export default HomePage
```

```jsx title="web/src/pages/AboutPage/AboutPage.js"
import { RouteAnnouncement } from '@redwoodjs/router'

const AboutPage = () => {
return (
<h1>Welcome to my site!</h1>
// This won't be visible
// highlight-start
<RouteAnnouncement visuallyHidden>
All about me
</RouteAnnouncement>
// highlight-end
)
}

export default AboutPage
```

`visuallyHidden` shouldn't be the first thing you reach for—it's good to maintain parity between your site's visual and audible experiences.
But it's there if you need it.

## Focus

On page change, Redwood Router resets focus to the top of the DOM so that users can navigate through the new page.
While this is the expected behavior (and the behavior you usually want), for some pages—especially those with a lot of navigation—it can be cumbersome for users to have tab through navigation before getting to the main point.
(And that goes for every page change!)

Right now, there's two ways to alleviate this: with skip links or the `RouteFocus` component.

### Skip Links

Since the main content isn't usually the first thing on the page, it's a best practice to provide a shortcut for keyboard and screen-reader users to skip to it.
Skip links do just that, and if you generate a layout using the `--skipLink` option, you'll get one with a skip link:

```
yarn rw g layout main --skipLink
```

```jsx title="web/src/layouts/MainLayout/MainLayout.js"
import { SkipNavLink, SkipNavContent } from '@redwoodjs/router'
import '@redwoodjs/router/skip-nav.css'

const MainLayout = ({ children }) => {
return (
<>
<SkipNavLink />
<nav></nav>
<SkipNavContent />
<main>{children}</main>
</>
)
}

export default MainLayout
```

`SkipNavLink` renders a link that remains hidden till focused and `SkipNavContent` renders a div as the target for the link.
The code for these components comes from Reach UI. For more details, see [Reach UI's docs](https://reach.tech/skip-nav/#reach-skip-nav).

One thing you'll probably want to do is change the URL the skip link sends the user to when activated.
You can do that by changing the `contentId` and `id` props of `SkipNavLink` and `SkipNavContent` respectively:

```jsx
<SkipNavLink contentId="main-content" />
{/* ... */}
<SkipNavContent id="main-content" />
```

If you'd prefer to implement your own skip link, [Ben Myers' blog](https://benmyers.dev/blog/skip-links/) is a great resource, and a great place to read about accessibility in general.

### `RouteFocus`

Sometimes you don't want to just skip the nav, but send a user somewhere.
In this situation, you of course have the foresight that that place is where the user wants to be.
So please use this at your discretion—sending a user to an unexpected location can be worse than sending them back the top.

Having said that, if you know that on a particular page change a user's focus is better off being directed to a particular element, the `RouteFocus` component is what you want:

```jsx title="web/src/pages/ContactPage/ContactPage.js"
// highlight-next-line
import { RouteFocus } from '@redwoodjs/router'

const ContactPage = () => (
<nav>
{/* Way too much nav... */}
</nav>

// The contact form the user actually wants to interact with
// highlight-start
<RouteFocus>
<TextField name="name" />
</RouteFocus>
// highlight-end
)

export default ContactPage
```

`RouteFocus` tells the router to send focus to it's child on page change. In the example above, when the user navigates to the contact page, the name text field on the form is focused—the first field of the form they're here to fill out.

<div class="video-container">
<iframe src="https://www.youtube.com/embed/T1zs77LU68w?t=3240" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; modestbranding; showinfo=0; fullscreen"></iframe>
</div>
Loading

0 comments on commit 349f80b

Please sign in to comment.