[bot]: Update Outputs

This commit is contained in:
jkrauss
2026-03-06 18:13:38 +00:00
committed by github-actions[bot]
parent c00f1ce352
commit 6a0f1050fe
117 changed files with 146697 additions and 19 deletions

View File

@@ -1557,19 +1557,7 @@
(pin (num "59") (name "P1.05") (type "bidirectional"))
(pin (num "60") (name "P1.03") (type "bidirectional"))
(pin (num "61") (name "P1.01") (type "bidirectional")))))
(libraries
(library (logical "Amplifier_Operational")
(uri "/usr/share/kicad/symbols//Amplifier_Operational.kicad_sym"))
(library (logical "Battery_Management")
(uri "/usr/share/kicad/symbols//Battery_Management.kicad_sym"))
(library (logical "Connector")
(uri "/usr/share/kicad/symbols//Connector.kicad_sym"))
(library (logical "Connector_Generic")
(uri "/usr/share/kicad/symbols//Connector_Generic.kicad_sym"))
(library (logical "Device")
(uri "/usr/share/kicad/symbols//Device.kicad_sym"))
(library (logical "RF_Module")
(uri "/usr/share/kicad/symbols//RF_Module.kicad_sym")))
(libraries)
(nets
(net (code "1") (name "+3.3V") (class "Default")
(node (ref "C1") (pin "1") (pintype "passive"))

View File

@@ -846,13 +846,13 @@
"DWG_TITLE_PCB": "PCB, Assembly Name",
"DWG_TITLE_SCH": "Schematic, Assembly Name",
"FABRICATION_NOTES": "FABRICATION NOTES (UNLESS OTHERWISE SPECIFIED)\n\n1)\tFABRICATE PER IPC-6012A CLASS 2.\n\n2)\tOUTLINE DEFINED IN SEPARATE GERBER FILE WITH\n\t\"Edge_Cuts.GBR\" SUFFIX.\n\n3)\tSEE SEPARATE DRILL FILES WITH \".DRL\" SUFFIX \n\tFOR HOLE LOCATIONS.\n\n\tSELECTED HOLE LOCATIONS SHOWN ON THIS DRAWING \n\tFOR REFERENCE ONLY.\n\n4)\tSURFACE FINISH: HAL SNPB\n\n5)\tSOLDERMASK ON BOTH SIDES OF THE BOARD SHALL \n\tBE LPI, COLOR GREEN.\n\n6)\tSILK SCREEN LEGEND TO BE APPLIED PER LAYER \n\tSTACKUP USING WHITE NON-CONDUCTIVE EPOXY INK.\n\n7)\tALL VIAS ARE TENTED ON BOTH SIDES UNLESS \n\tSOLDERMASK OPENED IN GERBER.\n\n8)\tRESERVED\n\n9)\tPCB MATERIAL REQUIREMENTS:\n\n\tA.\tFLAMMABILITY RATING MUST MEET OR EXCEED \n\t\tUL94V-0 REQUIREMENTS.\n\tB.\tTg 135 C OR EQUIVALENT.\n\n10)\tDESIGN GEOMETRY MINIMUM FEATURE SIZES:\n\n\tBOARD SIZE\t\t\t\t46.000 \u00d7 27.500 mm\n\tBOARD THICKNESS\t\t1.647 mm\n\tTRACE WIDTH\t\t\t0.100 mm\n\tTRACE TO TRACE\t\t0.200 mm\n\tMIN. HOLE (PTH)\t\t\t0.300 mm\n\tMIN. HOLE (NPTH)\t\t2.200 mm\n\tANNULAR RING\t\t\t0.150 mm\n\tCOPPER TO HOLE\t\t0.250 mm\n\tCOPPER TO EDGE\t\t0.500 mm\n\tHOLE TO HOLE\t\t\t0.250 mm\n\n11)\tALL DIMENSIONS ARE IN MILLIMETERS UNLESS OTHERWISE\n\tSPECIFIED.",
"GIT_HASH": "0e4308b",
"GIT_HASH": "c00f1ce",
"GIT_HASH_PCB": "1fa3de1",
"GIT_HASH_SCH": "02b8af5",
"GIT_HASH_SCH": "8e94e7b",
"GIT_URL": "/jkrauss/Test_4",
"PROJECT_CODE": "P99",
"RELEASE_DATE": "2026-03-06",
"RELEASE_STATE": "DRAFT",
"RELEASE_STATE": "WORKING",
"REVISION": "NO_TAG+ (Unreleased)",
"SCALE": "2:1",
"SCHEMATIC_NOTES": "Unless otherwise specified, components Values are in ohms, \u00b5F, and \u00b5H.",

View File

@@ -62,13 +62,13 @@
11) ALL DIMENSIONS ARE IN MILLIMETERS UNLESS OTHERWISE
SPECIFIED.</textvar>
<textvar name="GIT_HASH">0e4308b</textvar>
<textvar name="GIT_HASH">c00f1ce</textvar>
<textvar name="GIT_HASH_PCB">1fa3de1</textvar>
<textvar name="GIT_HASH_SCH">02b8af5</textvar>
<textvar name="GIT_HASH_SCH">8e94e7b</textvar>
<textvar name="GIT_URL">/jkrauss/Test_4</textvar>
<textvar name="PROJECT_CODE">P99</textvar>
<textvar name="RELEASE_DATE">2026-03-06</textvar>
<textvar name="RELEASE_STATE">DRAFT</textvar>
<textvar name="RELEASE_STATE">WORKING</textvar>
<textvar name="REVISION">NO_TAG+ (Unreleased)</textvar>
<textvar name="SCALE">2:1</textvar>
<textvar name="SCHEMATIC_NOTES">Unless otherwise specified, components Values are in ohms, µF, and µH.</textvar>

579
html/Test_5-navigate.html Normal file
View File

@@ -0,0 +1,579 @@
<!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

@@ -0,0 +1,567 @@
<!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

@@ -0,0 +1,570 @@
<!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

@@ -0,0 +1,633 @@
<!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-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_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

@@ -0,0 +1,621 @@
<!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

@@ -0,0 +1,573 @@
<!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

@@ -0,0 +1,661 @@
<!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

@@ -0,0 +1,595 @@
<!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

@@ -0,0 +1,627 @@
<!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

@@ -0,0 +1,578 @@
<!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

@@ -0,0 +1,562 @@
<!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

@@ -0,0 +1,573 @@
<!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">@COMMENT@</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

@@ -0,0 +1,690 @@
<!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="306">
<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="306">
<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

@@ -0,0 +1,590 @@
<!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

@@ -0,0 +1,578 @@
<!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

@@ -0,0 +1,562 @@
<!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

@@ -0,0 +1,589 @@
<!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>

BIN
html/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
html/images/back_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
html/images/drc.svg_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
html/images/erc.svg_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
html/images/file_csv_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
html/images/file_drl_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
html/images/file_gbr_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
html/images/file_glb_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
html/images/file_pdf_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
html/images/file_png_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
html/images/file_stp_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
html/images/file_svg_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
html/images/file_txt_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
html/images/file_zip_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
html/images/home_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
html/images/ibom_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
html/images/icon.svg_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
html/images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
html/images/pcbnew_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
html/images/unknown_64.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

2
html/markdown-it.min.js vendored Normal file

File diff suppressed because one or more lines are too long

981
html/styles.css Normal file
View File

@@ -0,0 +1,981 @@
/* 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 */
}

