Clean Up and Revert to KiBot dev
Some checks failed
KiBot CI / test (push) Failing after 1m32s

This commit is contained in:
2026-03-09 17:39:47 -07:00
parent e9fadcd419
commit 093809072c
137 changed files with 2 additions and 207459 deletions

7
.gitattributes vendored
View File

@@ -1,7 +0,0 @@
*.csv filter=bom_csv
*.html filter=bom_html
*.gbr filter=gerber
*.gbrjob filter=gbrjob
*.xml filter=xml
*.kicad_pcb filter=kicad_pcb_f
*.net filter=net_filter

View File

@@ -1,20 +0,0 @@
[filter "bom_csv"]
clean = sed -E 's/^BoM Date:.*$/BoM Date:Date/'
smudge = sed -E \"s/BoM Date:Date/BoM Date:,`date +\\\"%a %d %b %Y %X %:::z\\\"`/\"
[filter "bom_html"]
clean = sed -E 's/^<tr><td>BoM Date<\\/td><td>.*$/<tr><td>BoM Date<\\/td><td>Date<\\/td><\\/tr>/'
smudge = sed -E \"s/<tr><td>BoM Date<\\/td><td>Date<\\/td><\\/tr>/<tr><td>BoM Date<\\/td><td>`date +\\\"%a %d %b %Y %X %:::z\\\"`<\\/td><\\/tr>/\"
[filter "gerber"]
clean = sed -E -e 's/^%TF.CreationDate,.*$/%TF.CreationDate,Date%/' -e 's/^G04 Created by KiCad.*$/G04 Created by KiCad*/'
smudge = sed -E \"s/%TF.CreationDate,Date%/%TF.CreationDate,`date +%Y-%m-%dT%H:%M:%S%:z`/\"
[filter "gbrjob"]
clean = sed -E 's/\"CreationDate\":.*/\"CreationDate\": \"Date\"/'
smudge = sed -E \"s/\\\"CreationDate\\\": \\\"Date\\\"/\\\"CreationDate\\\": \\\"`date +%Y-%m-%dT%H:%M:%S%:z`\\\"/\"
[filter "xml"]
clean = sed -E -e 's/^ <date>.*<\\/date>/ <date>Date2<\\/date>/' -e 's/^ <date>.*<\\/date>/ <date>Date1<\\/date>/'
smudge = sed -E -e \"s/<date>Date1<\\/date>/<date>`date +\\\"%a %d %b %Y %X %:::z\\\"`<\\/date>/\" -e \"s/<date>Date2<\\/date>/<date>`date +\\\"%Y-%m-%d\\\"`<\\/date>/\"
[filter "kicad_pcb_f"]
clean = sed -E 's/\\(host pcbnew ([[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+).*/\\(host pcbnew \\1\\)/'
[filter "net_filter"]
clean = sed -E -e 's/\\(date \\\".*\\\"\\)/\\(date \\\"Date\\\"\\)/'
smudge = sed -E -e \"s/\\(date \\\"Date\\\"\\)/\\(date \\\"`date +\\\"%a %d %b %Y %X %:::z\\\"`\\\"\\)/\"

View File

@@ -20,12 +20,12 @@ env:
# Update these to correspond to the KiCad version
kibot_group: "all_group"
kibot_tag: "v2_dk9"
kibot_tag: "dev"
jobs:
test:
runs-on: ubuntu-latest
container: ghcr.io/inti-cmnb/kicad9_auto_full:latest
container: ghcr.io/inti-cmnb/kicad9_auto_full:${{ env.kibot_tag }}
if: ${{ github.ref_type == 'tag' || !startsWith(github.event.head_commit.message, 'Merge pull request') }}
steps:

File diff suppressed because it is too large Load Diff

2174
Test_5.xml

File diff suppressed because it is too large Load Diff

View File

@@ -1,579 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Main page</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" disabled style="font-size:44px; color: gray; cursor: not-allowed; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_reports.html'">
<p class="category-title">reports</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_schematic.html'">
<p class="category-title">schematic</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg.html'">
<p class="category-title">mfg</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_kiri.html'">
<p class="category-title">kiri</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_renders.html'">
<p class="category-title">renders</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_models.html'">
<p class="category-title">models</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_test.html'">
<p class="category-title">test</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_panels.html'">
<p class="category-title">panels</p>
</div>
</div></div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,567 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/kiri</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_kiri.html" style="text-decoration:none;color:inherit;">kiri</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="html_kiri">
<div class="output-comment">KiRI webpage</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../kiri/index.html'">
<img src="images/icon.svg_64.png" alt="index.html" width="64" height="64">
<p class="filename">index.html</p>
<p class="output-name">html_kiri</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,570 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_assembly.html'">
<p class="category-title">assembly</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_fab.html'">
<p class="category-title">fab</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_jlcpcb.html'">
<p class="category-title">jlcpcb</p>
</div>
</div></div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,633 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/assembly</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_assembly.html" style="text-decoration:none;color:inherit;">assembly</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="csv_bom">
<div class="output-comment">Bill of Materials in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-bom.csv'">
<img src="images/file_csv_64.png" alt="Test_5-bom.csv" width="64" height="64">
<p class="filename">Test_5-bom.csv</p>
<p class="output-name">csv_bom</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="html_bom">
<div class="output-comment">Bill of Materials in HTML format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-bom.html'">
<img src="images/file_html_64.png" alt="Test_5-bom.html" width="64" height="64">
<p class="filename">Test_5-bom.html</p>
<p class="output-name">html_bom</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="html_bom_interactive">
<div class="output-comment">Bill of Materials in HTML format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-ibom.html'">
<img src="images/ibom_64.png" alt="Test_5-ibom.html" width="64" height="64">
<p class="filename">Test_5-ibom.html</p>
<p class="output-name">html_bom_interactive</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="csv_position">
<div class="output-comment">Position file in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-CPL.csv'">
<img src="images/file_csv_64.png" alt="Test_5-CPL.csv" width="64" height="64">
<p class="filename">Test_5-CPL.csv</p>
<p class="output-name">csv_position</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="pdf_assembly">
<div class="output-comment">Assembly document in PDF format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../mfg/assembly/Test_5-assembly.pdf'">
<img src="images/cat_pdf_assembly_Test_5-assembly.png" alt="Test_5-assembly.pdf" width="512" height="362">
<p class="filename">Test_5-assembly.pdf</p>
<p class="output-name">pdf_assembly</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="csv_comp_count">
<div class="output-comment">Component report (count) in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-components_count.csv'">
<img src="images/file_csv_64.png" alt="Test_5-components_count.csv" width="64" height="64">
<p class="filename">Test_5-components_count.csv</p>
<p class="output-name">csv_comp_count</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="txt_assembly_notes">
<div class="output-comment">Assembly notes in TXT format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-assembly_notes.txt'">
<img src="images/file_txt_64.png" alt="Test_5-assembly_notes.txt" width="64" height="64">
<p class="filename">Test_5-assembly_notes.txt</p>
<p class="output-name">txt_assembly_notes</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,621 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/fab</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_fab.html" style="text-decoration:none;color:inherit;">fab</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_fab_gerbers.html'">
<p class="category-title">gerbers</p>
</div>
</div><div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_fab_drill-tables.html'">
<p class="category-title">drill-tables</p>
</div>
</div></div>
<div class="output-virtual-box" id="zip_odb">
<div class="output-comment">ODB++ in ZIP format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/Test_5-odb.zip'">
<img src="images/file_zip_64.png" alt="Test_5-odb.zip" width="64" height="64">
<p class="filename">Test_5-odb.zip</p>
<p class="output-name">zip_odb</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="pdf_fabrication">
<div class="output-comment">Fabrication document in PDF format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../mfg/fab/Test_5-fabrication.pdf'">
<img src="images/cat_pdf_fabrication_Test_5-fabrication.png" alt="Test_5-fabrication.pdf" width="512" height="362">
<p class="filename">Test_5-fabrication.pdf</p>
<p class="output-name">pdf_fabrication</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="zip_compress_fab">
<div class="output-comment">Generates a ZIP file with gerbers, drill and fabrication document</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/Test_5-GERBERS.zip'">
<img src="images/file_zip_64.png" alt="Test_5-GERBERS.zip" width="64" height="64">
<p class="filename">Test_5-GERBERS.zip</p>
<p class="output-name">zip_compress_fab</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="csv_impedance_table">
<div class="output-comment">Impedance table in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/Test_5-impedance_table.csv'">
<img src="images/file_csv_64.png" alt="Test_5-impedance_table.csv" width="64" height="64">
<p class="filename">Test_5-impedance_table.csv</p>
<p class="output-name">csv_impedance_table</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="txt_fabrication_notes">
<div class="output-comment">Fabrication notes in TXT format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/Test_5-fabrication_notes.txt'">
<img src="images/file_txt_64.png" alt="Test_5-fabrication_notes.txt" width="64" height="64">
<p class="filename">Test_5-fabrication_notes.txt</p>
<p class="output-name">txt_fabrication_notes</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,573 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/fab/drill-tables</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg_fab.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_fab.html" style="text-decoration:none;color:inherit;">fab</a>/<wbr><a href="Test_5-navigate_mfg_fab_drill-tables.html" style="text-decoration:none;color:inherit;">drill-tables</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="csv_drill_table">
<div class="output-comment">Drill Table in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/drill-tables/Test_5-(L1-L4)_drill_table.csv'">
<img src="images/file_csv_64.png" alt="Test_5-(L1-L4)_drill_table.csv" width="64" height="64">
<p class="filename">Test_5-(L1-L4)_drill_table.csv</p>
<p class="output-name">csv_drill_table</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/drill-tables/Test_5-(L1-L4)_NPTH_drill_table.csv'">
<img src="images/file_csv_64.png" alt="Test_5-(L1-L4)_NPTH_drill_table.csv" width="64" height="64">
<p class="filename">Test_5-(L1-L4)_NPTH_drill_table.csv</p>
<p class="output-name">csv_drill_table</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,661 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/fab/gerbers</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg_fab.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_fab.html" style="text-decoration:none;color:inherit;">fab</a>/<wbr><a href="Test_5-navigate_mfg_fab_gerbers.html" style="text-decoration:none;color:inherit;">gerbers</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="gbr_gerbers">
<div class="output-comment">Gerbers in GBR format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Cu.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Cu.gbr" width="64" height="64">
<p class="filename">Test_5-F_Cu.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-In1_Cu.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-In1_Cu.gbr" width="64" height="64">
<p class="filename">Test_5-In1_Cu.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-In2_Cu.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-In2_Cu.gbr" width="64" height="64">
<p class="filename">Test_5-In2_Cu.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Cu.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Cu.gbr" width="64" height="64">
<p class="filename">Test_5-B_Cu.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-Edge_Cuts.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-Edge_Cuts.gbr" width="64" height="64">
<p class="filename">Test_5-Edge_Cuts.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Silkscreen.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Silkscreen.gbr" width="64" height="64">
<p class="filename">Test_5-F_Silkscreen.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Mask.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Mask.gbr" width="64" height="64">
<p class="filename">Test_5-F_Mask.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Paste.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Paste.gbr" width="64" height="64">
<p class="filename">Test_5-F_Paste.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Silkscreen.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Silkscreen.gbr" width="64" height="64">
<p class="filename">Test_5-B_Silkscreen.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Mask.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Mask.gbr" width="64" height="64">
<p class="filename">Test_5-B_Mask.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Paste.gbr'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Paste.gbr" width="64" height="64">
<p class="filename">Test_5-B_Paste.gbr</p>
<p class="output-name">gbr_gerbers</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="drl_excellon">
<div class="output-comment">Drill in Excellon format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5--pth.drl'">
<img src="images/file_drl_64.png" alt="Test_5--pth.drl" width="64" height="64">
<p class="filename">Test_5--pth.drl</p>
<p class="output-name">drl_excellon</p>
</div>
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5--npth.drl'">
<img src="images/file_drl_64.png" alt="Test_5--npth.drl" width="64" height="64">
<p class="filename">Test_5--npth.drl</p>
<p class="output-name">drl_excellon</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="pdf_drill_map">
<div class="output-comment">Drill Map in PDF format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../mfg/fab/gerbers/Test_5--pth_map.pdf'">
<img src="images/cat_pdf_drill_map_Test_5--pth_map.png" alt="Test_5--pth_map.pdf" width="512" height="362">
<p class="filename">Test_5--pth_map.pdf</p>
<p class="output-name">pdf_drill_map</p>
</div>
<div class="output-box wide" onclick="location.href='../mfg/fab/gerbers/Test_5--npth_map.pdf'">
<img src="images/cat_pdf_drill_map_Test_5--npth_map.png" alt="Test_5--npth_map.pdf" width="512" height="362">
<p class="filename">Test_5--npth_map.pdf</p>
<p class="output-name">pdf_drill_map</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,595 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/jlcpcb</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_jlcpcb.html" style="text-decoration:none;color:inherit;">jlcpcb</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_jlcpcb_gerbers.html'">
<p class="category-title">gerbers</p>
</div>
</div></div>
<div class="output-virtual-box" id="jlcpcb_fabpack">
<div class="output-comment">Zipped Fabpack for JLCPCB</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/jlcpcb/Test_5-Fabpack.zip'">
<img src="images/file_zip_64.png" alt="Test_5-Fabpack.zip" width="64" height="64">
<p class="filename">Test_5-Fabpack.zip</p>
<p class="output-name">jlcpcb_fabpack</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="jlcpcb_bom">
<div class="output-comment">Bill of Materials for JLCPCB</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/jlcpcb/Test_5-bom.csv'">
<img src="images/file_csv_64.png" alt="Test_5-bom.csv" width="64" height="64">
<p class="filename">Test_5-bom.csv</p>
<p class="output-name">jlcpcb_bom</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="jlcpcb_cpl">
<div class="output-comment">Component Placement File for JLCPCB</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/jlcpcb/Test_5-cpl.csv'">
<img src="images/file_csv_64.png" alt="Test_5-cpl.csv" width="64" height="64">
<p class="filename">Test_5-cpl.csv</p>
<p class="output-name">jlcpcb_cpl</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,627 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/mfg/jlcpcb/gerbers</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_mfg_jlcpcb.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_jlcpcb.html" style="text-decoration:none;color:inherit;">jlcpcb</a>/<wbr><a href="Test_5-navigate_mfg_jlcpcb_gerbers.html" style="text-decoration:none;color:inherit;">gerbers</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="jlcpcb_gerbers">
<div class="output-comment">Gerbers in GBR format for JLCPCB</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Cu.gtl'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Cu.gtl" width="64" height="64">
<p class="filename">Test_5-F_Cu.gtl</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-In1_Cu.g1'">
<img src="images/file_gbr_64.png" alt="Test_5-In1_Cu.g1" width="64" height="64">
<p class="filename">Test_5-In1_Cu.g1</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-In2_Cu.g2'">
<img src="images/file_gbr_64.png" alt="Test_5-In2_Cu.g2" width="64" height="64">
<p class="filename">Test_5-In2_Cu.g2</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Cu.gbl'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Cu.gbl" width="64" height="64">
<p class="filename">Test_5-B_Cu.gbl</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-Edge_Cuts.gm1'">
<img src="images/file_gbr_64.png" alt="Test_5-Edge_Cuts.gm1" width="64" height="64">
<p class="filename">Test_5-Edge_Cuts.gm1</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Silkscreen.gto'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Silkscreen.gto" width="64" height="64">
<p class="filename">Test_5-F_Silkscreen.gto</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Mask.gts'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Mask.gts" width="64" height="64">
<p class="filename">Test_5-F_Mask.gts</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Paste.gtp'">
<img src="images/file_gbr_64.png" alt="Test_5-F_Paste.gtp" width="64" height="64">
<p class="filename">Test_5-F_Paste.gtp</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Silkscreen.gbo'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Silkscreen.gbo" width="64" height="64">
<p class="filename">Test_5-B_Silkscreen.gbo</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Mask.gbs'">
<img src="images/file_gbr_64.png" alt="Test_5-B_Mask.gbs" width="64" height="64">
<p class="filename">Test_5-B_Mask.gbs</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Paste.gbp'">
<img src="images/unknown_64.png" alt="Test_5-B_Paste.gbp" width="64" height="64">
<p class="filename">Test_5-B_Paste.gbp</p>
<p class="output-name">jlcpcb_gerbers</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,578 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/models</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_models.html" style="text-decoration:none;color:inherit;">models</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="step">
<div class="output-comment">PCB 3D model in STEP format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../models/Test_5-step.step'">
<img src="images/file_stp_64.png" alt="Test_5-step.step" width="64" height="64">
<p class="filename">Test_5-step.step</p>
<p class="output-name">step</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="glb">
<div class="output-comment">PCB 3D model in GLB/gITF format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../models/Test_5-glb.glb'">
<img src="images/file_glb_64.png" alt="Test_5-glb.glb" width="64" height="64">
<p class="filename">Test_5-glb.glb</p>
<p class="output-name">glb</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,562 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/panels</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_panels.html" style="text-decoration:none;color:inherit;">panels</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_panels_panel-800.html'">
<p class="category-title">panel-800</p>
</div>
</div></div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,573 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/panels/panel-800</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_panels.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_panels.html" style="text-decoration:none;color:inherit;">panels</a>/<wbr><a href="Test_5-navigate_panels_panel-800.html" style="text-decoration:none;color:inherit;">panel-800</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="panel_801">
<div class="output-comment">PCB Panelization</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../panels/panel-800/Test_5-panel_801.kicad_pcb'">
<img src="images/pcbnew_64.png" alt="Test_5-panel_801.kicad_pcb" width="64" height="64">
<p class="filename">Test_5-panel_801.kicad_pcb</p>
<p class="output-name">panel_801</p>
</div>
<div class="output-box wide" onclick="location.href='../panels/panel-800/Test_5-panel_801.png'">
<img src="images/cat_panel_801_Test_5-panel_801.png" alt="Test_5-panel_801.png" width="512" height="317">
<p class="filename">Test_5-panel_801.png</p>
<p class="output-name">panel_801</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,690 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/renders</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_renders.html" style="text-decoration:none;color:inherit;">renders</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="pcbdraw_top">
<div class="output-comment">PCB 2D Render (Top)</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../renders/Test_5-pcbdraw_top.svg'">
<img src="images/cat_pcbdraw_top_Test_5-pcbdraw_top.png" alt="Test_5-pcbdraw_top.svg" width="512" height="307">
<p class="filename">Test_5-pcbdraw_top.svg</p>
<p class="output-name">pcbdraw_top</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="pcbdraw_bottom">
<div class="output-comment">PCB 2D Render (Bottom)</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../renders/Test_5-pcbdraw_bottom.svg'">
<img src="images/cat_pcbdraw_bottom_Test_5-pcbdraw_bottom.png" alt="Test_5-pcbdraw_bottom.svg" width="512" height="307">
<p class="filename">Test_5-pcbdraw_bottom.svg</p>
<p class="output-name">pcbdraw_bottom</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="png_3d_viewer_top">
<div class="output-comment">Top 3D viewer PCB render in PNG format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../renders/Test_5-top.png'">
<img src="images/cat_png_3d_viewer_top_Test_5-top.png" alt="Test_5-top.png" width="512" height="302">
<p class="filename">Test_5-top.png</p>
<p class="output-name">png_3d_viewer_top</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="png_3d_viewer_bottom">
<div class="output-comment">Bottom 3D viewer PCB render in PNG format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../renders/Test_5-bottom.png'">
<img src="images/cat_png_3d_viewer_bottom_Test_5-bottom.png" alt="Test_5-bottom.png" width="512" height="302">
<p class="filename">Test_5-bottom.png</p>
<p class="output-name">png_3d_viewer_bottom</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="png_3d_viewer_angled_top">
<div class="output-comment">Top (angled) 3D viewer PCB render in PNG format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../renders/Test_5-angled_top.png'">
<img src="images/cat_png_3d_viewer_angled_top_Test_5-angled_top.png" alt="Test_5-angled_top.png" width="512" height="323">
<p class="filename">Test_5-angled_top.png</p>
<p class="output-name">png_3d_viewer_angled_top</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="png_3d_viewer_angled_bottom">
<div class="output-comment">Bottom (angled) 3D viewer PCB render in PNG format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../renders/Test_5-angled_bottom.png'">
<img src="images/cat_png_3d_viewer_angled_bottom_Test_5-angled_bottom.png" alt="Test_5-angled_bottom.png" width="512" height="310">
<p class="filename">Test_5-angled_bottom.png</p>
<p class="output-name">png_3d_viewer_angled_bottom</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="blender_3d_top">
<div class="output-comment">High Quality 3D Render (Top)</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../renders/Test_5-blender_exportblender_3d_top.pcb3d'">
<img src="images/file_pcb3d_64.png" alt="Test_5-blender_exportblender_3d_top.pcb3d" width="64" height="64">
<p class="filename">Test_5-blender_exportblender_3d_top.pcb3d</p>
<p class="output-name">blender_3d_top</p>
</div>
<div class="output-box wide" onclick="location.href='../renders/Test_5-blender_3d_top.png'">
<img src="images/cat_blender_3d_top_Test_5-blender_3d_top.png" alt="Test_5-blender_3d_top.png" width="512" height="306">
<p class="filename">Test_5-blender_3d_top.png</p>
<p class="output-name">blender_3d_top</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="blender_3d_bottom">
<div class="output-comment">High Quality 3D Render (Bottom)</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../renders/Test_5-blender_exportblender_3d_bottom.pcb3d'">
<img src="images/file_pcb3d_64.png" alt="Test_5-blender_exportblender_3d_bottom.pcb3d" width="64" height="64">
<p class="filename">Test_5-blender_exportblender_3d_bottom.pcb3d</p>
<p class="output-name">blender_3d_bottom</p>
</div>
<div class="output-box wide" onclick="location.href='../renders/Test_5-blender_3d_bottom.png'">
<img src="images/cat_blender_3d_bottom_Test_5-blender_3d_bottom.png" alt="Test_5-blender_3d_bottom.png" width="512" height="302">
<p class="filename">Test_5-blender_3d_bottom.png</p>
<p class="output-name">blender_3d_bottom</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="blender_3d_angled_top">
<div class="output-comment">High Quality 3D Render (Angled Top)</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../renders/Test_5-blender_exportblender_3d_angled_top.pcb3d'">
<img src="images/file_pcb3d_64.png" alt="Test_5-blender_exportblender_3d_angled_top.pcb3d" width="64" height="64">
<p class="filename">Test_5-blender_exportblender_3d_angled_top.pcb3d</p>
<p class="output-name">blender_3d_angled_top</p>
</div>
<div class="output-box wide" onclick="location.href='../renders/Test_5-blender_3d_angled_top.png'">
<img src="images/cat_blender_3d_angled_top_Test_5-blender_3d_angled_top.png" alt="Test_5-blender_3d_angled_top.png" width="512" height="309">
<p class="filename">Test_5-blender_3d_angled_top.png</p>
<p class="output-name">blender_3d_angled_top</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="blender_3d_angled_bottom">
<div class="output-comment">High Quality 3D Render (Angled Bottom)</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../renders/Test_5-blender_exportblender_3d_angled_bottom.pcb3d'">
<img src="images/file_pcb3d_64.png" alt="Test_5-blender_exportblender_3d_angled_bottom.pcb3d" width="64" height="64">
<p class="filename">Test_5-blender_exportblender_3d_angled_bottom.pcb3d</p>
<p class="output-name">blender_3d_angled_bottom</p>
</div>
<div class="output-box wide" onclick="location.href='../renders/Test_5-blender_3d_angled_bottom.png'">
<img src="images/cat_blender_3d_angled_bottom_Test_5-blender_3d_angled_bottom.png" alt="Test_5-blender_3d_angled_bottom.png" width="512" height="290">
<p class="filename">Test_5-blender_3d_angled_bottom.png</p>
<p class="output-name">blender_3d_angled_bottom</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,590 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/reports</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_reports.html" style="text-decoration:none;color:inherit;">reports</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="erc">
<div class="output-comment">erc</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../reports/report_Test_5-erc.html'">
<img src="images/erc.svg_64.png" alt="report_Test_5-erc.html" width="64" height="64">
<p class="filename">report_Test_5-erc.html</p>
<p class="output-name">erc</p>
</div>
<div class="output-box " onclick="location.href='../reports/report_Test_5-erc.rpt'">
<img src="images/erc.svg_64.png" alt="report_Test_5-erc.rpt" width="64" height="64">
<p class="filename">report_Test_5-erc.rpt</p>
<p class="output-name">erc</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="drc">
<div class="output-comment">drc</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../reports/report_Test_5-drc.html'">
<img src="images/drc.svg_64.png" alt="report_Test_5-drc.html" width="64" height="64">
<p class="filename">report_Test_5-drc.html</p>
<p class="output-name">drc</p>
</div>
<div class="output-box " onclick="location.href='../reports/report_Test_5-drc.rpt'">
<img src="images/drc.svg_64.png" alt="report_Test_5-drc.rpt" width="64" height="64">
<p class="filename">report_Test_5-drc.rpt</p>
<p class="output-name">drc</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,578 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/schematic</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_schematic.html" style="text-decoration:none;color:inherit;">schematic</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="pdf_schematic">
<div class="output-comment">Schematic in PDF format</div>
<div class="items-container">
<div class="output-box wide" onclick="location.href='../schematic/Test_5-schematic.pdf'">
<img src="images/cat_pdf_schematic_Test_5-schematic.png" alt="Test_5-schematic.pdf" width="512" height="362">
<p class="filename">Test_5-schematic.pdf</p>
<p class="output-name">pdf_schematic</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="txt_schematic_notes">
<div class="output-comment">Schematic notes in TXT format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../schematic/Test_5-schematic_notes.txt'">
<img src="images/file_txt_64.png" alt="Test_5-schematic_notes.txt" width="64" height="64">
<p class="filename">Test_5-schematic_notes.txt</p>
<p class="output-name">txt_schematic_notes</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,562 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/test</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_test.html" style="text-decoration:none;color:inherit;">test</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="items-container">
<div>
<div class="category-box" onclick="location.href='Test_5-navigate_test_testpoints.html'">
<p class="category-title">testpoints</p>
</div>
</div></div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

