[bot]: Update Outputs
7
.gitattributes
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
*.csv filter=bom_csv
|
||||
*.html filter=bom_html
|
||||
*.gbr filter=gerber
|
||||
*.gbrjob filter=gbrjob
|
||||
*.xml filter=xml
|
||||
*.kicad_pcb filter=kicad_pcb_f
|
||||
*.net filter=net_filter
|
||||
20
.gitconfig
Normal file
@@ -0,0 +1,20 @@
|
||||
[filter "bom_csv"]
|
||||
clean = sed -E 's/^BoM Date:.*$/BoM Date:Date/'
|
||||
smudge = sed -E \"s/BoM Date:Date/BoM Date:,`date +\\\"%a %d %b %Y %X %:::z\\\"`/\"
|
||||
[filter "bom_html"]
|
||||
clean = sed -E 's/^<tr><td>BoM Date<\\/td><td>.*$/<tr><td>BoM Date<\\/td><td>Date<\\/td><\\/tr>/'
|
||||
smudge = sed -E \"s/<tr><td>BoM Date<\\/td><td>Date<\\/td><\\/tr>/<tr><td>BoM Date<\\/td><td>`date +\\\"%a %d %b %Y %X %:::z\\\"`<\\/td><\\/tr>/\"
|
||||
[filter "gerber"]
|
||||
clean = sed -E -e 's/^%TF.CreationDate,.*$/%TF.CreationDate,Date%/' -e 's/^G04 Created by KiCad.*$/G04 Created by KiCad*/'
|
||||
smudge = sed -E \"s/%TF.CreationDate,Date%/%TF.CreationDate,`date +%Y-%m-%dT%H:%M:%S%:z`/\"
|
||||
[filter "gbrjob"]
|
||||
clean = sed -E 's/\"CreationDate\":.*/\"CreationDate\": \"Date\"/'
|
||||
smudge = sed -E \"s/\\\"CreationDate\\\": \\\"Date\\\"/\\\"CreationDate\\\": \\\"`date +%Y-%m-%dT%H:%M:%S%:z`\\\"/\"
|
||||
[filter "xml"]
|
||||
clean = sed -E -e 's/^ <date>.*<\\/date>/ <date>Date2<\\/date>/' -e 's/^ <date>.*<\\/date>/ <date>Date1<\\/date>/'
|
||||
smudge = sed -E -e \"s/<date>Date1<\\/date>/<date>`date +\\\"%a %d %b %Y %X %:::z\\\"`<\\/date>/\" -e \"s/<date>Date2<\\/date>/<date>`date +\\\"%Y-%m-%d\\\"`<\\/date>/\"
|
||||
[filter "kicad_pcb_f"]
|
||||
clean = sed -E 's/\\(host pcbnew ([[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+).*/\\(host pcbnew \\1\\)/'
|
||||
[filter "net_filter"]
|
||||
clean = sed -E -e 's/\\(date \\\".*\\\"\\)/\\(date \\\"Date\\\"\\)/'
|
||||
smudge = sed -E -e \"s/\\(date \\\"Date\\\"\\)/\\(date \\\"`date +\\\"%a %d %b %Y %X %:::z\\\"`\\\"\\)/\"
|
||||
1846
Test_5-netlist.net
Normal file
@@ -845,17 +845,17 @@
|
||||
"DWG_TITLE_ASSY": "PCB Assembly, Assembly Name",
|
||||
"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 × 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.\n\n12)\tFOR REFERENCE ONLY THE STACKUP CORRESPONDS TO JLCPCB\n\tSTACKUP JLC04161H-7628.\n\tFOR REFERENCE ONLY. IMPEDANCE IS THE CONTROLLING PARAMETER\n\tOVER LAYER STACKUP. GERBER DATA MAY NOT BE ALTERED EXCEPT\n\tFOR STANDARD FABRICATION ALLOWANCES.\n\n\tTHE SUPPLIED ARTWORK MAY OR MAY NOT CONTAIN THE SPECIFIED\n\tTRACE GEOMETRIES ON EVERY LAYERS SPECIFIED.",
|
||||
"GIT_HASH": "b8fef39",
|
||||
"GIT_HASH_PCB": "b8fef39",
|
||||
"GIT_HASH_SCH": "5caa450",
|
||||
"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.\n\n12)\tFOR REFERENCE ONLY THE STACKUP CORRESPONDS TO JLCPCB\n\tSTACKUP JLC04161H-7628.\n\tFOR REFERENCE ONLY. IMPEDANCE IS THE CONTROLLING PARAMETER\n\tOVER LAYER STACKUP. GERBER DATA MAY NOT BE ALTERED EXCEPT\n\tFOR STANDARD FABRICATION ALLOWANCES.\n\n\tTHE SUPPLIED ARTWORK MAY OR MAY NOT CONTAIN THE SPECIFIED\n\tTRACE GEOMETRIES ON EVERY LAYERS SPECIFIED.",
|
||||
"GIT_HASH": "c3a4047",
|
||||
"GIT_HASH_PCB": "e9fadcd",
|
||||
"GIT_HASH_SCH": "e859a78",
|
||||
"GIT_URL": "/jkrauss/Test_4",
|
||||
"PROJECT_CODE": "P99",
|
||||
"RELEASE_DATE": "2026-03-09",
|
||||
"RELEASE_STATE": "WORKING",
|
||||
"REVISION": "NO_TAG+ (Unreleased)",
|
||||
"SCALE": "2:1",
|
||||
"SCHEMATIC_NOTES": "Unless otherwise specified, components Values are in ohms, µF, and µH.",
|
||||
"SCHEMATIC_NOTES": "Unless otherwise specified, components Values are in ohms, \u00b5F, and \u00b5H.",
|
||||
"SHEET_NAME_01": "Cover Page",
|
||||
"SHEET_NAME_02": "Block Diagram",
|
||||
"SHEET_NAME_03": "Project Architecture",
|
||||
@@ -879,4 +879,4 @@
|
||||
"STATE": "TEMPLATE",
|
||||
"VARIANT": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
2174
Test_5.xml
Normal file
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-assembly_notes.txt'">
|
||||
<img src="images/file_txt_64.png" alt="Test_5-assembly_notes.txt" width="64" height="64">
|
||||
<p class="filename">Test_5-assembly_notes.txt</p>
|
||||
<p class="output-name">txt_assembly_notes</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
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">PCB Panelization</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../panels/panel-800/Test_5-panel_801.kicad_pcb'">
|
||||
<img src="images/pcbnew_64.png" alt="Test_5-panel_801.kicad_pcb" width="64" height="64">
|
||||
<p class="filename">Test_5-panel_801.kicad_pcb</p>
|
||||
<p class="output-name">panel_801</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../panels/panel-800/Test_5-panel_801.png'">
|
||||
<img src="images/cat_panel_801_Test_5-panel_801.png" alt="Test_5-panel_801.png" width="512" height="317">
|
||||
<p class="filename">Test_5-panel_801.png</p>
|
||||
<p class="output-name">panel_801</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
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 " onclick="location.href='../renders/Test_5-top.png'">
|
||||
<img src="images/file_png_64.png" alt="Test_5-top.png" width="64" height="64">
|
||||
<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 " onclick="location.href='../renders/Test_5-bottom.png'">
|
||||
<img src="images/file_png_64.png" alt="Test_5-bottom.png" width="64" height="64">
|
||||
<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 " onclick="location.href='../renders/Test_5-angled_top.png'">
|
||||
<img src="images/file_png_64.png" alt="Test_5-angled_top.png" width="64" height="64">
|
||||
<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 " onclick="location.href='../renders/Test_5-angled_bottom.png'">
|
||||
<img src="images/file_png_64.png" alt="Test_5-angled_bottom.png" width="64" height="64">
|
||||
<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 " onclick="location.href='../renders/Test_5-blender_3d_top.png'">
|
||||
<img src="images/file_png_64.png" alt="Test_5-blender_3d_top.png" width="64" height="64">
|
||||
<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 " onclick="location.href='../renders/Test_5-blender_3d_bottom.png'">
|
||||
<img src="images/file_png_64.png" alt="Test_5-blender_3d_bottom.png" width="64" height="64">
|
||||
<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: 148 KiB |
|
After Width: | Height: | Size: 151 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: 119 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: 168 KiB |
BIN
html/images/cat_pdf_schematic_Test_5-schematic.png
Normal file
|
After Width: | Height: | Size: 93 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>
|
||||
8189
kibot_run_preprocess.log
Normal file
533
kibot_run_xml.log
Normal file
@@ -0,0 +1,533 @@
|
||||
DEBUG:KiBot 1.8.6 verbose level: 0 started on 2026-03-10 00:47:29.381551 (kibot - __main__.py:524)
|
||||
DEBUG:Filtering warnings we always get on CI/CD (kibot - __main__.py:438)
|
||||
DEBUG:Command line options: {'--banner': None,
|
||||
'--board-file': None,
|
||||
'--cli-order': False,
|
||||
'--config-outs': False,
|
||||
'--copy-and-expand': False,
|
||||
'--copy-options': False,
|
||||
'--define': [],
|
||||
'--defs-from-env': False,
|
||||
'--defs-from-project': False,
|
||||
'--dont-stop': False,
|
||||
'--dry': False,
|
||||
'--example': False,
|
||||
'--fail-on-ignored': False,
|
||||
'--fail-on-warnings': False,
|
||||
'--global-redef': [],
|
||||
'--gui': False,
|
||||
'--gui-inject': None,
|
||||
'--help': False,
|
||||
'--help-banners': False,
|
||||
'--help-dependencies': False,
|
||||
'--help-errors': False,
|
||||
'--help-filters': False,
|
||||
'--help-global-options': False,
|
||||
'--help-list-offsets': False,
|
||||
'--help-list-outputs': False,
|
||||
'--help-list-rotations': False,
|
||||
'--help-output': None,
|
||||
'--help-outputs': False,
|
||||
'--help-preflights': False,
|
||||
'--help-variants': False,
|
||||
'--internal-check': False,
|
||||
'--invert-sel': False,
|
||||
'--json': False,
|
||||
'--list': False,
|
||||
'--list-variants': False,
|
||||
'--log': 'kibot_run_xml.log',
|
||||
'--makefile': None,
|
||||
'--markdown': False,
|
||||
'--no-auto-download': False,
|
||||
'--no-priority': False,
|
||||
'--no-warn': None,
|
||||
'--only-groups': False,
|
||||
'--only-names': False,
|
||||
'--only-pre': False,
|
||||
'--out-dir': '.',
|
||||
'--output-name-first': False,
|
||||
'--plot-config': 'kibot/yaml/kibot_pre_update_xml.yaml',
|
||||
'--quick-start': False,
|
||||
'--quiet': False,
|
||||
'--rst': False,
|
||||
'--schematic': None,
|
||||
'--skip-pre': None,
|
||||
'--start': '.',
|
||||
'--stop-on-warnings': False,
|
||||
'--sub-pcbs': False,
|
||||
'--type': [],
|
||||
'--variant': [],
|
||||
'--verbose': 0,
|
||||
'--version': False,
|
||||
'--warn-ci-cd': False,
|
||||
'TARGET': []} (kibot - __main__.py:528)
|
||||
DEBUG:Start of initialization (kibot - __main__.py:531)
|
||||
DEBUG:Detected KiCad v9.0.7 (9.0.7+1 90000070) (kibot - __main__.py:340)
|
||||
DEBUG:KiCad config path /root/.config/kicad/9.0 (kibot - __main__.py:392)
|
||||
DEBUG:Command line arguments:
|
||||
['/usr/local/bin/kibot', '-c', 'kibot/yaml/kibot_pre_update_xml.yaml', '-d', '.', '--log', 'kibot_run_xml.log'] (kibot - __main__.py:444)
|
||||
DEBUG:Command line parsed:
|
||||
{'--banner': None,
|
||||
'--board-file': None,
|
||||
'--cli-order': False,
|
||||
'--config-outs': False,
|
||||
'--copy-and-expand': False,
|
||||
'--copy-options': False,
|
||||
'--define': [],
|
||||
'--defs-from-env': False,
|
||||
'--defs-from-project': False,
|
||||
'--dont-stop': False,
|
||||
'--dry': False,
|
||||
'--example': False,
|
||||
'--fail-on-ignored': False,
|
||||
'--fail-on-warnings': False,
|
||||
'--global-redef': [],
|
||||
'--gui': False,
|
||||
'--gui-inject': None,
|
||||
'--help': False,
|
||||
'--help-banners': False,
|
||||
'--help-dependencies': False,
|
||||
'--help-errors': False,
|
||||
'--help-filters': False,
|
||||
'--help-global-options': False,
|
||||
'--help-list-offsets': False,
|
||||
'--help-list-outputs': False,
|
||||
'--help-list-rotations': False,
|
||||
'--help-output': None,
|
||||
'--help-outputs': False,
|
||||
'--help-preflights': False,
|
||||
'--help-variants': False,
|
||||
'--internal-check': False,
|
||||
'--invert-sel': False,
|
||||
'--json': False,
|
||||
'--list': False,
|
||||
'--list-variants': False,
|
||||
'--log': 'kibot_run_xml.log',
|
||||
'--makefile': None,
|
||||
'--markdown': False,
|
||||
'--no-auto-download': False,
|
||||
'--no-priority': False,
|
||||
'--no-warn': None,
|
||||
'--only-groups': False,
|
||||
'--only-names': False,
|
||||
'--only-pre': False,
|
||||
'--out-dir': '.',
|
||||
'--output-name-first': False,
|
||||
'--plot-config': 'kibot/yaml/kibot_pre_update_xml.yaml',
|
||||
'--quick-start': False,
|
||||
'--quiet': False,
|
||||
'--rst': False,
|
||||
'--schematic': None,
|
||||
'--skip-pre': None,
|
||||
'--start': '.',
|
||||
'--stop-on-warnings': False,
|
||||
'--sub-pcbs': False,
|
||||
'--type': [],
|
||||
'--variant': [],
|
||||
'--verbose': 0,
|
||||
'--version': False,
|
||||
'--warn-ci-cd': False,
|
||||
'TARGET': []} (kibot - __main__.py:445)
|
||||
DEBUG:- Processing dependencies for `global` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'Colorama', 'python_module': True, 'role': 'Get color messages in a portable way', 'debian': 'python3-colorama', 'arch': 'python-colorama'}, {'name': 'Requests', 'python_module': True, 'role': 'mandatory', 'debian': 'python3-requests', 'arch': 'python-requests'}, {'name': 'PyYAML', 'python_module': True, 'debian': 'python3-yaml', 'arch': 'python-yaml', 'module_name': 'yaml', 'role': 'mandatory'}, {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto'}, {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git'}, {'name': 'RSVG tools', 'url': 'https://gitlab.gnome.org/GNOME/librsvg', 'debian': 'librsvg2-bin', 'arch': 'librsvg', 'command': 'rsvg-convert', 'downloader': 'rsvg', 'id': 'RSVG', 'tests': [{'command': ['convert', '-list', 'font'], 'search': 'Helvetica', 'error': 'Missing Helvetica font, try installing Ghostscript fonts'}]}, {'name': 'Ghostscript', 'url': 'https://www.ghostscript.com/', 'url_down': 'https://github.com/ArtifexSoftware/ghostpdl-downloads/releases', 'debian': 'ghostscript', 'arch': 'ghostscript', 'command': 'gs', 'downloader': 'gs'}, {'name': 'ImageMagick', 'url': 'https://imagemagick.org/', 'url_down': 'https://imagemagick.org/script/download.php', 'command': 'convert', 'downloader': 'convert', 'debian': 'imagemagick', 'arch': 'imagemagick', 'extra_arch': ['gsfonts'], 'extra_checks': ['check_imagick_policy']}, {'name': 'KiCost', 'github': 'hildogjr/KiCost', 'pypi': 'KiCost', 'downloader': 'pytool'}, {'name': 'LXML', 'python_module': True, 'debian': 'python3-lxml', 'arch': 'python-lxml', 'downloader': 'python'}, {'name': 'KiKit', 'github': 'INTI-CMNB/KiKit', 'pypi': 'KiKit', 'downloader': 'pytool', 'version_k6': '1.5.0', 'version_k7': '1.6.0', 'version_k9': '1.7.0'}, {'from': 'KiKit', 'role': 'Separate multiboard projects'}, {'name': 'Xvfbwrapper', 'python_module': True, 'debian': 'python3-xvfbwrapper', 'arch': 'python-xvfbwrapper', 'downloader': 'python'}, {'name': 'Xvfb', 'url': 'https://www.x.org', 'command': 'xvfb-run', 'debian': 'xvfb', 'arch': 'xorg-server-xvfb', 'no_cmd_line_version': True}, {'name': 'Bash', 'url': 'https://www.gnu.org/software/bash/', 'debian': 'bash', 'arch': 'bash'}, {'name': 'Blender', 'url': 'https://www.blender.org/', 'debian': 'blender', 'arch': 'blender'}, {'name': 'Lark', 'python_module': True, 'role': 'mandatory', 'debian': 'python3-lark', 'arch': 'python-lark'}, {'name': 'ZStd', 'python_module': True, 'debian': 'python3-zstd', 'arch': 'python-zstd', 'downloader': 'python', 'role': 'Copy embedded files from the schematic to the KiCad cache'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'Colorama', 'python_module': True, 'role': 'Get color messages in a portable way', 'debian': 'python3-colorama', 'arch': 'python-colorama'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Registering dep {'name': 'Requests', 'python_module': True, 'role': 'mandatory', 'debian': 'python3-requests', 'arch': 'python-requests'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Registering dep {'name': 'PyYAML', 'python_module': True, 'debian': 'python3-yaml', 'arch': 'python-yaml', 'module_name': 'yaml', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Registering base dep {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto'} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git'} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'RSVG tools', 'url': 'https://gitlab.gnome.org/GNOME/librsvg', 'debian': 'librsvg2-bin', 'arch': 'librsvg', 'command': 'rsvg-convert', 'downloader': 'rsvg', 'id': 'RSVG', 'tests': [{'command': ['convert', '-list', 'font'], 'search': 'Helvetica', 'error': 'Missing Helvetica font, try installing Ghostscript fonts'}]} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'Ghostscript', 'url': 'https://www.ghostscript.com/', 'url_down': 'https://github.com/ArtifexSoftware/ghostpdl-downloads/releases', 'debian': 'ghostscript', 'arch': 'ghostscript', 'command': 'gs', 'downloader': 'gs'} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'ImageMagick', 'url': 'https://imagemagick.org/', 'url_down': 'https://imagemagick.org/script/download.php', 'command': 'convert', 'downloader': 'convert', 'debian': 'imagemagick', 'arch': 'imagemagick', 'extra_arch': ['gsfonts'], 'extra_checks': ['check_imagick_policy']} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'KiCost', 'github': 'hildogjr/KiCost', 'pypi': 'KiCost', 'downloader': 'pytool'} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'LXML', 'python_module': True, 'debian': 'python3-lxml', 'arch': 'python-lxml', 'downloader': 'python'} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'KiKit', 'github': 'INTI-CMNB/KiKit', 'pypi': 'KiKit', 'downloader': 'pytool', 'version_k6': '1.5.0', 'version_k7': '1.6.0', 'version_k9': '1.7.0'} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering dep {'from': 'KiKit', 'role': 'Separate multiboard projects'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiKit: {'name': 'KiKit', 'github': 'INTI-CMNB/KiKit', 'pypi': 'KiKit', 'downloader': 'pytool', 'version_k6': '1.5.0', 'version_k7': '1.6.0', 'version_k9': '1.7.0', 'from': 'KiKit', 'role': 'Separate multiboard projects'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering base dep {'name': 'Xvfbwrapper', 'python_module': True, 'debian': 'python3-xvfbwrapper', 'arch': 'python-xvfbwrapper', 'downloader': 'python'} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'Xvfb', 'url': 'https://www.x.org', 'command': 'xvfb-run', 'debian': 'xvfb', 'arch': 'xorg-server-xvfb', 'no_cmd_line_version': True} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'Bash', 'url': 'https://www.gnu.org/software/bash/', 'debian': 'bash', 'arch': 'bash'} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering base dep {'name': 'Blender', 'url': 'https://www.blender.org/', 'debian': 'blender', 'arch': 'blender'} (kibot - dep_downloader.py:1084)
|
||||
DEBUG: - Registering dep {'name': 'Lark', 'python_module': True, 'role': 'mandatory', 'debian': 'python3-lark', 'arch': 'python-lark'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Registering dep {'name': 'ZStd', 'python_module': True, 'debian': 'python3-zstd', 'arch': 'python-zstd', 'downloader': 'python', 'role': 'Copy embedded files from the schematic to the KiCad cache'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG:Importing from /usr/local/lib/python3.13/dist-packages/kibot (kibot - kiplot.py:83)
|
||||
DEBUG:- Importing fil_base (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_expand_text_vars (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_field_modify (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_field_rename (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_generic (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_rot_footprint (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_separate_pins (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_spec_to_field (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_subparts (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_urlify (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_value_split (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_var_rename (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing fil_var_rename_kicost (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing globals (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_any_diff (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_any_drill (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_any_layer (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_any_navigate_results (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_any_pcb_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_any_sch_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_any_stencil (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_base (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_base_3d (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_blender_export (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_blender_export` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'Blender', 'role': 'mandatory', 'version': '3.4.0'}, {'from': 'ImageMagick', 'role': 'Automatically crop images'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'Blender', 'role': 'mandatory', 'version': '3.4.0'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Blender: {'name': 'Blender', 'url': 'https://www.blender.org/', 'debian': 'blender', 'arch': 'blender', 'from': 'Blender', 'role': 'mandatory', 'version': '3.4.0'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'ImageMagick', 'role': 'Automatically crop images'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from ImageMagick: {'name': 'ImageMagick', 'url': 'https://imagemagick.org/', 'url_down': 'https://imagemagick.org/script/download.php', 'command': 'convert', 'downloader': 'convert', 'debian': 'imagemagick', 'arch': 'imagemagick', 'extra_arch': ['gsfonts'], 'extra_checks': ['check_imagick_policy'], 'from': 'ImageMagick', 'role': 'Automatically crop images'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_boardview (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_bom (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_bom` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiCost', 'role': 'Find components costs and specs', 'version': '1.1.8'}, {'from': 'RSVG', 'role': 'SVG logos for the BoM'}, {'name': 'XLSXWriter', 'role': 'Create XLSX files', 'python_module': True, 'debian': 'python3-xlsxwriter', 'arch': 'python-xlsxwriter', 'version': '1.1.2', 'downloader': 'python'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiCost', 'role': 'Find components costs and specs', 'version': '1.1.8'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiCost: {'name': 'KiCost', 'github': 'hildogjr/KiCost', 'pypi': 'KiCost', 'downloader': 'pytool', 'from': 'KiCost', 'role': 'Find components costs and specs', 'version': '1.1.8'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'RSVG', 'role': 'SVG logos for the BoM'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from RSVG: {'name': 'RSVG tools', 'url': 'https://gitlab.gnome.org/GNOME/librsvg', 'debian': 'librsvg2-bin', 'arch': 'librsvg', 'command': 'rsvg-convert', 'downloader': 'rsvg', 'id': 'RSVG', 'tests': [{'command': ['convert', '-list', 'font'], 'search': 'Helvetica', 'error': 'Missing Helvetica font, try installing Ghostscript fonts'}], 'from': 'RSVG', 'role': 'SVG logos for the BoM'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'name': 'XLSXWriter', 'role': 'Create XLSX files', 'python_module': True, 'debian': 'python3-xlsxwriter', 'arch': 'python-xlsxwriter', 'version': '1.1.2', 'downloader': 'python'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG:- Importing out_bom_labels (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_bom_labels` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'ReportLab', 'role': 'Create a PDF with BoM labels', 'python_module': True, 'debian': 'python3-reportlab', 'arch': 'python-reportlab', 'downloader': 'python'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'ReportLab', 'role': 'Create a PDF with BoM labels', 'python_module': True, 'debian': 'python3-reportlab', 'arch': 'python-reportlab', 'downloader': 'python'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG:- Importing out_compress (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_compress` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'RAR', 'url': 'https://www.rarlab.com/', 'url_down': 'https://www.rarlab.com/download.htm', 'help_option': '-?', 'downloader': 'rar', 'role': 'Compress in RAR format', 'debian': 'rar', 'arch': 'rar(AUR)'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'RAR', 'url': 'https://www.rarlab.com/', 'url_down': 'https://www.rarlab.com/download.htm', 'help_option': '-?', 'downloader': 'rar', 'role': 'Compress in RAR format', 'debian': 'rar', 'arch': 'rar(AUR)'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG:- Importing out_copy_files (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_diff (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_diff` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'KiCad PCB/SCH Diff', 'version': '2.5.3', 'role': 'mandatory', 'github': 'INTI-CMNB/KiDiff', 'command': 'kicad-diff.py', 'pypi': 'kidiff', 'downloader': 'pytool', 'id': 'KiDiff'}, {'from': 'Git', 'role': 'Compare with files in the repo'}, {'from': 'KiAuto', 'role': 'Compare schematics', 'version': '2.2.0'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'KiCad PCB/SCH Diff', 'version': '2.5.3', 'role': 'mandatory', 'github': 'INTI-CMNB/KiDiff', 'command': 'kicad-diff.py', 'pypi': 'kidiff', 'downloader': 'pytool', 'id': 'KiDiff'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Registering dep {'from': 'Git', 'role': 'Compare with files in the repo'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Git: {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git', 'from': 'Git', 'role': 'Compare with files in the repo'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'Compare schematics', 'version': '2.2.0'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'Compare schematics', 'version': '2.2.0'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_download_datasheets (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_dxf (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_dxf_sch_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_dxf_sch_print` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'eeschema_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.4'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_excellon (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_export_3d (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_gencad (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_gencad` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.5'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.5'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.5'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_gerb_drill (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_gerber (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_hpgl (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_hpgl_sch_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_hpgl_sch_print` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'eeschema_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.4'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_ibom (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_ibom` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'Interactive HTML BoM', 'role': 'mandatory', 'github': 'INTI-CMNB/InteractiveHtmlBom', 'command': 'generate_interactive_bom.py', 'no_cmd_line_version_old': True, 'plugin_dirs': ['InteractiveHtmlBom', 'InteractiveHtmlBom/InteractiveHtmlBom', 'org_openscopeproject_InteractiveHtmlBom', 'org_openscopeproject_InteractiveHtmlBom/InteractiveHtmlBom'], 'version': '2.7.0', 'downloader': 'pytool', 'id': 'ibom'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'Interactive HTML BoM', 'role': 'mandatory', 'github': 'INTI-CMNB/InteractiveHtmlBom', 'command': 'generate_interactive_bom.py', 'no_cmd_line_version_old': True, 'plugin_dirs': ['InteractiveHtmlBom', 'InteractiveHtmlBom/InteractiveHtmlBom', 'org_openscopeproject_InteractiveHtmlBom', 'org_openscopeproject_InteractiveHtmlBom/InteractiveHtmlBom'], 'version': '2.7.0', 'downloader': 'pytool', 'id': 'ibom'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG:- Importing out_info (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_info` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'Show KiAuto installation information', 'version': '2.0.0'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'Show KiAuto installation information', 'version': '2.0.0'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'Show KiAuto installation information', 'version': '2.0.0'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_ipc2581 (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_jobset (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_kibom (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_kibom` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'KiBoM', 'role': 'mandatory', 'github': 'INTI-CMNB/KiBoM', 'command': 'KiBOM_CLI.py', 'version': '1.9.1', 'downloader': 'pytool'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'KiBoM', 'role': 'mandatory', 'github': 'INTI-CMNB/KiBoM', 'command': 'KiBOM_CLI.py', 'version': '1.9.1', 'downloader': 'pytool'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG:- Importing out_kicanvas (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_kicost (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_kicost` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiCost', 'role': 'mandatory', 'version': '1.1.7'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiCost', 'role': 'mandatory', 'version': '1.1.7'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiCost: {'name': 'KiCost', 'github': 'hildogjr/KiCost', 'pypi': 'KiCost', 'downloader': 'pytool', 'from': 'KiCost', 'role': 'mandatory', 'version': '1.1.7'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_kikit_present (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_kikit_present` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'markdown2', 'python_module': True, 'debian': 'python3-markdown2', 'arch': 'python-markdown2', 'role': 'mandatory'}, {'from': 'Git', 'role': 'Find commit hash and/or date'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'markdown2', 'python_module': True, 'debian': 'python3-markdown2', 'arch': 'python-markdown2', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Registering dep {'from': 'Git', 'role': 'Find commit hash and/or date'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Git: {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git', 'from': 'Git', 'role': 'Find commit hash and/or date'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_kiri (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_kiri` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'KiCad PCB/SCH Diff', 'version': '2.5.1', 'role': 'mandatory', 'github': 'INTI-CMNB/KiDiff', 'command': 'kicad-diff.py', 'pypi': 'kidiff', 'downloader': 'pytool', 'id': 'KiDiff'}, {'from': 'Git', 'role': 'Compare with files in the repo'}, {'from': 'KiAuto', 'role': 'Compare schematics', 'version': '2.2.0'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'KiCad PCB/SCH Diff', 'version': '2.5.1', 'role': 'mandatory', 'github': 'INTI-CMNB/KiDiff', 'command': 'kicad-diff.py', 'pypi': 'kidiff', 'downloader': 'pytool', 'id': 'KiDiff'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Registering dep {'from': 'Git', 'role': 'Compare with files in the repo'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Git: {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git', 'from': 'Git', 'role': 'Compare with files in the repo'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'Compare schematics', 'version': '2.2.0'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'Compare schematics', 'version': '2.2.0'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_navigate_results (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_navigate_results` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'RSVG', 'role': 'Create outputs preview', 'id': 'rsvg1'}, {'from': 'RSVG', 'role': 'Create PNG icons', 'id': 'rsvg2'}, {'from': 'Ghostscript', 'role': 'Create outputs preview'}, {'from': 'ImageMagick', 'role': 'Create outputs preview'}, {'from': 'Git', 'role': 'Find origin url'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'RSVG', 'role': 'Create outputs preview', 'id': 'rsvg1'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from RSVG: {'name': 'RSVG tools', 'url': 'https://gitlab.gnome.org/GNOME/librsvg', 'debian': 'librsvg2-bin', 'arch': 'librsvg', 'command': 'rsvg-convert', 'downloader': 'rsvg', 'id': 'rsvg1', 'tests': [{'command': ['convert', '-list', 'font'], 'search': 'Helvetica', 'error': 'Missing Helvetica font, try installing Ghostscript fonts'}], 'from': 'RSVG', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'RSVG', 'role': 'Create PNG icons', 'id': 'rsvg2'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from RSVG: {'name': 'RSVG tools', 'url': 'https://gitlab.gnome.org/GNOME/librsvg', 'debian': 'librsvg2-bin', 'arch': 'librsvg', 'command': 'rsvg-convert', 'downloader': 'rsvg', 'id': 'rsvg2', 'tests': [{'command': ['convert', '-list', 'font'], 'search': 'Helvetica', 'error': 'Missing Helvetica font, try installing Ghostscript fonts'}], 'from': 'RSVG', 'role': 'Create PNG icons'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Ghostscript', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Ghostscript: {'name': 'Ghostscript', 'url': 'https://www.ghostscript.com/', 'url_down': 'https://github.com/ArtifexSoftware/ghostpdl-downloads/releases', 'debian': 'ghostscript', 'arch': 'ghostscript', 'command': 'gs', 'downloader': 'gs', 'from': 'Ghostscript', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'ImageMagick', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from ImageMagick: {'name': 'ImageMagick', 'url': 'https://imagemagick.org/', 'url_down': 'https://imagemagick.org/script/download.php', 'command': 'convert', 'downloader': 'convert', 'debian': 'imagemagick', 'arch': 'imagemagick', 'extra_arch': ['gsfonts'], 'extra_checks': ['check_imagick_policy'], 'from': 'ImageMagick', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Git', 'role': 'Find origin url'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Git: {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git', 'from': 'Git', 'role': 'Find origin url'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_navigate_results_rb (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_navigate_results_rb` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'RSVG', 'role': 'Create outputs preview', 'id': 'rsvg1'}, {'from': 'RSVG', 'role': 'Create PNG icons', 'id': 'rsvg2'}, {'from': 'Ghostscript', 'role': 'Create outputs preview'}, {'from': 'ImageMagick', 'role': 'Create outputs preview'}, {'from': 'Git', 'role': 'Find origin url'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'RSVG', 'role': 'Create outputs preview', 'id': 'rsvg1'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from RSVG: {'name': 'RSVG tools', 'url': 'https://gitlab.gnome.org/GNOME/librsvg', 'debian': 'librsvg2-bin', 'arch': 'librsvg', 'command': 'rsvg-convert', 'downloader': 'rsvg', 'id': 'rsvg1', 'tests': [{'command': ['convert', '-list', 'font'], 'search': 'Helvetica', 'error': 'Missing Helvetica font, try installing Ghostscript fonts'}], 'from': 'RSVG', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'RSVG', 'role': 'Create PNG icons', 'id': 'rsvg2'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from RSVG: {'name': 'RSVG tools', 'url': 'https://gitlab.gnome.org/GNOME/librsvg', 'debian': 'librsvg2-bin', 'arch': 'librsvg', 'command': 'rsvg-convert', 'downloader': 'rsvg', 'id': 'rsvg2', 'tests': [{'command': ['convert', '-list', 'font'], 'search': 'Helvetica', 'error': 'Missing Helvetica font, try installing Ghostscript fonts'}], 'from': 'RSVG', 'role': 'Create PNG icons'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Ghostscript', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Ghostscript: {'name': 'Ghostscript', 'url': 'https://www.ghostscript.com/', 'url_down': 'https://github.com/ArtifexSoftware/ghostpdl-downloads/releases', 'debian': 'ghostscript', 'arch': 'ghostscript', 'command': 'gs', 'downloader': 'gs', 'from': 'Ghostscript', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'ImageMagick', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from ImageMagick: {'name': 'ImageMagick', 'url': 'https://imagemagick.org/', 'url_down': 'https://imagemagick.org/script/download.php', 'command': 'convert', 'downloader': 'convert', 'debian': 'imagemagick', 'arch': 'imagemagick', 'extra_arch': ['gsfonts'], 'extra_checks': ['check_imagick_policy'], 'from': 'ImageMagick', 'role': 'Create outputs preview'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Git', 'role': 'Find origin url'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Git: {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git', 'from': 'Git', 'role': 'Find origin url'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_netlist (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_netlist` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.0.0'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.0.0'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'eeschema_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.0.0'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_odb (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_panelize (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_panelize` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiKit', 'role': 'mandatory', 'version': '1.5.1'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiKit', 'role': 'mandatory', 'version': '1.5.1'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiKit: {'name': 'KiKit', 'github': 'INTI-CMNB/KiKit', 'pypi': 'KiKit', 'downloader': 'pytool', 'version_k6': '1.5.0', 'version_k7': '1.6.0', 'version_k9': '1.7.0', 'from': 'KiKit', 'role': 'mandatory', 'version': '1.5.1'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_pcb2blender_tools (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_pcb_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_pcb_print` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'RSVG', 'role': 'Create PDF, PNG, PS and EPS formats', 'id': 'rsvg1'}, {'from': 'Ghostscript', 'role': 'Create PNG, PS and EPS formats'}, {'from': 'ImageMagick', 'role': 'Create monochrome prints and scaled PNG files'}, {'from': 'KiAuto', 'command': 'pcbnew_do', 'role': 'Print the page frame in GUI mode', 'version': '1.6.7'}, {'from': 'LXML', 'role': 'mandatory'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'RSVG', 'role': 'Create PDF, PNG, PS and EPS formats', 'id': 'rsvg1'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from RSVG: {'name': 'RSVG tools', 'url': 'https://gitlab.gnome.org/GNOME/librsvg', 'debian': 'librsvg2-bin', 'arch': 'librsvg', 'command': 'rsvg-convert', 'downloader': 'rsvg', 'id': 'rsvg1', 'tests': [{'command': ['convert', '-list', 'font'], 'search': 'Helvetica', 'error': 'Missing Helvetica font, try installing Ghostscript fonts'}], 'from': 'RSVG', 'role': 'Create PDF, PNG, PS and EPS formats'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Ghostscript', 'role': 'Create PNG, PS and EPS formats'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Ghostscript: {'name': 'Ghostscript', 'url': 'https://www.ghostscript.com/', 'url_down': 'https://github.com/ArtifexSoftware/ghostpdl-downloads/releases', 'debian': 'ghostscript', 'arch': 'ghostscript', 'command': 'gs', 'downloader': 'gs', 'from': 'Ghostscript', 'role': 'Create PNG, PS and EPS formats'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'ImageMagick', 'role': 'Create monochrome prints and scaled PNG files'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from ImageMagick: {'name': 'ImageMagick', 'url': 'https://imagemagick.org/', 'url_down': 'https://imagemagick.org/script/download.php', 'command': 'convert', 'downloader': 'convert', 'debian': 'imagemagick', 'arch': 'imagemagick', 'extra_arch': ['gsfonts'], 'extra_checks': ['check_imagick_policy'], 'from': 'ImageMagick', 'role': 'Create monochrome prints and scaled PNG files'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'command': 'pcbnew_do', 'role': 'Print the page frame in GUI mode', 'version': '1.6.7'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'Print the page frame in GUI mode', 'version': '1.6.7'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'LXML', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from LXML: {'name': 'LXML', 'python_module': True, 'debian': 'python3-lxml', 'arch': 'python-lxml', 'downloader': 'python', 'from': 'LXML', 'role': 'mandatory'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_pcb_stats (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_pcb_variant (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_pcbdraw (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_pcbdraw` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'RSVG', 'role': 'Create PNG, JPG and BMP images'}, {'from': 'ImageMagick', 'role': 'Create JPG and BMP images'}, {'from': 'LXML', 'role': 'mandatory'}, {'name': 'numpy', 'python_module': True, 'debian': 'python3-numpy', 'arch': 'python-numpy', 'downloader': 'python', 'role': 'Automatically adjust SVG margin'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'RSVG', 'role': 'Create PNG, JPG and BMP images'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from RSVG: {'name': 'RSVG tools', 'url': 'https://gitlab.gnome.org/GNOME/librsvg', 'debian': 'librsvg2-bin', 'arch': 'librsvg', 'command': 'rsvg-convert', 'downloader': 'rsvg', 'id': 'RSVG', 'tests': [{'command': ['convert', '-list', 'font'], 'search': 'Helvetica', 'error': 'Missing Helvetica font, try installing Ghostscript fonts'}], 'from': 'RSVG', 'role': 'Create PNG, JPG and BMP images'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'ImageMagick', 'role': 'Create JPG and BMP images'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from ImageMagick: {'name': 'ImageMagick', 'url': 'https://imagemagick.org/', 'url_down': 'https://imagemagick.org/script/download.php', 'command': 'convert', 'downloader': 'convert', 'debian': 'imagemagick', 'arch': 'imagemagick', 'extra_arch': ['gsfonts'], 'extra_checks': ['check_imagick_policy'], 'from': 'ImageMagick', 'role': 'Create JPG and BMP images'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'LXML', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from LXML: {'name': 'LXML', 'python_module': True, 'debian': 'python3-lxml', 'arch': 'python-lxml', 'downloader': 'python', 'from': 'LXML', 'role': 'mandatory'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'name': 'numpy', 'python_module': True, 'debian': 'python3-numpy', 'arch': 'python-numpy', 'downloader': 'python', 'role': 'Automatically adjust SVG margin'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG:- Importing out_pdf (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_pdf_pcb_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_pdf_pcb_print` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.7'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.7'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.7'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_pdf_sch_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_pdf_sch_print` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'eeschema_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.4'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_pdfunite (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_populate (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_position (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_ps (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_ps_sch_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_ps_sch_print` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'eeschema_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.4'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_qr_lib (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_qr_lib` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'QRCodeGen', 'role': 'mandatory', 'python_module': True, 'downloader': 'python', 'debian': 'python3-qrcodegen'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'QRCodeGen', 'role': 'mandatory', 'python_module': True, 'downloader': 'python', 'debian': 'python3-qrcodegen'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG:- Importing out_render_3d (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_render_3d` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.1'}, {'from': 'ImageMagick', 'role': 'Automatically crop images'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.1'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.1'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'ImageMagick', 'role': 'Automatically crop images'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from ImageMagick: {'name': 'ImageMagick', 'url': 'https://imagemagick.org/', 'url_down': 'https://imagemagick.org/script/download.php', 'command': 'convert', 'downloader': 'convert', 'debian': 'imagemagick', 'arch': 'imagemagick', 'extra_arch': ['gsfonts'], 'extra_checks': ['check_imagick_policy'], 'from': 'ImageMagick', 'role': 'Automatically crop images'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_report (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_report` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'name': 'Pandoc', 'role': 'Create PDF/ODF/DOCX files', 'url': 'https://pandoc.org/', 'url_down': 'https://github.com/jgm/pandoc/releases', 'debian': 'pandoc', 'arch': 'pandoc', 'extra_deb': ['texlive', 'texlive-latex-base', 'texlive-latex-recommended'], 'extra_arch': ['texlive-core'], 'comments': 'In CI/CD environments: the `kicad_auto_test` docker image contains it.'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'name': 'Pandoc', 'role': 'Create PDF/ODF/DOCX files', 'url': 'https://pandoc.org/', 'url_down': 'https://github.com/jgm/pandoc/releases', 'debian': 'pandoc', 'arch': 'pandoc', 'extra_deb': ['texlive', 'texlive-latex-base', 'texlive-latex-recommended'], 'extra_arch': ['texlive-core'], 'comments': 'In CI/CD environments: the `kicad_auto_test` docker image contains it.'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG:- Importing out_sch_variant (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_stencil_3d (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_stencil_3d` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiKit', 'role': 'mandatory'}, {'name': 'OpenSCAD', 'url': 'https://openscad.org/', 'url_down': 'https://openscad.org/downloads.html', 'command': 'openscad', 'debian': 'openscad', 'arch': 'openscad', 'role': 'mandatory'}, {'from': 'Xvfbwrapper', 'role': 'mandatory'}, {'from': 'Xvfb', 'role': 'mandatory'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiKit', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiKit: {'name': 'KiKit', 'github': 'INTI-CMNB/KiKit', 'pypi': 'KiKit', 'downloader': 'pytool', 'version_k6': '1.5.0', 'version_k7': '1.6.0', 'version_k9': '1.7.0', 'from': 'KiKit', 'role': 'mandatory'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'name': 'OpenSCAD', 'url': 'https://openscad.org/', 'url_down': 'https://openscad.org/downloads.html', 'command': 'openscad', 'debian': 'openscad', 'arch': 'openscad', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Registering dep {'from': 'Xvfbwrapper', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Xvfbwrapper: {'name': 'Xvfbwrapper', 'python_module': True, 'debian': 'python3-xvfbwrapper', 'arch': 'python-xvfbwrapper', 'downloader': 'python', 'from': 'Xvfbwrapper', 'role': 'mandatory'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Xvfb', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Xvfb: {'name': 'Xvfb', 'url': 'https://www.x.org', 'command': 'xvfb-run', 'debian': 'xvfb', 'arch': 'xorg-server-xvfb', 'no_cmd_line_version': True, 'from': 'Xvfb', 'role': 'mandatory'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_stencil_for_jig (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_stencil_for_jig` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiKit', 'role': 'mandatory'}, {'name': 'OpenSCAD', 'url': 'https://openscad.org/', 'url_down': 'https://openscad.org/downloads.html', 'command': 'openscad', 'debian': 'openscad', 'arch': 'openscad', 'role': 'mandatory'}, {'from': 'Xvfbwrapper', 'role': 'mandatory'}, {'from': 'Xvfb', 'role': 'mandatory'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiKit', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiKit: {'name': 'KiKit', 'github': 'INTI-CMNB/KiKit', 'pypi': 'KiKit', 'downloader': 'pytool', 'version_k6': '1.5.0', 'version_k7': '1.6.0', 'version_k9': '1.7.0', 'from': 'KiKit', 'role': 'mandatory'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'name': 'OpenSCAD', 'url': 'https://openscad.org/', 'url_down': 'https://openscad.org/downloads.html', 'command': 'openscad', 'debian': 'openscad', 'arch': 'openscad', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Registering dep {'from': 'Xvfbwrapper', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Xvfbwrapper: {'name': 'Xvfbwrapper', 'python_module': True, 'debian': 'python3-xvfbwrapper', 'arch': 'python-xvfbwrapper', 'downloader': 'python', 'from': 'Xvfbwrapper', 'role': 'mandatory'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Xvfb', 'role': 'mandatory'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Xvfb: {'name': 'Xvfb', 'url': 'https://www.x.org', 'command': 'xvfb-run', 'debian': 'xvfb', 'arch': 'xorg-server-xvfb', 'no_cmd_line_version': True, 'from': 'Xvfb', 'role': 'mandatory'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_step (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_step` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.1', 'command': 'kicad2step_do'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.1', 'command': 'kicad2step_do'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'kicad2step_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.1'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_svg (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing out_svg_pcb_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_svg_pcb_print` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.7'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.7'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '1.6.7'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_svg_sch_print (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_svg_sch_print` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.3.4'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'eeschema_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.4'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing out_vrml (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `out_vrml` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'version': '2.1.0'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'version': '2.1.0'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.1.0'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing pre_annotate_pcb (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_annotate_power (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_any_replace (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_any_xrc (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_base (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_check_fields (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_check_zone_fills (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_consolidate_pcbs (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_convert_pcb (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `pre_convert_pcb` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.2'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.2'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.3.2'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing pre_draw_fancy_stackup (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_draw_stackup (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_drc (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_erc (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_erc_warnings (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_fill_zones (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_filters (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_ignore_unconnected (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_include_table (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_pcb_replace (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `pre_pcb_replace` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'Git', 'role': 'Find commit hash and/or date'}, {'from': 'Bash', 'role': 'Run external commands to create replacement text'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'Git', 'role': 'Find commit hash and/or date'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Git: {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git', 'from': 'Git', 'role': 'Find commit hash and/or date'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Bash', 'role': 'Run external commands to create replacement text'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Bash: {'name': 'Bash', 'url': 'https://www.gnu.org/software/bash/', 'debian': 'bash', 'arch': 'bash', 'from': 'Bash', 'role': 'Run external commands to create replacement text'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing pre_run_drc (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `pre_run_drc` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'version': '2.0.0'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'version': '2.0.0'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'pcbnew_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.0.0'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing pre_run_erc (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `pre_run_erc` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.2.1'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '2.2.1'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'eeschema_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '2.2.1'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing pre_sch_replace (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `pre_sch_replace` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'Git', 'role': 'Find commit hash and/or date'}, {'from': 'Bash', 'role': 'Run external commands to create replacement text'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'Git', 'role': 'Find commit hash and/or date'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Git: {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git', 'from': 'Git', 'role': 'Find commit hash and/or date'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Bash', 'role': 'Run external commands to create replacement text'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Bash: {'name': 'Bash', 'url': 'https://www.gnu.org/software/bash/', 'debian': 'bash', 'arch': 'bash', 'from': 'Bash', 'role': 'Run external commands to create replacement text'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing pre_set_text_variables (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `pre_set_text_variables` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'Git', 'role': 'Find commit hash and/or date'}, {'from': 'Bash', 'role': 'Run external commands to create replacement text'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'Git', 'role': 'Find commit hash and/or date'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Git: {'name': 'Git', 'url': 'https://git-scm.com/', 'downloader': 'git', 'debian': 'git', 'arch': 'git', 'from': 'Git', 'role': 'Find commit hash and/or date'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG: - Registering dep {'from': 'Bash', 'role': 'Run external commands to create replacement text'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from Bash: {'name': 'Bash', 'url': 'https://www.gnu.org/software/bash/', 'debian': 'bash', 'arch': 'bash', 'from': 'Bash', 'role': 'Run external commands to create replacement text'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing pre_update_footprint (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_update_pcb_characteristics (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_update_qr (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_update_stackup (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing pre_update_xml (kibot - kiplot.py:91)
|
||||
DEBUG:- Processing dependencies for `pre_update_xml` (kibot - dep_downloader.py:1069)
|
||||
DEBUG: - Data: {'Dependencies': [{'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '1.5.4'}]} (kibot - dep_downloader.py:1070)
|
||||
DEBUG: - Registering dep {'from': 'KiAuto', 'role': 'mandatory', 'command': 'eeschema_do', 'version': '1.5.4'} (kibot - dep_downloader.py:1081)
|
||||
DEBUG: - Dep after applying from KiAuto: {'name': 'KiCad Automation tools', 'github': 'INTI-CMNB/KiAuto', 'command': 'eeschema_do', 'pypi': 'kiauto', 'downloader': 'pytool', 'id': 'KiAuto', 'from': 'KiAuto', 'role': 'mandatory', 'version': '1.5.4'} (kibot - dep_downloader.py:1009)
|
||||
DEBUG:- Importing var_base (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing var_ibom (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing var_kibom (kibot - kiplot.py:91)
|
||||
DEBUG:- Importing var_kicost (kibot - kiplot.py:91)
|
||||
DEBUG:Deactivating macros (kibot - kiplot.py:117)
|
||||
DEBUG:End of initialization (kibot - __main__.py:537)
|
||||
DEBUG:Using configuration file: `kibot/yaml/kibot_pre_update_xml.yaml` (kibot - __main__.py:276)
|
||||
Using SCH file: Test_5.kicad_sch
|
||||
DEBUG:Using schematic: `/workspace/jkrauss/Test_5/Test_5.kicad_sch` (kibot - kiplot.py:979)
|
||||
DEBUG:Real schematic name: `/workspace/jkrauss/Test_5/Test_5.kicad_sch` (kibot - kiplot.py:980)
|
||||
DEBUG:Using PCB: `/workspace/jkrauss/Test_5/Test_5.kicad_pcb` (kibot - kiplot.py:1010)
|
||||
DEBUG:Real PCB name: `/workspace/jkrauss/Test_5/Test_5.kicad_pcb` (kibot - kiplot.py:1011)
|
||||
DEBUG:Starting to load the configuration (kibot - __main__.py:607)
|
||||
DEBUG:Parsing global options: {} (kibot - config_reader.py:301)
|
||||
DEBUG:Looking for stack-up information in the PCB (kibot.globals - globals.py:500)
|
||||
DEBUG:- Found stack-up information (kibot.globals - globals.py:516)
|
||||
DEBUG:- F.SilkS color: White (kibot.globals - globals.py:471)
|
||||
DEBUG:- F.Mask color: Green (kibot.globals - globals.py:479)
|
||||
DEBUG:- B.Mask color: Green (kibot.globals - globals.py:483)
|
||||
DEBUG:- B.SilkS color: White (kibot.globals - globals.py:475)
|
||||
DEBUG:- Copper finish: HAL SnPb (kibot.globals - globals.py:531)
|
||||
DEBUG:- Impedance controlled: no (kibot.globals - globals.py:543)
|
||||
DEBUG:- PCB Material/s: FR4 (kibot.globals - globals.py:552)
|
||||
DEBUG:- Copper thickness: 35 / 15 (kibot.globals - globals.py:554)
|
||||
DEBUG:Configuring from default: filters -> [] (kibot - optionable.py:362)
|
||||
DEBUG:Configuring from default: aliases_for_3d_models -> [] (kibot - optionable.py:362)
|
||||
DEBUG:Configuring from default: extra_os -> [] (kibot - optionable.py:362)
|
||||
DEBUG:Configuring from default: environment -> <kibot.globals.Environment object at 0x7f03e3c6d550> (kibot - optionable.py:362)
|
||||
DEBUG:Configuring from default: field_tolerance -> ['tolerance', 'tol'] (kibot - optionable.py:598)
|
||||
DEBUG:Configuring from default: field_voltage -> ['voltage', 'v'] (kibot - optionable.py:598)
|
||||
DEBUG:Configuring from default: field_package -> ['package', 'pkg'] (kibot - optionable.py:598)
|
||||
DEBUG:Configuring from default: field_temp_coef -> ['temp_coef', 'tmp_coef'] (kibot - optionable.py:598)
|
||||
DEBUG:Configuring from default: field_power -> ['power', 'pow'] (kibot - optionable.py:598)
|
||||
DEBUG:Configuring from default: field_current -> ['current', 'i'] (kibot - optionable.py:598)
|
||||
DEBUG:Configuring from default: layer_defaults -> [] (kibot - optionable.py:362)
|
||||
DEBUG:Parsing preflight options: {'update_xml': True} (kibot - config_reader.py:283)
|
||||
DEBUG:Parsing preflight update_xml (kibot - config_reader.py:292)
|
||||
DEBUG:No font resources dir (kibot - kiplot.py:1257)
|
||||
DEBUG:No color resources dir (kibot - kiplot.py:1278)
|
||||
DEBUG:Starting outputs for board /workspace/jkrauss/Test_5/Test_5.kicad_pcb (kibot - kiplot.py:667)
|
||||
DEBUG:Outputs before preflights: [] (kibot - kiplot.py:714)
|
||||
DEBUG:Preflight checks (kibot - kiplot.py:548)
|
||||
DEBUG:Configuring preflight update_xml (kibot.pre_base - pre_base.py:145)
|
||||
DEBUG:Preflight apply update_xml (kibot.pre_base - pre_base.py:161)
|
||||
DEBUG:Preflight run update_xml (kibot.pre_base - pre_base.py:165)
|
||||
DEBUG:Starting tool check for KiCad Automation tools (kibot - dep_downloader.py:863)
|
||||
DEBUG:- Checking binary tool KiCad Automation tools (kibot - dep_downloader.py:769)
|
||||
DEBUG:- Looking for tool `eeschema_do` at system level (kibot - dep_downloader.py:697)
|
||||
DEBUG:- Checking version for `/usr/local/bin/eeschema_do` (kibot - dep_downloader.py:664)
|
||||
DEBUG:- Needed version (1, 5, 4) (kibot - dep_downloader.py:680)
|
||||
DEBUG:- Running ['/usr/local/bin/eeschema_do', '--version'] (kibot - dep_downloader.py:630)
|
||||
DEBUG:- Looking for version in `eeschema_do 2.3.6 - Copyright 2018-2024, INTI/Productize SPRL - License:
|
||||
Apache 2.0` (kibot - dep_downloader.py:656)
|
||||
DEBUG:- Found version (2, 3, 6, 0) (kibot - dep_downloader.py:691)
|
||||
DEBUG:- Returning `/usr/local/bin/eeschema_do` (kibot - dep_downloader.py:870)
|
||||
DEBUG:Expanding `/workspace/jkrauss/Test_5/.` in SCH context for update_xml: True parent: None (kibot - optionable.py:493)
|
||||
DEBUG:Current text variables: {'ASSEMBLY_NAME': 'Assembly Name', 'ASSEMBLY_NOTES': 'ASSEMBLY NOTES (UNLESS OTHERWISE SPECIFIED)\n\n1)\tDO NOT POPULATE COMPONENTS ARE MARKED WITH A RED CROSS\n\n2)\tDO NOT POPULATE COMPONENTS ARE NOT PRESENT IN THE BOM\n\n3)\tIF CONFLICTING INFORMATION IS FOUND BETWEEN THE ASSEMBLY\n\tFILE AND BOM, BOM SHOULD BE USED AS THE MAIN SOURCE.\n\n4)\tDOT IDENTIFIES PIN #1 LOCATION AND DEVICE ORIENTATION\n\tWHEN VIEWED FROM THE TOP.', 'ASSEMBLY_NUMBER': 'A99-9000', 'ASSEMBLY_SCALE': '1', 'COMPANY': 'Asymworks, LLC', 'DESIGNER': 'JPK', 'DWG_NUMBER_PCB': 'P99-9000', 'DWG_NUMBER_SCH': 'S99-9000', 'DWG_TITLE_ASSY': 'PCB Assembly, Assembly Name', '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 × 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.\n\n12)\tFOR REFERENCE ONLY THE STACKUP CORRESPONDS TO JLCPCB\n\tSTACKUP JLC04161H-7628.\n\tFOR REFERENCE ONLY. IMPEDANCE IS THE CONTROLLING PARAMETER\n\tOVER LAYER STACKUP. GERBER DATA MAY NOT BE ALTERED EXCEPT\n\tFOR STANDARD FABRICATION ALLOWANCES.\n\n\tTHE SUPPLIED ARTWORK MAY OR MAY NOT CONTAIN THE SPECIFIED\n\tTRACE GEOMETRIES ON EVERY LAYERS SPECIFIED.', 'GIT_HASH': 'b8fef39', 'GIT_HASH_PCB': 'b8fef39', 'GIT_HASH_SCH': '5caa450', 'GIT_URL': '/jkrauss/Test_4', 'PROJECT_CODE': 'P99', 'RELEASE_DATE': '2026-03-09', 'RELEASE_STATE': 'WORKING', 'REVISION': 'NO_TAG+ (Unreleased)', 'SCALE': '2:1', 'SCHEMATIC_NOTES': 'Unless otherwise specified, components Values are in ohms, µF, and µH.', 'SHEET_NAME_01': 'Cover Page', 'SHEET_NAME_02': 'Block Diagram', 'SHEET_NAME_03': 'Project Architecture', 'SHEET_NAME_04': 'Load Cell Amp', 'SHEET_NAME_05': 'BLE Controller', 'SHEET_NAME_06': 'Power and Interface', 'SHEET_NAME_07': 'Parts List', 'SHEET_NAME_08': '......................................', 'SHEET_NAME_09': '......................................', 'SHEET_NAME_10': '......................................', 'SHEET_NAME_11': '......................................', 'SHEET_NAME_12': '......................................', 'SHEET_NAME_13': '......................................', 'SHEET_NAME_14': '......................................', 'SHEET_NAME_15': '......................................', 'SHEET_NAME_16': '......................................', 'SHEET_NAME_17': '......................................', 'SHEET_NAME_18': '......................................', 'SHEET_NAME_19': '......................................', 'SHEET_NAME_20': '......................................', 'STATE': 'TEMPLATE', 'VARIANT': ''} (kibot.gs - gs.py:290)
|
||||
DEBUG:Expanded `/workspace/jkrauss/Test_5/.` (kibot - optionable.py:539)
|
||||
- Updating BoM in XML format
|
||||
DEBUG:Executing: /usr/local/bin/eeschema_do bom_xml /workspace/jkrauss/Test_5/Test_5.kicad_sch /workspace/jkrauss/Test_5/. (kibot - kiplot.py:193)
|
||||
DEBUG:Command line: ['/usr/local/bin/eeschema_do', 'bom_xml', '/workspace/jkrauss/Test_5/Test_5.kicad_sch', '/workspace/jkrauss/Test_5/.'] (kibot - kiplot.py:195)
|
||||
DEBUG:Output from command:
|
||||
> (kibot - kiplot.py:207)
|
||||
DEBUG:Removing temporal files (kibot.pre_base - pre_base.py:275)
|
||||
DEBUG:Outputs after preflights: [] (kibot - kiplot.py:717)
|
||||
DEBUG:Outputs after sorting: [] (kibot - kiplot.py:721)
|
||||
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
11
mfg/assembly/Test_5-assembly_notes.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
ASSEMBLY NOTES (UNLESS OTHERWISE SPECIFIED)
|
||||
|
||||
1) DO NOT POPULATE COMPONENTS ARE MARKED WITH A RED CROSS
|
||||
|
||||
2) DO NOT POPULATE COMPONENTS ARE NOT PRESENT IN THE BOM
|
||||
|
||||
3) IF CONFLICTING INFORMATION IS FOUND BETWEEN THE ASSEMBLY
|
||||
FILE AND BOM, BOM SHOULD BE USED AS THE MAIN SOURCE.
|
||||
|
||||
4) DOT IDENTIFIES PIN #1 LOCATION AND DEVICE ORIENTATION
|
||||
WHEN VIEWED FROM THE TOP.
|
||||
23
mfg/assembly/Test_5-bom.csv
Normal file
@@ -0,0 +1,23 @@
|
||||
Row,Quantity Per PCB,References,Value,Datasheet,Footprint,Description,Asymworks IPN,Manufacturer,Manufacturer PN,LCSC
|
||||
1,2,C1 C2,100n,https://yageogroup.com/download/specsheet/CC0603KRX7R9BB104,C_0603_1608Metric,"capacitor, small US symbol",,YAGEO,CC0603KRX7R9BB104,C14663
|
||||
2,1,C5,1u,https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A105KB8NNNC,C_0603_1608Metric,"capacitor, small US symbol",,Samsung Electro-Mechanics,CL10A105KB8NNNC,C15849
|
||||
3,1,C6,2.2u,https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A225KO8NNN,C_0603_1608Metric,"capacitor, small US symbol",,Samsung Electro-Mechanics,CL10A225KO8NNNC,C23630
|
||||
4,2,C7 C8,4.7u,https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A475KO8NNNC,C_0603_1608Metric,"capacitor, small US symbol",,Samsung Electro-Mechanics,CL10A475KO8NNNC,C19666
|
||||
5,2,C3 C4,100u,https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL31A107MQHNNNE,C_1206_3216Metric,"capacitor, small US symbol",,Samsung Electro-Mechanics,CL31A107MQHNNNE,C15008
|
||||
6,1,J1,B2B-PH-K,https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf,JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical,"Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)",,JST,S2B-PH-SM4-TB,C295747
|
||||
7,1,J2,B5B-PH-K,https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf,JST_PH_B5B-PH-K_1x05_P2.00mm_Vertical,"Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)",,JST,S5B-PH-SM4-TB,C265104
|
||||
8,1,J3,Conn_ARM_JTAG_SWD_10,http://infocenter.arm.com/help/topic/com.arm.doc.ddi0314h/DDI0314H_coresight_components_trm.pdf,PinHeader_2x05_P1.27mm_Vertical_SMD,"Cortex Debug Connector, standard ARM Cortex-M SWD and JTAG interface",,Amphenol ICC,20021121-00010C4LF,C150517
|
||||
9,1,L1,10uH,https://product.tdk.com/system/files/dam/doc/product/inductor/inductor/smd/catalog/inductor_commercial_decoupling_mlz1608_en.pdf,L_0603_1608Metric,"Inductor, small symbol",,TDK,MLZ1608M100WT000,C76798
|
||||
10,3,Q1 Q2 Q3,Si2301CDS,https://www.vishay.com/doc/?68741,SOT-23,"-3.1A Id, -20V Vds, P-Channel MOSFET, SOT-23",,Vishay,Si2301CDS-T1-GE3,C10487
|
||||
11,2,R10 R11,22,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF220JT5E,C23345
|
||||
12,1,R14,75,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF750JT5E,C4275
|
||||
13,1,R18,220,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF2200T5E,C22962
|
||||
14,1,R6,330,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF3300T5E,C23138
|
||||
15,1,R17,5.1k,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF5101T5E,C23186
|
||||
16,8,R1 R9 R12 R13 R15 R16 R19 R20,10k,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF1002T5E,C25804
|
||||
17,4,R2 R3 R5 R7,51k,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF5102T5E,C23196
|
||||
18,2,R4 R8,220k,https://www.royalohm.com/assets/pdf/products/smd/1.pdf,R_0603_1608Metric,"Resistor, US symbol",,Uni-Royal,0603WAF2203T5E,C22961
|
||||
19,1,U4,BQ27427,https://www.ti.com/lit/ds/symlink/bq27427.pdf,Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm,Li-Ion/Li-Po battery monitor and fuel guage,,Texas Instruments,BQ27427YZFR,C6075475
|
||||
20,2,U1 U2,MCP6042T-I/MS,http://ww1.microchip.com/downloads/en/devicedoc/22140b.pdf,MSOP-8_3x3mm_P0.65mm,"Dual, 1 MHz, 85µA, Rail-to-Rail input and output, MSOP-8",,Microchip,MCP6042-I/MS,C627438
|
||||
21,1,U5,MCP73832T-2ACI/OT,http://ww1.microchip.com/downloads/en/DeviceDoc/20001984g.pdf,SOT-23-5,"Single cell, Li-Ion/Li-Po charge management controller, 4.20V, Tri-State Status Output, in SOT23-5 package",,Microchip,MCP73832T-2ACI/OT,C424093
|
||||
22,1,U3,MDBT50Q-1MV2,https://www.raytac.com/download/index.php?index_id=43,Raytac_MDBT50Q,"Multiprotocol BLE/ANT/2.4 GHz/802.15.4 Cortex-M4F SoC, nRF52840 module",,Raytac,MDBT50Q-1MV2,C5118826
|
||||
|
528
mfg/assembly/Test_5-bom.html
Normal file
@@ -0,0 +1,528 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Bill of Materials</title>
|
||||
<style>
|
||||
.cell-title { vertical-align: bottom; }
|
||||
.cell-info { vertical-align: top; padding: 1em;}
|
||||
.cell-extra-info { vertical-align: top; padding: 1em;}
|
||||
.cell-stats { vertical-align: top; padding: 1em;}
|
||||
.title { font-size:2.5em; font-weight: bold; }
|
||||
.subtitle { font-size:1.5em; font-weight: bold; }
|
||||
.h2 { font-size:1.5em; font-weight: bold; }
|
||||
.td-empty0 { text-align: center; background-color: #F57676;}
|
||||
.td-gen0 { text-align: center; background-color: #DCF5E4;}
|
||||
.td-kicad0 { text-align: center; background-color: #F5DCA9;}
|
||||
.td-user0 { text-align: center; background-color: #DCEFF5;}
|
||||
.td-empty1 { text-align: center; background-color: #FF8080;}
|
||||
.td-gen1 { text-align: center; background-color: #E6FFEE;}
|
||||
.td-kicad1 { text-align: center; background-color: #FFE6B3;}
|
||||
.td-user1 { text-align: center; background-color: #E6F9FF;}
|
||||
.td-nocolor { text-align: center; }
|
||||
.color-ref { margin: 25px 0; }
|
||||
.color-ref th { text-align: left }
|
||||
.color-ref td { padding: 5px 20px; }
|
||||
.head-table { margin-bottom: 2em; }
|
||||
.centered-checkmark { font-size: 30vw; text-align: center; color: green; }
|
||||
.tg-sort-header::-moz-selection{background:0 0}
|
||||
.tg-sort-header::selection{background:0 0}.tg-sort-header{cursor:pointer}
|
||||
.tg-sort-header:after{content:'';float:right;border-width:0 5px 5px;border-style:solid;
|
||||
border-color:#ffffff transparent;visibility:hidden;opacity:.6}
|
||||
.tg-sort-header:hover:after{visibility:visible}
|
||||
.tg-sort-asc:after,.tg-sort-asc:hover:after,.tg-sort-desc:after{visibility:visible;opacity:1}
|
||||
.tg-sort-desc:after{border-bottom:none;border-width:5px 5px 0}
|
||||
|
||||
.content-table {
|
||||
border-collapse:
|
||||
collapse;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 4em;
|
||||
font-size: 0.9em;
|
||||
font-family: sans-serif;
|
||||
min-width: 400px;
|
||||
border-radius: 5px 5px 0 0;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.content-table thead tr { background-color: #0e4e8e; color: #ffffff; text-align: left; }
|
||||
.content-table th, .content-table td { padding: 12px 15px; }
|
||||
.content-table tbody tr { border-bottom: 1px solid #dddddd; }
|
||||
.content-table tbody tr:nth-of-type(even) { background-color: #f3f3f3; }
|
||||
.content-table tbody tr:last-of-type { border-bottom: 2px solid #0e4e8e; }
|
||||
.content-table * tr:hover > td { background-color: @bgl@ !important }
|
||||
|
||||
.content-table {
|
||||
border-collapse:
|
||||
collapse;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 4em;
|
||||
font-size: 0.9em;
|
||||
font-family: sans-serif;
|
||||
min-width: 400px;
|
||||
border-radius: 5px 5px 0 0;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.content-table thead tr { background-color: @bg@; color: #ffffff; text-align: left; }
|
||||
.content-table th, .content-table td { padding: 12px 15px; }
|
||||
.content-table tbody tr { border-bottom: 1px solid #dddddd; }
|
||||
.content-table tbody tr:nth-of-type(even) { background-color: #f3f3f3; }
|
||||
.content-table tbody tr:last-of-type { border-bottom: 2px solid @bg@; }
|
||||
.content-table * tr:hover > td { background-color: #3e7ebe !important }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table class="head-table">
|
||||
<tr>
|
||||
<td rowspan="2">
|
||||
</td>
|
||||
<td colspan="2" class="cell-title">
|
||||
<div class="title">Bill of Materials</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="cell-info">
|
||||
<b>Schematic</b>: Test_5<br>
|
||||
<b>Variant</b>: default<br>
|
||||
<b>Revision</b>: NO_TAG+ (Unreleased)<br>
|
||||
<b>Date</b>: 2026-03-09<br>
|
||||
<b>KiCad Version</b>: 9.0.7+1<br>
|
||||
</td>
|
||||
<td class="cell-stats">
|
||||
<b>Component Groups</b>: 22<br>
|
||||
<b>Component Count</b>: 40 (per PCB)<br>
|
||||
|
||||
<b>Fitted Components</b>: 40 (per PCB)<br>
|
||||
<b>Number of PCBs</b>: 1<br>
|
||||
<b>Total Components</b>: 40 (for 1 PCBs)<br>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h2>Component Groups</h2>
|
||||
<table class="content-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="th-gen">Row</th>
|
||||
<th class="th-gen">Quantity Per PCB</th>
|
||||
<th class="th-kicad">References</th>
|
||||
<th class="th-kicad">Value</th>
|
||||
<th class="th-kicad">Datasheet</th>
|
||||
<th class="th-kicad">Footprint</th>
|
||||
<th class="th-user">Description</th>
|
||||
<th class="th-user">Asymworks IPN</th>
|
||||
<th class="th-user">Manufacturer</th>
|
||||
<th class="th-user">Manufacturer PN</th>
|
||||
<th class="th-user">LCSC</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr id="0">
|
||||
<td class="td-gen0">1</td>
|
||||
<td class="td-gen0">2</td>
|
||||
<td class="td-kicad0"><div id="C2"></div><div id="C1"></div>C1 C2</td>
|
||||
<td class="td-kicad0">100n</td>
|
||||
<td class="td-kicad0"><a href="https://yageogroup.com/download/specsheet/CC0603KRX7R9BB104">https://yageogroup.com/download/specsheet/CC0603KRX7R9BB104</a></td>
|
||||
<td class="td-kicad0">C_0603_1608Metric</td>
|
||||
<td class="td-user0">capacitor, small US symbol</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">YAGEO</td>
|
||||
<td class="td-user0">CC0603KRX7R9BB104</td>
|
||||
<td class="td-user0">C14663</td>
|
||||
</tr>
|
||||
<tr id="1">
|
||||
<td class="td-gen1">2</td>
|
||||
<td class="td-gen1">1</td>
|
||||
<td class="td-kicad1"><div id="C5"></div>C5</td>
|
||||
<td class="td-kicad1">1u</td>
|
||||
<td class="td-kicad1"><a href="https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A105KB8NNNC">https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A105KB8NNNC</a></td>
|
||||
<td class="td-kicad1">C_0603_1608Metric</td>
|
||||
<td class="td-user1">capacitor, small US symbol</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Samsung Electro-Mechanics</td>
|
||||
<td class="td-user1">CL10A105KB8NNNC</td>
|
||||
<td class="td-user1">C15849</td>
|
||||
</tr>
|
||||
<tr id="2">
|
||||
<td class="td-gen0">3</td>
|
||||
<td class="td-gen0">1</td>
|
||||
<td class="td-kicad0"><div id="C6"></div>C6</td>
|
||||
<td class="td-kicad0">2.2u</td>
|
||||
<td class="td-kicad0"><a href="https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A225KO8NNN">https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A225KO8NNN</a></td>
|
||||
<td class="td-kicad0">C_0603_1608Metric</td>
|
||||
<td class="td-user0">capacitor, small US symbol</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">Samsung Electro-Mechanics</td>
|
||||
<td class="td-user0">CL10A225KO8NNNC</td>
|
||||
<td class="td-user0">C23630</td>
|
||||
</tr>
|
||||
<tr id="3">
|
||||
<td class="td-gen1">4</td>
|
||||
<td class="td-gen1">2</td>
|
||||
<td class="td-kicad1"><div id="C8"></div><div id="C7"></div>C7 C8</td>
|
||||
<td class="td-kicad1">4.7u</td>
|
||||
<td class="td-kicad1"><a href="https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A475KO8NNNC">https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL10A475KO8NNNC</a></td>
|
||||
<td class="td-kicad1">C_0603_1608Metric</td>
|
||||
<td class="td-user1">capacitor, small US symbol</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Samsung Electro-Mechanics</td>
|
||||
<td class="td-user1">CL10A475KO8NNNC</td>
|
||||
<td class="td-user1">C19666</td>
|
||||
</tr>
|
||||
<tr id="4">
|
||||
<td class="td-gen0">5</td>
|
||||
<td class="td-gen0">2</td>
|
||||
<td class="td-kicad0"><div id="C4"></div><div id="C3"></div>C3 C4</td>
|
||||
<td class="td-kicad0">100u</td>
|
||||
<td class="td-kicad0"><a href="https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL31A107MQHNNNE">https://weblib.samsungsem.com/mlcc/mlcc-ec-data-sheet.do?partNumber=CL31A107MQHNNNE</a></td>
|
||||
<td class="td-kicad0">C_1206_3216Metric</td>
|
||||
<td class="td-user0">capacitor, small US symbol</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">Samsung Electro-Mechanics</td>
|
||||
<td class="td-user0">CL31A107MQHNNNE</td>
|
||||
<td class="td-user0">C15008</td>
|
||||
</tr>
|
||||
<tr id="5">
|
||||
<td class="td-gen1">6</td>
|
||||
<td class="td-gen1">1</td>
|
||||
<td class="td-kicad1"><div id="J1"></div>J1</td>
|
||||
<td class="td-kicad1">B2B-PH-K</td>
|
||||
<td class="td-kicad1"><a href="https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf">https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf</a></td>
|
||||
<td class="td-kicad1">JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical</td>
|
||||
<td class="td-user1">Generic connector, single row, 01x02, script generated (kicad-library-utils/schlib/autogen/connector/)</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">JST</td>
|
||||
<td class="td-user1">S2B-PH-SM4-TB</td>
|
||||
<td class="td-user1">C295747</td>
|
||||
</tr>
|
||||
<tr id="6">
|
||||
<td class="td-gen0">7</td>
|
||||
<td class="td-gen0">1</td>
|
||||
<td class="td-kicad0"><div id="J2"></div>J2</td>
|
||||
<td class="td-kicad0">B5B-PH-K</td>
|
||||
<td class="td-kicad0"><a href="https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf">https://www.jst.com/wp-content/uploads/2025/06/ePH.pdf</a></td>
|
||||
<td class="td-kicad0">JST_PH_B5B-PH-K_1x05_P2.00mm_Vertical</td>
|
||||
<td class="td-user0">Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">JST</td>
|
||||
<td class="td-user0">S5B-PH-SM4-TB</td>
|
||||
<td class="td-user0">C265104</td>
|
||||
</tr>
|
||||
<tr id="7">
|
||||
<td class="td-gen1">8</td>
|
||||
<td class="td-gen1">1</td>
|
||||
<td class="td-kicad1"><div id="J3"></div>J3</td>
|
||||
<td class="td-kicad1">Conn_ARM_JTAG_SWD_10</td>
|
||||
<td class="td-kicad1"><a href="http://infocenter.arm.com/help/topic/com.arm.doc.ddi0314h/DDI0314H_coresight_components_trm.pdf">http://infocenter.arm.com/help/topic/com.arm.doc.ddi0314h/DDI0314H_coresight_components_trm.pdf</a></td>
|
||||
<td class="td-kicad1">PinHeader_2x05_P1.27mm_Vertical_SMD</td>
|
||||
<td class="td-user1">Cortex Debug Connector, standard ARM Cortex-M SWD and JTAG interface</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Amphenol ICC</td>
|
||||
<td class="td-user1">20021121-00010C4LF</td>
|
||||
<td class="td-user1">C150517</td>
|
||||
</tr>
|
||||
<tr id="8">
|
||||
<td class="td-gen0">9</td>
|
||||
<td class="td-gen0">1</td>
|
||||
<td class="td-kicad0"><div id="L1"></div>L1</td>
|
||||
<td class="td-kicad0">10uH</td>
|
||||
<td class="td-kicad0"><a href="https://product.tdk.com/system/files/dam/doc/product/inductor/inductor/smd/catalog/inductor_commercial_decoupling_mlz1608_en.pdf">https://product.tdk.com/system/files/dam/doc/product/inductor/inductor/smd/catalog/inductor_commercial_decoupling_mlz1608_en.pdf</a></td>
|
||||
<td class="td-kicad0">L_0603_1608Metric</td>
|
||||
<td class="td-user0">Inductor, small symbol</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">TDK</td>
|
||||
<td class="td-user0">MLZ1608M100WT000</td>
|
||||
<td class="td-user0">C76798</td>
|
||||
</tr>
|
||||
<tr id="9">
|
||||
<td class="td-gen1">10</td>
|
||||
<td class="td-gen1">3</td>
|
||||
<td class="td-kicad1"><div id="Q3"></div><div id="Q2"></div><div id="Q1"></div>Q1 Q2 Q3</td>
|
||||
<td class="td-kicad1">Si2301CDS</td>
|
||||
<td class="td-kicad1"><a href="https://www.vishay.com/doc/?68741">https://www.vishay.com/doc/?68741</a></td>
|
||||
<td class="td-kicad1">SOT-23</td>
|
||||
<td class="td-user1">-3.1A Id, -20V Vds, P-Channel MOSFET, SOT-23</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Vishay</td>
|
||||
<td class="td-user1">Si2301CDS-T1-GE3</td>
|
||||
<td class="td-user1">C10487</td>
|
||||
</tr>
|
||||
<tr id="10">
|
||||
<td class="td-gen0">11</td>
|
||||
<td class="td-gen0">2</td>
|
||||
<td class="td-kicad0"><div id="R11"></div><div id="R10"></div>R10 R11</td>
|
||||
<td class="td-kicad0">22</td>
|
||||
<td class="td-kicad0"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
|
||||
<td class="td-kicad0">R_0603_1608Metric</td>
|
||||
<td class="td-user0">Resistor, US symbol</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">Uni-Royal</td>
|
||||
<td class="td-user0">0603WAF220JT5E</td>
|
||||
<td class="td-user0">C23345</td>
|
||||
</tr>
|
||||
<tr id="11">
|
||||
<td class="td-gen1">12</td>
|
||||
<td class="td-gen1">1</td>
|
||||
<td class="td-kicad1"><div id="R14"></div>R14</td>
|
||||
<td class="td-kicad1">75</td>
|
||||
<td class="td-kicad1"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
|
||||
<td class="td-kicad1">R_0603_1608Metric</td>
|
||||
<td class="td-user1">Resistor, US symbol</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Uni-Royal</td>
|
||||
<td class="td-user1">0603WAF750JT5E</td>
|
||||
<td class="td-user1">C4275</td>
|
||||
</tr>
|
||||
<tr id="12">
|
||||
<td class="td-gen0">13</td>
|
||||
<td class="td-gen0">1</td>
|
||||
<td class="td-kicad0"><div id="R18"></div>R18</td>
|
||||
<td class="td-kicad0">220</td>
|
||||
<td class="td-kicad0"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
|
||||
<td class="td-kicad0">R_0603_1608Metric</td>
|
||||
<td class="td-user0">Resistor, US symbol</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">Uni-Royal</td>
|
||||
<td class="td-user0">0603WAF2200T5E</td>
|
||||
<td class="td-user0">C22962</td>
|
||||
</tr>
|
||||
<tr id="13">
|
||||
<td class="td-gen1">14</td>
|
||||
<td class="td-gen1">1</td>
|
||||
<td class="td-kicad1"><div id="R6"></div>R6</td>
|
||||
<td class="td-kicad1">330</td>
|
||||
<td class="td-kicad1"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
|
||||
<td class="td-kicad1">R_0603_1608Metric</td>
|
||||
<td class="td-user1">Resistor, US symbol</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Uni-Royal</td>
|
||||
<td class="td-user1">0603WAF3300T5E</td>
|
||||
<td class="td-user1">C23138</td>
|
||||
</tr>
|
||||
<tr id="14">
|
||||
<td class="td-gen0">15</td>
|
||||
<td class="td-gen0">1</td>
|
||||
<td class="td-kicad0"><div id="R17"></div>R17</td>
|
||||
<td class="td-kicad0">5.1k</td>
|
||||
<td class="td-kicad0"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
|
||||
<td class="td-kicad0">R_0603_1608Metric</td>
|
||||
<td class="td-user0">Resistor, US symbol</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">Uni-Royal</td>
|
||||
<td class="td-user0">0603WAF5101T5E</td>
|
||||
<td class="td-user0">C23186</td>
|
||||
</tr>
|
||||
<tr id="15">
|
||||
<td class="td-gen1">16</td>
|
||||
<td class="td-gen1">8</td>
|
||||
<td class="td-kicad1"><div id="R20"></div><div id="R19"></div><div id="R16"></div><div id="R15"></div><div id="R13"></div><div id="R12"></div><div id="R9"></div><div id="R1"></div>R1 R9 R12 R13 R15 R16 R19 R20</td>
|
||||
<td class="td-kicad1">10k</td>
|
||||
<td class="td-kicad1"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
|
||||
<td class="td-kicad1">R_0603_1608Metric</td>
|
||||
<td class="td-user1">Resistor, US symbol</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Uni-Royal</td>
|
||||
<td class="td-user1">0603WAF1002T5E</td>
|
||||
<td class="td-user1">C25804</td>
|
||||
</tr>
|
||||
<tr id="16">
|
||||
<td class="td-gen0">17</td>
|
||||
<td class="td-gen0">4</td>
|
||||
<td class="td-kicad0"><div id="R7"></div><div id="R5"></div><div id="R3"></div><div id="R2"></div>R2 R3 R5 R7</td>
|
||||
<td class="td-kicad0">51k</td>
|
||||
<td class="td-kicad0"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
|
||||
<td class="td-kicad0">R_0603_1608Metric</td>
|
||||
<td class="td-user0">Resistor, US symbol</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">Uni-Royal</td>
|
||||
<td class="td-user0">0603WAF5102T5E</td>
|
||||
<td class="td-user0">C23196</td>
|
||||
</tr>
|
||||
<tr id="17">
|
||||
<td class="td-gen1">18</td>
|
||||
<td class="td-gen1">2</td>
|
||||
<td class="td-kicad1"><div id="R8"></div><div id="R4"></div>R4 R8</td>
|
||||
<td class="td-kicad1">220k</td>
|
||||
<td class="td-kicad1"><a href="https://www.royalohm.com/assets/pdf/products/smd/1.pdf">https://www.royalohm.com/assets/pdf/products/smd/1.pdf</a></td>
|
||||
<td class="td-kicad1">R_0603_1608Metric</td>
|
||||
<td class="td-user1">Resistor, US symbol</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Uni-Royal</td>
|
||||
<td class="td-user1">0603WAF2203T5E</td>
|
||||
<td class="td-user1">C22961</td>
|
||||
</tr>
|
||||
<tr id="18">
|
||||
<td class="td-gen0">19</td>
|
||||
<td class="td-gen0">1</td>
|
||||
<td class="td-kicad0"><div id="U4"></div>U4</td>
|
||||
<td class="td-kicad0">BQ27427</td>
|
||||
<td class="td-kicad0"><a href="https://www.ti.com/lit/ds/symlink/bq27427.pdf">https://www.ti.com/lit/ds/symlink/bq27427.pdf</a></td>
|
||||
<td class="td-kicad0">Texas_DSBGA-9_1.62x1.58mm_Layout3x3_P0.5mm</td>
|
||||
<td class="td-user0">Li-Ion/Li-Po battery monitor and fuel guage</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">Texas Instruments</td>
|
||||
<td class="td-user0">BQ27427YZFR</td>
|
||||
<td class="td-user0">C6075475</td>
|
||||
</tr>
|
||||
<tr id="19">
|
||||
<td class="td-gen1">20</td>
|
||||
<td class="td-gen1">2</td>
|
||||
<td class="td-kicad1"><div id="U2"></div><div id="U1"></div>U1 U2</td>
|
||||
<td class="td-kicad1">MCP6042T-I/MS</td>
|
||||
<td class="td-kicad1"><a href="http://ww1.microchip.com/downloads/en/devicedoc/22140b.pdf">http://ww1.microchip.com/downloads/en/devicedoc/22140b.pdf</a></td>
|
||||
<td class="td-kicad1">MSOP-8_3x3mm_P0.65mm</td>
|
||||
<td class="td-user1">Dual, 1 MHz, 85µA, Rail-to-Rail input and output, MSOP-8</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Microchip</td>
|
||||
<td class="td-user1">MCP6042-I/MS</td>
|
||||
<td class="td-user1">C627438</td>
|
||||
</tr>
|
||||
<tr id="20">
|
||||
<td class="td-gen0">21</td>
|
||||
<td class="td-gen0">1</td>
|
||||
<td class="td-kicad0"><div id="U5"></div>U5</td>
|
||||
<td class="td-kicad0">MCP73832T-2ACI/OT</td>
|
||||
<td class="td-kicad0"><a href="http://ww1.microchip.com/downloads/en/DeviceDoc/20001984g.pdf">http://ww1.microchip.com/downloads/en/DeviceDoc/20001984g.pdf</a></td>
|
||||
<td class="td-kicad0">SOT-23-5</td>
|
||||
<td class="td-user0">Single cell, Li-Ion/Li-Po charge management controller, 4.20V, Tri-State Status Output, in SOT23-5 package</td>
|
||||
<td class="td-empty0"></td>
|
||||
<td class="td-user0">Microchip</td>
|
||||
<td class="td-user0">MCP73832T-2ACI/OT</td>
|
||||
<td class="td-user0">C424093</td>
|
||||
</tr>
|
||||
<tr id="21">
|
||||
<td class="td-gen1">22</td>
|
||||
<td class="td-gen1">1</td>
|
||||
<td class="td-kicad1"><div id="U3"></div>U3</td>
|
||||
<td class="td-kicad1">MDBT50Q-1MV2</td>
|
||||
<td class="td-kicad1"><a href="https://www.raytac.com/download/index.php?index_id=43">https://www.raytac.com/download/index.php?index_id=43</a></td>
|
||||
<td class="td-kicad1">Raytac_MDBT50Q</td>
|
||||
<td class="td-user1">Multiprotocol BLE/ANT/2.4 GHz/802.15.4 Cortex-M4F SoC, nRF52840 module</td>
|
||||
<td class="td-empty1"></td>
|
||||
<td class="td-user1">Raytac</td>
|
||||
<td class="td-user1">MDBT50Q-1MV2</td>
|
||||
<td class="td-user1">C5118826</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="color-ref">
|
||||
<tr><th>Color reference for columns:</th></tr>
|
||||
<tr><td class="td-kicad0">KiCad Fields (default)</td></tr>
|
||||
<tr><td class="td-gen0">Generated Fields</td></tr>
|
||||
<tr><td class="td-user0">User Fields</td></tr>
|
||||
<tr><td class="td-empty0">Empty Fields</td></tr>
|
||||
</table>
|
||||
<script charset="utf-8">
|
||||
var TGSort = window.TGSort || function(n) {
|
||||
"use strict";
|
||||
function r(n) { return n ? n.length : 0 }
|
||||
function t(n, t, e, o = 0) { for (e = r(n); o < e; ++o) t(n[o], o) }
|
||||
function e(n) { return n.split("").reverse().join("") }
|
||||
function o(n) {
|
||||
var e = n[0];
|
||||
return t(n, function(n) {
|
||||
for (; !n.startsWith(e);) e = e.substring(0, r(e) - 1)
|
||||
}), r(e)
|
||||
}
|
||||
function u(n, r, e = []) {
|
||||
return t(n, function(n) {
|
||||
r(n) && e.push(n)
|
||||
}), e
|
||||
}
|
||||
var a = parseFloat;
|
||||
function i(n, r) {
|
||||
return function(t) {
|
||||
var e = "";
|
||||
return t.replace(n, function(n, t, o) {
|
||||
return e = t.replace(r, "") + "." + (o || "").substring(1)
|
||||
}), a(e)
|
||||
}
|
||||
}
|
||||
var s = i(/^(?:\s*)([+-]?(?:\d+)(?:,\d{3})*)(\.\d*)?$/g, /,/g),
|
||||
c = i(/^(?:\s*)([+-]?(?:\d+)(?:\.\d{3})*)(,\d*)?$/g, /\./g);
|
||||
function f(n) {
|
||||
var t = a(n);
|
||||
return !isNaN(t) && r("" + t) + 1 >= r(n) ? t : NaN
|
||||
}
|
||||
function d(n) {
|
||||
var e = [],
|
||||
o = n;
|
||||
return t([f, s, c], function(u) {
|
||||
var a = [],
|
||||
i = [];
|
||||
t(n, function(n, r) {
|
||||
r = u(n), a.push(r), r || i.push(n)
|
||||
}), r(i) < r(o) && (o = i, e = a)
|
||||
}), r(u(o, function(n) {
|
||||
return n == o[0]
|
||||
})) == r(o) ? e : []
|
||||
}
|
||||
function v(n) {
|
||||
if ("TABLE" == n.nodeName) {
|
||||
for (var a = function(r) {
|
||||
var e, o, u = [],
|
||||
a = [];
|
||||
return function n(r, e) {
|
||||
e(r), t(r.childNodes, function(r) {
|
||||
n(r, e)
|
||||
})
|
||||
}(n, function(n) {
|
||||
"TR" == (o = n.nodeName) ? (e = [], u.push(e), a.push(n)) : "TD" != o && "TH" != o || e.push(n)
|
||||
}), [u, a]
|
||||
}(), i = a[0], s = a[1], c = r(i), f = c > 1 && r(i[0]) < r(i[1]) ? 1 : 0, v = f + 1, p = i[f], h = r(p), l = [], g = [], N = [], m = v; m < c; ++m) {
|
||||
for (var T = 0; T < h; ++T) {
|
||||
r(g) < h && g.push([]);
|
||||
var C = i[m][T],
|
||||
L = C.textContent || C.innerText || "";
|
||||
g[T].push(L.trim())
|
||||
}
|
||||
N.push(m - v)
|
||||
}
|
||||
t(p, function(n, t) {
|
||||
l[t] = 0;
|
||||
var a = n.classList;
|
||||
a.add("tg-sort-header"), n.addEventListener("click", function() {
|
||||
var n = l[t];
|
||||
! function() {
|
||||
for (var n = 0; n < h; ++n) {
|
||||
var r = p[n].classList;
|
||||
r.remove("tg-sort-asc"), r.remove("tg-sort-desc"), l[n] = 0
|
||||
}
|
||||
}(), (n = 1 == n ? -1 : +!n) && a.add(n > 0 ? "tg-sort-asc" : "tg-sort-desc"), l[t] = n;
|
||||
var i, f = g[t],
|
||||
m = function(r, t) {
|
||||
return n * f[r].localeCompare(f[t]) || n * (r - t)
|
||||
},
|
||||
T = function(n) {
|
||||
var t = d(n);
|
||||
if (!r(t)) {
|
||||
var u = o(n),
|
||||
a = o(n.map(e));
|
||||
t = d(n.map(function(n) {
|
||||
return n.substring(u, r(n) - a)
|
||||
}))
|
||||
}
|
||||
return t
|
||||
}(f);
|
||||
(r(T) || r(T = r(u(i = f.map(Date.parse), isNaN)) ? [] : i)) && (m = function(r, t) {
|
||||
var e = T[r],
|
||||
o = T[t],
|
||||
u = isNaN(e),
|
||||
a = isNaN(o);
|
||||
return u && a ? 0 : u ? -n : a ? n : e > o ? n : e < o ? -n : n * (r - t)
|
||||
});
|
||||
var C, L = N.slice();
|
||||
L.sort(m);
|
||||
for (var E = v; E < c; ++E)(C = s[E].parentNode).removeChild(s[E]);
|
||||
for (E = v; E < c; ++E) C.appendChild(s[v + L[E - v]])
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
n.addEventListener("DOMContentLoaded", function() {
|
||||
for (var t = n.getElementsByClassName("content-table"), e = 0; e < r(t); ++e) try {
|
||||
v(t[e])
|
||||
} catch (n) {}
|
||||
})
|
||||
}(document)
|
||||
</script>
|
||||
</body></html>
|
||||
4
mfg/assembly/Test_5-components_count.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
Type,Front Side,Back Side,Total
|
||||
THT,0,2,2
|
||||
SMD,38,0,38
|
||||
Total,38,2,40
|
||||
|
BIN
mfg/fab/Test_5-GERBERS.zip
Normal file
BIN
mfg/fab/Test_5-fabrication.pdf
Normal file
56
mfg/fab/Test_5-fabrication_notes.txt
Normal file
@@ -0,0 +1,56 @@
|
||||
FABRICATION NOTES (UNLESS OTHERWISE SPECIFIED)
|
||||
|
||||
1) FABRICATE PER IPC-6012A CLASS 2.
|
||||
|
||||
2) OUTLINE DEFINED IN SEPARATE GERBER FILE WITH
|
||||
"Edge_Cuts.GBR" SUFFIX.
|
||||
|
||||
3) SEE SEPARATE DRILL FILES WITH ".DRL" SUFFIX
|
||||
FOR HOLE LOCATIONS.
|
||||
|
||||
SELECTED HOLE LOCATIONS SHOWN ON THIS DRAWING
|
||||
FOR REFERENCE ONLY.
|
||||
|
||||
4) SURFACE FINISH: HAL SNPB
|
||||
|
||||
5) SOLDERMASK ON BOTH SIDES OF THE BOARD SHALL
|
||||
BE LPI, COLOR GREEN.
|
||||
|
||||
6) SILK SCREEN LEGEND TO BE APPLIED PER LAYER
|
||||
STACKUP USING WHITE NON-CONDUCTIVE EPOXY INK.
|
||||
|
||||
7) ALL VIAS ARE TENTED ON BOTH SIDES UNLESS
|
||||
SOLDERMASK OPENED IN GERBER.
|
||||
|
||||
8) RESERVED
|
||||
|
||||
9) PCB MATERIAL REQUIREMENTS:
|
||||
|
||||
A. FLAMMABILITY RATING MUST MEET OR EXCEED
|
||||
UL94V-0 REQUIREMENTS.
|
||||
B. Tg 135 C OR EQUIVALENT.
|
||||
|
||||
10) DESIGN GEOMETRY MINIMUM FEATURE SIZES:
|
||||
|
||||
BOARD SIZE 46.000 × 27.500 mm
|
||||
BOARD THICKNESS 1.647 mm
|
||||
TRACE WIDTH 0.100 mm
|
||||
TRACE TO TRACE 0.200 mm
|
||||
MIN. HOLE (PTH) 0.300 mm
|
||||
MIN. HOLE (NPTH) 2.200 mm
|
||||
ANNULAR RING 0.150 mm
|
||||
COPPER TO HOLE 0.250 mm
|
||||
COPPER TO EDGE 0.500 mm
|
||||
HOLE TO HOLE 0.250 mm
|
||||
|
||||
11) ALL DIMENSIONS ARE IN MILLIMETERS UNLESS OTHERWISE
|
||||
SPECIFIED.
|
||||
|
||||
12) FOR REFERENCE ONLY THE STACKUP CORRESPONDS TO JLCPCB
|
||||
STACKUP JLC04161H-7628.
|
||||
FOR REFERENCE ONLY. IMPEDANCE IS THE CONTROLLING PARAMETER
|
||||
OVER LAYER STACKUP. GERBER DATA MAY NOT BE ALTERED EXCEPT
|
||||
FOR STANDARD FABRICATION ALLOWANCES.
|
||||
|
||||
THE SUPPLIED ARTWORK MAY OR MAY NOT CONTAIN THE SPECIFIED
|
||||
TRACE GEOMETRIES ON EVERY LAYERS SPECIFIED.
|
||||
4
mfg/fab/Test_5-impedance_table.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
Layer,Ref1,Ref2,Type,Impedance,Width,Space,Tolerance
|
||||
L1,AIR,L2,SE,50,0.350,-----,10%
|
||||
L1,AIR,L2,DIFF,90,0.286,0.203,10%
|
||||
L1,AIR,L2,DIFF,100,0.220,0.203,10%
|
||||
|
BIN
mfg/fab/Test_5-odb.zip
Normal file
3
mfg/fab/drill-tables/Test_5-(L1-L4)_NPTH_drill_table.csv
Normal file
@@ -0,0 +1,3 @@
|
||||
Count,Hole Size,Plated,Hole Shape,Drill Layer Pair,Hole Type
|
||||
2,2.20mm (86.61mils),NPTH,Round,F.Cu - B.Cu,Mechanical
|
||||
Total 2,,,,,
|
||||
|
4
mfg/fab/drill-tables/Test_5-(L1-L4)_drill_table.csv
Normal file
@@ -0,0 +1,4 @@
|
||||
Count,Hole Size,Plated,Hole Shape,Drill Layer Pair,Hole Type
|
||||
97,0.30mm (11.81mils),PTH,Round,F.Cu - B.Cu,Via
|
||||
7,0.75mm (29.53mils),PTH,Round,F.Cu - B.Cu,Pad
|
||||
Total 104,,,,,
|
||||
|
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-10T00:47:49+0000
|
||||
; FORMAT={-:-/ absolute / metric / decimal}
|
||||
; #@! TF.CreationDate,2026-03-10T00:47:49+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-10T00:47:49+0000
|
||||
; FORMAT={-:-/ absolute / metric / decimal}
|
||||
; #@! TF.CreationDate,2026-03-10T00:47:49+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,H1*%
|
||||
X15500000Y7000000D03*
|
||||
%TD*%
|
||||
%TO.C,H2*%
|
||||
X30500000Y7000000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,TP12*%
|
||||
X3500000Y14000000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,TP1*%
|
||||
X5000000Y4500000D03*
|
||||
%TD*%
|
||||
D13*
|
||||
%TO.C,J2*%
|
||||
X43500000Y2750000D03*
|
||||
D14*
|
||||
X43500000Y4750000D03*
|
||||
X43500000Y6750000D03*
|
||||
X43500000Y8750000D03*
|
||||
X43500000Y10750000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,TP8*%
|
||||
X38000000Y14000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP3*%
|
||||
X16000000Y2500000D03*
|
||||
%TD*%
|
||||
%TO.C,TP10*%
|
||||
X35000000Y17000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP7*%
|
||||
X35000000Y14000000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,TP14*%
|
||||
X9500000Y14000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP13*%
|
||||
X6500000Y14000000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,TP6*%
|
||||
X35000000Y11000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP9*%
|
||||
X38000000Y17000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP2*%
|
||||
X21000000Y11500000D03*
|
||||
%TD*%
|
||||
%TO.C,TP4*%
|
||||
X19000000Y2500000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,TP11*%
|
||||
X12500000Y14000000D03*
|
||||
%TD*%
|
||||
D13*
|
||||
%TO.C,J1*%
|
||||
X25050000Y3550000D03*
|
||||
D14*
|
||||
X25050000Y5550000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,TP5*%
|
||||
X34324797Y3291770D03*
|
||||
%TD*%
|
||||
M02*
|
||||
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,H1*%
|
||||
X15500000Y7000000D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,U4*%
|
||||
X15500000Y3000000D03*
|
||||
X15500000Y2500000D03*
|
||||
X15500000Y2000000D03*
|
||||
X15000000Y3000000D03*
|
||||
X15000000Y2500000D03*
|
||||
X15000000Y2000000D03*
|
||||
X14500000Y3000000D03*
|
||||
X14500000Y2500000D03*
|
||||
X14500000Y2000000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R2*%
|
||||
X3500000Y6175000D03*
|
||||
X3500000Y7825000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R19*%
|
||||
X39250000Y15825000D03*
|
||||
X39250000Y14175000D03*
|
||||
%TD*%
|
||||
D17*
|
||||
%TO.C,U3*%
|
||||
X18350000Y22250000D03*
|
||||
X18350000Y21150000D03*
|
||||
X18350000Y20350000D03*
|
||||
X18350000Y18750000D03*
|
||||
X19250000Y18350000D03*
|
||||
X18350000Y17950000D03*
|
||||
X19250000Y17550000D03*
|
||||
X18350000Y17150000D03*
|
||||
X19250000Y16750000D03*
|
||||
X18350000Y16350000D03*
|
||||
X19250000Y15950000D03*
|
||||
X18350000Y15550000D03*
|
||||
X19250000Y15150000D03*
|
||||
X18350000Y14750000D03*
|
||||
D18*
|
||||
X18200000Y11350000D03*
|
||||
X19000000Y11350000D03*
|
||||
X19800000Y11350000D03*
|
||||
X20600000Y11350000D03*
|
||||
X21000000Y12250000D03*
|
||||
X21400000Y11350000D03*
|
||||
X21800000Y12250000D03*
|
||||
X22200000Y11350000D03*
|
||||
X22600000Y12250000D03*
|
||||
X23000000Y11350000D03*
|
||||
X23400000Y12250000D03*
|
||||
X23800000Y11350000D03*
|
||||
X24200000Y12250000D03*
|
||||
X24600000Y11350000D03*
|
||||
X25000000Y12250000D03*
|
||||
X25400000Y11350000D03*
|
||||
X26200000Y11350000D03*
|
||||
X27000000Y11350000D03*
|
||||
X27800000Y11350000D03*
|
||||
D17*
|
||||
X27650000Y12350000D03*
|
||||
X27650000Y13150000D03*
|
||||
X26750000Y13550000D03*
|
||||
X27650000Y13950000D03*
|
||||
X26750000Y14350000D03*
|
||||
X27650000Y14750000D03*
|
||||
X26750000Y15150000D03*
|
||||
X27650000Y15550000D03*
|
||||
X26750000Y15950000D03*
|
||||
X26750000Y16750000D03*
|
||||
X27650000Y17150000D03*
|
||||
X26750000Y17550000D03*
|
||||
X27650000Y17950000D03*
|
||||
X26750000Y18350000D03*
|
||||
X27650000Y18750000D03*
|
||||
X26750000Y19150000D03*
|
||||
X26750000Y19950000D03*
|
||||
X27650000Y20350000D03*
|
||||
X26750000Y20750000D03*
|
||||
X27650000Y21150000D03*
|
||||
X26750000Y21550000D03*
|
||||
X27650000Y22250000D03*
|
||||
D18*
|
||||
X21000000Y17950000D03*
|
||||
X21800000Y17950000D03*
|
||||
X22600000Y17950000D03*
|
||||
X23400000Y17950000D03*
|
||||
X24200000Y17950000D03*
|
||||
X25000000Y17950000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R17*%
|
||||
X36500000Y5175000D03*
|
||||
X36500000Y6825000D03*
|
||||
%TD*%
|
||||
%TO.C,R3*%
|
||||
X3500000Y3175000D03*
|
||||
X3500000Y4825000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R20*%
|
||||
X19825000Y4500000D03*
|
||||
X18175000Y4500000D03*
|
||||
%TD*%
|
||||
D19*
|
||||
%TO.C,U5*%
|
||||
X33862500Y3450000D03*
|
||||
X33862500Y2500000D03*
|
||||
X33862500Y1550000D03*
|
||||
X36137500Y1550000D03*
|
||||
X36137500Y3450000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R12*%
|
||||
X19825000Y3000000D03*
|
||||
X18175000Y3000000D03*
|
||||
%TD*%
|
||||
D13*
|
||||
%TO.C,C5*%
|
||||
X27000000Y3725000D03*
|
||||
X27000000Y5275000D03*
|
||||
%TD*%
|
||||
D20*
|
||||
%TO.C,L1*%
|
||||
X24712500Y9500000D03*
|
||||
X26287500Y9500000D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,C4*%
|
||||
X22000000Y8975000D03*
|
||||
X22000000Y6025000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.C,H2*%
|
||||
X30500000Y7000000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R8*%
|
||||
X11612500Y12100000D03*
|
||||
X11612500Y10450000D03*
|
||||
%TD*%
|
||||
D22*
|
||||
%TO.C,Q2*%
|
||||
X39500000Y7600000D03*
|
||||
X39500000Y9500000D03*
|
||||
X37625000Y8550000D03*
|
||||
%TD*%
|
||||
D23*
|
||||
%TO.C,C6*%
|
||||
X12275000Y1500000D03*
|
||||
X10725000Y1500000D03*
|
||||
%TD*%
|
||||
D24*
|
||||
%TO.C,C3*%
|
||||
X24025000Y7500000D03*
|
||||
X26975000Y7500000D03*
|
||||
%TD*%
|
||||
D25*
|
||||
%TO.C,Q1*%
|
||||
X14950000Y19687500D03*
|
||||
X13050000Y19687500D03*
|
||||
X14000000Y17812500D03*
|
||||
%TD*%
|
||||
D26*
|
||||
%TO.C,Q3*%
|
||||
X40800000Y14562500D03*
|
||||
X42700000Y14562500D03*
|
||||
X41750000Y16437500D03*
|
||||
%TD*%
|
||||
D27*
|
||||
%TO.C,U2*%
|
||||
X5387500Y12475000D03*
|
||||
X5387500Y11825000D03*
|
||||
X5387500Y11175000D03*
|
||||
X5387500Y10525000D03*
|
||||
X9612500Y10525000D03*
|
||||
X9612500Y11175000D03*
|
||||
X9612500Y11825000D03*
|
||||
X9612500Y12475000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R14*%
|
||||
X41500000Y7825000D03*
|
||||
X41500000Y6175000D03*
|
||||
%TD*%
|
||||
D23*
|
||||
%TO.C,C7*%
|
||||
X39775000Y3000000D03*
|
||||
X38225000Y3000000D03*
|
||||
%TD*%
|
||||
D28*
|
||||
%TO.C,J3*%
|
||||
X31300000Y16290000D03*
|
||||
X35200000Y16290000D03*
|
||||
X31300000Y15020000D03*
|
||||
X35200000Y15020000D03*
|
||||
X31300000Y13750000D03*
|
||||
X35200000Y13750000D03*
|
||||
X31300000Y12480000D03*
|
||||
X35200000Y12480000D03*
|
||||
X31300000Y11210000D03*
|
||||
X35200000Y11210000D03*
|
||||
%TD*%
|
||||
D29*
|
||||
%TO.C,C1*%
|
||||
X11500000Y6275000D03*
|
||||
X11500000Y4725000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R4*%
|
||||
X3500000Y10825000D03*
|
||||
X3500000Y9175000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R1*%
|
||||
X16500000Y18350000D03*
|
||||
X16500000Y20000000D03*
|
||||
%TD*%
|
||||
D30*
|
||||
%TO.C,R16*%
|
||||
X38175000Y6000000D03*
|
||||
X39825000Y6000000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R7*%
|
||||
X6000000Y15825000D03*
|
||||
X6000000Y14175000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R15*%
|
||||
X12325000Y3000000D03*
|
||||
X10675000Y3000000D03*
|
||||
%TD*%
|
||||
D27*
|
||||
%TO.C,U1*%
|
||||
X5387500Y6475000D03*
|
||||
X5387500Y5825000D03*
|
||||
X5387500Y5175000D03*
|
||||
X5387500Y4525000D03*
|
||||
X9612500Y4525000D03*
|
||||
X9612500Y5175000D03*
|
||||
X9612500Y5825000D03*
|
||||
X9612500Y6475000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R10*%
|
||||
X31075000Y19750000D03*
|
||||
X29425000Y19750000D03*
|
||||
%TD*%
|
||||
D31*
|
||||
%TO.C,J2*%
|
||||
X43500000Y2750000D03*
|
||||
D32*
|
||||
X43500000Y4750000D03*
|
||||
X43500000Y6750000D03*
|
||||
X43500000Y8750000D03*
|
||||
X43500000Y10750000D03*
|
||||
%TD*%
|
||||
D31*
|
||||
%TO.C,J1*%
|
||||
X25050000Y3550000D03*
|
||||
D32*
|
||||
X25050000Y5550000D03*
|
||||
%TD*%
|
||||
M02*
|
||||
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-10T00:49:54+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-10 00:49:54*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
G04 Aperture macros list*
|
||||
%AMRoundRect*
|
||||
0 Rectangle with rounded corners*
|
||||
0 $1 Rounding radius*
|
||||
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
|
||||
0 Add a 4 corners polygon primitive as box body*
|
||||
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
|
||||
0 Add four circle primitives for the rounded corners*
|
||||
1,1,$1+$1,$2,$3*
|
||||
1,1,$1+$1,$4,$5*
|
||||
1,1,$1+$1,$6,$7*
|
||||
1,1,$1+$1,$8,$9*
|
||||
0 Add four rect primitives between the rounded corners*
|
||||
20,1,$1+$1,$2,$3,$4,$5,0*
|
||||
20,1,$1+$1,$4,$5,$6,$7,0*
|
||||
20,1,$1+$1,$6,$7,$8,$9,0*
|
||||
20,1,$1+$1,$8,$9,$2,$3,0*%
|
||||
G04 Aperture macros list end*
|
||||
%ADD10C,2.200000*%
|
||||
%ADD11RoundRect,0.500000X0.500000X1.500000X-0.500000X1.500000X-0.500000X-1.500000X0.500000X-1.500000X0*%
|
||||
%ADD12C,1.500000*%
|
||||
%ADD13RoundRect,0.250000X0.625000X-0.350000X0.625000X0.350000X-0.625000X0.350000X-0.625000X-0.350000X0*%
|
||||
%ADD14O,1.750000X1.200000*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.C,H1*%
|
||||
X15500000Y7000000D03*
|
||||
%TD*%
|
||||
%TO.C,H2*%
|
||||
X30500000Y7000000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,TP12*%
|
||||
X3500000Y14000000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,TP1*%
|
||||
X5000000Y4500000D03*
|
||||
%TD*%
|
||||
D13*
|
||||
%TO.C,J2*%
|
||||
X43500000Y2750000D03*
|
||||
D14*
|
||||
X43500000Y4750000D03*
|
||||
X43500000Y6750000D03*
|
||||
X43500000Y8750000D03*
|
||||
X43500000Y10750000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,TP8*%
|
||||
X38000000Y14000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP3*%
|
||||
X16000000Y2500000D03*
|
||||
%TD*%
|
||||
%TO.C,TP10*%
|
||||
X35000000Y17000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP7*%
|
||||
X35000000Y14000000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,TP14*%
|
||||
X9500000Y14000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP13*%
|
||||
X6500000Y14000000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,TP6*%
|
||||
X35000000Y11000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP9*%
|
||||
X38000000Y17000000D03*
|
||||
%TD*%
|
||||
%TO.C,TP2*%
|
||||
X21000000Y11500000D03*
|
||||
%TD*%
|
||||
%TO.C,TP4*%
|
||||
X19000000Y2500000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,TP11*%
|
||||
X12500000Y14000000D03*
|
||||
%TD*%
|
||||
D13*
|
||||
%TO.C,J1*%
|
||||
X25050000Y3550000D03*
|
||||
D14*
|
||||
X25050000Y5550000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,TP5*%
|
||||
X34324797Y3291770D03*
|
||||
%TD*%
|
||||
M02*
|
||||
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-10T00:49:54+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-10 00:49:54*
|
||||
%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-10T00:49:54+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-10 00:49:54*
|
||||
%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-10T00:49:54+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-10 00:49:54*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G01*
|
||||
G04 APERTURE LIST*
|
||||
G04 Aperture macros list*
|
||||
%AMRoundRect*
|
||||
0 Rectangle with rounded corners*
|
||||
0 $1 Rounding radius*
|
||||
0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners*
|
||||
0 Add a 4 corners polygon primitive as box body*
|
||||
4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0*
|
||||
0 Add four circle primitives for the rounded corners*
|
||||
1,1,$1+$1,$2,$3*
|
||||
1,1,$1+$1,$4,$5*
|
||||
1,1,$1+$1,$6,$7*
|
||||
1,1,$1+$1,$8,$9*
|
||||
0 Add four rect primitives between the rounded corners*
|
||||
20,1,$1+$1,$2,$3,$4,$5,0*
|
||||
20,1,$1+$1,$4,$5,$6,$7,0*
|
||||
20,1,$1+$1,$6,$7,$8,$9,0*
|
||||
20,1,$1+$1,$8,$9,$2,$3,0*%
|
||||
G04 Aperture macros list end*
|
||||
%ADD10RoundRect,0.225000X-0.225000X-0.250000X0.225000X-0.250000X0.225000X0.250000X-0.225000X0.250000X0*%
|
||||
%ADD11RoundRect,0.200000X-0.275000X0.200000X-0.275000X-0.200000X0.275000X-0.200000X0.275000X0.200000X0*%
|
||||
%ADD12RoundRect,0.200000X0.200000X0.275000X-0.200000X0.275000X-0.200000X-0.275000X0.200000X-0.275000X0*%
|
||||
%ADD13RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*%
|
||||
%ADD14C,2.200000*%
|
||||
%ADD15C,0.345000*%
|
||||
%ADD16RoundRect,0.200000X0.275000X-0.200000X0.275000X0.200000X-0.275000X0.200000X-0.275000X-0.200000X0*%
|
||||
%ADD17R,0.600000X0.400000*%
|
||||
%ADD18R,0.400000X0.600000*%
|
||||
%ADD19RoundRect,0.150000X-0.512500X-0.150000X0.512500X-0.150000X0.512500X0.150000X-0.512500X0.150000X0*%
|
||||
%ADD20RoundRect,0.218750X-0.218750X-0.256250X0.218750X-0.256250X0.218750X0.256250X-0.218750X0.256250X0*%
|
||||
%ADD21RoundRect,0.250000X-0.650000X0.325000X-0.650000X-0.325000X0.650000X-0.325000X0.650000X0.325000X0*%
|
||||
%ADD22RoundRect,0.150000X0.587500X0.150000X-0.587500X0.150000X-0.587500X-0.150000X0.587500X-0.150000X0*%
|
||||
%ADD23RoundRect,0.225000X0.225000X0.250000X-0.225000X0.250000X-0.225000X-0.250000X0.225000X-0.250000X0*%
|
||||
%ADD24RoundRect,0.250000X-0.325000X-0.650000X0.325000X-0.650000X0.325000X0.650000X-0.325000X0.650000X0*%
|
||||
%ADD25RoundRect,0.150000X-0.150000X0.587500X-0.150000X-0.587500X0.150000X-0.587500X0.150000X0.587500X0*%
|
||||
%ADD26RoundRect,0.150000X0.150000X-0.587500X0.150000X0.587500X-0.150000X0.587500X-0.150000X-0.587500X0*%
|
||||
%ADD27RoundRect,0.100000X-0.712500X-0.100000X0.712500X-0.100000X0.712500X0.100000X-0.712500X0.100000X0*%
|
||||
%ADD28R,2.400000X0.740000*%
|
||||
%ADD29RoundRect,0.225000X-0.250000X0.225000X-0.250000X-0.225000X0.250000X-0.225000X0.250000X0.225000X0*%
|
||||
%ADD30RoundRect,0.200000X-0.200000X-0.275000X0.200000X-0.275000X0.200000X0.275000X-0.200000X0.275000X0*%
|
||||
%ADD31RoundRect,0.250000X0.625000X-0.350000X0.625000X0.350000X-0.625000X0.350000X-0.625000X-0.350000X0*%
|
||||
%ADD32O,1.750000X1.200000*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
%TO.C,C2*%
|
||||
X10225000Y14000000D03*
|
||||
X11775000Y14000000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R9*%
|
||||
X41500000Y10825000D03*
|
||||
X41500000Y9175000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R11*%
|
||||
X31075000Y21250000D03*
|
||||
X29425000Y21250000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R6*%
|
||||
X7500000Y15825000D03*
|
||||
X7500000Y14175000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R13*%
|
||||
X19825000Y1500000D03*
|
||||
X18175000Y1500000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R18*%
|
||||
X44250000Y15825000D03*
|
||||
X44250000Y14175000D03*
|
||||
%TD*%
|
||||
%TO.C,R5*%
|
||||
X3500000Y13825000D03*
|
||||
X3500000Y12175000D03*
|
||||
%TD*%
|
||||
D13*
|
||||
%TO.C,C8*%
|
||||
X32000000Y1725000D03*
|
||||
X32000000Y3275000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.C,H1*%
|
||||
X15500000Y7000000D03*
|
||||
%TD*%
|
||||
D15*
|
||||
%TO.C,U4*%
|
||||
X15500000Y3000000D03*
|
||||
X15500000Y2500000D03*
|
||||
X15500000Y2000000D03*
|
||||
X15000000Y3000000D03*
|
||||
X15000000Y2500000D03*
|
||||
X15000000Y2000000D03*
|
||||
X14500000Y3000000D03*
|
||||
X14500000Y2500000D03*
|
||||
X14500000Y2000000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R2*%
|
||||
X3500000Y6175000D03*
|
||||
X3500000Y7825000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R19*%
|
||||
X39250000Y15825000D03*
|
||||
X39250000Y14175000D03*
|
||||
%TD*%
|
||||
D17*
|
||||
%TO.C,U3*%
|
||||
X18350000Y22250000D03*
|
||||
X18350000Y21150000D03*
|
||||
X18350000Y20350000D03*
|
||||
X18350000Y18750000D03*
|
||||
X19250000Y18350000D03*
|
||||
X18350000Y17950000D03*
|
||||
X19250000Y17550000D03*
|
||||
X18350000Y17150000D03*
|
||||
X19250000Y16750000D03*
|
||||
X18350000Y16350000D03*
|
||||
X19250000Y15950000D03*
|
||||
X18350000Y15550000D03*
|
||||
X19250000Y15150000D03*
|
||||
X18350000Y14750000D03*
|
||||
D18*
|
||||
X18200000Y11350000D03*
|
||||
X19000000Y11350000D03*
|
||||
X19800000Y11350000D03*
|
||||
X20600000Y11350000D03*
|
||||
X21000000Y12250000D03*
|
||||
X21400000Y11350000D03*
|
||||
X21800000Y12250000D03*
|
||||
X22200000Y11350000D03*
|
||||
X22600000Y12250000D03*
|
||||
X23000000Y11350000D03*
|
||||
X23400000Y12250000D03*
|
||||
X23800000Y11350000D03*
|
||||
X24200000Y12250000D03*
|
||||
X24600000Y11350000D03*
|
||||
X25000000Y12250000D03*
|
||||
X25400000Y11350000D03*
|
||||
X26200000Y11350000D03*
|
||||
X27000000Y11350000D03*
|
||||
X27800000Y11350000D03*
|
||||
D17*
|
||||
X27650000Y12350000D03*
|
||||
X27650000Y13150000D03*
|
||||
X26750000Y13550000D03*
|
||||
X27650000Y13950000D03*
|
||||
X26750000Y14350000D03*
|
||||
X27650000Y14750000D03*
|
||||
X26750000Y15150000D03*
|
||||
X27650000Y15550000D03*
|
||||
X26750000Y15950000D03*
|
||||
X26750000Y16750000D03*
|
||||
X27650000Y17150000D03*
|
||||
X26750000Y17550000D03*
|
||||
X27650000Y17950000D03*
|
||||
X26750000Y18350000D03*
|
||||
X27650000Y18750000D03*
|
||||
X26750000Y19150000D03*
|
||||
X26750000Y19950000D03*
|
||||
X27650000Y20350000D03*
|
||||
X26750000Y20750000D03*
|
||||
X27650000Y21150000D03*
|
||||
X26750000Y21550000D03*
|
||||
X27650000Y22250000D03*
|
||||
D18*
|
||||
X21000000Y17950000D03*
|
||||
X21800000Y17950000D03*
|
||||
X22600000Y17950000D03*
|
||||
X23400000Y17950000D03*
|
||||
X24200000Y17950000D03*
|
||||
X25000000Y17950000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R17*%
|
||||
X36500000Y5175000D03*
|
||||
X36500000Y6825000D03*
|
||||
%TD*%
|
||||
%TO.C,R3*%
|
||||
X3500000Y3175000D03*
|
||||
X3500000Y4825000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R20*%
|
||||
X19825000Y4500000D03*
|
||||
X18175000Y4500000D03*
|
||||
%TD*%
|
||||
D19*
|
||||
%TO.C,U5*%
|
||||
X33862500Y3450000D03*
|
||||
X33862500Y2500000D03*
|
||||
X33862500Y1550000D03*
|
||||
X36137500Y1550000D03*
|
||||
X36137500Y3450000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R12*%
|
||||
X19825000Y3000000D03*
|
||||
X18175000Y3000000D03*
|
||||
%TD*%
|
||||
D13*
|
||||
%TO.C,C5*%
|
||||
X27000000Y3725000D03*
|
||||
X27000000Y5275000D03*
|
||||
%TD*%
|
||||
D20*
|
||||
%TO.C,L1*%
|
||||
X24712500Y9500000D03*
|
||||
X26287500Y9500000D03*
|
||||
%TD*%
|
||||
D21*
|
||||
%TO.C,C4*%
|
||||
X22000000Y8975000D03*
|
||||
X22000000Y6025000D03*
|
||||
%TD*%
|
||||
D14*
|
||||
%TO.C,H2*%
|
||||
X30500000Y7000000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R8*%
|
||||
X11612500Y12100000D03*
|
||||
X11612500Y10450000D03*
|
||||
%TD*%
|
||||
D22*
|
||||
%TO.C,Q2*%
|
||||
X39500000Y7600000D03*
|
||||
X39500000Y9500000D03*
|
||||
X37625000Y8550000D03*
|
||||
%TD*%
|
||||
D23*
|
||||
%TO.C,C6*%
|
||||
X12275000Y1500000D03*
|
||||
X10725000Y1500000D03*
|
||||
%TD*%
|
||||
D24*
|
||||
%TO.C,C3*%
|
||||
X24025000Y7500000D03*
|
||||
X26975000Y7500000D03*
|
||||
%TD*%
|
||||
D25*
|
||||
%TO.C,Q1*%
|
||||
X14950000Y19687500D03*
|
||||
X13050000Y19687500D03*
|
||||
X14000000Y17812500D03*
|
||||
%TD*%
|
||||
D26*
|
||||
%TO.C,Q3*%
|
||||
X40800000Y14562500D03*
|
||||
X42700000Y14562500D03*
|
||||
X41750000Y16437500D03*
|
||||
%TD*%
|
||||
D27*
|
||||
%TO.C,U2*%
|
||||
X5387500Y12475000D03*
|
||||
X5387500Y11825000D03*
|
||||
X5387500Y11175000D03*
|
||||
X5387500Y10525000D03*
|
||||
X9612500Y10525000D03*
|
||||
X9612500Y11175000D03*
|
||||
X9612500Y11825000D03*
|
||||
X9612500Y12475000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R14*%
|
||||
X41500000Y7825000D03*
|
||||
X41500000Y6175000D03*
|
||||
%TD*%
|
||||
D23*
|
||||
%TO.C,C7*%
|
||||
X39775000Y3000000D03*
|
||||
X38225000Y3000000D03*
|
||||
%TD*%
|
||||
D28*
|
||||
%TO.C,J3*%
|
||||
X31300000Y16290000D03*
|
||||
X35200000Y16290000D03*
|
||||
X31300000Y15020000D03*
|
||||
X35200000Y15020000D03*
|
||||
X31300000Y13750000D03*
|
||||
X35200000Y13750000D03*
|
||||
X31300000Y12480000D03*
|
||||
X35200000Y12480000D03*
|
||||
X31300000Y11210000D03*
|
||||
X35200000Y11210000D03*
|
||||
%TD*%
|
||||
D29*
|
||||
%TO.C,C1*%
|
||||
X11500000Y6275000D03*
|
||||
X11500000Y4725000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R4*%
|
||||
X3500000Y10825000D03*
|
||||
X3500000Y9175000D03*
|
||||
%TD*%
|
||||
D16*
|
||||
%TO.C,R1*%
|
||||
X16500000Y18350000D03*
|
||||
X16500000Y20000000D03*
|
||||
%TD*%
|
||||
D30*
|
||||
%TO.C,R16*%
|
||||
X38175000Y6000000D03*
|
||||
X39825000Y6000000D03*
|
||||
%TD*%
|
||||
D11*
|
||||
%TO.C,R7*%
|
||||
X6000000Y15825000D03*
|
||||
X6000000Y14175000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R15*%
|
||||
X12325000Y3000000D03*
|
||||
X10675000Y3000000D03*
|
||||
%TD*%
|
||||
D27*
|
||||
%TO.C,U1*%
|
||||
X5387500Y6475000D03*
|
||||
X5387500Y5825000D03*
|
||||
X5387500Y5175000D03*
|
||||
X5387500Y4525000D03*
|
||||
X9612500Y4525000D03*
|
||||
X9612500Y5175000D03*
|
||||
X9612500Y5825000D03*
|
||||
X9612500Y6475000D03*
|
||||
%TD*%
|
||||
D12*
|
||||
%TO.C,R10*%
|
||||
X31075000Y19750000D03*
|
||||
X29425000Y19750000D03*
|
||||
%TD*%
|
||||
D31*
|
||||
%TO.C,J2*%
|
||||
X43500000Y2750000D03*
|
||||
D32*
|
||||
X43500000Y4750000D03*
|
||||
X43500000Y6750000D03*
|
||||
X43500000Y8750000D03*
|
||||
X43500000Y10750000D03*
|
||||
%TD*%
|
||||
D31*
|
||||
%TO.C,J1*%
|
||||
X25050000Y3550000D03*
|
||||
D32*
|
||||
X25050000Y5550000D03*
|
||||
%TD*%
|
||||
M02*
|
||||
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-10T00:49:54+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-10 00:49:54*
|
||||
%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-10T00:49:54+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-10 00:49:54*
|
||||
%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*
|
||||