4
index.html Normal file
View File

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

View File

@@ -0,0 +1,41 @@
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.

File diff suppressed because one or more lines are too long

BIN
mfg/fab/Test_5-GERBERS.zip Normal file

Binary file not shown.

Binary file not shown.

BIN
mfg/fab/Test_5-odb.zip Normal file

Binary file not shown.

View File

@@ -0,0 +1,17 @@
M48
; DRILL file {KiCad 9.0.7+1} date 2026-03-06T18:12:55+0000
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2026-03-06T18:12:55+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

@@ -0,0 +1,122 @@
M48
; DRILL file {KiCad 9.0.7+1} date 2026-03-06T18:12:55+0000
; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2026-03-06T18:12:55+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

@@ -0,0 +1,109 @@
%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,REF\u002A\u002A*%
X15500000Y7000000D03*
%TD*%
%TO.C,REF\u002A\u002A*%
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

@@ -0,0 +1,15 @@
%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

@@ -0,0 +1,34 @@
%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

@@ -0,0 +1,362 @@
%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,REF\u002A\u002A*%
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,REF\u002A\u002A*%
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

@@ -0,0 +1,336 @@
%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

@@ -0,0 +1,253 @@
%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.

23
mfg/jlcpcb/Test_5-bom.csv Normal file
View File

@@ -0,0 +1,23 @@
"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

39
mfg/jlcpcb/Test_5-cpl.csv Normal file
View File

@@ -0,0 +1,39 @@
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

@@ -0,0 +1,109 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,2026-03-06T18:13:22+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-06 18:13:22*
%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,REF\u002A\u002A*%
X15500000Y7000000D03*
%TD*%
%TO.C,REF\u002A\u002A*%
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

@@ -0,0 +1,15 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,2026-03-06T18:13:22+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-06 18:13:22*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,34 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,2026-03-06T18:13:22+00:00*%
%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 (PCBNEW 9.0.7+1) date 2026-03-06 18:13:22*
%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

@@ -0,0 +1,362 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,2026-03-06T18:13:22+00:00*%
%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 (PCBNEW 9.0.7+1) date 2026-03-06 18:13:22*
%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,REF\u002A\u002A*%
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,REF\u002A\u002A*%
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

@@ -0,0 +1,336 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,2026-03-06T18:13:22+00:00*%
%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 (PCBNEW 9.0.7+1) date 2026-03-06 18:13:22*
%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

@@ -0,0 +1,253 @@
%TF.GenerationSoftware,KiCad,Pcbnew,9.0.7+1*%
%TF.CreationDate,2026-03-06T18:13:22+00:00*%
%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 (PCBNEW 9.0.7+1) date 2026-03-06 18:13:22*
%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

BIN
models/Test_5-glb.glb Normal file

Binary file not shown.

49683
models/Test_5-step.step Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
(version 1)

File diff suppressed because it is too large Load Diff

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