View File

@@ -1,589 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>/test/testpoints</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="styles.css">
<link rel="icon" href="favicon.ico">
<script src="markdown-it.min.js"></script>
</head>
<body>
<div id="theSideNav" class="navbar">
<!-- Search bar container -->
<div id="search-container">
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
<ul id="autocomplete-list"></ul>
</div>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
</ul>
</ul>
</li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
<ul class='navbar-category'>
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
</ul>
</ul>
</li>
</ul>
</ul>
</li>
</ul>
</div>
<div id="topmenu" class="topmenu">
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">&#9776;</span>
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()"></span>
<button id="back-button" onclick="history.back()" style="font-size:30px;"></button>
<button id="forward-button" onclick="history.forward()" style="font-size:30px;"></button>
<button id="up-button" onclick="location.href='Test_5-navigate_test.html'" style="font-size:44px; position: relative; top: -3px;"></button>
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
<span style="
font-size:18px;
color: var(--text-color-accent);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1;
">
<a href="Test_5-navigate_test.html" style="text-decoration:none;color:inherit;">test</a>/<wbr><a href="Test_5-navigate_test_testpoints.html" style="text-decoration:none;color:inherit;">testpoints</a>
</span>
</div>
<div style="text-align: center; flex: 1; min-width: 200px;">
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
</a>
<div style="
font-size:14px;
color: var(--text-color-accent);
margin-top: 5px;">
Asymworks, LLC
</div>
</div>
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
<div style="
text-align: left;
font-size:14px;
margin-right: 10px;
color: var(--text-color-accent);">
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
<div>Variant: </div>
</div>
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
<label class="theme-switch" style="
position: relative;
margin-right: 10px; /* Move toggle slightly left */
max-width: 100%; /* Prevent overflow */
">
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
<span></span>
</label>
</div>
</div>
<div id="main">
<div class="output-virtual-box" id="csv_testpoints">
<div class="output-comment">Testpoint report in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../test/testpoints/Test_5-testpoints.csv'">
<img src="images/file_csv_64.png" alt="Test_5-testpoints.csv" width="64" height="64">
<p class="filename">Test_5-testpoints.csv</p>
<p class="output-name">csv_testpoints</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="csv_testpoints_top">
<div class="output-comment">Top testpoint report in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../test/testpoints/Test_5-testpoints-top.csv'">
<img src="images/file_csv_64.png" alt="Test_5-testpoints-top.csv" width="64" height="64">
<p class="filename">Test_5-testpoints-top.csv</p>
<p class="output-name">csv_testpoints_top</p>
</div>
</div>
</div>
<div class="output-virtual-box" id="csv_testpoints_bottom">
<div class="output-comment">Bottom testpoint report in CSV format</div>
<div class="items-container">
<div class="output-box " onclick="location.href='../test/testpoints/Test_5-testpoints-bottom.csv'">
<img src="images/file_csv_64.png" alt="Test_5-testpoints-bottom.csv" width="64" height="64">
<p class="filename">Test_5-testpoints-bottom.csv</p>
<p class="output-name">csv_testpoints_bottom</p>
</div>
</div>
</div>
<script>
// Side Navigation functions ===================================================
function openNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "360px";
navbar.style.paddingLeft = "20px";
main.style.marginLeft = "360px";
document.getElementById("open-navbar").style.display = "none";
document.getElementById("close-navbar").style.display = "inline-block";
}
function closeNav() {
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
navbar.style.width = "0"; // Close the navbar
navbar.style.paddingLeft = "0"; // Reset padding
main.style.marginLeft = "0"; // Reset page content position
document.getElementById("open-navbar").style.display = "inline-block";
document.getElementById("close-navbar").style.display = "none";
}
function toggleFolder(folderHeader) {
const folder = folderHeader.parentElement;
const folderContents = folderHeader.nextElementSibling;
if (folder.classList.contains("open")) {
folder.classList.remove("open");
folderContents.style.display = "none";
} else {
folder.classList.add("open");
folderContents.style.display = "block";
}
// Save the updated state
saveSideNavState();
}
function saveSideNavState() {
const navbar = document.getElementById("theSideNav");
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
// Save the state of each folder
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
isOpen: folder.classList.contains("open") // Check if folder is open
}));
// Save the navbar and folder states to localStorage
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
}
function restorenavbarState() {
const savedState = localStorage.getItem("navbarState");
if (savedState) {
const { isOpen, folderStates } = JSON.parse(savedState);
const navbar = document.getElementById("theSideNav");
const main = document.getElementById("main");
// Temporarily disable animations on page load so elements don't move
navbar.style.transition = "none";
main.style.transition = "none";
const chevrons = document.querySelectorAll(".chevron");
chevrons.forEach(chevron => {
chevron.style.transition = "none";
});
// Restore side navigation state
if (isOpen) {
openNav()
} else {
closeNav()
}
// Restore folder open/closed states
folderStates.forEach(({ id, isOpen }) => {
const folder = Array.from(document.querySelectorAll(".folder"))
.find(folder => folder.querySelector("span").textContent.trim() === id);
if (folder) {
const folderContents = folder.querySelector(".folder-contents");
if (isOpen) {
folder.classList.add("open");
folderContents.style.display = "block";
} else {
folder.classList.remove("open");
folderContents.style.display = "none";
}
}
});
// Re-enable animation
setTimeout(() => {
navbar.style.transition = "";
main.style.transition = "";
chevrons.forEach(chevron => {
chevron.style.transition = "";
});
}, 100);
}
}
function saveSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const scrollPosition = navbar.scrollTop;
localStorage.setItem("navbarScrollPosition", scrollPosition);
}
function restoreSidenavScrollPosition() {
const navbar = document.getElementById("theSideNav");
const savedPosition = localStorage.getItem("navbarScrollPosition");
if (savedPosition !== null) {
navbar.scrollTop = parseInt(savedPosition, 10);
}
}
function adjustSidenavOffset() {
const topMenu = document.getElementById("topmenu");
const navbar = document.getElementById("theSideNav");
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight;
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
adjustSidenavOffset();
window.addEventListener("resize", adjustSidenavOffset);
/* This is the scrolling offset when we click on an output in the side navigation bar
It should take into account the top menu height */
function adjustOutputOffset() {
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
if (topMenu) {
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
}
}
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
window.addEventListener("resize", adjustOutputOffset);
// Prevent flickering on page navigation
window.addEventListener("beforeunload", () => {
saveSideNavState();
saveSidenavScrollPosition();
});
window.addEventListener("load", restoreSidenavScrollPosition);
document.addEventListener("DOMContentLoaded", restorenavbarState);
function initializeSearchBar(searchContainerId, outputSelector) {
const searchContainer = document.getElementById(searchContainerId);
if (!searchContainer) return; // Exit if container is not found
const searchBar = searchContainer.querySelector('#search-bar');
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
const outputLinks = document.querySelectorAll(outputSelector);
// Collect output names and their hrefs
const outputs = Array.from(outputLinks).map(link => ({
name: link.textContent.trim(),
href: link.getAttribute("href"),
}));
let highlightedIndex = -1; // Index of the currently highlighted item
function adjustAutocompleteWidth() {
const searchBarWidth = searchBar.offsetWidth;
autocompleteList.style.width = `${searchBarWidth}px`;
}
function updateAutocomplete(query) {
autocompleteList.innerHTML = ""; // Clear suggestions
highlightedIndex = -1; // Reset highlighting
const matches = outputs.filter(output =>
output.name.toLowerCase().includes(query.toLowerCase())
);
matches.forEach(match => {
const listItem = document.createElement("li");
listItem.textContent = match.name;
listItem.addEventListener("click", () => {
window.location.href = match.href;
});
autocompleteList.appendChild(listItem);
});
autocompleteList.style.display = matches.length ? "block" : "none";
}
function highlightItem(index) {
const items = autocompleteList.querySelectorAll("li");
items.forEach((item, i) => {
if (i === index) {
item.classList.add("highlighted");
item.scrollIntoView({ block: "nearest" });
} else {
item.classList.remove("highlighted");
}
});
}
// Add event listeners for search bar input and keydown
searchBar.addEventListener("input", () => {
const query = searchBar.value.trim();
if (query) updateAutocomplete(query);
else {
autocompleteList.innerHTML = "";
autocompleteList.style.display = "none";
}
});
searchBar.addEventListener("keydown", (event) => {
const items = autocompleteList.querySelectorAll("li");
if (!items.length) return;
if (event.key === "ArrowDown") {
event.preventDefault();
highlightedIndex = (highlightedIndex + 1) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "ArrowUp") {
event.preventDefault();
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
highlightItem(highlightedIndex);
} else if (event.key === "Enter" && highlightedIndex >= 0) {
event.preventDefault();
items[highlightedIndex].click();
}
});
// Hide suggestions when clicking outside
document.addEventListener("click", (event) => {
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
autocompleteList.style.display = "none";
}
});
// Adjust width on window resize
adjustAutocompleteWidth();
window.addEventListener("resize", adjustAutocompleteWidth);
}
// Initialize search functionality
document.addEventListener("DOMContentLoaded", () => {
initializeSearchBar("search-container", ".navbar-output");
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function () {
const md = window.markdownit({
html: true,
linkify: true,
typographer: true
});
// Find all markdown containers and render them
document.querySelectorAll('.markdown-content').forEach(container => {
const rawMarkdown = container.innerHTML;
container.style.display = 'block';
container.innerHTML = md.render(rawMarkdown);
});
});
</script>
<script>
// Theme toggle ================================================================
function toggleTheme() {
const body = document.body;
// Check if the current theme is dark
const isDark = body.classList.contains('dark-mode');
// Toggle between dark and light themes
if (isDark) {
body.classList.remove('dark-mode');
body.classList.add('light-mode');
} else {
body.classList.remove('light-mode');
body.classList.add('dark-mode');
}
// Save the selected theme to localStorage
localStorage.setItem('theme', isDark ? 'light' : 'dark');
}
// Do not animate theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const themeToggle = document.getElementById('themeToggle');
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
// Prevent animation on page load
const savedTheme = localStorage.getItem('theme') || 'dark';
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
themeToggle.checked = savedTheme === 'dark';
// Add the "animate" class on user interaction
themeToggle.addEventListener('change', () => {
toggleSpan.classList.add('animate');
setTimeout(() => {
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
}, 400); // Match the CSS transition duration (0.4s)
});
});
// Avoid flickering of theme toggle on page load
document.addEventListener("DOMContentLoaded", () => {
const body = document.body;
// Temporarily disable transitions during page load
body.classList.add('no-transition');
// Remove the no-transition class after the page is fully loaded
setTimeout(() => {
body.classList.remove('no-transition');
}, 50); // Allow rendering to complete before enabling transitions
});
function adjustMainBodyOffset() {
const topMenu = document.getElementById("topmenu");
const mainBody = document.getElementById("main");
if (topMenu && mainBody) {
const topMenuHeight = topMenu.offsetHeight;
mainBody.style.marginTop = `${topMenuHeight}px`;
}
}
// Apply the adjustment on page load and window resize
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
window.addEventListener("resize", adjustMainBodyOffset);
</script>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

File diff suppressed because one or more lines are too long

View File

