Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions .github/workflows/website.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

name: Website

on:
push:
branches:
- main
paths:
- "website/**"
- ".github/workflows/website.yml"
# The provider catalog and included code snippets must stay in sync
# with the workspace, so Rust-side changes also validate the website.
- "Cargo.toml"
- "reqsign/**"
- "core/**"
- "context/**"
- "services/**"
pull_request:
branches:
- main
paths:
- "website/**"
- ".github/workflows/website.yml"
- "Cargo.toml"
- "reqsign/**"
- "core/**"
- "context/**"
- "services/**"

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
# docusaurus.config.js resolves the released version from Git tags.
fetch-depth: 0

- uses: actions/setup-node@v6
with:
node-version: 24

- name: Enable pnpm
run: corepack enable

- name: Install dependencies
working-directory: website
run: pnpm install --frozen-lockfile

- name: Validate provider catalog against cargo metadata
working-directory: website
run: node scripts/validate-providers.mjs

- name: Build (fails on broken internal links)
working-directory: website
run: pnpm build

- name: Check for third-party runtime assets
working-directory: website
run: node scripts/check-external-assets.mjs
2 changes: 2 additions & 0 deletions licenserc.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ builtin = "Apache-2.0-ASF"

[files]
includes = ["**/*.rs", "**/*.yml", "**/*.yaml", "**/*.toml"]
# Generated files cannot carry license headers.
excludes = ["website/pnpm-lock.yaml"]
15 changes: 15 additions & 0 deletions website/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Dependencies
node_modules/

# Production build
build/

# Generated files
.docusaurus/
.cache-loader/

# Misc
.DS_Store
npm-debug.log*
yarn-debug.log*
yarn-error.log*
110 changes: 110 additions & 0 deletions website/DESIGN_SYSTEM.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->

# Reqsign Design System

> **Build. Sign. Send.** An engineering-grade visual language for Apache
> Reqsign™ — sharing its skeleton with the Apache OpenDAL™ website, carrying
> its own signature.

This document is the source of truth for Reqsign's web visual language. The
landing page (`src/pages/index.jsx`) is its first full application; docs and
providers pages inherit it through Infima variable mapping.

## 1. Skeleton and identity

The system deliberately splits into two layers with different change rules:

