Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4f0b68f
docs(camelot): rewrite to minimal plaintext style and direct copy
AKRiLLiCK May 22, 2026
087e3ce
docs(camelot): switch to dark mode, widen layout, and add logo svg
AKRiLLiCK May 22, 2026
9dbf253
docs(camelot): debian-style modular dark mode with search
AKRiLLiCK May 22, 2026
a1616b3
docs(camelot): remove code showcase, add debian-style table and borders
AKRiLLiCK May 22, 2026
d933cbf
docs(camelot): add table of contents back to sidebar
AKRiLLiCK May 22, 2026
b70e5fa
docs(camelot): add hand-coded architectural svgs and icons
AKRiLLiCK May 22, 2026
40145bb
docs(camelot): remove useless arena memory map svg
AKRiLLiCK May 22, 2026
c1cca7b
docs(camelot): fix search bar csp, increase font size, add openssf badge
AKRiLLiCK May 22, 2026
dd8d03b
docs(camelot): decrease font size and add openssf badge to sidebar
AKRiLLiCK May 22, 2026
d41bb24
docs(camelot): add is:inline directive to script to fix astro build e…
AKRiLLiCK May 22, 2026
d57f393
docs(camelot): fix openssf badge url and update logo link
AKRiLLiCK May 22, 2026
c73b2b3
docs: rewrite text across yutila pages for utilitarian tone and nativ…
AKRiLLiCK May 22, 2026
0e29deb
docs: change homepage hero text to rainbow yutila
AKRiLLiCK May 22, 2026
fc435d4
docs: remove comma from homepage subheader
AKRiLLiCK May 22, 2026
005632b
docs: remove shields.io badges and redesign camelot page like debian
AKRiLLiCK May 22, 2026
3049cb6
docs: add native openssf passing logo
AKRiLLiCK May 22, 2026
0380ec7
chore: allow unsafe-inline scripts in CSP
AKRiLLiCK May 22, 2026
03ce68d
docs: replace tiny passing svg with official openssf png logo
AKRiLLiCK May 22, 2026
03bbf0e
docs: replace logo with custom utilitarian badge
AKRiLLiCK May 22, 2026
53f9774
docs: move openssf badge to top and add explanation
AKRiLLiCK May 22, 2026
08c46a6
updated docs and added our compliance
AKRiLLiCK May 22, 2026
9a65eee
Merge branch 'main' into camelot-docs-simplification
Dynamic-Pistol May 23, 2026
d269b98
docs: align camelot text with strict technical taxonomy and preserve …
AKRiLLiCK May 24, 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
6 changes: 6 additions & 0 deletions public/openssf-badge.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/openssf-logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions public/openssf-passing.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
136 changes: 136 additions & 0 deletions public/search.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
const pages = [
{ title: 'Introduction', section: 'Overview', href: '/docs/camelot/overview' },
{ title: 'Architecture', section: 'Overview', href: '/docs/camelot/overview/architecture' },
{ title: 'Memory Allocator', section: 'Overview', href: '/docs/camelot/overview/memory' },
{ title: 'Merlin Build Engine', section: 'Core Systems', href: '/docs/camelot/core/merlin' },
{ title: 'I/O Utilities', section: 'Core Systems', href: '/docs/camelot/core/io' }
];

document.addEventListener('DOMContentLoaded', () => {
const overlay = document.getElementById('search-overlay');
const searchInput = document.getElementById('search-input');
const resultsList = document.getElementById('search-results');
const emptyMsg = document.getElementById('search-empty');
const trigger = document.getElementById('search-trigger');

let activeIdx = -1;
let isOpen = false;

if (overlay && searchInput && resultsList && emptyMsg && trigger) {
const openSearch = () => {
isOpen = true;
overlay.style.display = 'flex';
searchInput.value = '';
activeIdx = -1;
emptyMsg.style.display = 'none';
renderResults(pages);
setTimeout(() => { searchInput.focus(); }, 50);
};

const closeSearch = () => {
isOpen = false;
overlay.style.display = 'none';
searchInput.blur();
};

const renderResults = (items) => {
resultsList.innerHTML = '';
if (items.length === 0) {
emptyMsg.style.display = 'block';
return;
}
emptyMsg.style.display = 'none';
items.forEach((item, idx) => {
const li = document.createElement('li');
li.className = 'search-result-item';

const a = document.createElement('a');
a.href = item.href;

const titleSpan = document.createElement('span');
titleSpan.className = 'sr-title';
titleSpan.textContent = item.title;

const sectionSpan = document.createElement('span');
sectionSpan.className = 'sr-section';
sectionSpan.textContent = item.section;

a.appendChild(titleSpan);
a.appendChild(sectionSpan);
li.appendChild(a);

li.addEventListener('mouseenter', () => {
activeIdx = idx;
highlightResult();
});

resultsList.appendChild(li);
});
};

const highlightResult = () => {
const items = resultsList.querySelectorAll('.search-result-item');
items.forEach((item, idx) => {
if (idx === activeIdx) {
item.classList.add('focused');
} else {
item.classList.remove('focused');
}
});
};

trigger.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
openSearch();
});

document.addEventListener('keydown', (e) => {
if ((e.ctrlKey || e.metaKey) && e.key === 'k') {
e.preventDefault();
openSearch();
return;
}
if (!isOpen) return;
if (e.key === 'Escape') {
closeSearch();
return;
}
const items = resultsList.querySelectorAll('.search-result-item');
if (e.key === 'ArrowDown') {
e.preventDefault();
activeIdx = Math.min(activeIdx + 1, items.length - 1);
highlightResult();
const activeEl = items[activeIdx];
if (activeEl) activeEl.scrollIntoView({ block: 'nearest' });
}
if (e.key === 'ArrowUp') {
e.preventDefault();
activeIdx = Math.max(activeIdx - 1, 0);
highlightResult();
const activeEl = items[activeIdx];
if (activeEl) activeEl.scrollIntoView({ block: 'nearest' });
}
if (e.key === 'Enter' && activeIdx >= 0 && items[activeIdx]) {
const link = items[activeIdx].querySelector('a');
if (link) window.location.href = link.href;
}
});

overlay.addEventListener('click', (e) => {
if (e.target === overlay) closeSearch();
});

searchInput.addEventListener('input', () => {
const q = searchInput.value.toLowerCase().trim();
const filtered = pages.filter(page =>
!q ||
page.title.toLowerCase().includes(q) ||
page.section.toLowerCase().includes(q)
);
activeIdx = filtered.length > 0 ? 0 : -1;
renderResults(filtered);
highlightResult();
});
}
});
Loading
Loading