@@ -1,981 +0,0 @@
/* Colors =================================================================== */
:root {
--light-bg-color: #ffffff;
--dark-bg-color: #1e1e2f;
--light-bg-color-banner: #dfdfdf;
--dark-bg-color-banner: #27293d;
--light-text-color: #444444;
--dark-text-color: #e5e5e5;
--light-hover-color: #902ec9;
--light-hover-color-act: #652f85;
--dark-hover-color: #ffa500;
--dark-hover-color-act: #cc8400;
--dark-text-color-accent: #a3a3c2;
--light-text-color-accent: #444444;
--light-banner-hover: #b0b0b0;
--dark-banner-hover: #383b4b;
--text-color-accent: #a3a3c2;
}
/* Main body ================================================================ */
body {
margin: 0;
font-family: 'Roboto', sans-serif;
background-color: var(--dark-bg-color);
color: var(--dark-text-color);
transition:
background-color 0.4s ease,
color 0.4s ease,
transition: scrollbar-color 0.2s ease-in-out;
}
body.dark-mode {
--text-color-accent: var(--dark-text-color-accent);
background-color: var(--dark-bg-color);
color: var(--dark-text-color);
}
body.light-mode {
--text-color-accent: var(--light-text-color-accent);
background-color: var(--light-bg-color);
color: var(--light-text-color);
}
/* Top Menu ================================================================= */
/* Layout is as follows */
/* [X/☰] [↩] [↪] <Category Path> <Title> (Logo) [☾/☀] [🏠︎] */
#topmenu {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1000;
background-color: var(--dark-bg-color-banner);
padding: 10px 0;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
display: flex;
align-items: center;
justify-content: space-between;
transition: background-color 0.2s ease, color 0.2s ease;
}
body.light-mode #topmenu {
background-color: var(--light-bg-color-banner);
}
body.dark-mode #topmenu {
background-color: var(--dark-bg-color-banner);
}
/* Buttons ================================================================== */
/* button corresponds to the navigation buttons (forward, backward, home) */
button, #open-navbar, #close-navbar {
background: none;
border: none;
color: var(--dark-text-color);
cursor: pointer;
transition: color 0.3s ease;
user-select: none;
}
body.light-mode #topmenu button,
body.light-mode #topmenu #open-navbar,
body.light-mode #topmenu #close-navbar {
color: var(--light-text-color);
}
body.dark-mode #topmenu button,
body.dark-mode #topmenu #open-navbar,
body.dark-mode #topmenu #close-navbar {
color: var(--dark-text-color);
}
button {
font-size: 20px;
margin: 0 10px;
}
#open-navbar, #close-navbar {
width: 36px;
height: 36px;
line-height: 36px;
text-align: center;
font-size: 28px;
margin-left: 15px;
}
/* Hover effects */
button:hover, #open-navbar:hover, #close-navbar:hover {
color: var(--dark-hover-color);
}
body.dark-mode #topmenu button:hover,
body.dark-mode #topmenu #open-navbar:hover,
body.dark-mode #topmenu #close-navbar:hover {
color: var(--dark-hover-color);
}
body.light-mode #topmenu button:hover,
body.light-mode #topmenu #open-navbar:hover,
body.light-mode #topmenu #close-navbar:hover {
color: var(--light-hover-color);
}
/* Active effects */
button:active, #open-navbar:active, #close-navbar:active {
color: var(--dark-hover-color-act);
transition: none;
}
body.dark-mode #topmenu button:active,
body.dark-mode #topmenu #open-navbar:active,
body.dark-mode #topmenu #close-navbar:active {
color: var(--dark-hover-color-act);
}
body.light-mode #topmenu button:active,
body.light-mode #topmenu #open-navbar:active,
body.light-mode #topmenu #close-navbar:active {
color: var(--light-hover-color-act);
}
/* Sidebar Navigation ======================================================= */
.navbar {
position: fixed;
width: 0; /* Initially collapsed */
height: calc(100% - var(--top-menu-height, 60px));
top: var(--top-menu-height, 60px);
left: 0;
background-color: #27293d;
overflow-x: hidden;
overflow-y: auto;
transition:
width 0.5s ease,
padding-left 0.5s ease,
scrollbar-color 0.2s ease-in-out,
background-color 0.2s ease-in-out;
box-sizing: border-box;
padding-top: 0;
padding-bottom: 40px;
}
body.dark-mode .navbar {
background-color: var(--dark-bg-color-banner);
}
body.light-mode .navbar {
background-color: var(--light-bg-color-banner);
}
.navbar > ul:first-child {
margin-top: 20px; /* Padding between top menu and first element of navbar */
}
/* Side Navigation Outputs -------------------------------------------------- */
.navbar-output {
padding: 8px 30px;
text-decoration: none;
font-size: 16px;
color: var(--dark-text-color);
display: block;
transition: color 0.3s ease;
border-radius: 4px;
}
body.light-mode .navbar-output {
color: var(--light-text-color);
}
body.dark-mode .navbar-output {
color: var(--dark-text-color);
}
/* Hover effects */
.navbar-output:hover {
color: var(--dark-hover-color);
background-color: var(--dark-banner-hover);
}
body.dark-mode .navbar-output:hover {
color: var(--dark-hover-color);
background-color: var(--dark-banner-hover);
}
body.light-mode .navbar-output:hover {
color: var(--light-hover-color);
background-color: var(--light-banner-hover);
}
/* Active effects */
.navbar-output:active {
color: var(--dark-hover-color-act);
}
body.dark-mode .navbar-output:active {
color: var(--dark-hover-color-act);
}
body.light-mode .navbar-output:active {
color: var(--light-hover-color-act);
}
/* Side Navigation Categories ----------------------------------------------- */
.navbar-category {
list-style: none;
padding: 0;
margin: 0;
user-select: none; /* Prevent text selection */
}
.navbar-category .folder > span {
display: flex;
align-items: center;
cursor: pointer;
color: var(--dark-text-color-accent);
padding: 10px 20px;
margin-bottom: 0px;
width: 100%;
transition: background-color 0.3s, color 0.3s;
border-radius: 4px;
}
.navbar-category .folder-contents {
list-style: none;
margin-left: 20px;
padding: 0;
}
body.dark-mode .navbar-category .folder > span {
color: var(--dark-text-color-accent);
}
body.light-mode .navbar-category .folder > span {
color: var(--light-text-color);
}
/* Hover effects */
.navbar-category .folder > span:hover {
background-color: var(--dark-banner-hover);
color: var(--dark-hover-color);
}
body.dark-mode .navbar-category .folder > span:hover {
color: var(--dark-hover-color);
background-color: var(--dark-banner-hover);
}
body.light-mode .navbar-category .folder > span:hover {
color: var(--light-hover-color);
background-color: var(--light-banner-hover);
}
/* Active effects */
.navbar-category .folder > span:active {
color: var(--dark-hover-color);
transition: none;
}
body.dark-mode .navbar-category .folder > span:active {
color: var(--dark-hover-color-act);
}
body.light-mode .navbar-category .folder > span:active {
color: var(--light-hover-color-act);
}
/* Chevron (arrow) styling -------------------------------------------------- */
.chevron {
display: block;
width: 0;
height: 0;
border: 8px solid transparent;
border-left-color: #606077;
margin-right: 8px;
transform-origin: 25% 50%;
transition: transform 0.3s ease, border-left-color 0.3s ease;
pointer-events: none;
}
body.dark-mode .chevron {
border-left-color: #606077;
}
body.light-mode .chevron {
border-left-color: #909090;
}
/* We change styles for when the chevron is pointing down */
.folder.open > span .chevron {
border-left-color: var(--dark-text-color-accent);
transform: rotate(90deg);
}
body.dark-mode .folder.open > span .chevron {
border-left-color: var(--dark-text-color-accent);
}
body.light-mode .folder.open > span .chevron {
border-left-color: var(--light-text-color-accent);
}
/* Hover effects */
body.dark-mode .folder > span:hover .chevron {
border-left-color: var(--dark-hover-color)
}
body.light-mode .folder > span:hover .chevron {
border-left-color: var(--light-hover-color)
}
/* Active effects */
body.dark-mode .folder > span:active .chevron {
border-left-color: var(--dark-hover-color-act)
}
body.light-mode .folder > span:active .chevron {
border-left-color: var(--light-hover-color-act)
}
/* Main content ============================================================= */
#main {
transition: margin-left 0.5s;
padding: 16px;
margin-top: 80px;
}
/* Comment field of output is used as a title for each output */
.output-comment {
font-size: 1.4em;
font-weight: 500;
color: var(--dark-text-color);
margin: 20px 0 10px 0;
text-align: center;
}
body.light-mode .output-comment {
color: var(--light-text-color);
}
body.dark-mode .output-comment {
color: var(--dark-text-color);
}
/* Kibot version ------------------------------------------------------------ */
.generator {
text-align: right;
font-size: 0.6em;
text-decoration: none;
}
.generator a {
text-decoration: none; /* Removes the underline */
}
/* Dark Mode: Regular Text */
body.dark-mode .generator {
color: var(--dark-text-color-accent);
}
/* Dark Mode: Hyperlinks */
body.dark-mode .generator a {
color: var(--dark-hover-color); /* Hyperlink */
}
/* Light Mode: Regular Text */
body.light-mode .generator {
color: var(--light-text-color-accent);
}
/* Light Mode: Hyperlinks */
body.light-mode .generator a {
color: var(--light-hover-color); /* Hyperlink */
}
/* Category boxes (folder) -------------------------------------------------- */
.category-box {
z-index: 1000;
background-color: var(--dark-bg-color-banner);
border: 1px solid var(--dark-bg-color-banner);
border-radius: 8px;
padding: 16px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 400px;
height: 140;
text-decoration: none;
transition: background-color 0.3s ease, transform 0.2s ease;
margin-bottom: 0px;
}
body.light-mode .category-box {
color: var(--light-text-color);
background-color: var(--light-bg-color-banner);
border: var(--light-bg-color-banner);
}
body.dark-mode .category-box {
color: var(--dark-text-color);
background-color: var(--dark-bg-color-banner);
border: var(--dark-bg-color-banner);
}
.category-box img {
margin-top: 10px;
max-width: 100%;
max-height: 100%;
height: auto;
margin-bottom: 10px;
}
.category-title {
font-size: 1.4em;
font-weight: 500;
text-align: center;
color: #e5e5e5;
text-decoration: none;
display: inline-block;
margin-top: 0px;
margin-bottom: 0px;
}
body.light-mode .category-title {
color: var(--light-text-color);
}
body.dark-mode .category-title {
color: var(--dark-text-color);
}
/* Hover effects */
.category-box:hover {
background-color: var(--dark-banner-hover);
transform: scale(1.05); /* Slight zoom effect */
cursor: pointer;
}
body.light-mode .category-box:hover {
background-color: var(--light-banner-hover);
}
body.dark-mode .category-box:hover {
background-color: var(--dark-banner-hover);
}
/* Output boxes (files) ----------------------------------------------------- */
.output-box {
z-index: 999;
background-color: var(--dark-bg-color-banner);
border: 1px solid var(--dark-bg-color-banner);
border-radius: 8px;
padding: 16px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 300px;
height: 140px;
text-decoration: none;
transition: background-color 0.3s ease, transform 0.2s ease;
}
/* Offset the scroll position */
.output-virtual-box {
position: relative;
padding-top: var(--top-menu-height, 80px);
margin-top: calc(-1 * var(--top-menu-height, 80px));
pointer-events: none; /* Make it non-interactive */
}
.output-virtual-box > * {
pointer-events: auto; /* Allow its children to remain interactive */
}
/* Some files (e.g. PDF, PNG) have wider output boxes */
.output-box.wide {
width: 400px;
height: auto;
}
.output-box img {
margin-top: 10px;
max-width: 100%;
max-height: 100%;
height: auto;
margin-bottom: 0px;
}
/* The output boxes are centered and wrap around */
.items-container {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 20px;
padding: 20px;
}
body.light-mode .output-box {
color: var(--light-text-color);
background-color: var(--light-bg-color-banner);
border: var(--light-bg-color-banner);
}
body.dark-mode .output-box {
color: var(--dark-text-color);
background-color: var(--dark-bg-color-banner);
border: var(--dark-bg-color-banner);
}
/* Hover effects */
.output-box:hover {
background-color: var(--dark-banner-hover);
transform: scale(1.05);
cursor: pointer;
}
body.light-mode .output-box:hover {
background-color: var(--light-banner-hover);
}
body.dark-mode .output-box:hover {
background-color: var(--dark-banner-hover);
}
/* Name of the output below the icon */
.output-box .output-name {
color: #8997c6;
font-size: 14px;
margin-top: 0px;
text-align: center;
}
body.light-mode .output-box .output-name {
color: var(--light-text-color-accent);
}
body.dark-mode .output-box .output-name {
color: #8997c6;
}
/* Filename below the icon */
.output-box .filename {
text-decoration: none;
color: var(--dark-text-color);
text-align: center;
font-size: 14px;
margin-bottom: 7px;
}
body.light-mode .output-box .filename {
color: var(--light-text-color);
}
body.dark-mode .output-box .filename {
color: var(--dark-text-color);
}
/* Theme Toggle Switch ====================================================== */
.theme-switch {
position: relative;
display: inline-block;
width: 50px;
height: 25px;
margin-left: 10px;
}
/* Hide the default checkbox button */
.theme-switch input {
opacity: 0;
width: 0;
height: 0;
}
.theme-switch span {
position: absolute;
cursor: pointer;
background-color: var(--light-banner-hover);
border-radius: 25px;
top: 0;
left: 0;
right: 0;
bottom: 0;
transition: 0.4s;
}
.theme-switch span::before {
position: absolute;
content: "";
height: 20px;
width: 20px;
left: 4px;
bottom: 3px;
background-color: var(--light-bg-color);
border-radius: 50%;
transition: none; /* Disable animation by default */
}
.theme-switch span.animate::before {
transition: transform 0.4s ease, background-color 0.4s ease;
}
.theme-switch input:checked + span {
background-color: var(--dark-bg-color);
}
.theme-switch input:checked + span::before {
transform: translateX(25px);
background-color: var(--dark-text-color);
}
/* Scrollbar ================================================================ */
body, html {
scroll-behavior: smooth;
scrollbar-width: auto;
}
body.dark-mode .navbar {
scrollbar-color: var(--dark-banner-hover) var(--dark-bg-color);
}
body.light-mode .navbar {
scrollbar-color: var(--light-banner-hover) var(--light-bg-color);
}
/* WebKit Scrollbar Styles */
body::-webkit-scrollbar, .navbar::-webkit-scrollbar {
width: 12px;
height: 12px;
}
body::-webkit-scrollbar-thumb, .navbar::-webkit-scrollbar-thumb {
border-radius: 6px;
background: var(--dark-banner-hover);
border: 2px solid var(--dark-bg-color);
}
body::-webkit-scrollbar-track, .navbar::-webkit-scrollbar-track {
border-radius: 6px;
background: var(--dark-bg-color);
}
body.dark-mode::-webkit-scrollbar-thumb:hover, .navbar.dark-mode::-webkit-scrollbar-thumb:hover {
background: #44475a !important;
}
body.light-mode::-webkit-scrollbar-thumb, .navbar.light-mode::-webkit-scrollbar-thumb {
background: var(--light-banner-hover);
border: 2px solid var(--light-bg-color);
}
body.light-mode::-webkit-scrollbar-track, .navbar.light-mode::-webkit-scrollbar-track {
background: var(--light-bg-color);
}
body.light-mode::-webkit-scrollbar-thumb:hover, .navbar.light-mode::-webkit-scrollbar-thumb:hover {
background: #909090 !important;
}
body::-webkit-scrollbar-corner, .navbar::-webkit-scrollbar-corner {
background: var(--dark-bg-color);
}
/* Markdown ================================================================= */
.markdown-content {
font-family: Roboto, sans-serif;
line-height: 1.6;
padding: 15px;
border-radius: 5px;
max-width: calc(100% - 180px);
white-space: pre-wrap; /* Handle preformatted text */
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
body.light-mode .markdown-content {
background-color: #f9f9f9;
border: 1px solid #ddd;
color: #444444;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
body.dark-mode .markdown-content {
background-color: #1e1e2f;
border: 1px solid #44475a;
color: #e5e5e5;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
/* Tables */
.markdown-content table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
body.light-mode .markdown-content table th,
body.light-mode .markdown-content table td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
background-color: #ffffff;
color: #444444;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
body.dark-mode .markdown-content table th,
body.dark-mode .markdown-content table td {
border: 1px solid #44475a;
padding: 8px;
text-align: left;
background-color: #27293d;
color: #e5e5e5;
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
}
/* Code Blocks */
.markdown-content pre {
background-color: var(--dark-bg-color-banner);
color: var(--dark-text-color); /* Matches dark theme text */
padding: 10px;
border-radius: 5px;
overflow-x: auto;
transition: background-color 0.4s ease, color 0.4s ease;
}
body.light-mode .markdown-content pre {
background-color: var(--light-bg-color-banner);
color: var(--light-text-color);
transition: background-color 0.4s ease, color 0.4s ease;
}
body.dark-mode .markdown-content pre {
background-color: var(--dark-bg-color-banner);
color: var(--dark-text-color);
transition: background-color 0.4s ease, color 0.4s ease;
}
/* Inline Code */
.markdown-content code {
background-color: var(--light-bg-color-banner);
padding: 2px 5px;
border-radius: 3px;
font-family: 'Courier New', Courier, monospace;
transition: background-color 0.4s ease, color 0.4s ease;
}
body.light-mode .markdown-content code {
background-color: var(--light-bg-color-banner);
color: var(--light-text-color);
transition: background-color 0.4s ease, color 0.4s ease;
}
body.dark-mode .markdown-content code {
background-color: var(--dark-bg-color-banner);
color: var(--dark-text-color);
transition: background-color 0.4s ease, color 0.4s ease;
}
/* Links */
body.light-mode .markdown-content a {
color: var(--light-hover-color);
text-decoration: none;
transition: color 0.4s ease;
}
body.dark-mode .markdown-content a {
color: var(--dark-hover-color);
text-decoration: none;
transition: color 0.4s ease;
}
.markdown-content a:hover {
text-decoration: underline;
}
/* Images */
.markdown-content img {
max-width: 100%;
height: auto;
display: block;
margin: 10px auto;
transition: opacity 0.4s ease;
}
.markdown-content pre::-webkit-scrollbar {
height: 12px; /* Horizontal scrollbar height */
}
.markdown-content pre::-webkit-scrollbar-thumb {
background: var(--dark-banner-hover); /* Match other scrollbar thumb color */
border-radius: 6px; /* Round edges */
border: 2px solid var(--dark-bg-color); /* Outer border matches background */
}
.markdown-content pre::-webkit-scrollbar-track {
background: var(--dark-bg-color); /* Match the background color */
border-radius: 6px;
}
body.light-mode .markdown-content pre::-webkit-scrollbar-thumb {
background: var(--light-banner-hover); /* Light mode thumb color */
border: 2px solid var(--light-bg-color); /* Light mode border */
}
body.light-mode .markdown-content pre::-webkit-scrollbar-track {
background: var(--light-bg-color); /* Light mode track background */
}
/* Search bar =============================================================== */
#search-container,
#search-bar,
#autocomplete-list,
#autocomplete-list li {
transition: background-color 0.3s, color 0.3s, border-color 0.3s;
}
#search-container {
padding: 10px;
background-color: transparent;
margin-top: 10px;
top: 0;
z-index: 1001;
width: calc(100% - 10px);
box-sizing: border-box;
}
#search-bar {
width: 100%; /* Match the width of the container */
padding: 8px;
border: 1px solid var(--light-text-color-accent);
border-radius: 4px;
outline: none;
background-color: transparent;
color: var(--light-text-color);
box-sizing: border-box; /* Ensure padding is included in width */
}
#search-bar::placeholder {
color: var(--light-text-color-accent);
}
#autocomplete-list {
list-style-type: none;
padding: 0;
margin: 5px 0 0;
max-height: 200px;
overflow-y: auto;
background-color: var(--light-bg-color-banner);
border: 1px solid var(--light-text-color-accent);
border-radius: 4px;
position: absolute;
z-index: 1001;
width: auto; /* Width will be dynamically calculated */
box-sizing: border-box;
display: none; /* Hidden by default */
}
#autocomplete-list li {
padding: 8px;
cursor: pointer;
transition: background-color 0.2s;
color: var(--light-text-color);
}
#autocomplete-list li:hover {
background-color: var(--light-banner-hover);
color: var(--light-hover-color);
}
.dark-mode #search-bar {
color: var(--dark-text-color);
border-color: var(--dark-text-color-accent);
}
.dark-mode #search-bar::placeholder {
color: var(--dark-text-color-accent);
}
.dark-mode #autocomplete-list {
background-color: var(--dark-bg-color-banner);
border-color: var(--dark-text-color-accent);
}
.dark-mode #autocomplete-list li {
color: var(--dark-text-color);
}
.dark-mode #autocomplete-list li:hover {
background-color: var(--dark-banner-hover);
color: var(--dark-hover-color);
}
.highlighted {
background-color: var(--light-banner-hover); /* Same as hover background */
color: var(--light-hover-color); /* Same as hover text color */
}
body.dark-mode .highlighted {
background-color: var(--dark-banner-hover); /* Same as hover background */
color: var(--dark-hover-color); /* Same as hover text color */
}
/* New classes to remove transitions on page load =========================== */
body.no-transition,
.no-transition .output-box,
body.no-transition .theme-switch span,
body.no-transition button,
body.no-transition #close-navbar,
body.no-transition #home-button,
body.no-transition #back-button,
body.no-transition #forward-button,
body.no-transition #topmenu,
body.no-transition .navbar-category .folder > span,
body.no-transition .navbar-output,
body.no-transition .category-box,
#search-bar {
transition: none !important; /* Disable transition during page load */
}

