Skip to content
Merged
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
89 changes: 83 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -269,46 +269,123 @@ gravitykit.dev/

### repos-config.json

Central configuration file mapping products to GitHub repositories:
Central configuration file mapping products to GitHub repositories. This file controls repository cloning, documentation generation, and navigation structure.

#### Schema Overview

```json
{
"$schema": "./repos-config.schema.json",
"reposDir": "./repos",
"outputDir": "./docs",
"defaults": {
"branch": "develop",
"ignoreFiles": ["**/vendor/**", "**/node_modules/**"],
"ignoreHooks": ["deprecated_*", "private_*"]
"ignoreHooks": ["deprecated_*", "private_*"],
"customFields": {
"since": true,
"deprecated": true,
"internal": false,
"example": true
}
},
"categories": {
"gravityview": {
"label": "GravityView",
"position": 1
},
"gravityview-extensions": {
"label": "Extensions",
"parent": "gravityview",
"position": 2
}
},
"products": [
{
"id": "gravityview",
"repo": "GravityKit/GravityView",
"label": "GravityView",
"routeBasePath": "docs/gravityview"
"category": "gravityview",
"purchaseUrl": "https://www.gravitykit.com/products/gravityview/"
}
]
}
```

#### Top-Level Fields

| Field | Type | Description |
|-------|------|-------------|
| `reposDir` | string | Directory where repos are cloned (default: `./repos`) |
| `outputDir` | string | Directory for generated documentation (default: `./docs`) |
| `defaults` | object | Default settings applied to all products |
| `categories` | object | Navigation groupings for the site navbar |
| `products` | array | List of product configurations |

#### Categories

Categories control how products are grouped in the site navigation. Each category can have:

| Field | Type | Description |
|-------|------|-------------|
| `label` | string | Display name in navigation |
| `parent` | string | Parent category ID (for nested dropdowns) |
| `position` | number | Sort order in navigation |

**Current category structure:**
- `gravityview` - Main GravityView dropdown
- `gravityview-extensions` - Extensions submenu
- `gravityview-layouts` - Layouts submenu
- `gravitykit` - GravityKit Products dropdown
- `gravity-forms` - Gravity Forms Add-Ons dropdown

#### Product Fields

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `id` | string | Yes | Unique identifier, used in URLs (e.g., `gravityview`) |
| `repo` | string | Yes | GitHub repository path (e.g., `GravityKit/GravityView`) |
| `label` | string | Yes | Display name (e.g., `GravityView`) |
| `category` | string | Yes | Category ID for navigation grouping |
| `purchaseUrl` | string | No | URL to product purchase page |
| `isFree` | boolean | No | Set to `true` for free products |
| `branch` | string | No | Override default branch |
| `ignoreFiles` | array | No | Additional glob patterns to ignore |
| `ignoreHooks` | array | No | Additional hook patterns to ignore |

### Adding a New Product

1. Add an entry to `repos-config.json`:
1. Add an entry to `repos-config.json` under `products`:

```json
{
"id": "new-product",
"repo": "GravityKit/NewProduct",
"label": "New Product Name",
"routeBasePath": "docs/new-product"
"category": "gravitykit",
"purchaseUrl": "https://www.gravitykit.com/products/new-product/"
}
```

2. If needed, add a new category:

```json
{
"categories": {
"new-category": {
"label": "New Category",
"position": 4
}
}
}
```

2. Regenerate documentation:
3. Regenerate documentation:

```bash
npm run repos:clone -- --product new-product
npm run hooks:generate -- --product new-product
npm run api:generate -- --filter new-product
```

## Deployment
Expand Down
111 changes: 101 additions & 10 deletions docusaurus.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,103 @@ const llms_sitemap_paths = [
...products_with_docs.map((product) => `docs/${product.id}/llms.txt`),
];

// Generate navigation items from products
const product_nav_items = config_products
.filter((product) => product?.label && product?.id)
.map((product) => ({
label: product.label,
href: `/docs/${product.id}/`,
}));
// Generate navigation items grouped by category
const categories = repos_config.categories || {};

// Helper to get products by category
function getProductsByCategory(categoryId) {
return config_products
.filter((p) => p?.category === categoryId && p?.label && p?.id)
.map((p) => ({
label: p.label,
href: `/docs/${p.id}/`,
}));
}

// Helper to get free add-ons (products with isFree: true)
function getFreeProducts() {
return config_products
.filter((p) => p?.isFree === true && p?.label && p?.id)
.map((p) => ({
label: p.label,
href: `/docs/${p.id}/`,
}));
}

// Helper to get third-party products (products with isThirdParty: true)
function getThirdPartyProducts() {
return config_products
.filter((p) => p?.isThirdParty === true && p?.label && p?.id)
.map((p) => ({
label: p.label,
href: `/docs/${p.id}/`,
}));
}

// Build GravityView dropdown with nested extensions and layouts
const gravityview_nav = {
label: 'GravityView',
position: 'left',
items: [
{ label: 'GravityView', href: '/docs/gravityview/' },
{
type: 'html',
value: '<hr class="dropdown-separator">',
},
{
type: 'html',
value: '<span class="dropdown-heading">Extensions</span>',
className: 'dropdown-heading-item',
},
...getProductsByCategory('gravityview-extensions'),
{
type: 'html',
value: '<hr class="dropdown-separator">',
},
{
type: 'html',
value: '<span class="dropdown-heading">Layouts</span>',
className: 'dropdown-heading-item',
},
...getProductsByCategory('gravityview-layouts'),
],
};

// Build GravityKit Products dropdown (includes GravityView, free add-ons, and third-party)
const gravitykit_nav = {
label: 'GravityKit Products',
position: 'left',
items: [
...getProductsByCategory('gravitykit'),
{ label: 'GravityView', href: '/docs/gravityview/' },
{
type: 'html',
value: '<hr class="dropdown-separator">',
},
{
type: 'html',
value: '<span class="dropdown-heading">Free Add-Ons</span>',
className: 'dropdown-heading-item',
},
...getFreeProducts(),
{
type: 'html',
value: '<hr class="dropdown-separator">',
},
{
type: 'html',
value: '<span class="dropdown-heading">Third Party</span>',
className: 'dropdown-heading-item',
},
...getThirdPartyProducts(),
],
};

// Helper to get purchase URL for a product from repos-config.json
function getProductPurchaseUrl(productId) {
const product = config_products.find((p) => p.id === productId);
return product?.purchaseUrl || null;
}

// Generate docs plugins for each product
// Documentation is generated to ./docs/{product-id}/
Expand Down Expand Up @@ -273,10 +363,11 @@ const config = {
src: 'img/gravitykit-icon.svg',
},
items: [
gravitykit_nav,
gravityview_nav,
{
label: 'Products',
position: 'left',
items: product_nav_items,
type: 'custom-productLearnMoreLink',
position: 'right',
},
],
},
Expand Down
Loading