**Shared skeleton — inherited from the [OpenDAL Design System]
(https://github.com/apache/opendal/blob/main/website/DESIGN_SYSTEM.md), kept
in sync (see `UPSTREAM_DESIGN.md`):**

- Engineering-minimal, light-first; dark mode is a fully designed peer.
- Near-monochrome ink palette (`--rs-ink-*`).
- System sans and system mono only — zero web-font requests, zero layout
shift, ASF-privacy-friendly. The mono stack doubles as a brand voice for
labels, indices, and figures.
- 4px spacing rhythm; 1200px container with responsive gutters.
- Hairline structure: 1px borders, 1px grid gaps, restrained radius/shadow.
- Code-first, content-first layouts.
- CSS-only progressive motion honoring `prefers-reduced-motion`.

**Reqsign identity — intentional divergence, never synced from upstream:**

- **Seal green** (`--rs-green-*`) replaces OpenDAL's precise blue as the
single accent. Green-700 `#0a7048` is the light-mode accent (≥ 4.5:1 on
white); green-300 `#6fd6a8` is the dark-mode accent. In dark mode, primary
actions invert to a bright-green surface with ink text — white-on-green
cannot reach AA there.
- **The signature stroke** replaces OpenDAL's solid bar: the same solid
quadrilateral, slanted by `--rs-stroke-skew` (−14°). Where the OpenDAL bar
sits level like a storage layer, the Reqsign stroke leans forward like a
pen closing a signature. Used in the eyebrow marker (`.rs-eyebrow::before`),
the standalone `.rs-stroke`, the logo, and the favicon.
- **Wordmark**: the stroke plus "Reqsign" in the system stack
(`static/img/logo.svg`, `logo_dark.svg`). The full `Apache Reqsign™` name
appears in the page title, hero eyebrow, and footer attribution rather than
inside the mark.

## 2. Where the system lives

| Concern | Location |
| --- | --- |
| Tokens + Infima mapping + motif | `src/css/custom.css` |
| Landing sections | `src/components/landing/sections.jsx` |
| Landing content model | `src/components/landing/data.js` |
| Code window / provider tabs | `src/components/landing/CodeTabs.jsx` |
| Landing styles | `src/components/landing/styles.module.css` |
| Provider facts &amp; matrix (embedded in docs) | `src/components/providers/` |

## 3. Token layers

1. **Primitives** — raw values: `--rs-ink-*`, `--rs-green-*`, type scale,
spacing, radius, motion.
2. **Semantic** — theme-aware roles: `--rs-bg`, `--rs-fg`, `--rs-accent`,
`--rs-action-*`, `--rs-stroke`. Components consume these, never
primitives.
3. **Infima projection** — semantic tokens mapped onto `--ifm-*` so docs,
navbar, and footer inherit the system without per-page styling.

The accent is replaceable at exactly one place (the semantic layer); nothing
downstream hard-codes a color.

## 4. Rules that keep it coherent

- One accent. Green marks interaction and emphasis; everything else is ink.
- The stroke stays sharp (no radius) and always skewed by the shared token.
- Mono for labels/metrics/eyebrows; sans for prose. Never mix per element.
- Light and dark ship together: every surface, chip, and code window is
designed in both before landing.
- Accessibility gates: WCAG 2.1 AA contrast in both modes,
`:focus-visible` outlines, keyboard-reachable tabs and navigation,
`prefers-reduced-motion` honored by every animation.
- No third-party runtime assets — fonts, scripts, styles, and images are
self-hosted (`scripts/check-external-assets.mjs` enforces this after every
build).

## 5. Content rules

- Capability numbers and provider lists derive from `data/providers.json`;
the page must not hand-write claims the catalog cannot back.
- Code shown on the landing page mirrors compiled examples
(`reqsign/examples/`) or in-tree doc tests; docs snippets include real
files via `remark-include-code`.
- Copy states what is verified, never "every cloud".
76 changes: 76 additions & 0 deletions website/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->

# Reqsign Website

The Apache Reqsign™ website — a [Docusaurus](https://docusaurus.io/) site
targeting `https://reqsign.apache.org/`.

## Development

```bash
pnpm install
pnpm start # dev server
pnpm build # production build into build/
pnpm serve # serve the production build locally
```

Requires Node ≥ 24.17 and pnpm 11 (`corepack enable`).

## Checks

```bash
pnpm validate-providers # catalog ↔ cargo metadata consistency
pnpm build # also fails on broken internal links
pnpm check-external-assets # no third-party runtime assets (run after build)
```

## Layout

| Path | Purpose |
| --- | --- |
| `data/providers.json` | Provider capability catalog — the single source of truth for every capability claim; validated in CI |
| `docs/` | Concept, guide, contract, compatibility, and provider documentation |
| `docs/providers/` | One page per provider: capability facts render from the catalog via `ProviderFacts`; provider-specific prose lives in the MDX. The validator requires a page per catalog entry |
| `src/pages/` | Landing page, `/download`, `/community` |
| `src/components/landing/` | Landing sections and content model |
| `src/components/providers/` | `ProviderFacts` and `ProvidersMatrix`, the catalog-rendering components embedded in docs pages |
| `plugins/remark-include-code.js` | Includes real repository files into docs code blocks |
| `scripts/` | Catalog validator and external-asset check |
| `DESIGN_SYSTEM.md` | Visual language: shared skeleton + Reqsign identity |
| `UPSTREAM_DESIGN.md` | Provenance and sync procedure for design reused from the OpenDAL website |

## Editing rules

- **Provider capabilities** change in `data/providers.json` (with source
refs), never directly in page copy. Run the validator.
- **Code snippets** in docs come from compiled sources via
` ```rust file=path/to/file.rs ` fences where possible; landing snippets
mirror `reqsign/examples/` and in-tree doc tests.
- **Design changes** to shared-skeleton styles should go through the sync
procedure in `UPSTREAM_DESIGN.md`; Reqsign-identity overrides (accent,
stroke motif, wordmark) are documented there and never synced.

## Environment variables

| Variable | Effect |
| --- | --- |
| `REQSIGN_WEBSITE_URL` | Overrides the canonical site URL |
| `REQSIGN_WEBSITE_BASE_URL` | Overrides `baseUrl` (fallback deployments) |
| `REQSIGN_WEBSITE_STAGING=true` | Marks the build as staging: sets `noIndex` |
81 changes: 81 additions & 0 deletions website/UPSTREAM_DESIGN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->

# Upstream Design Provenance

The Reqsign website reuses the Apache OpenDAL™ website's design skeleton.
This file records where each reused piece came from, what was intentionally
changed, and how to sync future upstream improvements.

## Source

- **Repository:** [apache/opendal](https://github.com/apache/opendal),
`website/` directory
- **Copied at commit:** `54b8392b6e2a26a74dc037e8878729aae4d2eb40`
(2026-07-07)
- **Last sync:** 2026-08-01 (initial import)

## Copied files and their fate

| Reqsign file | Upstream file | Relationship |
| --- | --- | --- |
| `src/css/custom.css` | `src/css/custom.css` | Skeleton kept; brand overrides (see below) |
| `src/components/landing/CodeTabs.jsx` | same path | Verbatim (mechanical rename only) |
| `src/components/landing/styles.module.css` | same path | Skeleton kept; OpenDAL-only sections (logo wall, bindings, layers) removed; Reqsign sections (flow, chooser, providers, adoption) added |
| `src/components/landing/sections.jsx` | same path | Structure reused; content and section set are Reqsign's |
| `src/components/landing/data.js` | same path | Pattern reused; all content is Reqsign's, stats derive from `data/providers.json` |
| `plugins/remark-include-code.js` | same path | Verbatim |
| `docusaurus.config.js` | same path | Pattern reused; Reqsign URLs, no blog, no community docs instance |
| `static/img/asf_logo_wide.svg` | same path | Verbatim (ASF asset) |

## Mechanical transforms (applied on every sync)

- `--odl-` → `--rs-` (CSS custom properties)
- `odl-` → `rs-` (global class names: `rs-container`, `rs-eyebrow`,
`rs-grid-bg`, `rs-tabular`)
- `odlFade` / `odlReveal` keyframes → `rsFade` / `rsReveal`

## Intentional brand overrides (never sync these)

| Token / element | Upstream (OpenDAL) | Reqsign |
| --- | --- | --- |
| Accent palette | Precise blue `--odl-blue-*` (canonical `#1e54e0`) | Seal green `--rs-green-*` (light accent `#0a7048`, dark accent `#6fd6a8`) |
| Dark-mode primary action | Blue surface, white text | Bright green surface (`green-400`), ink text — AA requires the inversion |
| Motif | Solid level bar (from the OpenDAL wordmark) | Signature stroke: same bar skewed `−14deg` (`--rs-stroke-skew`) |
| `.odl-bar` | level rectangle | `.rs-stroke`, skewed |
| Eyebrow marker | level accent bar | skewed accent stroke |
| Logo / favicon | OpenDAL wordmark assets | Reqsign stroke + wordmark (`logo.svg`, `logo_dark.svg`, `favicon.svg`) |
| Sidebar language logos | `sidebar-lang-*` rules + `static/img/bindings/` | Removed (not applicable) |

Everything not listed above is *skeleton*: a difference found there against
upstream is drift, not identity — either sync it or record it here.

## Sync procedure

1. Diff upstream `website/` between the recorded commit and its current
`main` for the copied files above.
2. Port skeleton changes, applying the mechanical transforms.
3. Skip any hunk touching an intentional override; if upstream restructured
around one, adapt while preserving the Reqsign value.
4. Verify: `pnpm build`, `node scripts/validate-providers.mjs`,
`node scripts/check-external-assets.mjs`, and a light/dark visual pass at
375/768/1024/1440 px.
5. Update the commit hash and sync date at the top of this file.

Check monthly; sync only when upstream changes shared tokens or components.
Loading
Loading