View File

@@ -1,4 +0,0 @@
<html>
<head>
<meta http-equiv="refresh" content="0; html/Test_5-navigate.html"/></head>
</html>

File diff suppressed because one or more lines are too long

View File

@@ -1,41 +0,0 @@
Ref,Val,Package,PosX,PosY,Rot,Side
"C1","100n","C_0603_1608Metric",11.5000,5.5000,-90.0000,top
"C2","100n","C_0603_1608Metric",11.0000,14.0000,0.0000,top
"C3","100u","C_1206_3216Metric",25.5000,7.5000,0.0000,top
"C4","100u","C_1206_3216Metric",22.0000,7.5000,-90.0000,top
"C5","1u","C_0603_1608Metric",27.0000,4.5000,90.0000,top
"C6","2.2u","C_0603_1608Metric",11.5000,1.5000,180.0000,top
"C7","4.7u","C_0603_1608Metric",39.0000,3.0000,180.0000,top
"C8","4.7u","C_0603_1608Metric",32.0000,2.5000,90.0000,top
"J1","B2B-PH-K","JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical",25.0500,3.5500,90.0000,bottom
"J2","B5B-PH-K","JST_PH_B5B-PH-K_1x05_P2.00mm_Vertical",43.5000,2.7500,90.0000,bottom
"J3","Conn_ARM_JTAG_SWD_10","PinHeader_2x05_P1.27mm_Vertical_SMD",33.2500,13.7500,0.0000,top
"L1","10uH","L_0603_1608Metric",25.5000,9.5000,0.0000,top
"Q1","Si2301CDS","SOT-23",14.0000,18.7500,-90.0000,top
"Q2","Si2301CDS","SOT-23",38.5625,8.5500,180.0000,top
"Q3","Si2301CDS","SOT-23",41.7500,15.5000,90.0000,top
"R1","10k","R_0603_1608Metric",16.5000,19.1750,90.0000,top
"R2","51k","R_0603_1608Metric",3.5000,7.0000,90.0000,top
"R3","51k","R_0603_1608Metric",3.5000,4.0000,90.0000,top
"R4","220k","R_0603_1608Metric",3.5000,10.0000,-90.0000,top
"R5","51k","R_0603_1608Metric",3.5000,13.0000,-90.0000,top
"R6","330","R_0603_1608Metric",7.5000,15.0000,-90.0000,top
"R7","51k","R_0603_1608Metric",6.0000,15.0000,-90.0000,top
"R8","220k","R_0603_1608Metric",11.6125,11.2750,-90.0000,top
"R9","10k","R_0603_1608Metric",41.5000,10.0000,-90.0000,top
"R10","22","R_0603_1608Metric",30.2500,19.7500,180.0000,top
"R11","22","R_0603_1608Metric",30.2500,21.2500,180.0000,top
"R12","10k","R_0603_1608Metric",19.0000,3.0000,180.0000,top
"R13","10k","R_0603_1608Metric",19.0000,1.5000,180.0000,top
"R14","75","R_0603_1608Metric",41.5000,7.0000,-90.0000,top
"R15","10k","R_0603_1608Metric",11.5000,3.0000,180.0000,top
"R16","10k","R_0603_1608Metric",39.0000,6.0000,0.0000,top
"R17","5.1k","R_0603_1608Metric",36.5000,6.0000,90.0000,top
"R18","220","R_0603_1608Metric",44.2500,15.0000,-90.0000,top
"R19","10k","R_0603_1608Metric",39.2500,15.0000,-90.0000,top
"R20","10k","R_0603_1608Metric",19.0000,4.5000,180.0000,top
"U1","MCP6042T-I/MS","MSOP-8_3x3mm_P0.65mm",7.5000,5.5000,0.0000,top
"U2","MCP6042T-I/MS","MSOP-8_3x3mm_P0.65mm",7.5000,11.5000,0.0000,top
"U3","MDBT50Q-1MV2","Raytac_MDBT50Q",23.0000,18.5000,0.0000,top
"U4","BQ27427","Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm",15.0000,2.5000,-90.0000,top
"U5","MCP73832T-2ACI/OT","SOT-23-5",35.0000,2.5000,0.0000,top
1 Ref Val Package PosX PosY Rot Side
2 C1 100n C_0603_1608Metric 11.5000 5.5000 -90.0000 top
3 C2 100n C_0603_1608Metric 11.0000 14.0000 0.0000 top
4 C3 100u C_1206_3216Metric 25.5000 7.5000 0.0000 top
5 C4 100u C_1206_3216Metric 22.0000 7.5000 -90.0000 top
6 C5 1u C_0603_1608Metric 27.0000 4.5000 90.0000 top
7 C6 2.2u C_0603_1608Metric 11.5000 1.5000 180.0000 top
8 C7 4.7u C_0603_1608Metric 39.0000 3.0000 180.0000 top
9 C8 4.7u C_0603_1608Metric 32.0000 2.5000 90.0000 top
10 J1 B2B-PH-K JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical 25.0500 3.5500 90.0000 bottom
11 J2 B5B-PH-K JST_PH_B5B-PH-K_1x05_P2.00mm_Vertical 43.5000 2.7500 90.0000 bottom
12 J3 Conn_ARM_JTAG_SWD_10 PinHeader_2x05_P1.27mm_Vertical_SMD 33.2500 13.7500 0.0000 top
13 L1 10uH L_0603_1608Metric 25.5000 9.5000 0.0000 top
14 Q1 Si2301CDS SOT-23 14.0000 18.7500 -90.0000 top
15 Q2 Si2301CDS SOT-23 38.5625 8.5500 180.0000 top
16 Q3 Si2301CDS SOT-23 41.7500 15.5000 90.0000 top
17 R1 10k R_0603_1608Metric 16.5000 19.1750 90.0000 top
18 R2 51k R_0603_1608Metric 3.5000 7.0000 90.0000 top
19 R3 51k R_0603_1608Metric 3.5000 4.0000 90.0000 top
20 R4 220k R_0603_1608Metric 3.5000 10.0000 -90.0000 top
21 R5 51k R_0603_1608Metric 3.5000 13.0000 -90.0000 top
22 R6 330 R_0603_1608Metric 7.5000 15.0000 -90.0000 top
23 R7 51k R_0603_1608Metric 6.0000 15.0000 -90.0000 top
24 R8 220k R_0603_1608Metric 11.6125 11.2750 -90.0000 top
25 R9 10k R_0603_1608Metric 41.5000 10.0000 -90.0000 top
26 R10 22 R_0603_1608Metric 30.2500 19.7500 180.0000 top
27 R11 22 R_0603_1608Metric 30.2500 21.2500 180.0000 top
28 R12 10k R_0603_1608Metric 19.0000 3.0000 180.0000 top
29 R13 10k R_0603_1608Metric 19.0000 1.5000 180.0000 top
30 R14 75 R_0603_1608Metric 41.5000 7.0000 -90.0000 top
31 R15 10k R_0603_1608Metric 11.5000 3.0000 180.0000 top
32 R16 10k R_0603_1608Metric 39.0000 6.0000 0.0000 top
33 R17 5.1k R_0603_1608Metric 36.5000 6.0000 90.0000 top
34 R18 220 R_0603_1608Metric 44.2500 15.0000 -90.0000 top
35 R19 10k R_0603_1608Metric 39.2500 15.0000 -90.0000 top
36 R20 10k R_0603_1608Metric 19.0000 4.5000 180.0000 top
37 U1 MCP6042T-I/MS MSOP-8_3x3mm_P0.65mm 7.5000 5.5000 0.0000 top
38 U2 MCP6042T-I/MS MSOP-8_3x3mm_P0.65mm 7.5000 11.5000 0.0000 top
39 U3 MDBT50Q-1MV2 Raytac_MDBT50Q 23.0000 18.5000 0.0000 top
40 U4 BQ27427 Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm 15.0000 2.5000 -90.0000 top
41 U5 MCP73832T-2ACI/OT SOT-23-5 35.0000 2.5000 0.0000 top

Binary file not shown.

View File

@@ -1,11 +0,0 @@
ASSEMBLY NOTES (UNLESS OTHERWISE SPECIFIED)
1) DO NOT POPULATE COMPONENTS ARE MARKED WITH A RED CROSS
2) DO NOT POPULATE COMPONENTS ARE NOT PRESENT IN THE BOM
3) IF CONFLICTING INFORMATION IS FOUND BETWEEN THE ASSEMBLY
FILE AND BOM, BOM SHOULD BE USED AS THE MAIN SOURCE.
4) DOT IDENTIFIES PIN #1 LOCATION AND DEVICE ORIENTATION
WHEN VIEWED FROM THE TOP.

View File

@@ -1,23 +0,0 @@
Row,Quantity Per PCB,References,Value,Datasheet,Footprint,Description,Asymworks IPN,Manufacturer,Manufacturer PN,LCSC
1,2,C1 C2,100n,https://yageogroup.com/download/specsheet/CC0603KRX7R9BB104,C_0603_1608Metric,"capacitor, small US symbol",,YAGEO,CC0603KRX7R9BB104,C14663
2,1,C5,1u,https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A105KB8NNNC,C_0603_1608Metric,"capacitor, small US symbol",,Samsung Electro-Mechanics,CL10A105KB8NNNC,C15849
3,1,C6,2.2u,https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A225KO8NNN,C_0603_1608Metric,"capacitor, small US symbol",,Samsung Electro-Mechanics,CL10A225KO8NNNC,C23630
4,2,C7 C8,4.7u,https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A475KO8NNNC,C_0603_1608Metric,"capacitor, small US symbol",,Samsung Electro-Mechanics,CL10A475KO8NNNC,C19666
5,2,C3 C4,100u,https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL31A107MQHNNNE,C_1206_3216Metric,"capacitor, small US symbol",,Samsung Electro-Mechanics,CL31A107MQHNNNE,C15008
6,1,J1,B2B-PH-K,https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf,JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical,"Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)",,JST,S2B-PH-SM4-TB,C295747
7,1,J2,B5B-PH-K,https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf,JST_PH_B5B-PH-K_1x05_P2.00mm_Vertical,"Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)",,JST,S5B-PH-SM4-TB,C265104
8,1,J3,Conn_ARM_JTAG_SWD_10,http://infocenter.arm.com/help/topic/com.arm.doc.ddi0314h/DDI0314H_coresight_components_trm.pdf,PinHeader_2x05_P1.27mm_Vertical_SMD,"Cortex Debug Connector, standard ARM Cortex-M SWD and JTAG interface",,Amphenol ICC,20021121-00010C4LF,C150517
9,1,L1,10uH,https://product.tdk.com/system/files/dam/doc/product/inductor/inductor/smd/catalog/inductor_commercial_decoupling_mlz1608_en.pdf,L_0603_1608Metric,"Inductor, small symbol",,TDK,MLZ1608M100WT000,C76798
10,3,Q1 Q2 Q3,Si2301CDS,https://www.vishay.com/doc/?68741,SOT-23,"-3.1A Id, -20V Vds, P-Channel MOSFET, SOT-23",,Vishay,Si2301CDS-T1-GE3,C10487
11,2,R10 R11,22,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF220JT5E,C23345
12,1,R14,75,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF750JT5E,C4275
13,1,R18,220,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF2200T5E,C22962
14,1,R6,330,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF3300T5E,C23138
15,1,R17,5.1k,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF5101T5E,C23186
16,8,R1 R9 R12 R13 R15 R16 R19 R20,10k,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF1002T5E,C25804
17,4,R2 R3 R5 R7,51k,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF5102T5E,C23196
18,2,R4 R8,220k,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF2203T5E,C22961
19,1,U4,BQ27427,https://www.ti.com/lit/ds/symlink/bq27427.pdf,Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm,Li-Ion/Li-Po battery monitor and fuel guage,,Texas Instruments,BQ27427YZFR,C6075475
20,2,U1 U2,MCP6042T-I/MS,http://ww1.microchip.com/downloads/en/devicedoc/22140b.pdf,MSOP-8_3x3mm_P0.65mm,"Dual, 1 MHz, 85µA, Rail-to-Rail input and output, MSOP-8",,Microchip,MCP6042-I/MS,C627438
21,1,U5,MCP73832T-2ACI/OT,http://ww1.microchip.com/downloads/en/DeviceDoc/20001984g.pdf,SOT-23-5,"Single cell, Li-Ion/Li-Po charge management controller, 4.20V, Tri-State Status Output, in SOT23-5 package",,Microchip,MCP73832T-2ACI/OT,C424093
22,1,U3,MDBT50Q-1MV2,https://www.raytac.com/download/index.php?index_id=43,Raytac_MDBT50Q,"Multiprotocol BLE/ANT/2.4 GHz/802.15.4 Cortex-M4F SoC, nRF52840 module",,Raytac,MDBT50Q-1MV2,C5118826
1 Row Quantity Per PCB References Value Datasheet Footprint Description Asymworks IPN Manufacturer Manufacturer PN LCSC
2 1 2 C1 C2 100n https://yageogroup.com/download/specsheet/CC0603KRX7R9BB104 C_0603_1608Metric capacitor, small US symbol YAGEO CC0603KRX7R9BB104 C14663
3 2 1 C5 1u https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A105KB8NNNC C_0603_1608Metric capacitor, small US symbol Samsung Electro-Mechanics CL10A105KB8NNNC C15849
4 3 1 C6 2.2u https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A225KO8NNN C_0603_1608Metric capacitor, small US symbol Samsung Electro-Mechanics CL10A225KO8NNNC C23630
5 4 2 C7 C8 4.7u https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A475KO8NNNC C_0603_1608Metric capacitor, small US symbol Samsung Electro-Mechanics CL10A475KO8NNNC C19666
6 5 2 C3 C4 100u https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL31A107MQHNNNE C_1206_3216Metric capacitor, small US symbol Samsung Electro-Mechanics CL31A107MQHNNNE C15008
7 6 1 J1 B2B-PH-K https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/) JST S2B-PH-SM4-TB C295747
8 7 1 J2 B5B-PH-K https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf JST_PH_B5B-PH-K_1x05_P2.00mm_Vertical Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/) JST S5B-PH-SM4-TB C265104
9 8 1 J3 Conn_ARM_JTAG_SWD_10 http://infocenter.arm.com/help/topic/com.arm.doc.ddi0314h/DDI0314H_coresight_components_trm.pdf PinHeader_2x05_P1.27mm_Vertical_SMD Cortex Debug Connector, standard ARM Cortex-M SWD and JTAG interface Amphenol ICC 20021121-00010C4LF C150517
10 9 1 L1 10uH https://product.tdk.com/system/files/dam/doc/product/inductor/inductor/smd/catalog/inductor_commercial_decoupling_mlz1608_en.pdf L_0603_1608Metric Inductor, small symbol TDK MLZ1608M100WT000 C76798
11 10 3 Q1 Q2 Q3 Si2301CDS https://www.vishay.com/doc/?68741 SOT-23 -3.1A Id, -20V Vds, P-Channel MOSFET, SOT-23 Vishay Si2301CDS-T1-GE3 C10487
12 11 2 R10 R11 22 https://www.royalohm.com/assets/pdf/products/smd/1.pdf R_0603_1608Metric Resistor, US symbol Uni-Royal 0603WAF220JT5E C23345
13 12 1 R14 75 https://www.royalohm.com/assets/pdf/products/smd/1.pdf R_0603_1608Metric Resistor, US symbol Uni-Royal 0603WAF750JT5E C4275
14 13 1 R18 220 https://www.royalohm.com/assets/pdf/products/smd/1.pdf R_0603_1608Metric Resistor, US symbol Uni-Royal 0603WAF2200T5E C22962
15 14 1 R6 330 https://www.royalohm.com/assets/pdf/products/smd/1.pdf R_0603_1608Metric Resistor, US symbol Uni-Royal 0603WAF3300T5E C23138
16 15 1 R17 5.1k https://www.royalohm.com/assets/pdf/products/smd/1.pdf R_0603_1608Metric Resistor, US symbol Uni-Royal 0603WAF5101T5E C23186
17 16 8 R1 R9 R12 R13 R15 R16 R19 R20 10k https://www.royalohm.com/assets/pdf/products/smd/1.pdf R_0603_1608Metric Resistor, US symbol Uni-Royal 0603WAF1002T5E C25804
18 17 4 R2 R3 R5 R7 51k https://www.royalohm.com/assets/pdf/products/smd/1.pdf R_0603_1608Metric Resistor, US symbol Uni-Royal 0603WAF5102T5E C23196
19 18 2 R4 R8 220k https://www.royalohm.com/assets/pdf/products/smd/1.pdf R_0603_1608Metric Resistor, US symbol Uni-Royal 0603WAF2203T5E C22961
20 19 1 U4 BQ27427 https://www.ti.com/lit/ds/symlink/bq27427.pdf Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm Li-Ion/Li-Po battery monitor and fuel guage Texas Instruments BQ27427YZFR C6075475
21 20 2 U1 U2 MCP6042T-I/MS http://ww1.microchip.com/downloads/en/devicedoc/22140b.pdf MSOP-8_3x3mm_P0.65mm Dual, 1 MHz, 85µA, Rail-to-Rail input and output, MSOP-8 Microchip MCP6042-I/MS C627438
22 21 1 U5 MCP73832T-2ACI/OT http://ww1.microchip.com/downloads/en/DeviceDoc/20001984g.pdf SOT-23-5 Single cell, Li-Ion/Li-Po charge management controller, 4.20V, Tri-State Status Output, in SOT23-5 package Microchip MCP73832T-2ACI/OT C424093
23 22 1 U3 MDBT50Q-1MV2 https://www.raytac.com/download/index.php?index_id=43 Raytac_MDBT50Q Multiprotocol BLE/ANT/2.4 GHz/802.15.4 Cortex-M4F SoC, nRF52840 module Raytac MDBT50Q-1MV2 C5118826

View File

