Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
eeaa392
docs(self-hosting): rewrite the overview as an explanation page
khushalsonawat Jun 26, 2026
8997304
Merge branch 'dev' into docs/self-hosting
khushalsonawat Jun 29, 2026
f427b09
feat(docs): reorder product dropdown by agent lifecycle
khushalsonawat Jun 29, 2026
f6b6bd2
docs: add self-hosting environment variables reference page
abhijaisrivastava15 Jun 29, 2026
6f37ddc
Self-hosting: rework Requirements page, add Requirements + Installati…
Jun 29, 2026
d3431e6
Self-hosting: add Installation page + sidebar entries
Jun 29, 2026
2402c83
docs: align frontmatter with review standards
abhijaisrivastava15 Jul 1, 2026
76f4b8e
docs(self-hosting): address Khushal review on Requirements (#696)
Jul 2, 2026
c19c52d
docs(self-hosting): address Khushal review on Installation (#697)
Jul 2, 2026
e26cb58
docs: add self-hosting environment variables page
abhijaisrivastava15 Jul 2, 2026
02b339f
Merge pull request #693 from future-agi/docs/product-dropdown-order
khushalsonawat Jul 2, 2026
700bc97
docs(self-hosting): rename Installation to Install; fix first-boot an…
khushalsonawat Jul 6, 2026
fe16c59
Merge pull request #697 from future-agi/docs/self-hosting-installation
khushalsonawat Jul 6, 2026
9a218e7
docs(self-hosting): rename Install back to Installation
khushalsonawat Jul 6, 2026
354b76a
docs: restructure self-hosting sidebar; add Production subsection and…
abhijaisrivastava15 Jul 2, 2026
53eb7ab
docs: rewrite Production pages against the real compose/deploy config
abhijaisrivastava15 Jul 3, 2026
07b23e7
docs: production overview themed card groups (no orphan) + fix monito…
abhijaisrivastava15 Jul 3, 2026
60d518c
docs(self-hosting): address round-2 review on Production pages (#705)
khushalsonawat Jul 6, 2026
de5624f
Merge pull request #705 from future-agi/docs/self-hosting-restructure
khushalsonawat Jul 6, 2026
83ae3ab
docs: add self-hosting system configuration page
abhijaisrivastava15 Jun 29, 2026
90fc401
docs: align frontmatter with review standards
abhijaisrivastava15 Jul 1, 2026
d775e2d
docs: address Khushal's review on system configuration
abhijaisrivastava15 Jul 2, 2026
19305bb
docs(self-hosting): point sidebar at nested System configuration; fix…
khushalsonawat Jul 6, 2026
439d83e
Merge branch 'docs/self-hosting' into docs/self-hosting-environment
khushalsonawat Jul 6, 2026
129d27c
Merge pull request #695 from future-agi/docs/self-hosting-system
khushalsonawat Jul 6, 2026
e7b9b84
docs: add self-hosting environment variables page
abhijaisrivastava15 Jul 2, 2026
7f042d5
docs(self-hosting): point sidebar at nested Environment variables; re…
khushalsonawat Jul 6, 2026
1c12330
Absorb remote branch history; keep the rebuilt env-page tree
khushalsonawat Jul 6, 2026
e5100c7
Merge docs/self-hosting (post #695) into docs/self-hosting-environment
khushalsonawat Jul 6, 2026
997a420
Merge pull request #704 from future-agi/docs/self-hosting-environment
khushalsonawat Jul 6, 2026
54249f7
Merge branch 'docs/self-hosting' into docs/self-hosting-requirements
khushalsonawat Jul 6, 2026
cc45752
docs(self-hosting): address review on Requirements; repoint ports anc…
khushalsonawat Jul 6, 2026
e4ba52f
Merge pull request #696 from future-agi/docs/self-hosting-requirements
khushalsonawat Jul 6, 2026
7315d20
docs: restore observe pages and components reverted by branch history…
khushalsonawat Jul 6, 2026
f7f15d8
docs(self-hosting): order System configuration before Environment var…
khushalsonawat Jul 6, 2026
c35cafb
Merge pull request #700 from future-agi/docs/self-hosting
khushalsonawat Jul 6, 2026
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
55 changes: 0 additions & 55 deletions src/components/Breadcrumb.astro

This file was deleted.

210 changes: 0 additions & 210 deletions src/components/SectionSwitcher.astro

This file was deleted.

104 changes: 84 additions & 20 deletions src/components/Sidebar.astro
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,62 @@ function getIconPath(icon?: string): string {
return iconPaths[icon || 'default'] || iconPaths.default;
}

// ── Lifecycle-ordered product dropdown (Docs tab only) ──────────────────────
// Reorders the Docs section dropdown from alphabetical to agent-development-
// lifecycle order, grouped under lightweight phase headers. This is dropdown-only
// and does NOT reorder the `groups` array in navigation.ts, so the page list below
// still follows nav order. "Resources" is intentionally omitted; "Falcon AI" sits
// last; a "Reference" group links out to the Integrations/Guides/SDK/API tabs.
// The dropdown only renders when a tab exposes multiple groups (today that's the
// Docs tab); any other multi-group tab falls back to a single unlabelled list.
interface DropdownItem { title: string; icon: string; href: string; }
interface DropdownSection { phase: string; items: DropdownItem[]; }

const groupLookup = new Map(
allGroups.map(g => [g.group, { icon: g.icon || 'default', href: g.items[0]?.href || '/docs' }])
);
// Single source for turning a group title into a dropdown item.
const toItem = (title: string): DropdownItem => {
const g = groupLookup.get(title);
return { title, icon: g?.icon || 'default', href: g?.href || '/docs' };
};

const phasedOrder: { phase: string; titles: string[] }[] = [
{ phase: 'Start', titles: ['Get Started'] },
{ phase: 'Observe & diagnose', titles: ['Observability', 'Error Feed'] },
{ phase: 'Evaluate & measure', titles: ['Evaluation', 'Simulation', 'Dataset'] },
{ phase: 'Improve', titles: ['Optimization', 'Annotations'] },
{ phase: 'Build & connect', titles: ['Prompt', 'Prototype', 'Agent Playground', 'Knowledge Base', 'Agent Command Center'] },
{ phase: 'Protect', titles: ['Protect'] },
{ phase: 'Assistant', titles: ['Falcon AI'] },
];

// Reference links live in their own top-level tabs; surface them at the bottom.
const referenceItems: DropdownItem[] = [
{ title: 'Integrations', icon: 'plug', href: '/docs/integrations' },
{ title: 'Guides', icon: 'book', href: '/docs/cookbook' },
{ title: 'SDK Reference', icon: 'code', href: '/docs/sdk' },
{ title: 'API Reference', icon: 'webhook', href: '/docs/api' },
];

let dropdownSections: DropdownSection[];
if (isDocsTab) {
dropdownSections = phasedOrder
.map(p => ({ phase: p.phase, items: p.titles.filter(t => groupLookup.has(t)).map(toItem) }))
.filter(s => s.items.length > 0);

// Future-proofing: surface any Docs group not placed above (besides the hidden
// "Resources") under "More" so new products never silently vanish.
const placed = new Set<string>([...phasedOrder.flatMap(p => p.titles), 'Resources']);
const leftovers = allGroups.map(g => g.group).filter(t => !placed.has(t)).map(toItem);
if (leftovers.length) dropdownSections.push({ phase: 'More', items: leftovers });

dropdownSections.push({ phase: 'Reference', items: referenceItems });
} else {
// Other multi-group tabs: one unlabelled section (empty phase hides the header).
dropdownSections = [{ phase: '', items: allGroups.map(g => toItem(g.group)) }];
}

// Infer HTTP method from API endpoint title for sidebar badges
const isApiTab = activeTab?.tab === 'API';

Expand Down Expand Up @@ -139,26 +195,34 @@ function inferApiMethod(title: string): { method: string; css: string } | null {
class="absolute left-3 right-3 mt-1 py-1 bg-[var(--color-bg-secondary)] border border-[var(--color-border-default)] rounded-xl shadow-xl shadow-black/20 z-50 hidden opacity-0 transition-all duration-150 max-h-[60vh] overflow-y-auto hide-scrollbar"
data-section-dropdown
>
{allGroups.map((group) => {
const isCurrent = group.group === activeGroup?.group;
const firstHref = group.items[0]?.href || '/docs';
return (
<a
href={firstHref}
class:list={[
"flex items-center gap-2.5 px-3 py-2 mx-1 rounded-lg text-sm transition-colors",
isCurrent
? "bg-[var(--color-accent-primary)]/10 text-[var(--color-accent-primary)] font-medium"
: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-bg-hover)]"
]}
>
<svg class="w-4 h-4 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d={getIconPath(group.icon)} />
</svg>
<span class="flex-1 truncate">{group.group}</span>
</a>
);
})}
{dropdownSections.map((section, sectionIndex) => (
<div class:list={["px-1", sectionIndex > 0 && "mt-1.5 pt-1.5 border-t border-[var(--color-border-default)]/60"]}>
{section.phase && (
<div class="px-2 py-1">
<span class="text-[11px] font-semibold text-[var(--color-text-muted)] uppercase tracking-wider">{section.phase}</span>
</div>
)}
{section.items.map((item) => {
const isCurrent = item.title === activeGroup?.group;
return (
<a
href={item.href}
class:list={[
"flex items-center gap-2.5 px-3 py-2 rounded-lg text-sm transition-colors",
isCurrent
? "bg-[var(--color-accent-primary)]/10 text-[var(--color-accent-primary)] font-medium"
: "text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] hover:bg-[var(--color-bg-hover)]"
]}
>
<svg class="w-4 h-4 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d={getIconPath(item.icon)} />
</svg>
<span class="flex-1 truncate">{item.title}</span>
</a>
);
})}
</div>
))}
</div>
</div>
)}
Expand Down
Loading
Loading