EverydayTech Platform - Developer Reference
Complete Source Code Documentation - All Applications
Loading...
Searching...
No Matches
DocsLayout.jsx
Go to the documentation of this file.
1import { useMemo, useState } from 'react';
2import { Link, NavLink } from 'react-router-dom';
3import PublicLayout from '../../components/Layout/PublicLayout';
4import { docGroups } from './docsData';
5import './docs.css';
6
7export default function DocsLayout({ children }) {
8 const [q, setQ] = useState('');
9
10 const filtered = useMemo(() => {
11 if (!q.trim()) return docGroups;
12 const query = q.toLowerCase();
13 return docGroups
14 .map((g) => ({
15 ...g,
16 items: g.items.filter((i) =>
17 i.title.toLowerCase().includes(query) ||
18 i.summary?.toLowerCase().includes(query)
19 )
20 }))
21 .filter((g) => g.items.length > 0);
22 }, [q]);
23
24 return (
25 <PublicLayout>
26 <div className="docs-container">
27 <aside className="docs-sidebar">
28 <div className="docs-search">
29 <span className="material-symbols-outlined">search</span>
30 <input
31 type="text"
32 placeholder="Search docs..."
33 value={q}
34 onChange={(e) => setQ(e.target.value)}
35 aria-label="Search documentation"
36 />
37 </div>
38 <nav className="docs-nav">
39 {filtered.map((group) => (
40 <div className="nav-section" key={group.id}>
41 <h3>{group.title}</h3>
42 <ul>
43 {group.items.map((item) => (
44 <li key={item.slug}>
45 <NavLink
46 to={`/docs/${item.slug}`}
47 className={({ isActive }) => `nav-link ${isActive ? 'active' : ''}`}
48 >
49 <span className="material-symbols-outlined" aria-hidden="true">{item.icon}</span>
50 <span>{item.title}</span>
51 </NavLink>
52 </li>
53 ))}
54 </ul>
55 </div>
56 ))}
57 </nav>
58 </aside>
59 <main className="docs-content">
60 {children}
61 </main>
62 </div>
63 </PublicLayout>
64 );
65}