@@ -1,528 +0,0 @@
<html>
<head>
<meta charset="UTF-8">
<title>Bill of Materials</title>
<style>
.cell-title { vertical-align: bottom; }
.cell-info { vertical-align: top; padding: 1em;}
.cell-extra-info { vertical-align: top; padding: 1em;}
.cell-stats { vertical-align: top; padding: 1em;}
.title { font-size:2.5em; font-weight: bold; }
.subtitle { font-size:1.5em; font-weight: bold; }
.h2 { font-size:1.5em; font-weight: bold; }
.td-empty0 { text-align: center; background-color: #F57676;}
.td-gen0 { text-align: center; background-color: #DCF5E4;}
.td-kicad0 { text-align: center; background-color: #F5DCA9;}
.td-user0 { text-align: center; background-color: #DCEFF5;}
.td-empty1 { text-align: center; background-color: #FF8080;}
.td-gen1 { text-align: center; background-color: #E6FFEE;}
.td-kicad1 { text-align: center; background-color: #FFE6B3;}
.td-user1 { text-align: center; background-color: #E6F9FF;}
.td-nocolor { text-align: center; }
.color-ref { margin: 25px 0; }
.color-ref th { text-align: left }
.color-ref td { padding: 5px 20px; }
.head-table { margin-bottom: 2em; }
.centered-checkmark { font-size: 30vw; text-align: center; color: green; }
.tg-sort-header::-moz-selection{background:0 0}
.tg-sort-header::selection{background:0 0}.tg-sort-header{cursor:pointer}
.tg-sort-header:after{content:'';float:right;border-width:0 5px 5px;border-style:solid;
border-color:#ffffff transparent;visibility:hidden;opacity:.6}
.tg-sort-header:hover:after{visibility:visible}
.tg-sort-asc:after,.tg-sort-asc:hover:after,.tg-sort-desc:after{visibility:visible;opacity:1}
.tg-sort-desc:after{border-bottom:none;border-width:5px 5px 0}
.content-table {
border-collapse:
collapse;
margin-top: 5px;
margin-bottom: 4em;
font-size: 0.9em;
font-family: sans-serif;
min-width: 400px;
border-radius: 5px 5px 0 0;
overflow: hidden;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
}
.content-table thead tr { background-color: #0e4e8e; color: #ffffff; text-align: left; }
.content-table th, .content-table td { padding: 12px 15px; }
.content-table tbody tr { border-bottom: 1px solid #dddddd; }
.content-table tbody tr:nth-of-type(even) { background-color: #f3f3f3; }
.content-table tbody tr:last-of-type { border-bottom: 2px solid #0e4e8e; }
.content-table * tr:hover > td { background-color: @bgl@ !important }
.content-table {
border-collapse:
collapse;
margin-top: 5px;
margin-bottom: 4em;
font-size: 0.9em;
font-family: sans-serif;
min-width: 400px;
border-radius: 5px 5px 0 0;
overflow: hidden;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
}
.content-table thead tr { background-color: @bg@; color: #ffffff; text-align: left; }
.content-table th, .content-table td { padding: 12px 15px; }
.content-table tbody tr { border-bottom: 1px solid #dddddd; }
.content-table tbody tr:nth-of-type(even) { background-color: #f3f3f3; }
.content-table tbody tr:last-of-type { border-bottom: 2px solid @bg@; }
.content-table * tr:hover > td { background-color: #3e7ebe !important }
</style>
</head>
<body>
<table class="head-table">
<tr>
<td rowspan="2">
</td>
<td colspan="2" class="cell-title">
<div class="title">Bill of Materials</div>
</td>
</tr>
<tr>
<td class="cell-info">
<b>Schematic</b>: Test_5<br>
<b>Variant</b>: default<br>
<b>Revision</b>: NO_TAG+ (Unreleased)<br>
<b>Date</b>: 2026-03-09<br>
<b>KiCad Version</b>: 9.0.7+1<br>
</td>
<td class="cell-stats">
<b>Component Groups</b>: 22<br>
<b>Component Count</b>: 40 (per PCB)<br>
<b>Fitted Components</b>: 40 (per PCB)<br>
<b>Number of PCBs</b>: 1<br>
<b>Total Components</b>: 40 (for 1 PCBs)<br>
</td>
</tr>
</table>
<h2>Component Groups</h2>
<table class="content-table">
<thead>
<tr>
<th class="th-gen">Row</th>
<th class="th-gen">Quantity Per PCB</th>
<th class="th-kicad">References</th>
<th class="th-kicad">Value</th>
<th class="th-kicad">Datasheet</th>
<th class="th-kicad">Footprint</th>
<th class="th-user">Description</th>
<th class="th-user">Asymworks IPN</th>
<th class="th-user">Manufacturer</th>
<th class="th-user">Manufacturer PN</th>
<th class="th-user">LCSC</th>
</tr>
</thead>
<tbody>
<tr id="0">
<td class="td-gen0">1</td>
<td class="td-gen0">2</td>
<td class="td-kicad0"><div id="C2"></div><div id="C1"></div>C1 C2</td>
<td class="td-kicad0">100n</td>
<td class="td-kicad0"><a href="https://yageogroup.com/download/specsheet/CC0603KRX7R9BB104">https://yageogroup.com/download/specsheet/CC0603KRX7R9BB104</a></td>
<td class="td-kicad0">C_0603_1608Metric</td>
<td class="td-user0">capacitor, small US symbol</td>
<td class="td-empty0"></td>
<td class="td-user0">YAGEO</td>
<td class="td-user0">CC0603KRX7R9BB104</td>
<td class="td-user0">C14663</td>
</tr>
<tr id="1">
<td class="td-gen1">2</td>
<td class="td-gen1">1</td>
<td class="td-kicad1"><div id="C5"></div>C5</td>
<td class="td-kicad1">1u</td>
<td class="td-kicad1"><a href="https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A105KB8NNNC">https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A105KB8NNNC</a></td>
<td class="td-kicad1">C_0603_1608Metric</td>
<td class="td-user1">capacitor, small US symbol</td>
<td class="td-empty1"></td>
<td class="td-user1">Samsung Electro-Mechanics</td>
<td class="td-user1">CL10A105KB8NNNC</td>
<td class="td-user1">C15849</td>
</tr>
<tr id="2">
<td class="td-gen0">3</td>
<td class="td-gen0">1</td>
<td class="td-kicad0"><div id="C6"></div>C6</td>
<td class="td-kicad0">2.2u</td>
<td class="td-kicad0"><a href="https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A225KO8NNN">https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A225KO8NNN</a></td>
<td class="td-kicad0">C_0603_1608Metric</td>
<td class="td-user0">capacitor, small US symbol</td>
<td class="td-empty0"></td>
<td class="td-user0">Samsung Electro-Mechanics</td>
<td class="td-user0">CL10A225KO8NNNC</td>
<td class="td-user0">C23630</td>
</tr>
<tr id="3">
<td class="td-gen1">4</td>
<td class="td-gen1">2</td>
<td class="td-kicad1"><div id="C8"></div><div id="C7"></div>C7 C8</td>
<td class="td-kicad1">4.7u</td>
<td class="td-kicad1"><a href="https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A475KO8NNNC">https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A475KO8NNNC</a></td>
<td class="td-kicad1">C_0603_1608Metric</td>
<td class="td-user1">capacitor, small US symbol</td>
<td class="td-empty1"></td>
<td class="td-user1">Samsung Electro-Mechanics</td>
<td class="td-user1">CL10A475KO8NNNC</td>
<td class="td-user1">C19666</td>
</tr>
<tr id="4">
<td class="td-gen0">5</td>
<td class="td-gen0">2</td>
<td class="td-kicad0"><div id="C4"></div><div id="C3"></div>C3 C4</td>
<td class="td-kicad0">100u</td>
<td class="td-kicad0"><a href="https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL31A107MQHNNNE">https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL31A107MQHNNNE</a></td>
<td class="td-kicad0">C_1206_3216Metric</td>
<td class="td-user0">capacitor, small US symbol</td>
<td class="td-empty0"></td>
<td class="td-user0">Samsung Electro-Mechanics</td>
<td class="td-user0">CL31A107MQHNNNE</td>
<td class="td-user0">C15008</td>
</tr>
<tr id="5">
<td class="td-gen1">6</td>
<td class="td-gen1">1</td>
<td class="td-kicad1"><div id="J1"></div>J1</td>
<td class="td-kicad1">B2B-PH-K</td>
<td class="td-kicad1"><a href="https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf">https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf</a></td>
<td class="td-kicad1">JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical</td>
<td class="td-user1">Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)</td>
<td class="td-empty1"></td>
<td class="td-user1">JST</td>
<td class="td-user1">S2B-PH-SM4-TB</td>
<td class="td-user1">C295747</td>
</tr>
<tr id="6">
<td class="td-gen0">7</td>
<td class="td-gen0">1</td>
<td class="td-kicad0"><div id="J2"></div>J2</td>
<td class="td-kicad0">B5B-PH-K</td>
<td class="td-kicad0"><a href="https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf">https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf</a></td>
<td class="td-kicad0">JST_PH_B5B-PH-K_1x05_P2.00mm_Vertical</td>
<td class="td-user0">Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)</td>
<td class="td-empty0"></td>
<td class="td-user0">JST</td>
<td class="td-user0">S5B-PH-SM4-TB</td>
<td class="td-user0">C265104</td>
</tr>
<tr id="7">
<td class="td-gen1">8</td>
<td class="td-gen1">1</td>
<td class="td-kicad1"><div id="J3"></div>J3</td>
<td class="td-kicad1">Conn_ARM_JTAG_SWD_10</td>
<td class="td-kicad1"><a href="http://infocenter.arm.com/help/topic/com.arm.doc.ddi0314h/DDI0314H_coresight_components_trm.pdf">http://infocenter.arm.com/help/topic/com.arm.doc.ddi0314h/DDI0314H_coresight_components_trm.pdf</a></td>
<td class="td-kicad1">PinHeader_2x05_P1.27mm_Vertical_SMD</td>
<td class="td-user1">Cortex Debug Connector, standard ARM Cortex-M SWD and JTAG interface</td>
<td class="td-empty1"></td>
<td class="td-user1">Amphenol ICC</td>
<td class="td-user1">20021121-00010C4LF</td>
<td class="td-user1">C150517</td>
</tr>
<tr id="8">
<td class="td-gen0">9</td>
<td class="td-gen0">1</td>
<td class="td-kicad0"><div id="L1"></div>L1</td>
<td class="td-kicad0">10uH</td>
<td class="td-kicad0"><a href="https://product.tdk.com/system/files/dam/doc/product/inductor/inductor/smd/catalog/inductor_commercial_decoupling_mlz1608_en.pdf">https://product.tdk.com/system/files/dam/doc/product/inductor/inductor/smd/catalog/inductor_commercial_decoupling_mlz1608_en.pdf</a></td>
<td class="td-kicad0">L_0603_1608Metric</td>
<td class="td-user0">Inductor, small symbol</td>
<td class="td-empty0"></td>
<td class="td-user0">TDK</td>
<td class="td-user0">MLZ1608M100WT000</td>
<td class="td-user0">C76798</td>
</tr>
<tr id="9">
<td class="td-gen1">10</td>
<td class="td-gen1">3</td>
<td class="td-kicad1"><div id="Q3"></div><div id="Q2"></div><div id="Q1"></div>Q1 Q2 Q3</td>
<td class="td-kicad1">Si2301CDS</td>
<td class="td-kicad1"><a href="https://www.vishay.com/doc/?68741">https://www.vishay.com/doc/?68741</a></td>
<td class="td-kicad1">SOT-23</td>
<td class="td-user1">-3.1A Id, -20V Vds, P-Channel MOSFET, SOT-23</td>
<td class="td-empty1"></td>
<td class="td-user1">Vishay</td>
<td class="td-user1">Si2301CDS-T1-GE3</td>
<td class="td-user1">C10487</td>
</tr>
<tr id="10">
<td class="td-gen0">11</td>
<td class="td-gen0">2</td>
<td class="td-kicad0"><div id="R11"></div><div id="R10"></div>R10 R11</td>
<td class="td-kicad0">22</td>
<td class="td-kicad0"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
<td class="td-kicad0">R_0603_1608Metric</td>
<td class="td-user0">Resistor, US symbol</td>
<td class="td-empty0"></td>
<td class="td-user0">Uni-Royal</td>
<td class="td-user0">0603WAF220JT5E</td>
<td class="td-user0">C23345</td>
</tr>
<tr id="11">
<td class="td-gen1">12</td>
<td class="td-gen1">1</td>
<td class="td-kicad1"><div id="R14"></div>R14</td>
<td class="td-kicad1">75</td>
<td class="td-kicad1"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
<td class="td-kicad1">R_0603_1608Metric</td>
<td class="td-user1">Resistor, US symbol</td>
<td class="td-empty1"></td>
<td class="td-user1">Uni-Royal</td>
<td class="td-user1">0603WAF750JT5E</td>
<td class="td-user1">C4275</td>
</tr>
<tr id="12">
<td class="td-gen0">13</td>
<td class="td-gen0">1</td>
<td class="td-kicad0"><div id="R18"></div>R18</td>
<td class="td-kicad0">220</td>
<td class="td-kicad0"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
<td class="td-kicad0">R_0603_1608Metric</td>
<td class="td-user0">Resistor, US symbol</td>
<td class="td-empty0"></td>
<td class="td-user0">Uni-Royal</td>
<td class="td-user0">0603WAF2200T5E</td>
<td class="td-user0">C22962</td>
</tr>
<tr id="13">
<td class="td-gen1">14</td>
<td class="td-gen1">1</td>
<td class="td-kicad1"><div id="R6"></div>R6</td>
<td class="td-kicad1">330</td>
<td class="td-kicad1"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
<td class="td-kicad1">R_0603_1608Metric</td>
<td class="td-user1">Resistor, US symbol</td>
<td class="td-empty1"></td>
<td class="td-user1">Uni-Royal</td>
<td class="td-user1">0603WAF3300T5E</td>
<td class="td-user1">C23138</td>
</tr>
<tr id="14">
<td class="td-gen0">15</td>
<td class="td-gen0">1</td>
<td class="td-kicad0"><div id="R17"></div>R17</td>
<td class="td-kicad0">5.1k</td>
<td class="td-kicad0"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
<td class="td-kicad0">R_0603_1608Metric</td>
<td class="td-user0">Resistor, US symbol</td>
<td class="td-empty0"></td>
<td class="td-user0">Uni-Royal</td>
<td class="td-user0">0603WAF5101T5E</td>
<td class="td-user0">C23186</td>
</tr>
<tr id="15">
<td class="td-gen1">16</td>
<td class="td-gen1">8</td>
<td class="td-kicad1"><div id="R20"></div><div id="R19"></div><div id="R16"></div><div id="R15"></div><div id="R13"></div><div id="R12"></div><div id="R9"></div><div id="R1"></div>R1 R9 R12 R13 R15 R16 R19 R20</td>
<td class="td-kicad1">10k</td>
<td class="td-kicad1"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
<td class="td-kicad1">R_0603_1608Metric</td>
<td class="td-user1">Resistor, US symbol</td>
<td class="td-empty1"></td>
<td class="td-user1">Uni-Royal</td>
<td class="td-user1">0603WAF1002T5E</td>
<td class="td-user1">C25804</td>
</tr>
<tr id="16">
<td class="td-gen0">17</td>
<td class="td-gen0">4</td>
<td class="td-kicad0"><div id="R7"></div><div id="R5"></div><div id="R3"></div><div id="R2"></div>R2 R3 R5 R7</td>
<td class="td-kicad0">51k</td>
<td class="td-kicad0"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
<td class="td-kicad0">R_0603_1608Metric</td>
<td class="td-user0">Resistor, US symbol</td>
<td class="td-empty0"></td>
<td class="td-user0">Uni-Royal</td>
<td class="td-user0">0603WAF5102T5E</td>
<td class="td-user0">C23196</td>
</tr>
<tr id="17">
<td class="td-gen1">18</td>
<td class="td-gen1">2</td>
<td class="td-kicad1"><div id="R8"></div><div id="R4"></div>R4 R8</td>
<td class="td-kicad1">220k</td>
<td class="td-kicad1"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
<td class="td-kicad1">R_0603_1608Metric</td>
<td class="td-user1">Resistor, US symbol</td>
<td class="td-empty1"></td>
<td class="td-user1">Uni-Royal</td>
<td class="td-user1">0603WAF2203T5E</td>
<td class="td-user1">C22961</td>
</tr>
<tr id="18">
<td class="td-gen0">19</td>
<td class="td-gen0">1</td>
<td class="td-kicad0"><div id="U4"></div>U4</td>
<td class="td-kicad0">BQ27427</td>
<td class="td-kicad0"><a href="https://www.ti.com/lit/ds/symlink/bq27427.pdf">https://www.ti.com/lit/ds/symlink/bq27427.pdf</a></td>
<td class="td-kicad0">Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm</td>
<td class="td-user0">Li-Ion/Li-Po battery monitor and fuel guage</td>
<td class="td-empty0"></td>
<td class="td-user0">Texas Instruments</td>
<td class="td-user0">BQ27427YZFR</td>
<td class="td-user0">C6075475</td>
</tr>
<tr id="19">
<td class="td-gen1">20</td>
<td class="td-gen1">2</td>
<td class="td-kicad1"><div id="U2"></div><div id="U1"></div>U1 U2</td>
<td class="td-kicad1">MCP6042T-I/MS</td>
<td class="td-kicad1"><a href="http://ww1.microchip.com/downloads/en/devicedoc/22140b.pdf">http://ww1.microchip.com/downloads/en/devicedoc/22140b.pdf</a></td>
<td class="td-kicad1">MSOP-8_3x3mm_P0.65mm</td>
<td class="td-user1">Dual, 1 MHz, 85µA, Rail-to-Rail input and output, MSOP-8</td>
<td class="td-empty1"></td>
<td class="td-user1">Microchip</td>
<td class="td-user1">MCP6042-I/MS</td>
<td class="td-user1">C627438</td>
</tr>
<tr id="20">
<td class="td-gen0">21</td>
<td class="td-gen0">1</td>
<td class="td-kicad0"><div id="U5"></div>U5</td>
<td class="td-kicad0">MCP73832T-2ACI/OT</td>
<td class="td-kicad0"><a href="http://ww1.microchip.com/downloads/en/DeviceDoc/20001984g.pdf">http://ww1.microchip.com/downloads/en/DeviceDoc/20001984g.pdf</a></td>
<td class="td-kicad0">SOT-23-5</td>
<td class="td-user0">Single cell, Li-Ion/Li-Po charge management controller, 4.20V, Tri-State Status Output, in SOT23-5 package</td>
<td class="td-empty0"></td>
<td class="td-user0">Microchip</td>
<td class="td-user0">MCP73832T-2ACI/OT</td>
<td class="td-user0">C424093</td>
</tr>
<tr id="21">
<td class="td-gen1">22</td>
<td class="td-gen1">1</td>
<td class="td-kicad1"><div id="U3"></div>U3</td>
<td class="td-kicad1">MDBT50Q-1MV2</td>
<td class="td-kicad1"><a href="https://www.raytac.com/download/index.php?index_id=43">https://www.raytac.com/download/index.php?index_id=43</a></td>
<td class="td-kicad1">Raytac_MDBT50Q</td>
<td class="td-user1">Multiprotocol BLE/ANT/2.4 GHz/802.15.4 Cortex-M4F SoC, nRF52840 module</td>
<td class="td-empty1"></td>
<td class="td-user1">Raytac</td>
<td class="td-user1">MDBT50Q-1MV2</td>
<td class="td-user1">C5118826</td>
</tr>
</tbody>
</table>
<table class="color-ref">
<tr><th>Color reference for columns:</th></tr>
<tr><td class="td-kicad0">KiCad Fields (default)</td></tr>
<tr><td class="td-gen0">Generated Fields</td></tr>
<tr><td class="td-user0">User Fields</td></tr>
<tr><td class="td-empty0">Empty Fields</td></tr>
</table>
<script charset="utf-8">
var TGSort = window.TGSort || function(n) {
"use strict";
function r(n) { return n ? n.length : 0 }
function t(n, t, e, o = 0) { for (e = r(n); o < e; ++o) t(n[o], o) }
function e(n) { return n.split("").reverse().join("") }
function o(n) {
var e = n[0];
return t(n, function(n) {
for (; !n.startsWith(e);) e = e.substring(0, r(e) - 1)
}), r(e)
}
function u(n, r, e = []) {
return t(n, function(n) {
r(n) && e.push(n)
}), e
}
var a = parseFloat;
function i(n, r) {
return function(t) {
var e = "";
return t.replace(n, function(n, t, o) {
return e = t.replace(r, "") + "." + (o || "").substring(1)
}), a(e)
}
}
var s = i(/^(?:\s*)([+-]?(?:\d+)(?:,\d{3})*)(\.\d*)?$/g, /,/g),
c = i(/^(?:\s*)([+-]?(?:\d+)(?:\.\d{3})*)(,\d*)?$/g, /\./g);
function f(n) {
var t = a(n);
return !isNaN(t) && r("" + t) + 1 >= r(n) ? t : NaN
}
function d(n) {
var e = [],
o = n;
return t([f, s, c], function(u) {
var a = [],
i = [];
t(n, function(n, r) {
r = u(n), a.push(r), r || i.push(n)
}), r(i) < r(o) && (o = i, e = a)
}), r(u(o, function(n) {
return n == o[0]
})) == r(o) ? e : []
}
function v(n) {
if ("TABLE" == n.nodeName) {
for (var a = function(r) {
var e, o, u = [],
a = [];
return function n(r, e) {
e(r), t(r.childNodes, function(r) {
n(r, e)
})
}(n, function(n) {
"TR" == (o = n.nodeName) ? (e = [], u.push(e), a.push(n)) : "TD" != o && "TH" != o || e.push(n)
}), [u, a]
}(), i = a[0], s = a[1], c = r(i), f = c > 1 && r(i[0]) < r(i[1]) ? 1 : 0, v = f + 1, p = i[f], h = r(p), l = [], g = [], N = [], m = v; m < c; ++m) {
for (var T = 0; T < h; ++T) {
r(g) < h && g.push([]);
var C = i[m][T],
L = C.textContent || C.innerText || "";
g[T].push(L.trim())
}
N.push(m - v)
}
t(p, function(n, t) {
l[t] = 0;
var a = n.classList;
a.add("tg-sort-header"), n.addEventListener("click", function() {
var n = l[t];
! function() {
for (var n = 0; n < h; ++n) {
var r = p[n].classList;
r.remove("tg-sort-asc"), r.remove("tg-sort-desc"), l[n] = 0
}
}(), (n = 1 == n ? -1 : +!n) && a.add(n > 0 ? "tg-sort-asc" : "tg-sort-desc"), l[t] = n;
var i, f = g[t],
m = function(r, t) {
return n * f[r].localeCompare(f[t]) || n * (r - t)
},
T = function(n) {
var t = d(n);
if (!r(t)) {
var u = o(n),
a = o(n.map(e));
t = d(n.map(function(n) {
return n.substring(u, r(n) - a)
}))
}
return t
}(f);
(r(T) || r(T = r(u(i = f.map(Date.parse), isNaN)) ? [] : i)) && (m = function(r, t) {
var e = T[r],
o = T[t],
u = isNaN(e),
a = isNaN(o);
return u && a ? 0 : u ? -n : a ? n : e > o ? n : e < o ? -n : n * (r - t)
});
var C, L = N.slice();
L.sort(m);
for (var E = v; E < c; ++E)(C = s[E].parentNode).removeChild(s[E]);
for (E = v; E < c; ++E) C.appendChild(s[v + L[E - v]])
})
})
}
}
n.addEventListener("DOMContentLoaded", function() {
for (var t = n.getElementsByClassName("content-table"), e = 0; e < r(t); ++e) try {
v(t[e])
} catch (n) {}
})
}(document)
</script>
</body></html>

View File

@@ -1,4 +0,0 @@
Type,Front Side,Back Side,Total
THT,0,2,2
SMD,38,0,38
Total,38,2,40
1 Type Front Side Back Side Total
2 THT 0 2 2
3 SMD 38 0 38
4 Total 38 2 40

View File

@@ -1,11 +0,0 @@
ASSEMBLY NOTES (UNLESS OTHERWISE SPECIFIED)
1) DO NOT POPULATE COMPONENTS ARE MARKED WITH A RED CROSS
2) DO NOT POPULATE COMPONENTS ARE NOT PRESENT IN THE BOM
3) IF CONFLICTING INFORMATION IS FOUND BETWEEN THE ASSEMBLY
FILE AND BOM, BOM SHOULD BE USED AS THE MAIN SOURCE.
4) DOT IDENTIFIES PIN #1 LOCATION AND DEVICE ORIENTATION
WHEN VIEWED FROM THE TOP.

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@@ -1,56 +0,0 @@
FABRICATION NOTES (UNLESS OTHERWISE SPECIFIED)
1) FABRICATE PER IPC-6012A CLASS 2.
2) OUTLINE DEFINED IN SEPARATE GERBER FILE WITH
"Edge_Cuts.GBR" SUFFIX.
3) SEE SEPARATE DRILL FILES WITH ".DRL" SUFFIX
FOR HOLE LOCATIONS.
SELECTED HOLE LOCATIONS SHOWN ON THIS DRAWING
FOR REFERENCE ONLY.
4) SURFACE FINISH: HAL SNPB
5) SOLDERMASK ON BOTH SIDES OF THE BOARD SHALL
BE LPI, COLOR GREEN.
6) SILK SCREEN LEGEND TO BE APPLIED PER LAYER
STACKUP USING WHITE NON-CONDUCTIVE EPOXY INK.
7) ALL VIAS ARE TENTED ON BOTH SIDES UNLESS
SOLDERMASK OPENED IN GERBER.
8) RESERVED
9) PCB MATERIAL REQUIREMENTS:
A. FLAMMABILITY RATING MUST MEET OR EXCEED
UL94V-0 REQUIREMENTS.
B. Tg 135 C OR EQUIVALENT.
10) DESIGN GEOMETRY MINIMUM FEATURE SIZES:
BOARD SIZE 46.000 × 27.500 mm
BOARD THICKNESS 1.647 mm
TRACE WIDTH 0.100 mm
TRACE TO TRACE 0.200 mm
MIN. HOLE (PTH) 0.300 mm
MIN. HOLE (NPTH) 2.200 mm
ANNULAR RING 0.150 mm
COPPER TO HOLE 0.250 mm
COPPER TO EDGE 0.500 mm
HOLE TO HOLE 0.250 mm
11) ALL DIMENSIONS ARE IN MILLIMETERS UNLESS OTHERWISE
SPECIFIED.
12) FOR REFERENCE ONLY THE STACKUP CORRESPONDS TO JLCPCB
STACKUP JLC04161H-7628.
FOR REFERENCE ONLY. IMPEDANCE IS THE CONTROLLING PARAMETER
OVER LAYER STACKUP. GERBER DATA MAY NOT BE ALTERED EXCEPT
FOR STANDARD FABRICATION ALLOWANCES.
THE SUPPLIED ARTWORK MAY OR MAY NOT CONTAIN THE SPECIFIED
TRACE GEOMETRIES ON EVERY LAYERS SPECIFIED.

