[bot]: Update Outputs
@@ -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"))
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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
@@ -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()">☰</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>
|
||||
567
html/Test_5-navigate_kiri.html
Normal 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()">☰</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>
|
||||
570
html/Test_5-navigate_mfg.html
Normal 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()">☰</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>
|
||||
633
html/Test_5-navigate_mfg_assembly.html
Normal 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()">☰</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>
|
||||
621
html/Test_5-navigate_mfg_fab.html
Normal 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()">☰</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>
|
||||
573
html/Test_5-navigate_mfg_fab_drill-tables.html
Normal 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()">☰</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>
|
||||
661
html/Test_5-navigate_mfg_fab_gerbers.html
Normal 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()">☰</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>
|
||||
595
html/Test_5-navigate_mfg_jlcpcb.html
Normal 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()">☰</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>
|
||||
627
html/Test_5-navigate_mfg_jlcpcb_gerbers.html
Normal 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()">☰</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>
|
||||
578
html/Test_5-navigate_models.html
Normal 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()">☰</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>
|
||||
562
html/Test_5-navigate_panels.html
Normal 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()">☰</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>
|
||||
573
html/Test_5-navigate_panels_panel-800.html
Normal 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()">☰</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>
|
||||
690
html/Test_5-navigate_renders.html
Normal 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()">☰</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>
|
||||
590
html/Test_5-navigate_reports.html
Normal 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()">☰</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>
|
||||
578
html/Test_5-navigate_schematic.html
Normal 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()">☰</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>
|
||||
562
html/Test_5-navigate_test.html
Normal 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()">☰</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>
|
||||
589
html/Test_5-navigate_test_testpoints.html
Normal 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()">☰</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
|
After Width: | Height: | Size: 4.2 KiB |
BIN
html/images/back_64.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 158 KiB |
|
After Width: | Height: | Size: 158 KiB |
BIN
html/images/cat_blender_3d_bottom_Test_5-blender_3d_bottom.png
Normal file
|
After Width: | Height: | Size: 196 KiB |
BIN
html/images/cat_blender_3d_top_Test_5-blender_3d_top.png
Normal file
|
After Width: | Height: | Size: 172 KiB |
BIN
html/images/cat_panel_801_Test_5-panel_801.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
html/images/cat_pcbdraw_bottom_Test_5-pcbdraw_bottom.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
html/images/cat_pcbdraw_top_Test_5-pcbdraw_top.png
Normal file
|
After Width: | Height: | Size: 69 KiB |
BIN
html/images/cat_pdf_assembly_Test_5-assembly.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
html/images/cat_pdf_drill_map_Test_5--npth_map.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
html/images/cat_pdf_drill_map_Test_5--pth_map.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
html/images/cat_pdf_fabrication_Test_5-fabrication.png
Normal file
|
After Width: | Height: | Size: 139 KiB |
BIN
html/images/cat_pdf_schematic_Test_5-schematic.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 122 KiB |
BIN
html/images/cat_png_3d_viewer_angled_top_Test_5-angled_top.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
html/images/cat_png_3d_viewer_bottom_Test_5-bottom.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
html/images/cat_png_3d_viewer_top_Test_5-top.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
html/images/drc.svg_64.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
html/images/erc.svg_64.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
html/images/file_csv_64.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
html/images/file_drl_64.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
html/images/file_gbr_64.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
html/images/file_glb_64.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
html/images/file_html_64.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
html/images/file_pcb3d_64.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
html/images/file_pdf_64.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
html/images/file_png_64.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
html/images/file_stp_64.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
html/images/file_svg_64.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
html/images/file_txt_64.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
html/images/file_zip_64.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
html/images/home_64.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
html/images/ibom_64.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
html/images/icon.svg_64.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
html/images/logo.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
html/images/pcbnew_64.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
html/images/unknown_64.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
2
html/markdown-it.min.js
vendored
Normal file
981
html/styles.css
Normal 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
@@ -0,0 +1,4 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0; html/Test_5-navigate.html"/></head>
|
||||
</html>
|
||||
41
mfg/assembly/Test_5-CPL.csv
Normal 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
|
||||
|
BIN
mfg/assembly/Test_5-assembly.pdf
Normal file
4719
mfg/assembly/Test_5-ibom.html
Normal file
BIN
mfg/fab/Test_5-GERBERS.zip
Normal file
BIN
mfg/fab/Test_5-fabrication.pdf
Normal file
BIN
mfg/fab/Test_5-odb.zip
Normal file
17
mfg/fab/gerbers/Test_5--npth.drl
Normal 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
|
||||
BIN
mfg/fab/gerbers/Test_5--npth_map.pdf
Normal file
122
mfg/fab/gerbers/Test_5--pth.drl
Normal 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
|
||||
BIN
mfg/fab/gerbers/Test_5--pth_map.pdf
Normal file
4385
mfg/fab/gerbers/Test_5-B_Cu.gbr
Normal file
109
mfg/fab/gerbers/Test_5-B_Mask.gbr
Normal 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*
|
||||
15
mfg/fab/gerbers/Test_5-B_Paste.gbr
Normal 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*
|
||||
1348
mfg/fab/gerbers/Test_5-B_Silkscreen.gbr
Normal file
34
mfg/fab/gerbers/Test_5-Edge_Cuts.gbr
Normal 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*
|
||||
1375
mfg/fab/gerbers/Test_5-F_Cu.gbr
Normal file
362
mfg/fab/gerbers/Test_5-F_Mask.gbr
Normal 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*
|
||||
336
mfg/fab/gerbers/Test_5-F_Paste.gbr
Normal 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*
|
||||
2358
mfg/fab/gerbers/Test_5-F_Silkscreen.gbr
Normal file
253
mfg/fab/gerbers/Test_5-In1_Cu.gbr
Normal 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*
|
||||
3115
mfg/fab/gerbers/Test_5-In2_Cu.gbr
Normal file
BIN
mfg/jlcpcb/Test_5-Fabpack.zip
Normal file
23
mfg/jlcpcb/Test_5-bom.csv
Normal 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"
|
||||
|
39
mfg/jlcpcb/Test_5-cpl.csv
Normal 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
|
||||
|
4385
mfg/jlcpcb/gerbers/Test_5-B_Cu.gbl
Normal file
109
mfg/jlcpcb/gerbers/Test_5-B_Mask.gbs
Normal 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*
|
||||
15
mfg/jlcpcb/gerbers/Test_5-B_Paste.gbp
Normal 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*
|
||||
1348
mfg/jlcpcb/gerbers/Test_5-B_Silkscreen.gbo
Normal file
34
mfg/jlcpcb/gerbers/Test_5-Edge_Cuts.gm1
Normal 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*
|
||||
1375
mfg/jlcpcb/gerbers/Test_5-F_Cu.gtl
Normal file
362
mfg/jlcpcb/gerbers/Test_5-F_Mask.gts
Normal 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*
|
||||
336
mfg/jlcpcb/gerbers/Test_5-F_Paste.gtp
Normal 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*
|
||||
2358
mfg/jlcpcb/gerbers/Test_5-F_Silkscreen.gto
Normal file
253
mfg/jlcpcb/gerbers/Test_5-In1_Cu.g1
Normal 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*
|
||||
3115
mfg/jlcpcb/gerbers/Test_5-In2_Cu.g2
Normal file
BIN
models/Test_5-glb.glb
Normal file
49683
models/Test_5-step.step
Normal file
2
panels/panel-800/Test_5-panel_801.kicad_dru
Normal file
@@ -0,0 +1,2 @@
|
||||
(version 1)
|
||||
|
||||