View File

@@ -1,4 +0,0 @@
Layer,Ref1,Ref2,Type,Impedance,Width,Space,Tolerance
L1,AIR,L2,SE,50,0.350,-----,10%
L1,AIR,L2,DIFF,90,0.286,0.203,10%
L1,AIR,L2,DIFF,100,0.220,0.203,10%
1 Layer Ref1 Ref2 Type Impedance Width Space Tolerance
2 L1 AIR L2 SE 50 0.350 ----- 10%
3 L1 AIR L2 DIFF 90 0.286 0.203 10%
4 L1 AIR L2 DIFF 100 0.220 0.203 10%

Binary file not shown.

View File

@@ -1,3 +0,0 @@
Count,Hole Size,Plated,Hole Shape,Drill Layer Pair,Hole Type
2,2.20mm (86.61mils),NPTH,Round,F.Cu - B.Cu,Mechanical
Total 2,,,,,
1 Count Hole Size Plated Hole Shape Drill Layer Pair Hole Type
2 2 2.20mm (86.61mils) NPTH Round F.Cu - B.Cu Mechanical
3 Total 2

View File

@@ -1,4 +0,0 @@
Count,Hole Size,Plated,Hole Shape,Drill Layer Pair,Hole Type
97,0.30mm (11.81mils),PTH,Round,F.Cu - B.Cu,Via
7,0.75mm (29.53mils),PTH,Round,F.Cu - B.Cu,Pad
Total 104,,,,,
1 Count Hole Size Plated Hole Shape Drill Layer Pair Hole Type
2 97 0.30mm (11.81mils) PTH Round F.Cu - B.Cu Via
3 7 0.75mm (29.53mils) PTH Round F.Cu - B.Cu Pad
4 Total 104

View File

@@ -1,17 +0,0 @@
M48
; DRILL file {KiCad 9.0.7+1} date 2026-03-09T23:22:20+0000
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2026-03-09T23:22:20+00:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,9.0.7+1
; #@! TF.FileFunction,NonPlated,1,4,NPTH
FMAT,2
METRIC
; #@! TA.AperFunction,NonPlated,NPTH,ComponentDrill
T1C2.200
%
G90
G05
T1
X15.5Y7.0
X30.5Y7.0
M30

Binary file not shown.

View File

@@ -1,122 +0,0 @@
M48
; DRILL file {KiCad 9.0.7+1} date 2026-03-09T23:22:20+0000
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2026-03-09T23:22:20+00:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,9.0.7+1
; #@! TF.FileFunction,Plated,1,4,PTH
FMAT,2
METRIC
; #@! TA.AperFunction,Plated,PTH,ViaDrill
T1C0.300
; #@! TA.AperFunction,Plated,PTH,ComponentDrill
T2C0.750
%
G90
G05
T1
X2.5Y8.0
X6.975Y10.525
X7.0Y5.5
X7.0Y4.525
X7.5Y11.5
X8.0Y4.525
X8.025Y10.525
X9.5Y3.0
X9.5Y1.5
X10.5Y17.5
X12.5Y16.5
X12.5Y6.5
X12.5Y5.0
X13.5Y2.5
X14.0Y3.5
X14.0Y1.5
X15.0Y14.0
X15.5Y17.5
X16.5Y22.0
X16.5Y21.0
X17.0Y21.5
X17.0Y13.0
X17.0Y12.0
X17.0Y11.0
X17.0Y4.5
X17.5Y22.0
X17.5Y21.0
X17.5Y12.5
X17.5Y11.5
X17.5Y10.5
X18.5Y10.5
X18.5Y8.5
X19.0Y22.0
X19.0Y21.0
X19.0Y12.0
X19.5Y21.5
X19.5Y20.5
X19.5Y7.0
X20.0Y22.0
X20.0Y21.0
X20.05Y9.5
X20.5Y20.5
X21.0Y1.5
X21.5Y20.5
X22.0Y4.5
X22.5Y20.5
X23.0Y22.0
X23.0Y21.0
X23.0Y10.0
X23.5Y21.5
X23.5Y20.5
X24.0Y22.0
X24.0Y21.0
X24.0Y14.0
X24.0Y13.0
X24.5Y21.5
X24.5Y20.5
X25.0Y22.0
X25.0Y21.0
X25.5Y21.5
X25.5Y20.5
X25.5Y8.0
X26.0Y22.0
X26.0Y15.5
X26.0Y13.5
X27.5Y10.5
X28.5Y22.0
X28.5Y17.0
X28.5Y13.5
X28.5Y12.5
X28.5Y11.5
X28.5Y10.5
X29.0Y14.0
X29.0Y13.0
X29.0Y12.0
X29.0Y11.0
X29.5Y15.0
X29.5Y13.5
X29.5Y12.5
X29.5Y11.5
X29.5Y10.5
X30.0Y2.0
X31.0Y3.0
X31.5Y17.5
X32.5Y18.5
X32.75Y19.75
X33.862Y5.5
X33.995Y10.005
X35.5Y6.5
X36.5Y18.5
X37.0Y15.5
X37.5Y2.5
X38.5Y12.5
X39.5Y4.5
X40.0Y17.0
X40.5Y11.0
X43.5Y13.0
T2
X25.05Y5.55
X25.05Y3.55
X43.5Y10.75
X43.5Y8.75
X43.5Y6.75
X43.5Y4.75
X43.5Y2.75
M30

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,109 +0,0 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,Date%
%TF.ProjectId,Test_5,54657374-5f35-42e6-9b69-6361645f7063,NO_TAG+ (Unreleased)*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Soldermask,Bot*%
%TF.FilePolarity,Negative*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10C,2.200000*%
%ADD11RoundRect,0.500000X0.500000X1.500000X-0.500000X1.500000X-0.500000X-1.500000X0.500000X-1.500000X0*%
%ADD12C,1.500000*%
%ADD13RoundRect,0.250000X0.625000X-0.350000X0.625000X0.350000X-0.625000X0.350000X-0.625000X-0.350000X0*%
%ADD14O,1.750000X1.200000*%
G04 APERTURE END LIST*
D10*
%TO.C,H1*%
X15500000Y7000000D03*
%TD*%
%TO.C,H2*%
X30500000Y7000000D03*
%TD*%
D11*
%TO.C,TP12*%
X3500000Y14000000D03*
%TD*%
D12*
%TO.C,TP1*%
X5000000Y4500000D03*
%TD*%
D13*
%TO.C,J2*%
X43500000Y2750000D03*
D14*
X43500000Y4750000D03*
X43500000Y6750000D03*
X43500000Y8750000D03*
X43500000Y10750000D03*
%TD*%
D12*
%TO.C,TP8*%
X38000000Y14000000D03*
%TD*%
%TO.C,TP3*%
X16000000Y2500000D03*
%TD*%
%TO.C,TP10*%
X35000000Y17000000D03*
%TD*%
%TO.C,TP7*%
X35000000Y14000000D03*
%TD*%
D11*
%TO.C,TP14*%
X9500000Y14000000D03*
%TD*%
%TO.C,TP13*%
X6500000Y14000000D03*
%TD*%
D12*
%TO.C,TP6*%
X35000000Y11000000D03*
%TD*%
%TO.C,TP9*%
X38000000Y17000000D03*
%TD*%
%TO.C,TP2*%
X21000000Y11500000D03*
%TD*%
%TO.C,TP4*%
X19000000Y2500000D03*
%TD*%
D11*
%TO.C,TP11*%
X12500000Y14000000D03*
%TD*%
D13*
%TO.C,J1*%
X25050000Y3550000D03*
D14*
X25050000Y5550000D03*
%TD*%
D12*
%TO.C,TP5*%
X34324797Y3291770D03*
%TD*%
M02*

View File

@@ -1,15 +0,0 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,Date%
%TF.ProjectId,Test_5,54657374-5f35-42e6-9b69-6361645f7063,NO_TAG+ (Unreleased)*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Paste,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

File diff suppressed because it is too large Load Diff

View File

@@ -1,34 +0,0 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,Date%
%TF.ProjectId,Test_5,54657374-5f35-42e6-9b69-6361645f7063,NO_TAG+ (Unreleased)*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Profile,NP*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
%TA.AperFunction,Profile*%
%ADD10C,0.050000*%
%TD*%
G04 APERTURE END LIST*
D10*
X29250000Y27500000D02*
X34500000Y20000000D01*
X34500000Y20000000D02*
X46000000Y20000000D01*
X46000000Y0D02*
X46000000Y20000000D01*
X16750000Y27500000D02*
X11500000Y20000000D01*
X0Y20000000D02*
X0Y0D01*
X16750000Y27500000D02*
X29250000Y27500000D01*
X11500000Y20000000D02*
X0Y20000000D01*
X0Y0D02*
X46000000Y0D01*
M02*

File diff suppressed because it is too large Load Diff

View File

@@ -1,362 +0,0 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,Date%
%TF.ProjectId,Test_5,54657374-5f35-42e6-9b69-6361645f7063,NO_TAG+ (Unreleased)*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Soldermask,Top*%
%TF.FilePolarity,Negative*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10RoundRect,0.225000X-0.225000X-0.250000X0.225000X-0.250000X0.225000X0.250000X-0.225000X0.250000X0*%
%ADD11RoundRect,0.200000X-0.275000X0.200000X-0.275000X-0.200000X0.275000X-0.200000X0.275000X0.200000X0*%
%ADD12RoundRect,0.200000X0.200000X0.275000X-0.200000X0.275000X-0.200000X-0.275000X0.200000X-0.275000X0*%
%ADD13RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*%
%ADD14C,2.200000*%
%ADD15C,0.345000*%
%ADD16RoundRect,0.200000X0.275000X-0.200000X0.275000X0.200000X-0.275000X0.200000X-0.275000X-0.200000X0*%
%ADD17R,0.600000X0.400000*%
%ADD18R,0.400000X0.600000*%
%ADD19RoundRect,0.150000X-0.512500X-0.150000X0.512500X-0.150000X0.512500X0.150000X-0.512500X0.150000X0*%
%ADD20RoundRect,0.218750X-0.218750X-0.256250X0.218750X-0.256250X0.218750X0.256250X-0.218750X0.256250X0*%
%ADD21RoundRect,0.250000X-0.650000X0.325000X-0.650000X-0.325000X0.650000X-0.325000X0.650000X0.325000X0*%
%ADD22RoundRect,0.150000X0.587500X0.150000X-0.587500X0.150000X-0.587500X-0.150000X0.587500X-0.150000X0*%
%ADD23RoundRect,0.225000X0.225000X0.250000X-0.225000X0.250000X-0.225000X-0.250000X0.225000X-0.250000X0*%
%ADD24RoundRect,0.250000X-0.325000X-0.650000X0.325000X-0.650000X0.325000X0.650000X-0.325000X0.650000X0*%
%ADD25RoundRect,0.150000X-0.150000X0.587500X-0.150000X-0.587500X0.150000X-0.587500X0.150000X0.587500X0*%
%ADD26RoundRect,0.150000X0.150000X-0.587500X0.150000X0.587500X-0.150000X0.587500X-0.150000X-0.587500X0*%
%ADD27RoundRect,0.100000X-0.712500X-0.100000X0.712500X-0.100000X0.712500X0.100000X-0.712500X0.100000X0*%
%ADD28R,2.400000X0.740000*%
%ADD29RoundRect,0.225000X-0.250000X0.225000X-0.250000X-0.225000X0.250000X-0.225000X0.250000X0.225000X0*%
%ADD30RoundRect,0.200000X-0.200000X-0.275000X0.200000X-0.275000X0.200000X0.275000X-0.200000X0.275000X0*%
%ADD31RoundRect,0.250000X0.625000X-0.350000X0.625000X0.350000X-0.625000X0.350000X-0.625000X-0.350000X0*%
%ADD32O,1.750000X1.200000*%
G04 APERTURE END LIST*
D10*
%TO.C,C2*%
X10225000Y14000000D03*
X11775000Y14000000D03*
%TD*%
D11*
%TO.C,R9*%
X41500000Y10825000D03*
X41500000Y9175000D03*
%TD*%
D12*
%TO.C,R11*%
X31075000Y21250000D03*
X29425000Y21250000D03*
%TD*%
D11*
%TO.C,R6*%
X7500000Y15825000D03*
X7500000Y14175000D03*
%TD*%
D12*
%TO.C,R13*%
X19825000Y1500000D03*
X18175000Y1500000D03*
%TD*%
D11*
%TO.C,R18*%
X44250000Y15825000D03*
X44250000Y14175000D03*
%TD*%
%TO.C,R5*%
X3500000Y13825000D03*
X3500000Y12175000D03*
%TD*%
D13*
%TO.C,C8*%
X32000000Y1725000D03*
X32000000Y3275000D03*
%TD*%
D14*
%TO.C,H1*%
X15500000Y7000000D03*
%TD*%
D15*
%TO.C,U4*%
X15500000Y3000000D03*
X15500000Y2500000D03*
X15500000Y2000000D03*
X15000000Y3000000D03*
X15000000Y2500000D03*
X15000000Y2000000D03*
X14500000Y3000000D03*
X14500000Y2500000D03*
X14500000Y2000000D03*
%TD*%
D16*
%TO.C,R2*%
X3500000Y6175000D03*
X3500000Y7825000D03*
%TD*%
D11*
%TO.C,R19*%
X39250000Y15825000D03*
X39250000Y14175000D03*
%TD*%
D17*
%TO.C,U3*%
X18350000Y22250000D03*
X18350000Y21150000D03*
X18350000Y20350000D03*
X18350000Y18750000D03*
X19250000Y18350000D03*
X18350000Y17950000D03*
X19250000Y17550000D03*
X18350000Y17150000D03*
X19250000Y16750000D03*
X18350000Y16350000D03*
X19250000Y15950000D03*
X18350000Y15550000D03*
X19250000Y15150000D03*
X18350000Y14750000D03*
D18*
X18200000Y11350000D03*
X19000000Y11350000D03*
X19800000Y11350000D03*
X20600000Y11350000D03*
X21000000Y12250000D03*
X21400000Y11350000D03*
X21800000Y12250000D03*
X22200000Y11350000D03*
X22600000Y12250000D03*
X23000000Y11350000D03*
X23400000Y12250000D03*
X23800000Y11350000D03*
X24200000Y12250000D03*
X24600000Y11350000D03*
X25000000Y12250000D03*
X25400000Y11350000D03*
X26200000Y11350000D03*
X27000000Y11350000D03*
X27800000Y11350000D03*
D17*
X27650000Y12350000D03*
X27650000Y13150000D03*
X26750000Y13550000D03*
X27650000Y13950000D03*
X26750000Y14350000D03*
X27650000Y14750000D03*
X26750000Y15150000D03*
X27650000Y15550000D03*
X26750000Y15950000D03*
X26750000Y16750000D03*
X27650000Y17150000D03*
X26750000Y17550000D03*
X27650000Y17950000D03*
X26750000Y18350000D03*
X27650000Y18750000D03*
X26750000Y19150000D03*
X26750000Y19950000D03*
X27650000Y20350000D03*
X26750000Y20750000D03*
X27650000Y21150000D03*
X26750000Y21550000D03*
X27650000Y22250000D03*
D18*
X21000000Y17950000D03*
X21800000Y17950000D03*
X22600000Y17950000D03*
X23400000Y17950000D03*
X24200000Y17950000D03*
X25000000Y17950000D03*
%TD*%
D16*
%TO.C,R17*%
X36500000Y5175000D03*
X36500000Y6825000D03*
%TD*%
%TO.C,R3*%
X3500000Y3175000D03*
X3500000Y4825000D03*
%TD*%
D12*
%TO.C,R20*%
X19825000Y4500000D03*
X18175000Y4500000D03*
%TD*%
D19*
%TO.C,U5*%
X33862500Y3450000D03*
X33862500Y2500000D03*
X33862500Y1550000D03*
X36137500Y1550000D03*
X36137500Y3450000D03*
%TD*%
D12*
%TO.C,R12*%
X19825000Y3000000D03*
X18175000Y3000000D03*
%TD*%
D13*
%TO.C,C5*%
X27000000Y3725000D03*
X27000000Y5275000D03*
%TD*%
D20*
%TO.C,L1*%
X24712500Y9500000D03*
X26287500Y9500000D03*
%TD*%
D21*
%TO.C,C4*%
X22000000Y8975000D03*
X22000000Y6025000D03*
%TD*%
D14*
%TO.C,H2*%
X30500000Y7000000D03*
%TD*%
D11*
%TO.C,R8*%
X11612500Y12100000D03*
X11612500Y10450000D03*
%TD*%
D22*
%TO.C,Q2*%
X39500000Y7600000D03*
X39500000Y9500000D03*
X37625000Y8550000D03*
%TD*%
D23*
%TO.C,C6*%
X12275000Y1500000D03*
X10725000Y1500000D03*
%TD*%
D24*
%TO.C,C3*%
X24025000Y7500000D03*
X26975000Y7500000D03*
%TD*%
D25*
%TO.C,Q1*%
X14950000Y19687500D03*
X13050000Y19687500D03*
X14000000Y17812500D03*
%TD*%
D26*
%TO.C,Q3*%
X40800000Y14562500D03*
X42700000Y14562500D03*
X41750000Y16437500D03*
%TD*%
D27*
%TO.C,U2*%
X5387500Y12475000D03*
X5387500Y11825000D03*
X5387500Y11175000D03*
X5387500Y10525000D03*
X9612500Y10525000D03*
X9612500Y11175000D03*
X9612500Y11825000D03*
X9612500Y12475000D03*
%TD*%
D11*
%TO.C,R14*%
X41500000Y7825000D03*
X41500000Y6175000D03*
%TD*%
D23*
%TO.C,C7*%
X39775000Y3000000D03*
X38225000Y3000000D03*
%TD*%
D28*
%TO.C,J3*%
X31300000Y16290000D03*
X35200000Y16290000D03*
X31300000Y15020000D03*
X35200000Y15020000D03*
X31300000Y13750000D03*
X35200000Y13750000D03*
X31300000Y12480000D03*
X35200000Y12480000D03*
X31300000Y11210000D03*
X35200000Y11210000D03*
%TD*%
D29*
%TO.C,C1*%
X11500000Y6275000D03*
X11500000Y4725000D03*
%TD*%
D11*
%TO.C,R4*%
X3500000Y10825000D03*
X3500000Y9175000D03*
%TD*%
D16*
%TO.C,R1*%
X16500000Y18350000D03*
X16500000Y20000000D03*
%TD*%
D30*
%TO.C,R16*%
X38175000Y6000000D03*
X39825000Y6000000D03*
%TD*%
D11*
%TO.C,R7*%
X6000000Y15825000D03*
X6000000Y14175000D03*
%TD*%
D12*
%TO.C,R15*%
X12325000Y3000000D03*
X10675000Y3000000D03*
%TD*%
D27*
%TO.C,U1*%
X5387500Y6475000D03*
X5387500Y5825000D03*
X5387500Y5175000D03*
X5387500Y4525000D03*
X9612500Y4525000D03*
X9612500Y5175000D03*
X9612500Y5825000D03*
X9612500Y6475000D03*
%TD*%
D12*
%TO.C,R10*%
X31075000Y19750000D03*
X29425000Y19750000D03*
%TD*%
D31*
%TO.C,J2*%
X43500000Y2750000D03*
D32*
X43500000Y4750000D03*
X43500000Y6750000D03*
X43500000Y8750000D03*
X43500000Y10750000D03*
%TD*%
D31*
%TO.C,J1*%
X25050000Y3550000D03*
D32*
X25050000Y5550000D03*
%TD*%
M02*

View File

@@ -1,336 +0,0 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,Date%
%TF.ProjectId,Test_5,54657374-5f35-42e6-9b69-6361645f7063,NO_TAG+ (Unreleased)*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Paste,Top*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10RoundRect,0.225000X-0.225000X-0.250000X0.225000X-0.250000X0.225000X0.250000X-0.225000X0.250000X0*%
%ADD11RoundRect,0.200000X-0.275000X0.200000X-0.275000X-0.200000X0.275000X-0.200000X0.275000X0.200000X0*%
%ADD12RoundRect,0.200000X0.200000X0.275000X-0.200000X0.275000X-0.200000X-0.275000X0.200000X-0.275000X0*%
%ADD13RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*%
%ADD14C,0.245000*%
%ADD15RoundRect,0.200000X0.275000X-0.200000X0.275000X0.200000X-0.275000X0.200000X-0.275000X-0.200000X0*%
%ADD16R,0.600000X0.400000*%
%ADD17R,0.400000X0.600000*%
%ADD18RoundRect,0.150000X-0.512500X-0.150000X0.512500X-0.150000X0.512500X0.150000X-0.512500X0.150000X0*%
%ADD19RoundRect,0.218750X-0.218750X-0.256250X0.218750X-0.256250X0.218750X0.256250X-0.218750X0.256250X0*%
%ADD20RoundRect,0.250000X-0.650000X0.325000X-0.650000X-0.325000X0.650000X-0.325000X0.650000X0.325000X0*%
%ADD21RoundRect,0.150000X0.587500X0.150000X-0.587500X0.150000X-0.587500X-0.150000X0.587500X-0.150000X0*%
%ADD22RoundRect,0.225000X0.225000X0.250000X-0.225000X0.250000X-0.225000X-0.250000X0.225000X-0.250000X0*%
%ADD23RoundRect,0.250000X-0.325000X-0.650000X0.325000X-0.650000X0.325000X0.650000X-0.325000X0.650000X0*%
%ADD24RoundRect,0.150000X-0.150000X0.587500X-0.150000X-0.587500X0.150000X-0.587500X0.150000X0.587500X0*%
%ADD25RoundRect,0.150000X0.150000X-0.587500X0.150000X0.587500X-0.150000X0.587500X-0.150000X-0.587500X0*%
%ADD26RoundRect,0.100000X-0.712500X-0.100000X0.712500X-0.100000X0.712500X0.100000X-0.712500X0.100000X0*%
%ADD27R,2.400000X0.740000*%
%ADD28RoundRect,0.225000X-0.250000X0.225000X-0.250000X-0.225000X0.250000X-0.225000X0.250000X0.225000X0*%
%ADD29RoundRect,0.200000X-0.200000X-0.275000X0.200000X-0.275000X0.200000X0.275000X-0.200000X0.275000X0*%
G04 APERTURE END LIST*
D10*
%TO.C,C2*%
X10225000Y14000000D03*
X11775000Y14000000D03*
%TD*%
D11*
%TO.C,R9*%
X41500000Y10825000D03*
X41500000Y9175000D03*
%TD*%
D12*
%TO.C,R11*%
X31075000Y21250000D03*
X29425000Y21250000D03*
%TD*%
D11*
%TO.C,R6*%
X7500000Y15825000D03*
X7500000Y14175000D03*
%TD*%
D12*
%TO.C,R13*%
X19825000Y1500000D03*
X18175000Y1500000D03*
%TD*%
D11*
%TO.C,R18*%
X44250000Y15825000D03*
X44250000Y14175000D03*
%TD*%
%TO.C,R5*%
X3500000Y13825000D03*
X3500000Y12175000D03*
%TD*%
D13*
%TO.C,C8*%
X32000000Y1725000D03*
X32000000Y3275000D03*
%TD*%
D14*
%TO.C,U4*%
X15500000Y3000000D03*
X15500000Y2500000D03*
X15500000Y2000000D03*
X15000000Y3000000D03*
X15000000Y2500000D03*
X15000000Y2000000D03*
X14500000Y3000000D03*
X14500000Y2500000D03*
X14500000Y2000000D03*
%TD*%
D15*
%TO.C,R2*%
X3500000Y6175000D03*
X3500000Y7825000D03*
%TD*%
D11*
%TO.C,R19*%
X39250000Y15825000D03*
X39250000Y14175000D03*
%TD*%
D16*
%TO.C,U3*%
X18350000Y22250000D03*
X18350000Y21150000D03*
X18350000Y20350000D03*
X18350000Y18750000D03*
X19250000Y18350000D03*
X18350000Y17950000D03*
X19250000Y17550000D03*
X18350000Y17150000D03*
X19250000Y16750000D03*
X18350000Y16350000D03*
X19250000Y15950000D03*
X18350000Y15550000D03*
X19250000Y15150000D03*
X18350000Y14750000D03*
D17*
X18200000Y11350000D03*
X19000000Y11350000D03*
X19800000Y11350000D03*
X20600000Y11350000D03*
X21000000Y12250000D03*
X21400000Y11350000D03*
X21800000Y12250000D03*
X22200000Y11350000D03*
X22600000Y12250000D03*
X23000000Y11350000D03*
X23400000Y12250000D03*
X23800000Y11350000D03*
X24200000Y12250000D03*
X24600000Y11350000D03*
X25000000Y12250000D03*
X25400000Y11350000D03*
X26200000Y11350000D03*
X27000000Y11350000D03*
X27800000Y11350000D03*
D16*
X27650000Y12350000D03*
X27650000Y13150000D03*
X26750000Y13550000D03*
X27650000Y13950000D03*
X26750000Y14350000D03*
X27650000Y14750000D03*
X26750000Y15150000D03*
X27650000Y15550000D03*
X26750000Y15950000D03*
X26750000Y16750000D03*
X27650000Y17150000D03*
X26750000Y17550000D03*
X27650000Y17950000D03*
X26750000Y18350000D03*
X27650000Y18750000D03*
X26750000Y19150000D03*
X26750000Y19950000D03*
X27650000Y20350000D03*
X26750000Y20750000D03*
X27650000Y21150000D03*
X26750000Y21550000D03*
X27650000Y22250000D03*
D17*
X21000000Y17950000D03*
X21800000Y17950000D03*
X22600000Y17950000D03*
X23400000Y17950000D03*
X24200000Y17950000D03*
X25000000Y17950000D03*
%TD*%
D15*
%TO.C,R17*%
X36500000Y5175000D03*
X36500000Y6825000D03*
%TD*%
%TO.C,R3*%
X3500000Y3175000D03*
X3500000Y4825000D03*
%TD*%
D12*
%TO.C,R20*%
X19825000Y4500000D03*
X18175000Y4500000D03*
%TD*%
D18*
%TO.C,U5*%
X33862500Y3450000D03*
X33862500Y2500000D03*
X33862500Y1550000D03*
X36137500Y1550000D03*
X36137500Y3450000D03*
%TD*%
D12*
%TO.C,R12*%
X19825000Y3000000D03*
X18175000Y3000000D03*
%TD*%
D13*
%TO.C,C5*%
X27000000Y3725000D03*
X27000000Y5275000D03*
%TD*%
D19*
%TO.C,L1*%
X24712500Y9500000D03*
X26287500Y9500000D03*
%TD*%
D20*
%TO.C,C4*%
X22000000Y8975000D03*
X22000000Y6025000D03*
%TD*%
D11*
%TO.C,R8*%
X11612500Y12100000D03*
X11612500Y10450000D03*
%TD*%
D21*
%TO.C,Q2*%
X39500000Y7600000D03*
X39500000Y9500000D03*
X37625000Y8550000D03*
%TD*%
D22*
%TO.C,C6*%
X12275000Y1500000D03*
X10725000Y1500000D03*
%TD*%
D23*
%TO.C,C3*%
X24025000Y7500000D03*
X26975000Y7500000D03*
%TD*%
D24*
%TO.C,Q1*%
X14950000Y19687500D03*
X13050000Y19687500D03*
X14000000Y17812500D03*
%TD*%
D25*
%TO.C,Q3*%
X40800000Y14562500D03*
X42700000Y14562500D03*
X41750000Y16437500D03*
%TD*%
D26*
%TO.C,U2*%
X5387500Y12475000D03*
X5387500Y11825000D03*
X5387500Y11175000D03*
X5387500Y10525000D03*
X9612500Y10525000D03*
X9612500Y11175000D03*
X9612500Y11825000D03*
X9612500Y12475000D03*
%TD*%
D11*
%TO.C,R14*%
X41500000Y7825000D03*
X41500000Y6175000D03*
%TD*%
D22*
%TO.C,C7*%
X39775000Y3000000D03*
X38225000Y3000000D03*
%TD*%
D27*
%TO.C,J3*%
X31300000Y16290000D03*
X35200000Y16290000D03*
X31300000Y15020000D03*
X35200000Y15020000D03*
X31300000Y13750000D03*
X35200000Y13750000D03*
X31300000Y12480000D03*
X35200000Y12480000D03*
X31300000Y11210000D03*
X35200000Y11210000D03*
%TD*%
D28*
%TO.C,C1*%
X11500000Y6275000D03*
X11500000Y4725000D03*
%TD*%
D11*
%TO.C,R4*%
X3500000Y10825000D03*
X3500000Y9175000D03*
%TD*%
D15*
%TO.C,R1*%
X16500000Y18350000D03*
X16500000Y20000000D03*
%TD*%
D29*
%TO.C,R16*%
X38175000Y6000000D03*
X39825000Y6000000D03*
%TD*%
D11*
%TO.C,R7*%
X6000000Y15825000D03*
X6000000Y14175000D03*
%TD*%
D12*
%TO.C,R15*%
X12325000Y3000000D03*
X10675000Y3000000D03*
%TD*%
D26*
%TO.C,U1*%
X5387500Y6475000D03*
X5387500Y5825000D03*
X5387500Y5175000D03*
X5387500Y4525000D03*
X9612500Y4525000D03*
X9612500Y5175000D03*
X9612500Y5825000D03*
X9612500Y6475000D03*
%TD*%
D12*
%TO.C,R10*%
X31075000Y19750000D03*
X29425000Y19750000D03*
%TD*%
M02*

File diff suppressed because it is too large Load Diff

View File

@@ -1,253 +0,0 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,Date%
%TF.ProjectId,Test_5,54657374-5f35-42e6-9b69-6361645f7063,NO_TAG+ (Unreleased)*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Copper,L2,Inr*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%TA.AperFunction,ComponentPad*%
%ADD10RoundRect,0.250000X0.625000X-0.350000X0.625000X0.350000X-0.625000X0.350000X-0.625000X-0.350000X0*%
%TD*%
%TA.AperFunction,ComponentPad*%
%ADD11O,1.750000X1.200000*%
%TD*%
%TA.AperFunction,ViaPad*%
%ADD12C,0.600000*%
%TD*%
%TA.AperFunction,Conductor*%
%ADD13C,0.200000*%
%TD*%
G04 APERTURE END LIST*
D10*
%TO.N,VBUS*%
%TO.C,J2*%
X43500000Y2750000D03*
D11*
%TO.N,/Project Architecture/Power and Interface/CHARGE_LED_IO*%
X43500000Y4750000D03*
%TO.N,/Project Architecture/Power and Interface/PAIR_LED_IO*%
X43500000Y6750000D03*
%TO.N,/Project Architecture/BLE Controller/~{PAIR_SW}*%
X43500000Y8750000D03*
%TO.N,GND*%
X43500000Y10750000D03*
%TD*%
D10*
%TO.N,Net-(J1-Pin_1)*%
%TO.C,J1*%
X25050000Y3550000D03*
D11*
%TO.N,GND*%
X25050000Y5550000D03*
%TD*%
D12*
%TO.N,GND*%
X17500000Y21000000D03*
X20000000Y21000000D03*
X29500000Y15000000D03*
X24000000Y21000000D03*
X21500000Y20500000D03*
X23000000Y22000000D03*
X12500000Y5000000D03*
X31000000Y3000000D03*
X17000000Y13000000D03*
X29500000Y13500000D03*
X28500000Y12500000D03*
X25000000Y21000000D03*
X28500000Y10500000D03*
X17000000Y11000000D03*
X25000000Y22000000D03*
X23000000Y21000000D03*
X17500000Y12500000D03*
X20500000Y20500000D03*
X29500000Y11500000D03*
X17500000Y22000000D03*
X28500000Y22000000D03*
X37500000Y2500000D03*
X17500000Y11500000D03*
X19500000Y20500000D03*
X22500000Y20500000D03*
X17000000Y21500000D03*
X9500000Y1500000D03*
X29500000Y10500000D03*
X24500000Y21500000D03*
X14000000Y3500000D03*
X28500000Y11500000D03*
X19000000Y21000000D03*
X25500000Y21500000D03*
X19500000Y21500000D03*
X29000000Y13000000D03*
X24500000Y20500000D03*
X28500000Y13500000D03*
X19000000Y22000000D03*
X27500000Y10500000D03*
X23500000Y21500000D03*
X7000000Y4525000D03*
X26000000Y22000000D03*
X15000000Y14000000D03*
X16500000Y22000000D03*
X29500000Y12500000D03*
X35500000Y6500000D03*
X29000000Y11000000D03*
X25500000Y20500000D03*
X29000000Y12000000D03*
X6975000Y10525000D03*
X17000000Y12000000D03*
X17500000Y10500000D03*
X9500000Y3000000D03*
X18500000Y10500000D03*
X29000000Y14000000D03*
X23500000Y20500000D03*
X8000000Y4525000D03*
X16500000Y21000000D03*
X24000000Y22000000D03*
X20000000Y22000000D03*
%TO.N,+3.3V*%
X2500000Y8000000D03*
X40000000Y17000000D03*
X31500000Y17500000D03*
X23000000Y10000000D03*
X12500000Y6500000D03*
X15500000Y17500000D03*
X39500000Y4500000D03*
X40500000Y11000000D03*
X21000000Y1500000D03*
X10500000Y17500000D03*
%TO.N,VDD*%
X30000000Y2000000D03*
X25500000Y8000000D03*
X13500000Y2500000D03*
X38500000Y12500000D03*
%TO.N,Net-(J1-Pin_1)*%
X14000000Y1500000D03*
%TO.N,/Project Architecture/Power and Interface/PAIR_LED_IO*%
X43500000Y13000000D03*
%TO.N,/Project Architecture/BLE Controller/~{PAIR_SW}*%
X28500000Y17000000D03*
%TO.N,/Project Architecture/Power and Interface/SWDIO*%
X32750000Y19750000D03*
%TO.N,/Project Architecture/Power and Interface/SWDCLK*%
X37000000Y15500000D03*
%TO.N,/Project Architecture/Power and Interface/~{RESET}*%
X33995000Y10005000D03*
X26000000Y15500000D03*
%TO.N,/Project Architecture/Load Cell Amp/EXC+*%
X12500000Y16500000D03*
%TO.N,/Project Architecture/Power and Interface/STAT*%
X26000000Y13500000D03*
X33862500Y5500000D03*
%TO.N,/Project Architecture/BLE Controller/~{PAIR_LED}*%
X32500000Y18500000D03*
X36500000Y18500000D03*
%TO.N,Net-(U1A--)*%
X7000000Y5500000D03*
%TO.N,/Project Architecture/BLE Controller/LOAD_CELL*%
X20050000Y9500000D03*
%TO.N,/Project Architecture/BLE Controller/SDA*%
X24000000Y14000000D03*
X19500000Y7000000D03*
%TO.N,/Project Architecture/BLE Controller/SCL*%
X24000000Y13000000D03*
X22000000Y4500000D03*
%TO.N,/Project Architecture/BLE Controller/~{BATT_INT}*%
X19000000Y12000000D03*
X17000000Y4500000D03*
X18500000Y8500000D03*
%TO.N,/Project Architecture/Load Cell Amp/SIG-*%
X8025000Y10525000D03*
%TO.N,/Project Architecture/Load Cell Amp/SIG+*%
X7500000Y11500000D03*
%TD*%
D13*
%TO.N,/Project Architecture/Power and Interface/PAIR_LED_IO*%
X44676000Y7676000D02*
X44676000Y11824000D01*
X44676000Y11824000D02*
X43500000Y13000000D01*
X43500000Y6750000D02*
X43750000Y6750000D01*
X43750000Y6750000D02*
X44676000Y7676000D01*
%TO.N,/Project Architecture/BLE Controller/~{PAIR_SW}*%
X35000000Y14000000D02*
X35000000Y9000000D01*
X35250000Y8750000D02*
X43500000Y8750000D01*
X28500000Y17000000D02*
X29000000Y16500000D01*
X29000000Y16500000D02*
X32500000Y16500000D01*
X35000000Y9000000D02*
X35250000Y8750000D01*
X32500000Y16500000D02*
X35000000Y14000000D01*
%TO.N,/Project Architecture/Power and Interface/~{RESET}*%
X26500000Y16000000D02*
X26000000Y15500000D01*
X32000000Y16000000D02*
X26500000Y16000000D01*
X33995000Y10005000D02*
X33995000Y14005000D01*
X33995000Y14005000D02*
X32000000Y16000000D01*
%TO.N,/Project Architecture/Power and Interface/STAT*%
X29000000Y5500000D02*
X33862500Y5500000D01*
X26000000Y8500000D02*
X29000000Y5500000D01*
X26000000Y13500000D02*
X26000000Y8500000D01*
%TO.N,/Project Architecture/BLE Controller/~{PAIR_LED}*%
X32500000Y18500000D02*
X36500000Y18500000D01*
%TO.N,/Project Architecture/BLE Controller/SDA*%
X21500000Y7500000D02*
X21000000Y7000000D01*
X22500000Y14000000D02*
X21500000Y13000000D01*
X24000000Y14000000D02*
X22500000Y14000000D01*
X21000000Y7000000D02*
X19500000Y7000000D01*
X21500000Y13000000D02*
X21500000Y7500000D01*
%TO.N,/Project Architecture/BLE Controller/SCL*%
X24000000Y13000000D02*
X22500000Y13000000D01*
X22000000Y12500000D02*
X22000000Y4500000D01*
X22500000Y13000000D02*
X22000000Y12500000D01*
%TO.N,/Project Architecture/BLE Controller/~{BATT_INT}*%
X18500000Y8500000D02*
X19101000Y9101000D01*
X19101000Y11899000D02*
X19000000Y12000000D01*
X19101000Y9101000D02*
X19101000Y11899000D01*
%TD*%
M02*

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,23 +0,0 @@
"Comment","Designator","Footprint","LCSC Part #"
"100n","C1,C2","C_0603_1608Metric","C14663"
"1u","C5","C_0603_1608Metric","C15849"
"2.2u","C6","C_0603_1608Metric","C23630"
"4.7u","C7,C8","C_0603_1608Metric","C19666"
"100u","C3,C4","C_1206_3216Metric","C15008"
"B2B-PH-K","J1","JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical","C295747"
"B5B-PH-K","J2","JST_PH_B5B-PH-K_1x05_P2.00mm_Vertical","C265104"
"Conn_ARM_JTAG_SWD_10","J3","PinHeader_2x05_P1.27mm_Vertical_SMD","C150517"
"10uH","L1","L_0603_1608Metric","C76798"
"Si2301CDS","Q1,Q2,Q3","SOT-23","C10487"
"22","R10,R11","R_0603_1608Metric","C23345"
"75","R14","R_0603_1608Metric","C4275"
"220","R18","R_0603_1608Metric","C22962"
"330","R6","R_0603_1608Metric","C23138"
"5.1k","R17","R_0603_1608Metric","C23186"
"10k","R1,R9,R12,R13,R15,R16,R19,R20","R_0603_1608Metric","C25804"
"51k","R2,R3,R5,R7","R_0603_1608Metric","C23196"
"220k","R4,R8","R_0603_1608Metric","C22961"
"BQ27427","U4","Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm","C6075475"
"MCP6042T-I/MS","U1,U2","MSOP-8_3x3mm_P0.65mm","C627438"
"MCP73832T-2ACI/OT","U5","SOT-23-5","C424093"
"MDBT50Q-1MV2","U3","Raytac_MDBT50Q","C5118826"
1 Comment Designator Footprint LCSC Part #
2 100n C1,C2 C_0603_1608Metric C14663
3 1u C5 C_0603_1608Metric C15849
4 2.2u C6 C_0603_1608Metric C23630
5 4.7u C7,C8 C_0603_1608Metric C19666
6 100u C3,C4 C_1206_3216Metric C15008
7 B2B-PH-K J1 JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical C295747
8 B5B-PH-K J2 JST_PH_B5B-PH-K_1x05_P2.00mm_Vertical C265104
9 Conn_ARM_JTAG_SWD_10 J3 PinHeader_2x05_P1.27mm_Vertical_SMD C150517
10 10uH L1 L_0603_1608Metric C76798
11 Si2301CDS Q1,Q2,Q3 SOT-23 C10487
12 22 R10,R11 R_0603_1608Metric C23345
13 75 R14 R_0603_1608Metric C4275
14 220 R18 R_0603_1608Metric C22962
15 330 R6 R_0603_1608Metric C23138
16 5.1k R17 R_0603_1608Metric C23186
17 10k R1,R9,R12,R13,R15,R16,R19,R20 R_0603_1608Metric C25804
18 51k R2,R3,R5,R7 R_0603_1608Metric C23196
19 220k R4,R8 R_0603_1608Metric C22961
20 BQ27427 U4 Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm C6075475
21 MCP6042T-I/MS U1,U2 MSOP-8_3x3mm_P0.65mm C627438
22 MCP73832T-2ACI/OT U5 SOT-23-5 C424093
23 MDBT50Q-1MV2 U3 Raytac_MDBT50Q C5118826

View File

@@ -1,39 +0,0 @@
Designator,Val,Package,Mid X,Mid Y,Rotation,Layer
"C1","100n","C_0603_1608Metric",11.5000,5.5000,270.0000,top
"C2","100n","C_0603_1608Metric",11.0000,14.0000,0.0000,top
"C3","100u","C_1206_3216Metric",25.5000,7.5000,0.0000,top
"C4","100u","C_1206_3216Metric",22.0000,7.5000,270.0000,top
"C5","1u","C_0603_1608Metric",27.0000,4.5000,90.0000,top
"C6","2.2u","C_0603_1608Metric",11.5000,1.5000,180.0000,top
"C7","4.7u","C_0603_1608Metric",39.0000,3.0000,180.0000,top
"C8","4.7u","C_0603_1608Metric",32.0000,2.5000,90.0000,top
"J3","Conn_ARM_JTAG_SWD_10","PinHeader_2x05_P1.27mm_Vertical_SMD",33.8850,11.2100,270.0000,top
"L1","10uH","L_0603_1608Metric",25.5000,9.5000,0.0000,top
"Q1","Si2301CDS","SOT-23",14.0000,18.7500,90.0000,top
"Q2","Si2301CDS","SOT-23",38.5625,8.5500,0.0000,top
"Q3","Si2301CDS","SOT-23",41.7500,15.5000,270.0000,top
"R1","10k","R_0603_1608Metric",16.5000,19.1750,90.0000,top
"R2","51k","R_0603_1608Metric",3.5000,7.0000,90.0000,top
"R3","51k","R_0603_1608Metric",3.5000,4.0000,90.0000,top
"R4","220k","R_0603_1608Metric",3.5000,10.0000,270.0000,top
"R5","51k","R_0603_1608Metric",3.5000,13.0000,270.0000,top
"R6","330","R_0603_1608Metric",7.5000,15.0000,270.0000,top
"R7","51k","R_0603_1608Metric",6.0000,15.0000,270.0000,top
"R8","220k","R_0603_1608Metric",11.6125,11.2750,270.0000,top
"R9","10k","R_0603_1608Metric",41.5000,10.0000,270.0000,top
"R10","22","R_0603_1608Metric",30.2500,19.7500,180.0000,top
"R11","22","R_0603_1608Metric",30.2500,21.2500,180.0000,top
"R12","10k","R_0603_1608Metric",19.0000,3.0000,180.0000,top
"R13","10k","R_0603_1608Metric",19.0000,1.5000,180.0000,top
"R14","75","R_0603_1608Metric",41.5000,7.0000,270.0000,top
"R15","10k","R_0603_1608Metric",11.5000,3.0000,180.0000,top
"R16","10k","R_0603_1608Metric",39.0000,6.0000,0.0000,top
"R17","5.1k","R_0603_1608Metric",36.5000,6.0000,90.0000,top
"R18","220","R_0603_1608Metric",44.2500,15.0000,270.0000,top
"R19","10k","R_0603_1608Metric",39.2500,15.0000,270.0000,top
"R20","10k","R_0603_1608Metric",19.0000,4.5000,180.0000,top
"U1","MCP6042T-I/MS","MSOP-8_3x3mm_P0.65mm",7.5000,5.5000,270.0000,top
"U2","MCP6042T-I/MS","MSOP-8_3x3mm_P0.65mm",7.5000,11.5000,270.0000,top
"U3","MDBT50Q-1MV2","Raytac_MDBT50Q",23.0000,18.5000,0.0000,top
"U4","BQ27427","Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm",15.0000,2.5000,270.0000,top
"U5","MCP73832T-2ACI/OT","SOT-23-5",35.0000,2.5000,180.0000,top
1 Designator Val Package Mid X Mid Y Rotation Layer
2 C1 100n C_0603_1608Metric 11.5000 5.5000 270.0000 top
3 C2 100n C_0603_1608Metric 11.0000 14.0000 0.0000 top
4 C3 100u C_1206_3216Metric 25.5000 7.5000 0.0000 top
5 C4 100u C_1206_3216Metric 22.0000 7.5000 270.0000 top
6 C5 1u C_0603_1608Metric 27.0000 4.5000 90.0000 top
7 C6 2.2u C_0603_1608Metric 11.5000 1.5000 180.0000 top
8 C7 4.7u C_0603_1608Metric 39.0000 3.0000 180.0000 top
9 C8 4.7u C_0603_1608Metric 32.0000 2.5000 90.0000 top
10 J3 Conn_ARM_JTAG_SWD_10 PinHeader_2x05_P1.27mm_Vertical_SMD 33.8850 11.2100 270.0000 top
11 L1 10uH L_0603_1608Metric 25.5000 9.5000 0.0000 top
12 Q1 Si2301CDS SOT-23 14.0000 18.7500 90.0000 top
13 Q2 Si2301CDS SOT-23 38.5625 8.5500 0.0000 top
14 Q3 Si2301CDS SOT-23 41.7500 15.5000 270.0000 top
15 R1 10k R_0603_1608Metric 16.5000 19.1750 90.0000 top
16 R2 51k R_0603_1608Metric 3.5000 7.0000 90.0000 top
17 R3 51k R_0603_1608Metric 3.5000 4.0000 90.0000 top
18 R4 220k R_0603_1608Metric 3.5000 10.0000 270.0000 top
19 R5 51k R_0603_1608Metric 3.5000 13.0000 270.0000 top
20 R6 330 R_0603_1608Metric 7.5000 15.0000 270.0000 top
21 R7 51k R_0603_1608Metric 6.0000 15.0000 270.0000 top
22 R8 220k R_0603_1608Metric 11.6125 11.2750 270.0000 top
23 R9 10k R_0603_1608Metric 41.5000 10.0000 270.0000 top
24 R10 22 R_0603_1608Metric 30.2500 19.7500 180.0000 top
25 R11 22 R_0603_1608Metric 30.2500 21.2500 180.0000 top
26 R12 10k R_0603_1608Metric 19.0000 3.0000 180.0000 top
27 R13 10k R_0603_1608Metric 19.0000 1.5000 180.0000 top
28 R14 75 R_0603_1608Metric 41.5000 7.0000 270.0000 top
29 R15 10k R_0603_1608Metric 11.5000 3.0000 180.0000 top
30 R16 10k R_0603_1608Metric 39.0000 6.0000 0.0000 top
31 R17 5.1k R_0603_1608Metric 36.5000 6.0000 90.0000 top
32 R18 220 R_0603_1608Metric 44.2500 15.0000 270.0000 top
33 R19 10k R_0603_1608Metric 39.2500 15.0000 270.0000 top
34 R20 10k R_0603_1608Metric 19.0000 4.5000 180.0000 top
35 U1 MCP6042T-I/MS MSOP-8_3x3mm_P0.65mm 7.5000 5.5000 270.0000 top
36 U2 MCP6042T-I/MS MSOP-8_3x3mm_P0.65mm 7.5000 11.5000 270.0000 top
37 U3 MDBT50Q-1MV2 Raytac_MDBT50Q 23.0000 18.5000 0.0000 top
38 U4 BQ27427 Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm 15.0000 2.5000 270.0000 top
39 U5 MCP73832T-2ACI/OT SOT-23-5 35.0000 2.5000 180.0000 top

File diff suppressed because it is too large Load Diff

View File

@@ -1,109 +0,0 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,2026-03-09T23:22:38+00:00*%
%TF.ProjectId,Test_5,54657374-5f35-42e6-9b69-6361645f7063,NO_TAG+ (Unreleased)*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Soldermask,Bot*%
%TF.FilePolarity,Negative*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.7+1) date 2026-03-09 23:22:38*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 Aperture macros list*
%AMRoundRect*
0 Rectangle with rounded corners*
0 $1 Rounding radius*
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
0 Add a 4 corners polygon primitive as box body*
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
0 Add four circle primitives for the rounded corners*
1,1,$1+$1,$2,$3*
1,1,$1+$1,$4,$5*
1,1,$1+$1,$6,$7*
1,1,$1+$1,$8,$9*
0 Add four rect primitives between the rounded corners*
20,1,$1+$1,$2,$3,$4,$5,0*
20,1,$1+$1,$4,$5,$6,$7,0*
20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end*
%ADD10C,2.200000*%
%ADD11RoundRect,0.500000X0.500000X1.500000X-0.500000X1.500000X-0.500000X-1.500000X0.500000X-1.500000X0*%
%ADD12C,1.500000*%
%ADD13RoundRect,0.250000X0.625000X-0.350000X0.625000X0.350000X-0.625000X0.350000X-0.625000X-0.350000X0*%
%ADD14O,1.750000X1.200000*%
G04 APERTURE END LIST*
D10*
%TO.C,H1*%
X15500000Y7000000D03*
%TD*%
%TO.C,H2*%
X30500000Y7000000D03*
%TD*%
D11*
%TO.C,TP12*%
X3500000Y14000000D03*
%TD*%
D12*
%TO.C,TP1*%
X5000000Y4500000D03*
%TD*%
D13*
%TO.C,J2*%
X43500000Y2750000D03*
D14*
X43500000Y4750000D03*
X43500000Y6750000D03*
X43500000Y8750000D03*
X43500000Y10750000D03*
%TD*%
D12*
%TO.C,TP8*%
X38000000Y14000000D03*
%TD*%
%TO.C,TP3*%
X16000000Y2500000D03*
%TD*%
%TO.C,TP10*%
X35000000Y17000000D03*
%TD*%
%TO.C,TP7*%
X35000000Y14000000D03*
%TD*%
D11*
%TO.C,TP14*%
X9500000Y14000000D03*
%TD*%
%TO.C,TP13*%
X6500000Y14000000D03*
%TD*%
D12*
%TO.C,TP6*%
X35000000Y11000000D03*
%TD*%
%TO.C,TP9*%
X38000000Y17000000D03*
%TD*%
%TO.C,TP2*%
X21000000Y11500000D03*
%TD*%
%TO.C,TP4*%
X19000000Y2500000D03*
%TD*%
D11*
%TO.C,TP11*%
X12500000Y14000000D03*
%TD*%
D13*
%TO.C,J1*%
X25050000Y3550000D03*
D14*
X25050000Y5550000D03*
%TD*%
D12*
%TO.C,TP5*%
X34324797Y3291770D03*
%TD*%
M02*

View File

@@ -1,15 +0,0 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,2026-03-09T23:22:38+00:00*%
%TF.ProjectId,Test_5,54657374-5f35-42e6-9b69-6361645f7063,NO_TAG+ (Unreleased)*%
%TF.SameCoordinates,Original*%
%TF.FileFunction,Paste,Bot*%
%TF.FilePolarity,Positive*%
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 9.0.7+1) date 2026-03-09 23:22:38*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

Some files were not shown because too many files have changed in this diff Show More