Files
GravityHW/Exports/iBOM/ibom.html
2024-06-19 14:10:57 +03:00

4670 lines
310 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive BOM for KiCAD</title>
<style type="text/css">
:root {
--pcb-edge-color: black;
--pad-color: #878787;
--pad-hole-color: #CCCCCC;
--pad-color-highlight: #D04040;
--pad-color-highlight-both: #D0D040;
--pad-color-highlight-marked: #44a344;
--pin1-outline-color: #ffb629;
--pin1-outline-color-highlight: #ffb629;
--pin1-outline-color-highlight-both: #fcbb39;
--pin1-outline-color-highlight-marked: #fdbe41;
--silkscreen-edge-color: #aa4;
--silkscreen-polygon-color: #4aa;
--silkscreen-text-color: #4aa;
--fabrication-edge-color: #907651;
--fabrication-polygon-color: #907651;
--fabrication-text-color: #a27c24;
--track-color: #def5f1;
--track-color-highlight: #D04040;
--zone-color: #def5f1;
--zone-color-highlight: #d0404080;
}
html,
body {
margin: 0px;
height: 100%;
font-family: Verdana, sans-serif;
}
.dark.topmostdiv {
--pcb-edge-color: #eee;
--pad-color: #808080;
--pin1-outline-color: #ffa800;
--pin1-outline-color-highlight: #ccff00;
--track-color: #42524f;
--zone-color: #42524f;
background-color: #252c30;
color: #eee;
}
button {
background-color: #eee;
border: 1px solid #888;
color: black;
height: 44px;
width: 44px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 14px;
font-weight: bolder;
}
.dark button {
/* This will be inverted */
background-color: #c3b7b5;
}
button.depressed {
background-color: #0a0;
color: white;
}
.dark button.depressed {
/* This will be inverted */
background-color: #b3b;
}
button:focus {
outline: 0;
}
button#tb-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#lr-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}
button#bom-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-grouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-ungrouped-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}
button#bom-netlist-btn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}
button#copy {
background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
background-position: 6px 6px;
background-repeat: no-repeat;
background-size: 26px 26px;
border-radius: 6px;
height: 40px;
width: 40px;
margin: 10px 5px;
}
button#copy:active {
box-shadow: inset 0px 0px 5px #6c6c6c;
}
textarea.clipboard-temp {
position: fixed;
top: 0;
left: 0;
width: 2em;
height: 2em;
padding: 0;
border: None;
outline: None;
box-shadow: None;
background: transparent;
}
.left-most-button {
border-right: 0;
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.middle-button {
border-right: 0;
}
.right-most-button {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.button-container {
font-size: 0;
margin: 0.4rem 0.4rem 0.4rem 0;
}
.dark .button-container {
filter: invert(1);
}
.button-container button {
background-size: 32px 32px;
background-position: 5px 5px;
background-repeat: no-repeat;
}
@media print {
.hideonprint {
display: none;
}
}
canvas {
cursor: crosshair;
}
canvas:active {
cursor: grabbing;
}
.fileinfo {
width: 100%;
max-width: 1000px;
border: none;
padding: 3px;
}
.fileinfo .title {
font-size: 20pt;
font-weight: bold;
}
.fileinfo td {
overflow: hidden;
white-space: nowrap;
max-width: 1px;
width: 50%;
text-overflow: ellipsis;
}
.bom {
border-collapse: collapse;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 10pt;
table-layout: fixed;
width: 100%;
margin-top: 1px;
position: relative;
}
.bom th,
.bom td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
.dark .bom th,
.dark .bom td {
border: 1px solid #777;
}
.bom th {
background-color: #CCCCCC;
background-clip: padding-box;
}
.dark .bom th {
background-color: #3b4749;
}
.bom tr.highlighted:nth-child(n) {
background-color: #cfc;
}
.dark .bom tr.highlighted:nth-child(n) {
background-color: #226022;
}
.bom tr:nth-child(even) {
background-color: #f2f2f2;
}
.dark .bom tr:nth-child(even) {
background-color: #313b40;
}
.bom tr.checked {
color: #1cb53d;
}
.dark .bom tr.checked {
color: #2cce54;
}
.bom tr {
transition: background-color 0.2s;
}
.bom .numCol {
width: 30px;
}
.bom .value {
width: 15%;
}
.bom .quantity {
width: 65px;
}
.bom th .sortmark {
position: absolute;
right: 1px;
top: 1px;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent #221 transparent;
transform-origin: 50% 85%;
transition: opacity 0.2s, transform 0.4s;
}
.dark .bom th .sortmark {
filter: invert(1);
}
.bom th .sortmark.none {
opacity: 0;
}
.bom th .sortmark.desc {
transform: rotate(180deg);
}
.bom th:hover .sortmark.none {
opacity: 0.5;
}
.bom .bom-checkbox {
width: 30px;
position: relative;
user-select: none;
-moz-user-select: none;
}
.bom .bom-checkbox:before {
content: "";
position: absolute;
border-width: 15px;
border-style: solid;
border-color: #51829f transparent transparent transparent;
visibility: hidden;
top: -15px;
}
.bom .bom-checkbox:after {
content: "Double click to set/unset all";
position: absolute;
color: white;
top: -35px;
left: -26px;
background: #51829f;
padding: 5px 15px;
border-radius: 8px;
white-space: nowrap;
visibility: hidden;
}
.bom .bom-checkbox:hover:before,
.bom .bom-checkbox:hover:after {
visibility: visible;
transition: visibility 0.2s linear 1s;
}
.split {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
overflow-y: auto;
overflow-x: hidden;
background-color: inherit;
}
.split.split-horizontal,
.gutter.gutter-horizontal {
height: 100%;
float: left;
}
.gutter {
background-color: #ddd;
background-repeat: no-repeat;
background-position: 50%;
transition: background-color 0.3s;
}
.dark .gutter {
background-color: #777;
}
.gutter.gutter-horizontal {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
cursor: ew-resize;
width: 5px;
}
.gutter.gutter-vertical {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
cursor: ns-resize;
height: 5px;
}
.searchbox {
float: left;
height: 40px;
margin: 10px 5px;
padding: 12px 32px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 18px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 6px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABNklEQVQ4T8XSMUvDQBQH8P/LElFa/AIZHcTBQSz0I/gFstTBRR2KUC4ldDxw7h0Bl3RRUATxi4iiODgoiLNrbQYp5J6cpJJqomkX33Z37/14d/dIa33MzDuYI4johOI4XhyNRteO46zNYjDzAxE1yBZprVeZ+QbAUhXEGJMA2Ox2u4+fQIa0mPmsCgCgJYQ4t7lfgF0opQYAdv9ABkKI/UnOFCClXKjX61cA1osQY8x9kiRNKeV7IWA3oyhaSdP0FkAtjxhj3hzH2RBCPOf3pzqYHCilfAAX+URm9oMguPzeWSGQvUcMYC8rOBJCHBRdqxTo9/vbRHRqi8bj8XKv1xvODbiuW2u32/bvf0SlDv4XYOY7z/Mavu+nM1+BmQ+NMc0wDF/LprP0DbTWW0T00ul0nn4b7Q87+X4Qmfiq2wAAAABJRU5ErkJggg==');
background-position: 10px 10px;
background-repeat: no-repeat;
}
.dark .searchbox {
background-color: #111;
color: #eee;
}
.searchbox::placeholder {
color: #ccc;
}
.dark .searchbox::placeholder {
color: #666;
}
.filter {
width: calc(60% - 64px);
}
.reflookup {
width: calc(40% - 10px);
}
input[type=text]:focus {
background-color: white;
border: 1px solid #333;
}
.dark input[type=text]:focus {
background-color: #333;
border: 1px solid #ccc;
}
mark.highlight {
background-color: #5050ff;
color: #fff;
padding: 2px;
border-radius: 6px;
}
.dark mark.highlight {
background-color: #76a6da;
color: #111;
}
.menubtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
background-position: center;
background-repeat: no-repeat;
}
.statsbtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.iobtn {
background-color: white;
border: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
}
.visbtn {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='none' stroke='%23333' d='M2.5 4.5h5v15h-5zM9.5 4.5h5v15h-5zM16.5 4.5h5v15h-5z'/%3E%3C/svg%3E");
background-position: center;
background-repeat: no-repeat;
padding: 15px;
}
#vismenu-content {
left: 0px;
font-family: Verdana, sans-serif;
}
.dark .statsbtn,
.dark .savebtn,
.dark .menubtn,
.dark .iobtn,
.dark .visbtn {
filter: invert(1);
}
.flexbox {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
}
.savebtn {
background-color: #d6d6d6;
width: auto;
height: 30px;
flex-grow: 1;
margin: 5px;
border-radius: 4px;
}
.savebtn:active {
background-color: #0a0;
color: white;
}
.dark .savebtn:active {
/* This will be inverted */
background-color: #b3b;
}
.stats {
border-collapse: collapse;
font-size: 12pt;
table-layout: fixed;
width: 100%;
min-width: 450px;
}
.dark .stats td {
border: 1px solid #bbb;
}
.stats td {
border: 1px solid black;
padding: 5px;
word-wrap: break-word;
text-align: center;
position: relative;
}
#checkbox-stats div {
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#checkbox-stats .bar {
background-color: rgba(28, 251, 0, 0.6);
}
.menu {
position: relative;
display: inline-block;
margin: 0.4rem 0.4rem 0.4rem 0;
}
.menu-content {
font-size: 12pt !important;
text-align: left !important;
font-weight: normal !important;
display: none;
position: absolute;
background-color: white;
right: 0;
min-width: 300px;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
z-index: 100;
padding: 8px;
}
.dark .menu-content {
background-color: #111;
}
.menu:hover .menu-content {
display: block;
}
.menu:hover .menubtn,
.menu:hover .iobtn,
.menu:hover .statsbtn {
background-color: #eee;
}
.menu-label {
display: inline-block;
padding: 8px;
border: 1px solid #ccc;
border-top: 0;
width: calc(100% - 18px);
}
.menu-label-top {
border-top: 1px solid #ccc;
}
.menu-textbox {
float: left;
height: 24px;
margin: 10px 5px;
padding: 5px 5px;
font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
font-size: 14px;
box-sizing: border-box;
border: 1px solid #888;
border-radius: 4px;
outline: none;
background-color: #eee;
transition: background-color 0.2s, border 0.2s;
width: calc(100% - 10px);
}
.menu-textbox.invalid,
.dark .menu-textbox.invalid {
color: red;
}
.dark .menu-textbox {
background-color: #222;
color: #eee;
}
.radio-container {
margin: 4px;
}
.topmostdiv {
display: flex;
flex-direction: column;
width: 100%;
background-color: white;
transition: background-color 0.3s;
}
#top {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
align-items: center;
}
#topdivider {
border-bottom: 2px solid black;
display: flex;
justify-content: center;
align-items: center;
}
.dark #topdivider {
border-bottom: 2px solid #ccc;
}
#topdivider>div {
position: relative;
}
#toptoggle {
cursor: pointer;
user-select: none;
position: absolute;
padding: 0.1rem 0.3rem;
top: -0.4rem;
left: -1rem;
font-size: 1.4rem;
line-height: 60%;
border: 1px solid black;
border-radius: 1rem;
background-color: #fff;
z-index: 100;
}
.flipped {
transform: rotate(0.5turn);
}
.dark #toptoggle {
border: 1px solid #fff;
background-color: #222;
}
#fileinfodiv {
flex: 20rem 1 0;
overflow: auto;
}
#bomcontrols {
display: flex;
flex-direction: row-reverse;
}
#bomcontrols>* {
flex-shrink: 0;
}
#dbg {
display: block;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #aaa;
}
::-webkit-scrollbar-thumb {
background: #666;
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
.slider {
-webkit-appearance: none;
width: 100%;
margin: 3px 0;
padding: 0;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border-radius: 3px;
}
.slider:hover {
opacity: 1;
}
.slider:focus {
outline: none;
}
.slider::-webkit-slider-runnable-track {
-webkit-appearance: none;
width: 100%;
height: 8px;
background: #d3d3d3;
border-radius: 3px;
border: none;
}
.slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin-top: -4px;
}
.dark .slider::-webkit-slider-thumb {
background: #3d3;
}
.slider::-moz-range-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
}
.slider::-moz-range-track {
height: 8px;
background: #d3d3d3;
border-radius: 3px;
}
.dark .slider::-moz-range-thumb {
background: #3d3;
}
.slider::-ms-track {
width: 100%;
height: 8px;
border-width: 3px 0;
background: transparent;
border-color: transparent;
color: transparent;
transition: opacity .2s;
}
.slider::-ms-fill-lower {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-fill-upper {
background: #d3d3d3;
border: none;
border-radius: 3px;
}
.slider::-ms-thumb {
width: 15px;
height: 15px;
border-radius: 50%;
background: #0a0;
cursor: pointer;
margin: 0;
}
.shameless-plug {
font-size: 0.8em;
text-align: center;
display: block;
}
a {
color: #0278a4;
}
.dark a {
color: #00b9fd;
}
#frontcanvas,
#backcanvas {
touch-action: none;
}
.placeholder {
border: 1px dashed #9f9fda !important;
background-color: #edf2f7 !important;
}
.dragging {
z-index: 999;
}
.dark .dragging>table>tbody>tr {
background-color: #252c30;
}
.dark .placeholder {
filter: invert(1);
}
.column-spacer {
top: 0;
left: 0;
width: calc(100% - 4px);
position: absolute;
cursor: pointer;
user-select: none;
height: 100%;
}
.column-width-handle {
top: 0;
right: 0;
width: 4px;
position: absolute;
cursor: col-resize;
user-select: none;
height: 100%;
}
.column-width-handle:hover {
background-color: #4f99bd;
}
.help-link {
border: 1px solid #0278a4;
padding-inline: 0.3rem;
border-radius: 3px;
cursor: pointer;
}
.dark .help-link {
border: 1px solid #00b9fd;
}
.bom-color {
width: 20%;
}
.color-column input {
width: 1.6rem;
height: 1rem;
border: 1px solid black;
cursor: pointer;
padding: 0;
}
/* removes default styling from input color element */
::-webkit-color-swatch {
border: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-moz-color-swatch,
::-moz-focus-inner {
border: none;
}
::-moz-focus-inner {
padding: 0;
}
/* #bomhead {
position: sticky;
top: 0px;
z-index: 1;
} */
</style>
<script type="text/javascript" >
///////////////////////////////////////////////
/*
Split.js - v1.3.5
MIT License
https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});
///////////////////////////////////////////////
///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////
///////////////////////////////////////////////
/*!
* PEP v0.4.3 | https://github.com/jquery/PEP
* Copyright jQuery Foundation and other contributors | http://jquery.org/license
*/
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});
///////////////////////////////////////////////
///////////////////////////////////////////////
var config = {"dark_mode": false, "show_pads": true, "show_fabrication": false, "show_silkscreen": true, "highlight_pin1": "none", "redraw_on_drag": true, "board_rotation": 0, "checkboxes": "Sourced,Placed", "bom_view": "left-right", "layer_view": "FB", "offset_back_rotation": false, "kicad_text_formatting": true, "fields": ["Value", "Footprint"]}
///////////////////////////////////////////////
///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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tqAANbwdsjW9cuIACgW1IAUduzWzBbZdvdMZGwEBmJ2+tbm1vAyxhb44Nz27SABFubKERbS9v52+db6tuXW9rbHNsnmxuRa5GcW4bb5WB8W28EawQlOILb5tsN203bagAt23bbFtsd29vbFNuwO4VBMXCaW/3b9Nu+cIzbRADGWyPboDts2+A7utsv24Yt+8ZA20bbeVuxiG5bkgBm21SAK9tW2ySANtuYO1vb5Nsk29Xb3CREsNcARDue2/Fb0JCj25YA49uI25PbsdthcBuRPya/2+6AzlsT/gymr1v12x9bKqgYO23bWDsDBLg74VvfHNPQwjtH28Q7nVt+W77bPVvn26wAl9vigMNb0JCh26BbkdtqANHbT9u3Wy/b65iggKtbSdtoWywA39sLijA7eFv/20btttB127oAwDuF25Q7xdvs2zQ7GrkGxf47PFsrjPxb9YpAgsg77DtYO+Jbkltr2+Vb2ju8Oyqoejs8WwN0VEBGO8rbJjvQ22Q7sNsRO2PbJdsyO8/ba5iC2Io7jDuE5PlbSTum229bHDulW5k731uVW207ODv8O3g7gjtRWyI71dpe2+I7FTuSO1U7EDv9yYxwxG31O8o7TTuIO8k7bDtwgN07n1sdOxvbXTs6O9dJeTsNWwY7U0aDO8BAHVve22Y7Z9sB2xfbQds2OyHbN9th24YDIADOO2gBsjsi3vHbHjtrW0BAydvRsz47adv1O5nbPAD824HVYTu0gKAAEjtSO6Xbt1uR6BXb9FgMO9RW/mAsO607aTuN2xk71tvr2zvbm9saO1k7u9sKpCZIQ2BFOxDbQzurBKQ75DtTgIC74zu626WgM9uV23CA1dsL2/UwITsoOyi76DurO0i76zs5O6i7Ttvd29dmmLtqAHs7BluHO8Tb5jungCc7VjtnO6wAtjvDAKHbYdvTWzc7j9t3O2XbjuQ6sPqFVy7PO1YArzvpGtgABoAfO3E7tIBfO9nbzTu/O1BAZ1vhO2ZbYDsT2xM7mXi7kJvw9TuQu4vbhVvL27C7aDusAFo7ktsbO53bDDv72+y7YNvGO6I7DNvD2wS7oztAu9U7t1v1gmsAZrvqu8DblLvQu+o7ZNuaO/S7PDu0u2s7zrtsu0KoStvYu/s7qtun2xY7/LuUW4K7llvX29IwIABjW3eAD4BlO047krvDADU7ukhlOk87Sdt4maGAqrudFDM7sIQuW29GLDuC23877oAAuz67RLtT24B6vyaK2ww7HlN/4Cw7i/7Wu/2QKACMsXS7CLvMu4y7MbsMuxC7VGZFsJy7HVulO/i7atsGu1Q7Rrs0OxXBW8ZQ8L27s7u9Bp6kg7s0u84AI7uAoWO7XDuIu9G7EbsTuzO7Dyhzu+67OLte0Mu7rNuRO9Q7nbvWc5u7Mzs7uwO7m+upO8O7o7t2u1G72TtTu1s7wNvXu75w87uq2yM7K7tPu2u7nbs52jMa77vXu7u7G+swuz+7x7t/u+O7nTvC2w7bPTtouw1bIHtYux7bd7tcQNy7rdu8u/7btICB22ZbV9t2OzfboFviu7c7Jbv+u7dJb9ueOx/b3jsqu5hb9TuBO0+WOdvIgHnbursF2/87GbuQe5U7UTtT2zK7e5DQO1XbeDsJOwg7ajtDuySA6TvN2/+7DrtMuxh71dsFO4Q7t7vJu4Pb3qReuw+7Gtsie8+79zvie3Q7Qsbbu407zDs8e00AizuYe9g7Kzvoe7G7yzu5O707+jv9OEI7HLtae1y7EHuPu4Z70HvGe27BCjvBuw07u5BzO3J7B7vS29vb9rvIuxe7ant9O4q4hjsee8U7HrtEe6m7fLvke6c7lHvnO9m7zgBh2/fbRbvQW1K7rjt6hYPJLHsvOynb7zuMbZ874lBau/M7vHuhO/x7IDvCe2M7onv3O/hNprtyu+S7eDuhu1Z77lvfuwp7cLtKew5707tOe5e7lNsuuwm7YHs6e3i75TtNe767xrsnKModQbtSe+Fb3Xvau717SzuOu5F7ynvRexF7fDs4e7hSGLsTe557Bzupe2R77oAUe7RbVHsiuzfbk1t5ezNbBXsMe5zbb+nqqJFwpXuKu9mo6Fta/unbAQDHcJEAij09ewcD9Xt8QHq7gnuEuy17z9sOQHMo33uY2zJw2NslOI8x4XtXLra7OgjcOwB7MXuxu9XbeHuJe0m7BluLuzN7PnvNe0Z70rtKsFD78HsuWz87FQDhu7t7kbtDe+e71Puje3g7WPtuu0l7hHsj2m27s3sdu8Z7z+kkhmT7E/4m29wACPt9e+j7KPtnu2j79Puxe+FbTPuJuwR72nvDO8MAYPtE+647xeB/6UF7H6BZ26ODx1vIe1O7UXuTu8L7QHuMO6GAICD4e8fbYjvy++274Pv+u1jGL3sPW5TbavvfO0LGmvtU+1h79nunu5e7I3sS+7lbhvvzSdj7Mvtee2b7HPsW+097JPtw2Db7htvG2yw7gvsbe6p7aHuu+xh77vsY+4z7fFuge8d74Hv++wT7c3s0O5D7Ifu8+3D7QIKR+7Z7q9u0+2L7zvvOe/t7VNtS+5N7J9tHO2m76XsCu5l7QrsXOzm7oFtQCPl7Mdulu4ZlacHyu14744M+Oxx7QXtce4A7SDskWw17+rvp+5z77fvjkBxby3vxO257sntL24j74U7I+zr7BfubOy57+Tvxe5p7LPuy+7i7enveewZ7hPt+exP76wD2W0F7szuWe2t7nEAL+4X7sfuOe5t7e3ssu657kVtwUJX7pvvs+2P7gfuQO1mdWVun+0w7qjvz+0L74vsx+84AqPsqe4B7a/vbO/F7uzsp+zXaxHtHgKR7ljtCe5d7WXvUe037BUsSuw9781uMe+FwWzFveyhbbHu+O/dGDDsD+wpmITstu9YAiAf7+xn7YnsxO8tJQXtwO0PocFBhewAHSPvwuzf7w3t3+6X7D/vr+xpbzVvQB3WKuntlO8zbAfuK+0H74XB1Oz/7Fnt/+0P7WvvC+8v78fvTuwI7bnsDO3wHr/sUB4a70jvze2sebHDTOxIHIXvn+7V71nsyB4AHIvtu+xwHDPv6O5AHvAdb+1y7p3sIB9Y7DfvZe2BbEOCt+y47nNu96K/br3sKu3gHPfvsez/b/fvjvgA7JAdAOyP7oPvm+yIHCb3mUJwZZnvV2zJ7jAc42zZ77duKeye7wAei+6AHevvgB8DbGntWBzj7C7tD24IHFDvCB4f7ILu3SXuq77uSB3EH0gdO+3Z7NPtsB3T7JfvmBzxb/TvP+yoH97t7++oHwLtuBwF7lphlB3oHUgcLO0YH9QfJB+KAIAc7e4MHCfsWB01bxvsmO7AH3Vtpe+d7GXtIBw4HKAc5e2gH9HuYB6IHuTBku+/bZXtvOyq7arvT+xq71XsU+5xAZAdv+5QH4/v+u+GGjzt0BzXbVLv/+1H7/XtL+9t7uvvGB/r743uH29YHuQcCB0u7bQeruxoHutsBu9cHBwchu/A7Ybvye7IHzwcr+067Y3vxux8HOQcpu9X7cweWABd7g1vIB9d7Obth284H93tt+8UHBbAde9sHirvle3sHlXtBe5q7xweVAKcHagd/Bx0H2FaCAEt7nXsre6CHAPsDB4v7rAcpB6YH0fsKB6y7h3twh777XwfTe0IH7/vhBzrwuV2yu+C7FLtMhxf7LIfX++yHcftmBx77AFI8h1MHyXumOzy7xzu1+xQHV3vAWzR71ztrB/c77gfuO/GYXgfugJ/bnNQEB9D7+1sBB0E7YIeUhwr7RQedB/rFtAfAh1TbsQdNuwkHNrtsh8MHqQejB9UHDQcNW1kHyoes+3j7gofnBx/76V5iBzLYPQfk+30HLTtVBzKHXocch2AHZfuJSE/7gYfb+60Hafuhh8KHFtAauToHzodn+zGHhgdxh5w7soe3+5yH+vvrLJMHPvsm+/e7tgfpu/YHWbvLB2BbRP3Yh64HEQcd+59ZuAcmh/gHffvOh8QHwTvxBxSHIQetu1SHUHv/B1Pb7gfuwfUwM7uuh8yHVQdJB0AHCYdyh+WHGQdU2wGH1YclO3kHPweZh+0HfrsOh4ZlJ/v5h7/7FQe52+CHxgdyB/KH4weNB0oHzQefB6n7Zwe7h5oH7gcsBtOHlNsFhyeHdXtX+yWHS4dlh0mHXAcQB1WHzPvwhzAHdYcahw2Hwrvahzm7k1tYh+gHOIduB1oVBdA6FUaH3fsE2ttbSqtEBzAgh1t6Zo77QPvepCD7I4d2h+OH+oe9OL9YDnDbu7D7xwcpOw8HEIdF+2kHrwerhy7bMXBu23eHU3u7+zuH1Id7h9hWqNurBORH5Pv8+1oA7oechxeHK4fJh9TbaYe4+1uH+PtZh/aHipi6SLElOfuUR4JH2vuQh/IHFYdiRxuHKof6e4+HxLvC5vf6ofu821jbikfSh9+Hdrvehy8HYwdch+FbCtvMR8BHVftqhzX78wd1+4sHjYfohzl7TCAP2xgHrXvVVfCYCdtdhxtbDrKp27i19TvhZOT76khj6ydbw4fkB4C7NIf9MdJ18lavh9yHGlufuyyHC4eWCHgABwAaR0GHkkchh/RbMUfzVev6PhYJR3vb4K4a+0h784cDe0MHVIDpR1KAL/u1h4iHZ3vIhwsHqIcT244HrAAAAEpOQB5HcEd+wTJwS9UVux/bkcjoWzLWFoeWAHEbMXDERuFHQ4fA+wJ7BEc+u3lH20kycGQGCjNXu1LUC4t7u1+71EfigK4AKABpALUAqUfj/k9AlUdwgNVHmUfphyQ7bEcPhxZb80dh8L1Hk5sjR+LWeEBrR2VHZ4cD9jtHe0cVR25THsU4OiZAsAgnR0BHfIcIh/ZHSIcoh84A1jitRyAAbUcQWC4HhXtPe+YL1bb9Ry87g0c+O8NH9TtjR+A4LDvj67hHZFuNe+n710eE0ptDy0eY+6tHrQbrRylHb0dHgB9HClhfR4dHi4dVRxlH/0c1h+dH+Qfeu7N7eMdwxzoihAdEx49HJMfPRwv720e7RxTHyPsHRzbQR0ewAH9H0vuMx6qHJHvqh45HmofigGDHTYesAAAAwjBHeofSu6XA6nVCxgSHKFsN4Q74qICvO1oUQXsbfpVk5x4GB9c9todhBzJHRc6ERue+zoe5EElHc4cvR6yHg3u1B8X7vocKh7hSoYA9YOJH/IcXR6OHvntER9K7xw3pzua7dR6lR1a7X4ftO7RHPoe6O6uHDxiRgL0GtUcpe/VHdgeZuwrHrkfigGHbEFuwR22HpibqZr5Hxof+R7mdqrtBR0bHc76VmAD7EUfTRzjHlAd4x8xmNPojR/vbg4MX+/n7iQeUx79H9McSx5uH3wdSR7lHnEd5x8BWCmZxu+Co4cd5+ylH7ccGcOLHScdSx3AHMseNR05HzUfSO+DHmIeqx8W76wfbDce+ZAjaxyaHAUcVe494wUflx+dIOEcWx6zH/ccJbqsNembDxw7HLcfjx08HwdBTxy0HTMfbh5dHmtt4x8HH3b7Oh03Ho8dvAK3HHocux+MAD8csR3ZH0scOR/PHcsctR4rHEMfZx2rHRXvhcEb7yEcDR5EoQ0dvjajHsxvjRwOHlQdYx/hHUUdzR2fHHoAcx0I98Cd2x9/ckVtuh2THAsf7R+UFNMdpR53H08fBhwUHuMd4J9YbokD15qHHtASkJwD7VEe2e/zH70dCx1QnIse0x8dHtCePxzPHswcNRyDH8seN+25Hd3s5xzDHcxZsLT5HCMeEh8XHKD4jRyFHE/5hR93+Vcd4RzNHOCenx5oHZC1qRr3un8clRw77vMfMB87HoseAJ7ZHO/vMx1pHV0dMJ4YnnhvD+lfHBDvJR+VHd8erkNYnAMcgRynH9Ydpx1In4oBtR3R7a8deRwWws8BKJzrHSCfIxygnqvtoJ+jHnCfD+9XHo/u1x44nBCc6sBEnNwfsJzFwPMeYJ3zH5MeUJ9THAic0JzVHIif0JyzHjCcGJzAookB8lmwnxMdkJ/OHBSeUx8LHnNQlJ6dHNgd+J2BHASfgxwAAqjInMCec2y/bzLyRJyaHw9g+O5koI0fTzsMEUiAYx9on2McpJ33HBieqUVMenMfSeyhA3scA+/u7Fic8J4LHj5DCx4D6HcelJ0AntifPx/7HkjvXR/coZwCJSvdHykgbJxf7WyebR69HFCfNJ/wnByeTx8InxycZhy/HY9sXJ5ce1yehx/nQdydmx4fuG0fcJ00nfCdFJ28n98cfJzYnXydnJ4HHrjtXB1tu28w3B4Cn3vv3J6CniQfgp3snryc/R+8nRyewp0R7vwevx44nMOydbqxKNydop4h7JTgPJ2CnzycQp4PoE7qHJ+0nBzvEpz8njifLJ8inl0Yzh+sn6KfAp7SnWKf0pzinkKd4p9CnBKc+J3L73yfnJ6SnbUaljpSnvKfUp0CCAqdpO9innZC4p1YnMKcSp6oH0UeOJ0in3I7yp+6kiqdvAMqnYluqp0PrTKf4pyyn94fwp78nwyhypwCnCqfuJ07HOyeFJ4ynZmbMpwzH0wdsp9KnBieih10eqyfhW1SnTqf5J0Knaqcipxqn4qeSx/YnJKcGJ6tG/qcGpwnHwafbJ2ann0dup1CnXieap1Gn3qcIp4Mn/VYrJwmnQKekx40noafmp+6nlqeep5pH2acXJ3mnXKcFp3ynRafOpymnVMdpp6KnGaeRp16n7EcxpzQ7cac3R9ynMQeOp5snmKcqpyWnqafRcBanYqdWp74nQMfiJ01HoMeBJ6wAvkDEAFeAXUe5xxbQkLtx6Ctbhcclx1/bgMMjR8qhPoDmK3J7J8dCh1bHa6feK3hWNwdnAM7BF/tcJ23Hnielh+wHIkf/h8B7Sfs+x8mK5SfRpwHH10c80M9mtJahx1enckZMB48nWlu/uyYHy4d/h13bkvuvp5OnkqfwpxcHbgfrp7vK/6d8W4Bng4dVB0e7d0FHRyMH5kfux1eHuHvQZxWnrPufpwf7OadJgJC7oGZyRjO7AGcNJ07HGGf/xz+Hj6cQZ1e7BGddx5pHoEeyxw2H6ceQR84AHUchJ55Hz9scQH1HCCeIx9EnKrsox3EnM/QQ88CnmMfHp6knSyeFOEtHfaeM+/Ung6fkJ7wnwqdup60nHqesZ1lHPcc5Rw4n8me3RxKrNyfZJ4lgSafAZy6nLydFJ1pn5ac6Z2dHoifwB/4n9ftLx5AnAACCq8f8Z7AnKq7Me1unHkDoW1h15rt3mGS1ZidWu7Jn2kcTh+w9msehxyyo9af3B9wnE8fRxzhnsceiRxX7ZSfZRwwn0kekZzrwkWdiQHywrQYzuzFnRqeB1Qv7dGdYZ2ZHUIfYe8+n5fssZ9PHxGdUB/qHOWfOUNFnfFtFZ+t7tnulZ4In2GcVZ/f7kGc8W6lnnydEp52nX6dMJx5efJMuMM1nMXCtZ5f7FicdZ2Bnv4fpBylnNWciJ3Vn8GeyR6G9Jg4CCAVnLWdghyVnoGfCR0xnmPtLZwNnbPtwZ2GHFtA5Z03FE2f9u47Hu2eoe3NnjGcLZ1VnsHs3u8dnK2dnZyjwZ0Mg1sMGW2eTZztnM2d7ZypHl4eWR31nR2eEpydnhEdsx6Qoag7fZ9XbhWd/Z8Bns2f7Z49nvWf4ZxUFb6cwB9mnq2c+cVDnZLaMxj9n12dSh+hnAOeJZ91nnAco5y+naOcwZ9qnlsdZZ1ky2zgbZ9EHeDtw5zdn/2d3Z0jn9EeLZ5TnhGf2Z29n2YfebCnilu29BvjnsWcRx6znmGedZ+VnqkcMR7O7yfuvZ5jn72cEoKG9pXRXZyLnp4e3Z+Ln92d1B7hnwOeo5xVo6OewZxDnTCfoqHqEPNAq51NnLIeI54DnT6fk59VnXOd2Z377Uqf1Z9K74QLvXrtGwufm50TnbOdW5wdnift257Vn8ud859IIJudPAmbn8OftZ8Tnrsd0RxZHakf9Z2DnvOenp/znJueAw6HnLOcI5xHnD6da58lnT2cy5/rn1OeFB7Tniee7lhoQKeeE57Rn6ecMZ5nnq/uc53rnVOdwp4bnmgfG54+WZEew59tnqefh517nJOdS59XnL2dx5wHnCedB57eW58bu52Hn7duW553nQOcx56DnWqd15zTnkOcp4kKtJefApxbn5eemR4mHyOfMZ37ny2d95wXnA+ehbpRWw+dt56PnK+cwkGvnHOfZ57Hn0+eDZ47nWOd05/RIU6SL59S7Yuf0Z6vn4Gfr54dnm+dy50NnJGffp41nP9iM5+FbzOel5+rnz+cn56/nZ+c2589nsue951/nTuf+uy7nMaP/5zxbgBdL557nGufs59Hn0ucX51mnMBc35x9nSueRrQ/ncWdH5x3nkecxx1Xn5+dT59gX1+cK56Nng+foxgfnQBdP52Vnp+cYF93nUBeX5+Dns+cjZ41nhmaEF6LnaeckFxnnbsdZ5xAXOee151fnp2eB57QXPoDF5zcHyBeP5wIXaBfe52/nvuc159znDueSF/3n0hdiQMnnchet54wXihcgF11nXecUFx/n0BfUF1IXjWcreUVHSBf6FygXZeeCFxXnwhfkF6IXWBfTB+xnYCecZ/OnEMfuR9DHj3vth1T+BceVu6JnloCxJ86HaMdSZ5NHfHvJJ6EH+ifEu5Tox1CEx8pn3MfmZ3Sn6mdhp5pnracAJ5mn3ccChxlniyfxF7JYBCd1JykXqmfFp+kXpac2ZxOn6hcne50nHGfdJ5AnbUcth7In/hfhh7kwRCfhTlunSMdiZ2EXDIdWABEXE0doZ1gnuieO59+n6SdqMB0XK0elFzenSkfOAJZnDKdjp8Un2md0J+lnFSdyZ8S71SeEJ3ynUxccJzMXame7JxkXixdVF22n4hcOZ3PHEicQJxnH7UfSACunciesUNgHDnDbxxtb3RehF/njDDsDFxgn/QfRFzonNccFF2J74xcxXiUXuxfAp7enw6cVF6OniJDHF9kX7acqhx+nVadG55sXzrnN58kXwJdAZ2kXBxeVF1kXd5DeJ1GnHhcXFy5nVxc+F7oAtxetF3HbVOiPF35HJcehuDEnbxe2+/EnkRdDF2FnBmc0OwCX/tBZJypnexflFxiXEJeQgFCX2Jc5F7CXqxd1ZxcniJfklyZnHJcgl7MXW0dNpy0nWJd0xzCXRGd4l7Onkifgx5DHuoehJ2XbQPBqDhuYlJcvF+Jn4Rf0l4MX8PtTRz8XCyfMlxOHr2jDBPxMAad9ZxKXOEchp+CXzadHF3KXQicKl/ZncJcwF9+nlpeA+0kXkvt2l+sEv8empyOnTpeQly6XYscCl4qXdReeFw0XhJcdR/0nGpf+uwO+k0AjJ88XIRf6l30XtIAfFxH7JpfzJ7EXlScAhwO+ouvil9MXwKeBlwp7Mpf8J3yX8penFx6XoxdG550elu2+l7aXJZf2l8mnwZeylxGnpxczB45nXSfOZ1xn4U45u5DHLfuth3cX+5KyWKpIKZdUlyJIrxdKZ3hbWZcA+zJnkUd1l76nslibF0CXOSepF4Knjpcdl4In4ZdulxJHemf5F+aXrXsjESy1a2DFl6iX5icWZxWX1mdhlziX7hdRl/iX/Zeh2zZAXQAEACSX68c68H271WH3Rk8X26dmhxkQs5f9F1aHDLVHp0uXmhc751YLqEBgTjcn1GeJJ7fHnocv5/Nn4Bcb52oX9ue+x3Yn2+del1RmlODullRnKGc0Z8AXzBdgF6wXphdoV/7nOBc0F327kwawVwRX8FeoF0YXkucT55gXlBcdpxYXWhfUV3CeyGcxcKhneSdMFxLnLBfa55PnZhccF/HnkFfUV8+G3FccIIRX/Fea584X0IeqFz3noldKlwvHc6eql/GXnmf7h33oC4t/l3qXvRfvF4aXnxexh8MXvxfHl5qX4xfkTuuXZmf0V42n7ZeVl3eXEZful0KX8JdPh6KXllfsly2XQxcOl9yXIZe8lw5X+5e1F9Onqcd9l94XbUeOOyOXpJcZW7UnwmeKu3pXtJeG2/OXnJcmV2aXXaf/F5pyKEDRV8QnpmdPR3xX15d2V7eXnZc1F++nzleelwiXFe4ZV5knWVf+l7lX6Jeup86XhVfoV4DHICfAx8qXlxfcZ0En+EAfl/57cCd8p7pXaZf6V3SXkmdGl18XyVd5l+sXaVfnl4owkxdcx5eXNVdblz5XO5dtJ0VXrEeYV6VXDeeil6wnHlezVyNX3ld1V6GXDVe1ZypX4CcEl+1X7Ud5EF1XQcfgrhMTk5dxV0BXmZeGV7MnOZfYJ8uXAIfHDY2Xd1fAe9VXSqdDp0GX25f2VwdXaWeHl2sXfxfGe+/HRZdWVzlX31f7F3tXflcA169nR1deF+DHSscaV91H1sd5rlvHupezqUL8PjvShGongIYmx0dbwQcxF7NH+ed4xxrHc65kCDO7G/sj53/HxFfIV6RXNufxx0CnKxdA12JXb8cuUwm7VNfXx/YXkcdbe+Pn1udxu17HfKeHV4+XrVcnVwOXOXvDly0Xn5eKgoceJXtbp7vHxIf7x2XHokAVxzfH3xe5lyTX+ZdpV0SuCIJBe1/HIWdjxx4niFeulzWXJVcvVzrXg8eNx6Yn2ZfG1yAXe5ddlwjXMZenVz4XF1e4h/eRlVedF8EX1Jc9F/FXc5cPVzZXTJepV/qHFlee1zsXG5c2V7tXVmeZF3DXYOe1lzanI2duV2HXM1cR10lXUdcLF/tXu5f3l2xnoteqVyqXjRcEQG7XgydwxxOXMVdRJz7XM5d7pwHXF/uLl8TXeifa1617cMdrl1tXqdf8pz9X5Zf5VzHXWdeOVweXeRfA12ZXrjvsx+lXENe5J1DXXJcw1w8AVZem18tXwCezx6AnT5ehV1LXAycBF2KXN1f9V37XwFdDV0ZXRYejV1rX41ch1+lXSJcXl63XaJfzVxPX30ex1xwX8dc6p65X5VdH1yPXMld5V39XBVfd1wFXTVdz1y1XeddtVxLX4oA9Jx5nqNdklw9eZdejJ3cDKrsTJ/U7UyfotjMnC5dzJ89XCdfyZ8z4vlg2lw1bQadlF7ZXz9ctp5fXksfX17gnK5c6DD+ldadTZyanHdcYN4sX6afQl12XLlfRO94r94iEN5uXYJcLV+qnr9eUN2tXNDt6pwQ3DqeGp/Q3v1eMN+GnzDcz13nnDdfP22SnNb4kh8QnqDcYp9DX0ddkN/5XLDcW1617nKefpXQ3aDfp1xpnMjdYN2xX8Dc0OyI3/B3IN8DbEjdt11I3Gdf6aMsXW+esNy+7th1iQDdwyjeSN+PX0jfqmKY3n+fyN0f7ujc2N4Y3djfGN+pYjjfmF1o3nbt+p643nDeJpyo3bZekNw43tmcUV843rjs9p0g3bjcNp6o3hxdhN9UXjVcY5+Y3rXs1pwE3qKcDp7Y36De8N5g3/DfJNwbnuDc0O+k3HDeZN1w3wTdP17k36jf5NxE3vjete9E3tDeBN4WnV5e1V/Y3JjfhN8tnTtchV8vHzRfL11+XKd4SPX+Xitclx8rXzofqJ2rXpZdPVyMXdTealznecuD1OwbXttfOpwlnJxcCN567q1eRN24HOd4Mta4nzceTN3bXGjc510FXTmfOR8+XN9sdR//Xq6ckRCZIwcVr1xXX6ZcGV1vXj1ca13A3N9evV9dmv9ZNl7h7X1fGp+3Xcxc3l13XS1cFNycnvccD1097b1eHrcfX1lfZN/E3mJeHN5GXxze9l6c3oVfql5pXn/seB60GfVf3NwNXCVfV15KXUzemV8HXz9sWVxjLGZefV55Xc1cMN+fX1CfeN1fX5tczN4ind9cYtw/XkdchN1U3mddAtyLXiLf1F903Bde9NwmXT3sNl0vTXteIJ9i3G9f3V083lccEtylX7KcN5w2XkLcst+rXOTfUt0sXHTfHZzg3cReW16jLXzfkt9tXP8dGN2o3HLe0t7iXudfHV2c3GIeBAEXXy75dvtCgk5fDN6onB8eq10fHAZfSt2NXINfqx72+zG27N9/HAvsIV/bX2de6Z33Xwpf1l72+ahUmJyPHhtf6twc3NTedN6a3iNeNF6sHArdwW8y3wDepl2K3H1ejR3i3YFd115s3y76TVym3VVcUtztXbLcqt1PXDtdrN0/HoLdEt5cHTLfuV4W3erc717C3PJeT17I3FbdnF/PXYtfmtzxnaEBWt8eQhmWl1137orfTlw83g1cK28NXFoCwN9M3bzdie6eXiRcZtw9HDbdupn830ped1/VXMbfqt/S307fGe7O3xRct19C37jfKt203LbfwtzznXTfIt+DHAACKlzejl0bQCMTMk2vXQESvOyiUpIfRpGmAFiA0Z0HXw2dPhwIsbf6TtGS35fuPR9vXAkd+t3TXD2coVzCHokBCyLnn6zenJ/XnxLvz6/e3WSeAd4/X7edKF/zXPufFR5B3s6FyNxBX36cwrL+3W7uY+8h3rLeGF6B3lecKV5h3vKeXRly3zVczp1/X4tf2O5a3fhcy17awXGxrm4O3Imdf24BXI0f1vhpNNofgV3B3nbuHm5ubQufV23BXBhfxZ/enThdR50JXLFciV9g3m7dcF1UnEUZI2DYXDVvidzzXslfoF7J3bBfQdxIXgnete0CIcyhHJvhXPFc01yh7aHekF0lnLheoV0pXVBe4dxynO5ubKHDhUlfXp5p3pHcCVyRXOndkV3Z3mjcGd8/bRnfOdwl7xCcadwoXqHeMV4JXIhe2d+wX9nf+d647wnePKLKE/7ccIHRXEnfEF5Z3Qhcyd1F37+fkV2Y37Fc75yzxIlJy8K53vFdq51p3yhfgd4pXMXd+d0p3NDsJd0EB+Wdid6l37nfhd2R38leVZ64XrFeVp5RXgeeFd/lSbudNd2Z3h+dYO2PnVnek536HFOe5d043DnfyZ4u0J0Fqd8DboXdEFyN3x+fGF8xXuneO13G33SfXANMAvgB1AL4AMFs2AAQANgBAgiAAUAA2ACgAKqj3gKZABAAXgKgBrABSgO4AKAB4AJZAnADOAOVbVkAkgNnploCyAKq7ZACbKJgAfwCYAC5AmDo3O893MFuoABOACECSOyrHlIAFrCAAyNeUgNG4mECSO5DHSPcxOBDHd3sbAJhAEMfTW9R8EMeGA3gUEMfhV8zMEMcFS8tcEMcth59sEMfDl8gkUCdw92c4RJeUgLJ4PhdYh+18Phd3e+00Phck97j4Phfk9xj3kMcth97kPhfDl9yCPhcQWwP8mPec91sCzTio974XPAAjuD4XhgMq+Cj3mPfEl/S1OPcXN5SAvQSy95j301tLQJr3nUcuW1xAqveYh5SAPNTh23d7zLjh29NbGPdXO9r3OPcR23D3jvcFSw3Upve094z3Wcdw9xm44dtMd7ywjvedVy5bk5K695iHd3tClL7301uLOKb3Qvcm97r3f9dI99b3fSdw90RQqvfQR+b3dzi5u1Nb5ve0QLr3t3vm97H3xFIgAO5nzPdOMKr3i6dEAMunLlvGMKr3r5epAMz31fe691e32vcy94X3ebv3gDMAWIct9whAt9tYh2Tct9uc9zj3tHuUgBn3oFuGAxHMt9sk94P3rveK96BbLYfF9Lfbw5dURLfbEFsF9933oFt+9/IEOfdUgFeABAD2AI4ANrDXANMEq1szR6AAxJea265naQCpACgAoFvCAHpAUgDwAGNbnQA2AO4APQAAACrN2z0Af4A79093RAD/gNcA5DuSO5Nb8ABh2wAAkgAACvAAaABVAFHbaQA2ABd3f/dqAPfbmtu+QAAAomHbUoDPgFRbNgCv9ygA9gC+QJAAMjviDuf3l/coATf3d/cP90/3L/fv9+g7n/cV97pAf4AID6wAHWHED1f3ZA9XgPf3j/fHd1QPH/df9/QPv/cyO5HbyA9oDxgPWA84D3gPBA/XAPyFQg/oD2oAmA9WQGIP+A8HANcAzfqa22NbY1uYh9KQUoAgD1IASsfYAGoPGg8ewDI7UAgsD6QPt/fsDxQPXA9v9zwPdA8/94wPIAAzOtIPIg/yD7gPig8yO5a3mtttR7+bbgAcACgPRABPdxAAtFsWD8/3iLucD8EPvg/+D5d7//cAD0X3JA/X92YPHA+UD1YPNA+8D7YPbg9ID2PbF/esD/EPQQ/cD8kPNg8MD24PRA8ZD7EPbA8JD5YP1A+mRykPBQ//98wPY9uoDzIPQruiDy4PEg9qAIXXjg+yD00P4g9KD60PUg/FD1kP5A+hD7kPlQ/5D/wP//cqD30Ppg8DD4kPFQ8wkFUPow+tD8YPY9tAD6APEA9QD6rHsA/wD24PDg9j2xIAAAByk2QAABITW1KAYdsP9wAA8mHbNbviDtcA51ea27oAbUdSgG1H8ADwwDQA8AAgRDZAbVuIAZ4ANw/RDxIAAADSjw/PD7vwbw8L9B8PNgBfDzI7aSAWW4EAaQAI20rHEA9tR2qAt0HADzwQeAB4APAAYA/MbGiPkI9FD+cnrmev985AJw/nD5cPZjiQj7UPeI8Ej+K7pw9jWxcPVw+Qj4IPOw8Aj2oATw8vDyCP0gBgjxCPNw+9D5I7ew+HD8cPagDUj7SPpI83D+MPPI9Mj+1HQI9qQGyPETafD7pAkI+LD5I7r/e+QNIYUoA0j6q78gDwAOwQaACUwGiPGI9VyNiPNw/bDzD3DA/PDxIAUA/XO2APxAAHD2AAKQCBD2aP+gAYj8I8uo8AAGq0W0d37gCAodcAS0AWW/cPgI+sj+8Pso/fD2oAvcAWW65nrgAQAGkAxAAoAPAAuw/1ANGPpkB3wBgAagBhjxGPUY8xj3GP2AAAABQpAAAAVhkANgCQANgAT3dpAIUAHABuABAAAACUhA/pDzyPugCV9xKP/o+gj4GPhA+4jyAA/w9+j8CPAY/gj3KPXo/kj22P4o8Qx5KPrw9dj5yPwY8Mj2KPHY9SjyOPPY/Bj9yPbY91j5OPw49Nj92PQY+sAGww0I8DjyyPnY/Lj6OPa48Kj/2Pi4/SjxyPM49rj0aPCPcmj1UAUA/hVyAAlo9EANaPto+uAPAA9o+vD5iPPiguj26PSAF3QdcAGwAbj4eP04+rjyAAt6C/j8yPQ49Hj82P3481jwePIE+Nj+yP4E9qAISPmtv0gJuPoE//jzI7hgDQj7oAsI9SgPCP8ACIj6kAyI9XO78Auo+vj0EABo/wT+OPiNv4j4SPAo/Ej3SP349zj+2P0E/bj7BPK49oT6KPUE8Nj8xPMo+sT9+P+4+MT5xPU487jyePgE9nj0qPKo9qAGqP2gCaj9QA2o/IQMRP+o94AAIPZ/c7D7sPRmxEjzSPJI/1QAIPvw9BAMhPME/cT7uPIAAim4hPek9cT8ePAE/0AMBPAk9LjyxPhk9BQFdHVE9Uj7RPwo9qAHnJJk9/j0JPFk8MT6ZPgk+2T8JP3kAWW2APuw+jOFIArmdSgK/3Zw+VgPf3IA9EACUAxABOANcAkjCa22APKADtAJd7agC3j/ePAQ+Pj1IAV4+Oj2+P6I+uj4UAn4/XW1+br4Cggr735vee91b3jve29473hPeO9+FXivdh2673wfet9xNbvfcZ95Nbkfdb9933effPZr1PgA/5ux33lIBd95I76/fm9z73d9vM94P301sj92P3GPcOO0j3U/fm9zP3c/e898375vcquMv3lIAm94YVFU+w9y5biveI99uOg0+u10ZQhvdI90ZSuPdw97z3bUeE94r3YVdI99tPbUfk94z3TRfM9z73bUe09xn3bUcS9+9Pfvcs95DHbPePTzcXWduJuNz3SPd3Tz2345AC980A2vdfT+jAzPe/T1DHh+4vT1CPWdtjTz4X+vegz8r3sYq69x1H6vdevYb3WIc694X3vGfM99dPHUeGA3kQZ09h2x73jvcS9z73mIdEzwekvvdYh1gEpvdgz4fudvfy91H3Ifcx92dP8fdZnTj3SfcuWyn3uvfF91nbpfe69+X39Y9n+DX3b5f192dPTfeWsGdP6/eszyn3sAFdkH+ANgDwAPt3wgBPgF+bBACoAOiPpkBJWygB/4DigAmP1AC/AJDgQAAA=="))
///////////////////////////////////////////////
///////////////////////////////////////////////
/* Utility functions */
var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
pcbdata.metadata.revision + '__#';
var storage;
function initStorage(key) {
try {
window.localStorage.getItem("blank");
storage = window.localStorage;
} catch (e) {
// localStorage not available
}
if (!storage) {
try {
window.sessionStorage.getItem("blank");
storage = window.sessionStorage;
} catch (e) {
// sessionStorage also not available
}
}
}
function readStorage(key) {
if (storage) {
return storage.getItem(storagePrefix + key);
} else {
return null;
}
}
function writeStorage(key, value) {
if (storage) {
storage.setItem(storagePrefix + key, value);
}
}
function fancyDblClickHandler(el, onsingle, ondouble) {
return function () {
if (el.getAttribute("data-dblclick") == null) {
el.setAttribute("data-dblclick", 1);
setTimeout(function () {
if (el.getAttribute("data-dblclick") == 1) {
onsingle();
}
el.removeAttribute("data-dblclick");
}, 200);
} else {
el.removeAttribute("data-dblclick");
ondouble();
}
}
}
function smoothScrollToRow(rowid) {
document.getElementById(rowid).scrollIntoView({
behavior: "smooth",
block: "center",
inline: "nearest"
});
}
function focusInputField(input) {
input.scrollIntoView(false);
input.focus();
input.select();
}
function saveBomTable(output) {
var text = '';
for (var node of bomhead.childNodes[0].childNodes) {
if (node.firstChild) {
text += (output == 'csv' ? `"${node.firstChild.nodeValue}"` : node.firstChild.nodeValue);
}
if (node != bomhead.childNodes[0].lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
for (var row of bombody.childNodes) {
for (var cell of row.childNodes) {
let val = '';
for (var node of cell.childNodes) {
if (node.nodeName == "INPUT") {
if (node.checked) {
val += '✓';
}
} else if ((node.nodeName == "MARK") || (node.nodeName == "A")) {
val += node.firstChild.nodeValue;
} else {
val += node.nodeValue;
}
}
if (output == 'csv') {
val = val.replace(/\"/g, '\"\"'); // pair of double-quote characters
if (isNumeric(val)) {
val = +val; // use number
} else {
val = `"${val}"`; // enclosed within double-quote
}
}
text += val;
if (cell != row.lastChild) {
text += (output == 'csv' ? ',' : '\t');
}
}
text += '\n';
}
if (output != 'clipboard') {
// To file: csv or txt
var blob = new Blob([text], {
type: `text/${output}`
});
saveFile(`${pcbdata.metadata.title}.${output}`, blob);
} else {
// To clipboard
var textArea = document.createElement("textarea");
textArea.classList.add('clipboard-temp');
textArea.value = text;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
try {
if (document.execCommand('copy')) {
console.log('Bom copied to clipboard.');
}
} catch (err) {
console.log('Can not copy to clipboard.');
}
document.body.removeChild(textArea);
}
}
function isNumeric(str) {
/* https://stackoverflow.com/a/175787 */
return (typeof str != "string" ? false : !isNaN(str) && !isNaN(parseFloat(str)));
}
function removeGutterNode(node) {
for (var i = 0; i < node.childNodes.length; i++) {
if (node.childNodes[i].classList &&
node.childNodes[i].classList.contains("gutter")) {
node.removeChild(node.childNodes[i]);
break;
}
}
}
function cleanGutters() {
removeGutterNode(document.getElementById("bot"));
removeGutterNode(document.getElementById("canvasdiv"));
}
var units = {
prefixes: {
giga: ["G", "g", "giga", "Giga", "GIGA"],
mega: ["M", "mega", "Mega", "MEGA"],
kilo: ["K", "k", "kilo", "Kilo", "KILO"],
milli: ["m", "milli", "Milli", "MILLI"],
micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
nano: ["N", "n", "nano", "Nano", "NANO"],
pico: ["P", "p", "pico", "Pico", "PICO"],
},
unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
unitsLong: [
"OHM", "Ohm", "ohm", "ohms",
"FARAD", "Farad", "farad",
"HENRY", "Henry", "henry"
],
getMultiplier: function (s) {
if (this.prefixes.giga.includes(s)) return 1e9;
if (this.prefixes.mega.includes(s)) return 1e6;
if (this.prefixes.kilo.includes(s)) return 1e3;
if (this.prefixes.milli.includes(s)) return 1e-3;
if (this.prefixes.micro.includes(s)) return 1e-6;
if (this.prefixes.nano.includes(s)) return 1e-9;
if (this.prefixes.pico.includes(s)) return 1e-12;
return 1;
},
valueRegex: null,
}
function initUtils() {
var allPrefixes = units.prefixes.giga
.concat(units.prefixes.mega)
.concat(units.prefixes.kilo)
.concat(units.prefixes.milli)
.concat(units.prefixes.micro)
.concat(units.prefixes.nano)
.concat(units.prefixes.pico);
var allUnits = units.unitsShort.concat(units.unitsLong);
units.valueRegex = new RegExp("^([0-9\.]+)" +
"\\s*(" + allPrefixes.join("|") + ")?" +
"(" + allUnits.join("|") + ")?" +
"(\\b.*)?$", "");
units.valueAltRegex = new RegExp("^([0-9]*)" +
"(" + units.unitsShort.join("|") + ")?" +
"([GgMmKkUuNnPp])?" +
"([0-9]*)" +
"(\\b.*)?$", "");
if (config.fields.includes("Value")) {
var index = config.fields.indexOf("Value");
pcbdata.bom["parsedValues"] = {};
for (var id in pcbdata.bom.fields) {
pcbdata.bom.parsedValues[id] = parseValue(pcbdata.bom.fields[id][index])
}
}
}
function parseValue(val, ref) {
var inferUnit = (unit, ref) => {
if (unit) {
unit = unit.toLowerCase();
if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
unit = 'r';
}
unit = unit[0];
} else {
ref = /^([a-z]+)\d+$/i.exec(ref);
if (ref) {
ref = ref[1].toLowerCase();
if (ref == "c") unit = 'f';
else if (ref == "l") unit = 'h';
else if (ref == "r" || ref == "rv") unit = 'r';
else unit = null;
}
}
return unit;
};
val = val.replace(/,/g, "");
var match = units.valueRegex.exec(val);
var unit;
if (match) {
val = parseFloat(match[1]);
if (match[2]) {
val = val * units.getMultiplier(match[2]);
}
unit = inferUnit(match[3], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[4],
}
}
match = units.valueAltRegex.exec(val);
if (match && (match[1] || match[4])) {
val = parseFloat(match[1] + "." + match[4]);
if (match[3]) {
val = val * units.getMultiplier(match[3]);
}
unit = inferUnit(match[2], ref);
if (!unit) return null;
else return {
val: val,
unit: unit,
extra: match[5],
}
}
return null;
}
function valueCompare(a, b, stra, strb) {
if (a === null && b === null) {
// Failed to parse both values, compare them as strings.
if (stra != strb) return stra > strb ? 1 : -1;
else return 0;
} else if (a === null) {
return 1;
} else if (b === null) {
return -1;
} else {
if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
else if (a.val != b.val) return a.val > b.val ? 1 : -1;
else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
else return 0;
}
}
function validateSaveImgDimension(element) {
var valid = false;
var intValue = 0;
if (/^[1-9]\d*$/.test(element.value)) {
intValue = parseInt(element.value);
if (intValue <= 16000) {
valid = true;
}
}
if (valid) {
element.classList.remove("invalid");
} else {
element.classList.add("invalid");
}
return intValue;
}
function saveImage(layer) {
var width = validateSaveImgDimension(document.getElementById("render-save-width"));
var height = validateSaveImgDimension(document.getElementById("render-save-height"));
var bgcolor = null;
if (!document.getElementById("render-save-transparent").checked) {
var style = getComputedStyle(topmostdiv);
bgcolor = style.getPropertyValue("background-color");
}
if (!width || !height) return;
// Prepare image
var canvas = document.createElement("canvas");
var layerdict = {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
bg: canvas,
fab: canvas,
silk: canvas,
highlight: canvas,
layer: layer,
}
// Do the rendering
recalcLayerScale(layerdict, width, height);
prepareLayer(layerdict);
clearCanvas(canvas, bgcolor);
drawBackground(layerdict, false);
drawHighlightsOnLayer(layerdict, false);
// Save image
var imgdata = canvas.toDataURL("image/png");
var filename = pcbdata.metadata.title;
if (pcbdata.metadata.revision) {
filename += `.${pcbdata.metadata.revision}`;
}
filename += `.${layer}.png`;
saveFile(filename, dataURLtoBlob(imgdata));
}
function saveSettings() {
var data = {
type: "InteractiveHtmlBom settings",
version: 1,
pcbmetadata: pcbdata.metadata,
settings: settings,
}
var blob = new Blob([JSON.stringify(data, null, 4)], {
type: "application/json"
});
saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}
function loadSettings() {
var input = document.createElement("input");
input.type = "file";
input.accept = ".settings.json";
input.onchange = function (e) {
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = readerEvent => {
var content = readerEvent.target.result;
var newSettings;
try {
newSettings = JSON.parse(content);
} catch (e) {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
if (newSettings.type != "InteractiveHtmlBom settings") {
alert("Selected file is not InteractiveHtmlBom settings file.");
return;
}
var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
if (metadataMatches) {
for (var k in pcbdata.metadata) {
if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
metadataMatches = false;
}
}
}
if (!metadataMatches) {
var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
if (!confirm(
`Settins file metadata does not match current metadata.\n\n` +
`Page metadata:\n${currentMetadata}\n\n` +
`Settings file metadata:\n${fileMetadata}\n\n` +
`Press OK if you would like to import settings anyway.`)) {
return;
}
}
overwriteSettings(newSettings.settings);
}
reader.readAsText(file, 'UTF-8');
}
input.click();
}
function resetSettings() {
if (!confirm(
`This will reset all checkbox states and other settings.\n\n` +
`Press OK if you want to continue.`)) {
return;
}
if (storage) {
var keys = [];
for (var i = 0; i < storage.length; i++) {
var key = storage.key(i);
if (key.startsWith(storagePrefix)) keys.push(key);
}
for (var key of keys) storage.removeItem(key);
}
location.reload();
}
function overwriteSettings(newSettings) {
initDone = false;
Object.assign(settings, newSettings);
writeStorage("bomlayout", settings.bomlayout);
writeStorage("bommode", settings.bommode);
writeStorage("canvaslayout", settings.canvaslayout);
writeStorage("bomCheckboxes", settings.checkboxes.join(","));
document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
for (var checkbox of settings.checkboxes) {
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
}
writeStorage("markWhenChecked", settings.markWhenChecked);
padsVisible(settings.renderPads);
document.getElementById("padsCheckbox").checked = settings.renderPads;
fabricationVisible(settings.renderFabrication);
document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
silkscreenVisible(settings.renderSilkscreen);
document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
referencesVisible(settings.renderReferences);
document.getElementById("referencesCheckbox").checked = settings.renderReferences;
valuesVisible(settings.renderValues);
document.getElementById("valuesCheckbox").checked = settings.renderValues;
tracksVisible(settings.renderTracks);
document.getElementById("tracksCheckbox").checked = settings.renderTracks;
zonesVisible(settings.renderZones);
document.getElementById("zonesCheckbox").checked = settings.renderZones;
dnpOutline(settings.renderDnpOutline);
document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
setRedrawOnDrag(settings.redrawOnDrag);
document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
setDarkMode(settings.darkMode);
document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
setHighlightPin1(settings.highlightpin1);
document.forms.highlightpin1.highlightpin1.value = settings.highlightpin1;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
setOffsetBackRotation(settings.offsetBackRotation);
document.getElementById("offsetBackRotationCheckbox").checked = settings.offsetBackRotation;
initDone = true;
prepCheckboxes();
changeBomLayout(settings.bomlayout);
}
function saveFile(filename, blob) {
var link = document.createElement("a");
var objurl = URL.createObjectURL(blob);
link.download = filename;
link.href = objurl;
link.click();
}
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {
type: mime
});
}
var settings = {
canvaslayout: "FB",
bomlayout: "left-right",
bommode: "grouped",
checkboxes: [],
checkboxStoredRefs: {},
darkMode: false,
highlightpin1: "none",
redrawOnDrag: true,
boardRotation: 0,
offsetBackRotation: false,
renderPads: true,
renderReferences: true,
renderValues: true,
renderSilkscreen: true,
renderFabrication: true,
renderDnpOutline: false,
renderTracks: true,
renderZones: true,
columnOrder: [],
hiddenColumns: [],
netColors: {},
}
function initDefaults() {
settings.bomlayout = readStorage("bomlayout");
if (settings.bomlayout === null) {
settings.bomlayout = config.bom_view;
}
if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
settings.bomlayout = config.bom_view;
}
settings.bommode = readStorage("bommode");
if (settings.bommode === null) {
settings.bommode = "grouped";
}
if (settings.bommode == "netlist" && !pcbdata.nets) {
settings.bommode = "grouped";
}
if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
settings.bommode = "grouped";
}
settings.canvaslayout = readStorage("canvaslayout");
if (settings.canvaslayout === null) {
settings.canvaslayout = config.layer_view;
}
var bomCheckboxes = readStorage("bomCheckboxes");
if (bomCheckboxes === null) {
bomCheckboxes = config.checkboxes;
}
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
document.getElementById("bomCheckboxes").value = bomCheckboxes;
var highlightpin1 = readStorage("highlightpin1") || config.highlight_pin1;
if (highlightpin1 === "false") highlightpin1 = "none";
if (highlightpin1 === "true") highlightpin1 = "all";
setHighlightPin1(highlightpin1);
document.forms.highlightpin1.highlightpin1.value = highlightpin1;
settings.markWhenChecked = readStorage("markWhenChecked") || "";
populateMarkWhenCheckedOptions();
function initBooleanSetting(storageString, def, elementId, func) {
var b = readStorage(storageString);
if (b === null) {
b = def;
} else {
b = (b == "true");
}
document.getElementById(elementId).checked = b;
func(b);
}
initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
if ("tracks" in pcbdata) {
initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
} else {
document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
tracksVisible(false);
zonesVisible(false);
}
initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
var fields = ["checkboxes", "References"].concat(config.fields).concat(["Quantity"]);
var hcols = JSON.parse(readStorage("hiddenColumns"));
if (hcols === null) {
hcols = [];
}
settings.hiddenColumns = hcols.filter(e => fields.includes(e));
var cord = JSON.parse(readStorage("columnOrder"));
if (cord === null) {
cord = fields;
} else {
cord = cord.filter(e => fields.includes(e));
if (cord.length != fields.length)
cord = fields;
}
settings.columnOrder = cord;
settings.boardRotation = readStorage("boardRotation");
if (settings.boardRotation === null) {
settings.boardRotation = config.board_rotation * 5;
} else {
settings.boardRotation = parseInt(settings.boardRotation);
}
document.getElementById("boardRotation").value = settings.boardRotation / 5;
document.getElementById("rotationDegree").textContent = settings.boardRotation;
initBooleanSetting("offsetBackRotation", config.offset_back_rotation, "offsetBackRotationCheckbox", setOffsetBackRotation);
settings.netColors = JSON.parse(readStorage("netColors")) || {};
}
// Helper classes for user js callbacks.
const IBOM_EVENT_TYPES = {
ALL: "all",
HIGHLIGHT_EVENT: "highlightEvent",
CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}
const EventHandler = {
callbacks: {},
init: function () {
for (eventType of Object.values(IBOM_EVENT_TYPES))
this.callbacks[eventType] = [];
},
registerCallback: function (eventType, callback) {
this.callbacks[eventType].push(callback);
},
emitEvent: function (eventType, eventArgs) {
event = {
eventType: eventType,
args: eventArgs,
}
var callback;
for (callback of this.callbacks[eventType])
callback(event);
for (callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
callback(event);
}
}
EventHandler.init();
///////////////////////////////////////////////
///////////////////////////////////////////////
/* PCB rendering code */
var emptyContext2d = document.createElement("canvas").getContext("2d");
function deg2rad(deg) {
return deg * Math.PI / 180;
}
function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
var point = [
linepoint[0] * text.width + offsetx,
linepoint[1] * text.height + offsety
];
// This approximates pcbnew behavior with how text tilts depending on horizontal justification
point[0] -= (linepoint[1] + 0.5 * (1 + text.justify[0])) * text.height * tilt;
return point;
}
function drawText(ctx, text, color) {
if ("ref" in text && !settings.renderReferences) return;
if ("val" in text && !settings.renderValues) return;
ctx.save();
ctx.fillStyle = color;
ctx.strokeStyle = color;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.lineWidth = text.thickness;
if ("svgpath" in text) {
ctx.stroke(new Path2D(text.svgpath));
ctx.restore();
return;
}
if ("polygons" in text) {
ctx.fill(getPolygonsPath(text));
ctx.restore();
return;
}
ctx.translate(...text.pos);
ctx.translate(text.thickness * 0.5, 0);
var angle = -text.angle;
if (text.attr.includes("mirrored")) {
ctx.scale(-1, 1);
angle = -angle;
}
var tilt = 0;
if (text.attr.includes("italic")) {
tilt = 0.125;
}
var interline = text.height * 1.5 + text.thickness;
var txt = text.text.split("\n");
// KiCad ignores last empty line.
if (txt[txt.length - 1] == '') txt.pop();
ctx.rotate(deg2rad(angle));
var offsety = (1 - text.justify[1]) / 2 * text.height; // One line offset
offsety -= (txt.length - 1) * (text.justify[1] + 1) / 2 * interline; // Multiline offset
for (var i in txt) {
var lineWidth = text.thickness + interline / 2 * tilt;
for (var j = 0; j < txt[i].length; j++) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
lineWidth += fourSpaces - lineWidth % fourSpaces;
} else {
if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
}
lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
}
}
var offsetx = -lineWidth * (text.justify[0] + 1) / 2;
var inOverbar = false;
for (var j = 0; j < txt[i].length; j++) {
if (config.kicad_text_formatting) {
if (txt[i][j] == '\t') {
var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
offsetx += fourSpaces - offsetx % fourSpaces;
continue;
} else if (txt[i][j] == '~') {
j++;
if (j == txt[i].length)
break;
if (txt[i][j] != '~') {
inOverbar = !inOverbar;
}
}
}
var glyph = pcbdata.font_data[txt[i][j]];
if (inOverbar) {
var overbarStart = [offsetx, -text.height * 1.4 + offsety];
var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];
if (!lastHadOverbar) {
overbarStart[0] += text.height * 1.4 * tilt;
lastHadOverbar = true;
}
ctx.beginPath();
ctx.moveTo(...overbarStart);
ctx.lineTo(...overbarEnd);
ctx.stroke();
} else {
lastHadOverbar = false;
}
for (var line of glyph.l) {
ctx.beginPath();
ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
for (var k = 1; k < line.length; k++) {
ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
}
ctx.stroke();
}
offsetx += glyph.w * text.width;
}
offsety += interline;
}
ctx.restore();
}
function drawedge(ctx, scalefactor, edge, color) {
ctx.strokeStyle = color;
ctx.fillStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
if ("svgpath" in edge) {
ctx.stroke(new Path2D(edge.svgpath));
} else {
ctx.beginPath();
if (edge.type == "segment") {
ctx.moveTo(...edge.start);
ctx.lineTo(...edge.end);
}
if (edge.type == "rect") {
ctx.moveTo(...edge.start);
ctx.lineTo(edge.start[0], edge.end[1]);
ctx.lineTo(...edge.end);
ctx.lineTo(edge.end[0], edge.start[1]);
ctx.lineTo(...edge.start);
}
if (edge.type == "arc") {
ctx.arc(
...edge.start,
edge.radius,
deg2rad(edge.startangle),
deg2rad(edge.endangle));
}
if (edge.type == "circle") {
ctx.arc(
...edge.start,
edge.radius,
0, 2 * Math.PI);
ctx.closePath();
}
if (edge.type == "curve") {
ctx.moveTo(...edge.start);
ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
}
if("filled" in edge && edge.filled)
ctx.fill();
else
ctx.stroke();
}
}
function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
// chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
var path = new Path2D();
var width = size[0];
var height = size[1];
var x = width * -0.5;
var y = height * -0.5;
var chamfOffset = Math.min(width, height) * chamfratio;
path.moveTo(x, 0);
if (chamfpos & 4) {
path.lineTo(x, y + height - chamfOffset);
path.lineTo(x + chamfOffset, y + height);
path.lineTo(0, y + height);
} else {
path.arcTo(x, y + height, x + width, y + height, radius);
}
if (chamfpos & 8) {
path.lineTo(x + width - chamfOffset, y + height);
path.lineTo(x + width, y + height - chamfOffset);
path.lineTo(x + width, 0);
} else {
path.arcTo(x + width, y + height, x + width, y, radius);
}
if (chamfpos & 2) {
path.lineTo(x + width, y + chamfOffset);
path.lineTo(x + width - chamfOffset, y);
path.lineTo(0, y);
} else {
path.arcTo(x + width, y, x, y, radius);
}
if (chamfpos & 1) {
path.lineTo(x + chamfOffset, y);
path.lineTo(x, y + chamfOffset);
path.lineTo(x, 0);
} else {
path.arcTo(x, y, x, y + height, radius);
}
path.closePath();
return path;
}
function getOblongPath(size) {
return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}
function getPolygonsPath(shape) {
if (shape.path2d) {
return shape.path2d;
}
if ("svgpath" in shape) {
shape.path2d = new Path2D(shape.svgpath);
} else {
var path = new Path2D();
for (var polygon of shape.polygons) {
path.moveTo(...polygon[0]);
for (var i = 1; i < polygon.length; i++) {
path.lineTo(...polygon[i]);
}
path.closePath();
}
shape.path2d = path;
}
return shape.path2d;
}
function drawPolygonShape(ctx, scalefactor, shape, color) {
ctx.save();
if (!("svgpath" in shape)) {
ctx.translate(...shape.pos);
ctx.rotate(deg2rad(-shape.angle));
}
if("filled" in shape && !shape.filled) {
ctx.strokeStyle = color;
ctx.lineWidth = Math.max(1 / scalefactor, shape.width);
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.stroke(getPolygonsPath(shape));
} else {
ctx.fillStyle = color;
ctx.fill(getPolygonsPath(shape));
}
ctx.restore();
}
function drawDrawing(ctx, scalefactor, drawing, color) {
if (["segment", "arc", "circle", "curve", "rect"].includes(drawing.type)) {
drawedge(ctx, scalefactor, drawing, color);
} else if (drawing.type == "polygon") {
drawPolygonShape(ctx, scalefactor, drawing, color);
} else {
drawText(ctx, drawing, color);
}
}
function getCirclePath(radius) {
var path = new Path2D();
path.arc(0, 0, radius, 0, 2 * Math.PI);
path.closePath();
return path;
}
function getCachedPadPath(pad) {
if (!pad.path2d) {
// if path2d is not set, build one and cache it on pad object
if (pad.shape == "rect") {
pad.path2d = new Path2D();
pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
} else if (pad.shape == "oval") {
pad.path2d = getOblongPath(pad.size);
} else if (pad.shape == "circle") {
pad.path2d = getCirclePath(pad.size[0] / 2);
} else if (pad.shape == "roundrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
} else if (pad.shape == "chamfrect") {
pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
} else if (pad.shape == "custom") {
pad.path2d = getPolygonsPath(pad);
}
}
return pad.path2d;
}
function drawPad(ctx, pad, color, outline) {
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(-deg2rad(pad.angle));
if (pad.offset) {
ctx.translate(...pad.offset);
}
ctx.fillStyle = color;
ctx.strokeStyle = color;
var path = getCachedPadPath(pad);
if (outline) {
ctx.stroke(path);
} else {
ctx.fill(path);
}
ctx.restore();
}
function drawPadHole(ctx, pad, padHoleColor) {
if (pad.type != "th") return;
ctx.save();
ctx.translate(...pad.pos);
ctx.rotate(-deg2rad(pad.angle));
ctx.fillStyle = padHoleColor;
if (pad.drillshape == "oblong") {
ctx.fill(getOblongPath(pad.drillsize));
} else {
ctx.fill(getCirclePath(pad.drillsize[0] / 2));
}
ctx.restore();
}
function drawFootprint(ctx, layer, scalefactor, footprint, colors, highlight, outline) {
if (highlight) {
// draw bounding box
if (footprint.layer == layer) {
ctx.save();
ctx.globalAlpha = 0.2;
ctx.translate(...footprint.bbox.pos);
ctx.rotate(deg2rad(-footprint.bbox.angle));
ctx.translate(...footprint.bbox.relpos);
ctx.fillStyle = colors.pad;
ctx.fillRect(0, 0, ...footprint.bbox.size);
ctx.globalAlpha = 1;
ctx.strokeStyle = colors.pad;
ctx.lineWidth = 3 / scalefactor;
ctx.strokeRect(0, 0, ...footprint.bbox.size);
ctx.restore();
}
}
// draw drawings
for (var drawing of footprint.drawings) {
if (drawing.layer == layer) {
drawDrawing(ctx, scalefactor, drawing.drawing, colors.pad);
}
}
ctx.lineWidth = 3 / scalefactor;
// draw pads
if (settings.renderPads) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, colors.pad, outline);
if (pad.pin1 &&
(settings.highlightpin1 == "all" ||
settings.highlightpin1 == "selected" && highlight)) {
drawPad(ctx, pad, colors.outline, true);
}
}
}
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, colors.padHole);
}
}
}
function drawEdgeCuts(canvas, scalefactor) {
var ctx = canvas.getContext("2d");
var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
for (var edge of pcbdata.edges) {
drawDrawing(ctx, scalefactor, edge, edgecolor);
}
}
function drawFootprints(canvas, layer, scalefactor, highlight) {
var ctx = canvas.getContext("2d");
ctx.lineWidth = 3 / scalefactor;
var style = getComputedStyle(topmostdiv);
var colors = {
pad: style.getPropertyValue('--pad-color'),
padHole: style.getPropertyValue('--pad-hole-color'),
outline: style.getPropertyValue('--pin1-outline-color'),
}
for (var i = 0; i < pcbdata.footprints.length; i++) {
var mod = pcbdata.footprints[i];
var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
var h = highlightedFootprints.includes(i);
var d = markedFootprints.has(i);
if (highlight) {
if(h && d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-both');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-both');
} else if (h) {
colors.pad = style.getPropertyValue('--pad-color-highlight');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight');
} else if (d) {
colors.pad = style.getPropertyValue('--pad-color-highlight-marked');
colors.outline = style.getPropertyValue('--pin1-outline-color-highlight-marked');
}
}
if( h || d || !highlight) {
drawFootprint(ctx, layer, scalefactor, mod, colors, highlight, outline);
}
}
}
function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
var ctx = canvas.getContext("2d");
for (var d of pcbdata.drawings[layername][layer]) {
if (["segment", "arc", "circle", "curve", "rect"].includes(d.type)) {
drawedge(ctx, scalefactor, d, edgeColor);
} else if (d.type == "polygon") {
drawPolygonShape(ctx, scalefactor, d, polygonColor);
} else {
drawText(ctx, d, textColor);
}
}
}
function drawTracks(canvas, layer, defaultColor, highlight) {
ctx = canvas.getContext("2d");
ctx.lineCap = "round";
var hasHole = (track) => (
'drillsize' in track &&
track.start[0] == track.end[0] &&
track.start[1] == track.end[1]);
// First draw tracks and tented vias
for (var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
if (!hasHole(track)) {
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
ctx.lineWidth = track.width;
ctx.beginPath();
if ('radius' in track) {
ctx.arc(
...track.center,
track.radius,
deg2rad(track.startangle),
deg2rad(track.endangle));
} else {
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
}
ctx.stroke();
}
}
// Second pass to draw untented vias
var style = getComputedStyle(topmostdiv);
var holeColor = style.getPropertyValue('--pad-hole-color')
for (var track of pcbdata.tracks[layer]) {
if (highlight && highlightedNet != track.net) continue;
if (hasHole(track)) {
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[track.net] || defaultColor;
ctx.lineWidth = track.width;
ctx.beginPath();
ctx.moveTo(...track.start);
ctx.lineTo(...track.end);
ctx.stroke();
ctx.strokeStyle = holeColor;
ctx.lineWidth = track.drillsize;
ctx.lineTo(...track.end);
ctx.stroke();
}
}
}
function drawZones(canvas, layer, defaultColor, highlight) {
ctx = canvas.getContext("2d");
ctx.lineJoin = "round";
for (var zone of pcbdata.zones[layer]) {
if (highlight && highlightedNet != zone.net) continue;
ctx.strokeStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
ctx.fillStyle = highlight ? defaultColor : settings.netColors[zone.net] || defaultColor;
if (!zone.path2d) {
zone.path2d = getPolygonsPath(zone);
}
ctx.fill(zone.path2d, zone.fillrule || "nonzero");
if (zone.width > 0) {
ctx.lineWidth = zone.width;
ctx.stroke(zone.path2d);
}
}
}
function clearCanvas(canvas, color = null) {
var ctx = canvas.getContext("2d");
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
if (color) {
ctx.fillStyle = color;
ctx.fillRect(0, 0, canvas.width, canvas.height);
} else {
if (!window.matchMedia("print").matches)
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
ctx.restore();
}
function drawNets(canvas, layer, highlight) {
var style = getComputedStyle(topmostdiv);
if (settings.renderZones) {
var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
drawZones(canvas, layer, zoneColor, highlight);
}
if (settings.renderTracks) {
var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
drawTracks(canvas, layer, trackColor, highlight);
}
if (highlight && settings.renderPads) {
var padColor = style.getPropertyValue('--pad-color-highlight');
var padHoleColor = style.getPropertyValue('--pad-hole-color');
var ctx = canvas.getContext("2d");
for (var footprint of pcbdata.footprints) {
// draw pads
var padDrawn = false;
for (var pad of footprint.pads) {
if (highlightedNet != pad.net) continue;
if (pad.layers.includes(layer)) {
drawPad(ctx, pad, padColor, false);
padDrawn = true;
}
}
if (padDrawn) {
// redraw all pad holes because some pads may overlap
for (var pad of footprint.pads) {
drawPadHole(ctx, pad, padHoleColor);
}
}
}
}
}
function drawHighlightsOnLayer(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.highlight);
}
if (markedFootprints.size > 0 || highlightedFootprints.length > 0) {
drawFootprints(canvasdict.highlight, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, true);
}
if (highlightedNet !== null) {
drawNets(canvasdict.highlight, canvasdict.layer, true);
}
}
function drawHighlights() {
drawHighlightsOnLayer(allcanvas.front);
drawHighlightsOnLayer(allcanvas.back);
}
function drawBackground(canvasdict, clear = true) {
if (clear) {
clearCanvas(canvasdict.bg);
clearCanvas(canvasdict.fab);
clearCanvas(canvasdict.silk);
}
drawNets(canvasdict.bg, canvasdict.layer, false);
drawFootprints(canvasdict.bg, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom, false);
drawEdgeCuts(canvasdict.bg, canvasdict.transform.s * canvasdict.transform.zoom);
var style = getComputedStyle(topmostdiv);
var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
var textColor = style.getPropertyValue('--silkscreen-text-color');
if (settings.renderSilkscreen) {
drawBgLayer(
"silkscreen", canvasdict.silk, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
edgeColor = style.getPropertyValue('--fabrication-edge-color');
polygonColor = style.getPropertyValue('--fabrication-polygon-color');
textColor = style.getPropertyValue('--fabrication-text-color');
if (settings.renderFabrication) {
drawBgLayer(
"fabrication", canvasdict.fab, canvasdict.layer,
canvasdict.transform.s * canvasdict.transform.zoom,
edgeColor, polygonColor, textColor);
}
}
function prepareCanvas(canvas, flip, transform) {
var ctx = canvas.getContext("2d");
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.scale(transform.zoom, transform.zoom);
ctx.translate(transform.panx, transform.pany);
if (flip) {
ctx.scale(-1, 1);
}
ctx.translate(transform.x, transform.y);
ctx.rotate(deg2rad(settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
ctx.scale(transform.s, transform.s);
}
function prepareLayer(canvasdict) {
var flip = (canvasdict.layer === "B");
for (var c of ["bg", "fab", "silk", "highlight"]) {
prepareCanvas(canvasdict[c], flip, canvasdict.transform);
}
}
function rotateVector(v, angle) {
angle = deg2rad(angle);
return [
v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
];
}
function applyRotation(bbox, flip) {
var corners = [
[bbox.minx, bbox.miny],
[bbox.minx, bbox.maxy],
[bbox.maxx, bbox.miny],
[bbox.maxx, bbox.maxy],
];
corners = corners.map((v) => rotateVector(v, settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0)));
return {
minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
}
}
function recalcLayerScale(layerdict, width, height) {
var flip = (layerdict.layer === "B");
var bbox = applyRotation(pcbdata.edges_bbox, flip);
var scalefactor = 0.98 * Math.min(
width / (bbox.maxx - bbox.minx),
height / (bbox.maxy - bbox.miny)
);
if (scalefactor < 0.1) {
scalefactor = 1;
}
layerdict.transform.s = scalefactor;
if (flip) {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
} else {
layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
}
layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
for (var c of ["bg", "fab", "silk", "highlight"]) {
canvas = layerdict[c];
canvas.width = width;
canvas.height = height;
canvas.style.width = (width / devicePixelRatio) + "px";
canvas.style.height = (height / devicePixelRatio) + "px";
}
}
function redrawCanvas(layerdict) {
prepareLayer(layerdict);
drawBackground(layerdict);
drawHighlightsOnLayer(layerdict);
}
function resizeCanvas(layerdict) {
var canvasdivid = {
"F": "frontcanvas",
"B": "backcanvas"
} [layerdict.layer];
var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
recalcLayerScale(layerdict, width, height);
redrawCanvas(layerdict);
}
function resizeAll() {
resizeCanvas(allcanvas.front);
resizeCanvas(allcanvas.back);
}
function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
var A = x - x1;
var B = y - y1;
var C = x2 - x1;
var D = y2 - y1;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var dx, dy;
if (len_sq == 0) {
// start and end of the segment coincide
dx = x - x1;
dy = y - y1;
} else {
var param = dot / len_sq;
var xx, yy;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
}
return dx * dx + dy * dy <= d * d;
}
function modulo(n, mod) {
return ((n % mod) + mod) % mod;
}
function pointWithinDistanceToArc(x, y, xc, yc, radius, startangle, endangle, d) {
var dx = x - xc;
var dy = y - yc;
var r_sq = dx * dx + dy * dy;
var rmin = Math.max(0, radius - d);
var rmax = radius + d;
if (r_sq < rmin * rmin || r_sq > rmax * rmax)
return false;
var angle1 = modulo(deg2rad(startangle), 2 * Math.PI);
var dx1 = xc + radius * Math.cos(angle1) - x;
var dy1 = yc + radius * Math.sin(angle1) - y;
if (dx1 * dx1 + dy1 * dy1 <= d * d)
return true;
var angle2 = modulo(deg2rad(endangle), 2 * Math.PI);
var dx2 = xc + radius * Math.cos(angle2) - x;
var dy2 = yc + radius * Math.sin(angle2) - y;
if (dx2 * dx2 + dy2 * dy2 <= d * d)
return true;
var angle = modulo(Math.atan2(dy, dx), 2 * Math.PI);
if (angle1 > angle2)
return (angle >= angle2 || angle <= angle1);
else
return (angle >= angle1 && angle <= angle2);
}
function pointWithinPad(x, y, pad) {
var v = [x - pad.pos[0], y - pad.pos[1]];
v = rotateVector(v, pad.angle);
if (pad.offset) {
v[0] -= pad.offset[0];
v[1] -= pad.offset[1];
}
return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}
function netHitScan(layer, x, y) {
// Check track segments
if (settings.renderTracks && pcbdata.tracks) {
for (var track of pcbdata.tracks[layer]) {
if ('radius' in track) {
if (pointWithinDistanceToArc(x, y, ...track.center, track.radius, track.startangle, track.endangle, track.width / 2)) {
return track.net;
}
} else {
if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
return track.net;
}
}
}
}
// Check pads
if (settings.renderPads) {
for (var footprint of pcbdata.footprints) {
for (var pad of footprint.pads) {
if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
return pad.net;
}
}
}
}
return null;
}
function pointWithinFootprintBbox(x, y, bbox) {
var v = [x - bbox.pos[0], y - bbox.pos[1]];
v = rotateVector(v, bbox.angle);
return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}
function bboxHitScan(layer, x, y) {
var result = [];
for (var i = 0; i < pcbdata.footprints.length; i++) {
var footprint = pcbdata.footprints[i];
if (footprint.layer == layer) {
if (pointWithinFootprintBbox(x, y, footprint.bbox)) {
result.push(i);
}
}
}
return result;
}
function handlePointerDown(e, layerdict) {
if (e.button != 0 && e.button != 1) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
layerdict.pointerStates[e.pointerId] = {
distanceTravelled: 0,
lastX: e.offsetX,
lastY: e.offsetY,
downTime: Date.now(),
};
}
function handleMouseClick(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var x = e.offsetX;
var y = e.offsetY;
var t = layerdict.transform;
var flip = layerdict.layer === "B";
if (flip) {
x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
} else {
x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
}
y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
var v = rotateVector([x, y], -settings.boardRotation + (flip && settings.offsetBackRotation ? - 180 : 0));
if ("nets" in pcbdata) {
var net = netHitScan(layerdict.layer, ...v);
if (net !== highlightedNet) {
netClicked(net);
}
}
if (highlightedNet === null) {
var footprints = bboxHitScan(layerdict.layer, ...v);
if (footprints.length > 0) {
footprintsClicked(footprints);
}
}
}
function handlePointerLeave(e, layerdict) {
e.preventDefault();
e.stopPropagation();
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
delete layerdict.pointerStates[e.pointerId];
}
function resetTransform(layerdict) {
layerdict.transform.panx = 0;
layerdict.transform.pany = 0;
layerdict.transform.zoom = 1;
redrawCanvas(layerdict);
}
function handlePointerUp(e, layerdict) {
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
e.preventDefault();
e.stopPropagation();
if (e.button == 2) {
// Reset pan and zoom on right click.
resetTransform(layerdict);
layerdict.anotherPointerTapped = false;
return;
}
// We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
var ptr = layerdict.pointerStates[e.pointerId];
ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);
if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
if (Object.keys(layerdict.pointerStates).length == 1) {
if (layerdict.anotherPointerTapped) {
// This is the second pointer coming off of a two-finger tap
resetTransform(layerdict);
} else {
// This is just a regular tap
handleMouseClick(e, layerdict);
}
layerdict.anotherPointerTapped = false;
} else {
// This is the first finger coming off of what could become a two-finger tap
layerdict.anotherPointerTapped = true;
}
} else {
if (!settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
layerdict.anotherPointerTapped = false;
}
delete layerdict.pointerStates[e.pointerId];
}
function handlePointerMove(e, layerdict) {
if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
return;
}
e.preventDefault();
e.stopPropagation();
if (!e.hasOwnProperty("offsetX")) {
// The polyfill doesn't set this properly
e.offsetX = e.pageX - e.currentTarget.offsetLeft;
e.offsetY = e.pageY - e.currentTarget.offsetTop;
}
var thisPtr = layerdict.pointerStates[e.pointerId];
var dx = e.offsetX - thisPtr.lastX;
var dy = e.offsetY - thisPtr.lastY;
// If this number is low on pointer up, we count the action as a click
thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);
if (Object.keys(layerdict.pointerStates).length == 1) {
// This is a simple drag
layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
} else if (Object.keys(layerdict.pointerStates).length == 2) {
var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];
var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2) + Math.pow(e.offsetY - otherPtr.lastY, 2));
var scaleFactor = newDist / oldDist;
if (scaleFactor != NaN) {
layerdict.transform.zoom *= scaleFactor;
var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
}
}
thisPtr.lastX = e.offsetX;
thisPtr.lastY = e.offsetY;
if (settings.redrawOnDrag) {
redrawCanvas(layerdict);
}
}
function handleMouseWheel(e, layerdict) {
e.preventDefault();
e.stopPropagation();
var t = layerdict.transform;
var wheeldelta = e.deltaY;
if (e.deltaMode == 1) {
// FF only, scroll by lines
wheeldelta *= 30;
} else if (e.deltaMode == 2) {
wheeldelta *= 300;
}
var m = Math.pow(1.1, -wheeldelta / 40);
// Limit amount of zoom per tick.
if (m > 2) {
m = 2;
} else if (m < 0.5) {
m = 0.5;
}
t.zoom *= m;
var zoomd = (1 - m) / t.zoom;
t.panx += devicePixelRatio * e.offsetX * zoomd;
t.pany += devicePixelRatio * e.offsetY * zoomd;
redrawCanvas(layerdict);
}
function addMouseHandlers(div, layerdict) {
div.addEventListener("pointerdown", function(e) {
handlePointerDown(e, layerdict);
});
div.addEventListener("pointermove", function(e) {
handlePointerMove(e, layerdict);
});
div.addEventListener("pointerup", function(e) {
handlePointerUp(e, layerdict);
});
var pointerleave = function(e) {
handlePointerLeave(e, layerdict);
}
div.addEventListener("pointercancel", pointerleave);
div.addEventListener("pointerleave", pointerleave);
div.addEventListener("pointerout", pointerleave);
div.onwheel = function(e) {
handleMouseWheel(e, layerdict);
}
for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
element.addEventListener("contextmenu", function(e) {
e.preventDefault();
}, false);
}
}
function setRedrawOnDrag(value) {
settings.redrawOnDrag = value;
writeStorage("redrawOnDrag", value);
}
function setBoardRotation(value) {
settings.boardRotation = value * 5;
writeStorage("boardRotation", settings.boardRotation);
document.getElementById("rotationDegree").textContent = settings.boardRotation;
resizeAll();
}
function setOffsetBackRotation(value) {
settings.offsetBackRotation = value;
writeStorage("offsetBackRotation", value);
resizeAll();
}
function initRender() {
allcanvas = {
front: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("F_bg"),
fab: document.getElementById("F_fab"),
silk: document.getElementById("F_slk"),
highlight: document.getElementById("F_hl"),
layer: "F",
},
back: {
transform: {
x: 0,
y: 0,
s: 1,
panx: 0,
pany: 0,
zoom: 1,
},
pointerStates: {},
anotherPointerTapped: false,
bg: document.getElementById("B_bg"),
fab: document.getElementById("B_fab"),
silk: document.getElementById("B_slk"),
highlight: document.getElementById("B_hl"),
layer: "B",
}
};
addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/*
* Table reordering via Drag'n'Drop
* Inspired by: https://htmldom.dev/drag-and-drop-table-column
*/
function setBomHandlers() {
const bom = document.getElementById('bomtable');
let dragName;
let placeHolderElements;
let draggingElement;
let forcePopulation;
let xOffset;
let yOffset;
let wasDragged;
const mouseUpHandler = function(e) {
// Delete dragging element
draggingElement.remove();
// Make BOM selectable again
bom.style.removeProperty("userSelect");
// Remove listeners
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
if (wasDragged) {
// Redraw whole BOM
populateBomTable();
}
}
const mouseMoveHandler = function(e) {
// Notice the dragging
wasDragged = true;
// Make the dragged element visible
draggingElement.style.removeProperty("display");
// Set elements position to mouse position
draggingElement.style.left = `${e.screenX - xOffset}px`;
draggingElement.style.top = `${e.screenY - yOffset}px`;
// Forced redrawing of BOM table
if (forcePopulation) {
forcePopulation = false;
// Copy array
phe = Array.from(placeHolderElements);
// populate BOM table again
populateBomHeader(dragName, phe);
populateBomBody(dragName, phe);
}
// Set up array of hidden columns
var hiddenColumns = Array.from(settings.hiddenColumns);
// In the ungrouped mode, quantity don't exist
if (settings.bommode === "ungrouped")
hiddenColumns.push("Quantity");
// If no checkbox fields can be found, we consider them hidden
if (settings.checkboxes.length == 0)
hiddenColumns.push("checkboxes");
// Get table headers and group them into checkboxes, extrafields and normal headers
const bh = document.getElementById("bomhead");
headers = Array.from(bh.querySelectorAll("th"))
headers.shift() // numCol is not part of the columnOrder
headerGroups = []
lastCompoundClass = null;
for (i = 0; i < settings.columnOrder.length; i++) {
cElem = settings.columnOrder[i];
if (hiddenColumns.includes(cElem)) {
// Hidden columns appear as a dummy element
headerGroups.push([]);
continue;
}
elem = headers.filter(e => getColumnOrderName(e) === cElem)[0];
if (elem.classList.contains("bom-checkbox")) {
if (lastCompoundClass === "bom-checkbox") {
cbGroup = headerGroups.pop();
cbGroup.push(elem);
headerGroups.push(cbGroup);
} else {
lastCompoundClass = "bom-checkbox";
headerGroups.push([elem])
}
} else {
headerGroups.push([elem])
}
}
// Copy settings.columnOrder
var columns = Array.from(settings.columnOrder)
// Set up array with indices of hidden columns
var hiddenIndices = hiddenColumns.map(e => settings.columnOrder.indexOf(e));
var dragIndex = columns.indexOf(dragName);
var swapIndex = dragIndex;
var swapDone = false;
// Check if the current dragged element is swapable with the left or right element
if (dragIndex > 0) {
// Get left headers boundingbox
swapIndex = dragIndex - 1;
while (hiddenIndices.includes(swapIndex) && swapIndex > 0)
swapIndex--;
if (!hiddenIndices.includes(swapIndex)) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX < box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
if ((!swapDone) && dragIndex < headerGroups.length - 1) {
// Get right headers boundingbox
swapIndex = dragIndex + 1;
while (hiddenIndices.includes(swapIndex))
swapIndex++;
if (swapIndex < headerGroups.length) {
box = getBoundingClientRectFromMultiple(headerGroups[swapIndex]);
if (e.clientX > box.left + window.scrollX + (box.width / 2)) {
swapElement = columns[dragIndex];
columns.splice(dragIndex, 1);
columns.splice(swapIndex, 0, swapElement);
forcePopulation = true;
swapDone = true;
}
}
}
// Write back change to storage
if (swapDone) {
settings.columnOrder = columns
writeStorage("columnOrder", JSON.stringify(columns));
}
}
const mouseDownHandler = function(e) {
var target = e.target;
if (target.tagName.toLowerCase() != "td")
target = target.parentElement;
// Used to check if a dragging has ever happened
wasDragged = false;
// Create new element which will be displayed as the dragged column
draggingElement = document.createElement("div")
draggingElement.classList.add("dragging");
draggingElement.style.display = "none";
draggingElement.style.position = "absolute";
draggingElement.style.overflow = "hidden";
// Get bomhead and bombody elements
const bh = document.getElementById("bomhead");
const bb = document.getElementById("bombody");
// Get all compound headers for the current column
var compoundHeaders;
if (target.classList.contains("bom-checkbox")) {
compoundHeaders = Array.from(bh.querySelectorAll("th.bom-checkbox"));
} else {
compoundHeaders = [target];
}
// Create new table which will display the column
var newTable = document.createElement("table");
newTable.classList.add("bom");
newTable.style.background = "white";
draggingElement.append(newTable);
// Create new header element
var newHeader = document.createElement("thead");
newTable.append(newHeader);
// Set up array for storing all placeholder elements
placeHolderElements = [];
// Add all compound headers to the new thead element and placeholders
compoundHeaders.forEach(function(h) {
clone = cloneElementWithDimensions(h);
newHeader.append(clone);
placeHolderElements.push(clone);
});
// Create new body element
var newBody = document.createElement("tbody");
newTable.append(newBody);
// Get indices for compound headers
var idxs = compoundHeaders.map(e => getBomTableHeaderIndex(e));
// For each row in the BOM body...
var rows = bb.querySelectorAll("tr");
rows.forEach(function(row) {
// ..get the cells for the compound column
const tds = row.querySelectorAll("td");
var copytds = idxs.map(i => tds[i]);
// Add them to the new element and the placeholders
var newRow = document.createElement("tr");
copytds.forEach(function(td) {
clone = cloneElementWithDimensions(td);
newRow.append(clone);
placeHolderElements.push(clone);
});
newBody.append(newRow);
});
// Compute width for compound header
var width = compoundHeaders.reduce((acc, x) => acc + x.clientWidth, 0);
draggingElement.style.width = `${width}px`;
// Insert the new dragging element and disable selection on BOM
bom.insertBefore(draggingElement, null);
bom.style.userSelect = "none";
// Determine the mouse position offset
xOffset = e.screenX - compoundHeaders.reduce((acc, x) => Math.min(acc, x.offsetLeft), compoundHeaders[0].offsetLeft);
yOffset = e.screenY - compoundHeaders[0].offsetTop;
// Get name for the column in settings.columnOrder
dragName = getColumnOrderName(target);
// Change text and class for placeholder elements
placeHolderElements = placeHolderElements.map(function(e) {
newElem = cloneElementWithDimensions(e);
newElem.textContent = "";
newElem.classList.add("placeholder");
return newElem;
});
// On next mouse move, the whole BOM needs to be redrawn to show the placeholders
forcePopulation = true;
// Add listeners for move and up on mouse
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
}
// In netlist mode, there is nothing to reorder
if (settings.bommode === "netlist")
return;
// Add mouseDownHandler to every column except the numCol
bom.querySelectorAll("th")
.forEach(function(head) {
if (!head.classList.contains("numCol")) {
head.onmousedown = mouseDownHandler;
}
});
}
function getBoundingClientRectFromMultiple(elements) {
var elems = Array.from(elements);
if (elems.length == 0)
return null;
var box = elems.shift()
.getBoundingClientRect();
elems.forEach(function(elem) {
var elembox = elem.getBoundingClientRect();
box.left = Math.min(elembox.left, box.left);
box.top = Math.min(elembox.top, box.top);
box.width += elembox.width;
box.height = Math.max(elembox.height, box.height);
});
return box;
}
function cloneElementWithDimensions(elem) {
var newElem = elem.cloneNode(true);
newElem.style.height = window.getComputedStyle(elem).height;
newElem.style.width = window.getComputedStyle(elem).width;
return newElem;
}
function getBomTableHeaderIndex(elem) {
const bh = document.getElementById('bomhead');
const ths = Array.from(bh.querySelectorAll("th"));
return ths.indexOf(elem);
}
function getColumnOrderName(elem) {
var cname = elem.getAttribute("col_name");
if (cname === "bom-checkbox")
return "checkboxes";
else
return cname;
}
function resizableGrid(tablehead) {
var cols = tablehead.firstElementChild.children;
var rowWidth = tablehead.offsetWidth;
for (var i = 1; i < cols.length; i++) {
if (cols[i].classList.contains("bom-checkbox"))
continue;
cols[i].style.width = ((cols[i].clientWidth - paddingDiff(cols[i])) * 100 / rowWidth) + '%';
}
for (var i = 1; i < cols.length - 1; i++) {
var div = document.createElement('div');
div.className = "column-width-handle";
cols[i].appendChild(div);
setListeners(div);
}
function setListeners(div) {
var startX, curCol, nxtCol, curColWidth, nxtColWidth, rowWidth;
div.addEventListener('mousedown', function(e) {
e.preventDefault();
e.stopPropagation();
curCol = e.target.parentElement;
nxtCol = curCol.nextElementSibling;
startX = e.pageX;
var padding = paddingDiff(curCol);
rowWidth = curCol.parentElement.offsetWidth;
curColWidth = curCol.clientWidth - padding;
nxtColWidth = nxtCol.clientWidth - padding;
});
document.addEventListener('mousemove', function(e) {
if (startX) {
var diffX = e.pageX - startX;
diffX = -Math.min(-diffX, curColWidth - 20);
diffX = Math.min(diffX, nxtColWidth - 20);
curCol.style.width = ((curColWidth + diffX) * 100 / rowWidth) + '%';
nxtCol.style.width = ((nxtColWidth - diffX) * 100 / rowWidth) + '%';
console.log(`${curColWidth + nxtColWidth} ${(curColWidth + diffX) * 100 / rowWidth + (nxtColWidth - diffX) * 100 / rowWidth}`);
}
});
document.addEventListener('mouseup', function(e) {
curCol = undefined;
nxtCol = undefined;
startX = undefined;
nxtColWidth = undefined;
curColWidth = undefined
});
}
function paddingDiff(col) {
if (getStyleVal(col, 'box-sizing') == 'border-box') {
return 0;
}
var padLeft = getStyleVal(col, 'padding-left');
var padRight = getStyleVal(col, 'padding-right');
return (parseInt(padLeft) + parseInt(padRight));
}
function getStyleVal(elm, css) {
return (window.getComputedStyle(elm, null).getPropertyValue(css))
}
}
///////////////////////////////////////////////
///////////////////////////////////////////////
/* DOM manipulation and misc code */
var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var footprintIndexToHandler = {};
var netsToHandler = {};
var markedFootprints = new Set();
var highlightedFootprints = [];
var highlightedNet = null;
var lastClicked;
function dbg(html) {
dbgdiv.innerHTML = html;
}
function redrawIfInitDone() {
if (initDone) {
redrawCanvas(allcanvas.front);
redrawCanvas(allcanvas.back);
}
}
function padsVisible(value) {
writeStorage("padsVisible", value);
settings.renderPads = value;
redrawIfInitDone();
}
function referencesVisible(value) {
writeStorage("referencesVisible", value);
settings.renderReferences = value;
redrawIfInitDone();
}
function valuesVisible(value) {
writeStorage("valuesVisible", value);
settings.renderValues = value;
redrawIfInitDone();
}
function tracksVisible(value) {
writeStorage("tracksVisible", value);
settings.renderTracks = value;
redrawIfInitDone();
}
function zonesVisible(value) {
writeStorage("zonesVisible", value);
settings.renderZones = value;
redrawIfInitDone();
}
function dnpOutline(value) {
writeStorage("dnpOutline", value);
settings.renderDnpOutline = value;
redrawIfInitDone();
}
function setDarkMode(value) {
if (value) {
topmostdiv.classList.add("dark");
} else {
topmostdiv.classList.remove("dark");
}
writeStorage("darkmode", value);
settings.darkMode = value;
redrawIfInitDone();
if (initDone) {
populateBomTable();
}
}
function setShowBOMColumn(field, value) {
if (field === "references") {
var rl = document.getElementById("reflookup");
rl.disabled = !value;
if (!value) {
rl.value = "";
updateRefLookup("");
}
}
var n = settings.hiddenColumns.indexOf(field);
if (value) {
if (n != -1) {
settings.hiddenColumns.splice(n, 1);
}
} else {
if (n == -1) {
settings.hiddenColumns.push(field);
}
}
writeStorage("hiddenColumns", JSON.stringify(settings.hiddenColumns));
if (initDone) {
populateBomTable();
}
redrawIfInitDone();
}
function setFullscreen(value) {
if (value) {
document.documentElement.requestFullscreen();
} else {
document.exitFullscreen();
}
}
function fabricationVisible(value) {
writeStorage("fabricationVisible", value);
settings.renderFabrication = value;
redrawIfInitDone();
}
function silkscreenVisible(value) {
writeStorage("silkscreenVisible", value);
settings.renderSilkscreen = value;
redrawIfInitDone();
}
function setHighlightPin1(value) {
writeStorage("highlightpin1", value);
settings.highlightpin1 = value;
redrawIfInitDone();
}
function getStoredCheckboxRefs(checkbox) {
function convert(ref) {
var intref = parseInt(ref);
if (isNaN(intref)) {
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.footprints[i].ref == ref) {
return i;
}
}
return -1;
} else {
return intref;
}
}
if (!(checkbox in settings.checkboxStoredRefs)) {
var val = readStorage("checkbox_" + checkbox);
settings.checkboxStoredRefs[checkbox] = val ? val : "";
}
if (!settings.checkboxStoredRefs[checkbox]) {
return new Set();
} else {
return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
}
}
function getCheckboxState(checkbox, references) {
var storedRefsSet = getStoredCheckboxRefs(checkbox);
var currentRefsSet = new Set(references.map(r => r[1]));
// Get difference of current - stored
var difference = new Set(currentRefsSet);
for (ref of storedRefsSet) {
difference.delete(ref);
}
if (difference.size == 0) {
// All the current refs are stored
return "checked";
} else if (difference.size == currentRefsSet.size) {
// None of the current refs are stored
return "unchecked";
} else {
// Some of the refs are stored
return "indeterminate";
}
}
function setBomCheckboxState(checkbox, element, references) {
var state = getCheckboxState(checkbox, references);
element.checked = (state == "checked");
element.indeterminate = (state == "indeterminate");
}
function createCheckboxChangeHandler(checkbox, references, row) {
return function () {
refsSet = getStoredCheckboxRefs(checkbox);
var markWhenChecked = settings.markWhenChecked == checkbox;
eventArgs = {
checkbox: checkbox,
refs: references,
}
if (this.checked) {
// checkbox ticked
for (var ref of references) {
refsSet.add(ref[1]);
}
if (markWhenChecked) {
row.classList.add("checked");
for (var ref of references) {
markedFootprints.add(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'checked';
} else {
// checkbox unticked
for (var ref of references) {
refsSet.delete(ref[1]);
}
if (markWhenChecked) {
row.classList.remove("checked");
for (var ref of references) {
markedFootprints.delete(ref[1]);
}
drawHighlights();
}
eventArgs.state = 'unchecked';
}
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
updateCheckboxStats(checkbox);
EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
}
}
function clearHighlightedFootprints() {
if (currentHighlightedRowId) {
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
currentHighlightedRowId = null;
highlightedFootprints = [];
highlightedNet = null;
}
}
function createRowHighlightHandler(rowid, refs, net) {
return function () {
if (currentHighlightedRowId) {
if (currentHighlightedRowId == rowid) {
return;
}
document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
}
document.getElementById(rowid).classList.add("highlighted");
currentHighlightedRowId = rowid;
highlightedFootprints = refs ? refs.map(r => r[1]) : [];
highlightedNet = net;
drawHighlights();
EventHandler.emitEvent(
IBOM_EVENT_TYPES.HIGHLIGHT_EVENT, {
rowid: rowid,
refs: refs,
net: net
});
}
}
function updateNetColors() {
writeStorage("netColors", JSON.stringify(settings.netColors));
redrawIfInitDone();
}
function netColorChangeHandler(net) {
return (event) => {
settings.netColors[net] = event.target.value;
updateNetColors();
}
}
function netColorRightClick(net) {
return (event) => {
if (event.button == 2) {
event.preventDefault();
event.stopPropagation();
var style = getComputedStyle(topmostdiv);
var defaultNetColor = style.getPropertyValue('--track-color').trim();
event.target.value = defaultNetColor;
delete settings.netColors[net];
updateNetColors();
}
}
}
function entryMatches(entry) {
if (settings.bommode == "netlist") {
// entry is just a net name
return entry.toLowerCase().indexOf(filter) >= 0;
}
// check refs
if (!settings.hiddenColumns.includes("references")) {
for (var ref of entry) {
if (ref[0].toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
// check fields
for (var i in config.fields) {
var f = config.fields[i];
if (!settings.hiddenColumns.includes(f)) {
for (var ref of entry) {
if (String(pcbdata.bom.fields[ref[1]][i]).toLowerCase().indexOf(filter) >= 0) {
return true;
}
}
}
}
return false;
}
function findRefInEntry(entry) {
return entry.filter(r => r[0].toLowerCase() == reflookup);
}
function highlightFilter(s) {
if (!filter) {
return s;
}
var parts = s.toLowerCase().split(filter);
if (parts.length == 1) {
return s;
}
var r = "";
var pos = 0;
for (var i in parts) {
if (i > 0) {
r += '<mark class="highlight">' +
s.substring(pos, pos + filter.length) +
'</mark>';
pos += filter.length;
}
r += s.substring(pos, pos + parts[i].length);
pos += parts[i].length;
}
return r;
}
function checkboxSetUnsetAllHandler(checkboxname) {
return function () {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (checkboxnum >= settings.checkboxes.length) {
return;
}
var allset = true;
var checkbox;
var row;
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
if (!checkbox.checked || checkbox.indeterminate) {
allset = false;
break;
}
}
for (row of bombody.childNodes) {
checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = !allset;
checkbox.indeterminate = false;
checkbox.onchange();
}
}
}
function createColumnHeader(name, cls, comparator, is_checkbox = false) {
var th = document.createElement("TH");
th.innerHTML = name;
th.classList.add(cls);
if (is_checkbox)
th.setAttribute("col_name", "bom-checkbox");
else
th.setAttribute("col_name", name);
var span = document.createElement("SPAN");
span.classList.add("sortmark");
span.classList.add("none");
th.appendChild(span);
var spacer = document.createElement("div");
spacer.className = "column-spacer";
th.appendChild(spacer);
spacer.onclick = function () {
if (currentSortColumn && th !== currentSortColumn) {
// Currently sorted by another column
currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
if (currentSortColumn && th === currentSortColumn) {
// Already sorted by this column
if (currentSortOrder == "asc") {
// Sort by this column, descending order
bomSortFunction = function (a, b) {
return -comparator(a, b);
}
currentSortColumn.childNodes[1].classList.remove("asc");
currentSortColumn.childNodes[1].classList.add("desc");
currentSortOrder = "desc";
} else {
// Unsort
bomSortFunction = null;
currentSortColumn.childNodes[1].classList.remove("desc");
currentSortColumn.childNodes[1].classList.add("none");
currentSortColumn = null;
currentSortOrder = null;
}
} else {
// Sort by this column, ascending order
bomSortFunction = comparator;
currentSortColumn = th;
currentSortColumn.childNodes[1].classList.remove("none");
currentSortColumn.childNodes[1].classList.add("asc");
currentSortOrder = "asc";
}
populateBomBody();
}
if (is_checkbox) {
spacer.onclick = fancyDblClickHandler(
spacer, spacer.onclick, checkboxSetUnsetAllHandler(name));
}
return th;
}
function populateBomHeader(placeHolderColumn = null, placeHolderElements = null) {
while (bomhead.firstChild) {
bomhead.removeChild(bomhead.firstChild);
}
var tr = document.createElement("TR");
var th = document.createElement("TH");
th.classList.add("numCol");
var vismenu = document.createElement("div");
vismenu.id = "vismenu";
vismenu.classList.add("menu");
var visbutton = document.createElement("div");
visbutton.classList.add("visbtn");
visbutton.classList.add("hideonprint");
var viscontent = document.createElement("div");
viscontent.classList.add("menu-content");
viscontent.id = "vismenu-content";
settings.columnOrder.forEach(column => {
if (typeof column !== "string")
return;
// Skip empty columns
if (column === "checkboxes" && settings.checkboxes.length == 0)
return;
else if (column === "Quantity" && settings.bommode == "ungrouped")
return;
var label = document.createElement("label");
label.classList.add("menu-label");
var input = document.createElement("input");
input.classList.add("visibility_checkbox");
input.type = "checkbox";
input.onchange = function (e) {
setShowBOMColumn(column, e.target.checked)
};
input.checked = !(settings.hiddenColumns.includes(column));
label.appendChild(input);
if (column.length > 0)
label.append(column[0].toUpperCase() + column.slice(1));
viscontent.appendChild(label);
});
viscontent.childNodes[0].classList.add("menu-label-top");
vismenu.appendChild(visbutton);
if (settings.bommode != "netlist") {
vismenu.appendChild(viscontent);
th.appendChild(vismenu);
}
tr.appendChild(th);
var checkboxCompareClosure = function (checkbox) {
return (a, b) => {
var stateA = getCheckboxState(checkbox, a);
var stateB = getCheckboxState(checkbox, b);
if (stateA > stateB) return -1;
if (stateA < stateB) return 1;
return 0;
}
}
var stringFieldCompareClosure = function (fieldIndex) {
return (a, b) => {
var fa = pcbdata.bom.fields[a[0][1]][fieldIndex];
var fb = pcbdata.bom.fields[b[0][1]][fieldIndex];
if (fa != fb) return fa > fb ? 1 : -1;
else return 0;
}
}
var referenceRegex = /(?<prefix>[^0-9]+)(?<number>[0-9]+)/;
var compareRefs = (a, b) => {
var ra = referenceRegex.exec(a);
var rb = referenceRegex.exec(b);
if (ra === null || rb === null) {
if (a != b) return a > b ? 1 : -1;
return 0;
} else {
if (ra.groups.prefix != rb.groups.prefix) {
return ra.groups.prefix > rb.groups.prefix ? 1 : -1;
}
if (ra.groups.number != rb.groups.number) {
return parseInt(ra.groups.number) > parseInt(rb.groups.number) ? 1 : -1;
}
return 0;
}
}
if (settings.bommode == "netlist") {
tr.appendChild(createColumnHeader("Net name", "bom-netname", (a, b) => {
if (a > b) return -1;
if (a < b) return 1;
return 0;
}));
tr.appendChild(createColumnHeader("Color", "bom-color", (a, b) => {
return 0;
}));
} else {
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
var valueIndex = config.fields.indexOf("Value");
var footprintIndex = config.fields.indexOf("Footprint");
columns.forEach((column) => {
if (column === placeHolderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
th = createColumnHeader(
checkbox, "bom-checkbox", checkboxCompareClosure(checkbox), true);
tr.appendChild(th);
}
} else if (column === "References") {
tr.appendChild(createColumnHeader("References", "references", (a, b) => {
var i = 0;
while (i < a.length && i < b.length) {
if (a[i] != b[i]) return compareRefs(a[i][0], b[i][0]);
i++;
}
return a.length - b.length;
}));
} else if (column === "Value") {
tr.appendChild(createColumnHeader("Value", "value", (a, b) => {
var ra = a[0][1], rb = b[0][1];
return valueCompare(
pcbdata.bom.parsedValues[ra], pcbdata.bom.parsedValues[rb],
pcbdata.bom.fields[ra][valueIndex], pcbdata.bom.fields[rb][valueIndex]);
}));
return;
} else if (column === "Footprint") {
tr.appendChild(createColumnHeader(
"Footprint", "footprint", stringFieldCompareClosure(footprintIndex)));
} else if (column === "Quantity" && settings.bommode == "grouped") {
tr.appendChild(createColumnHeader("Quantity", "quantity", (a, b) => {
return a.length - b.length;
}));
} else {
// Other fields
var i = config.fields.indexOf(column);
if (i < 0)
return;
tr.appendChild(createColumnHeader(
column, `field${i + 1}`, stringFieldCompareClosure(i)));
}
});
}
bomhead.appendChild(tr);
}
function populateBomBody(placeholderColumn = null, placeHolderElements = null) {
const urlRegex = /^(https?:\/\/[^\s\/$.?#][^\s]*|file:\/\/([a-zA-Z]:|\/)[^\x00]+)$/;
while (bom.firstChild) {
bom.removeChild(bom.firstChild);
}
highlightHandlers = [];
footprintIndexToHandler = {};
netsToHandler = {};
currentHighlightedRowId = null;
var first = true;
var style = getComputedStyle(topmostdiv);
var defaultNetColor = style.getPropertyValue('--track-color').trim();
if (settings.bommode == "netlist") {
bomtable = pcbdata.nets.slice();
} else {
switch (settings.canvaslayout) {
case 'F':
bomtable = pcbdata.bom.F.slice();
break;
case 'FB':
bomtable = pcbdata.bom.both.slice();
break;
case 'B':
bomtable = pcbdata.bom.B.slice();
break;
}
if (settings.bommode == "ungrouped") {
// expand bom table
expandedTable = []
for (var bomentry of bomtable) {
for (var ref of bomentry) {
expandedTable.push([ref]);
}
}
bomtable = expandedTable;
}
}
if (bomSortFunction) {
bomtable = bomtable.sort(bomSortFunction);
}
for (var i in bomtable) {
var bomentry = bomtable[i];
if (filter && !entryMatches(bomentry)) {
continue;
}
var references = null;
var netname = null;
var tr = document.createElement("TR");
var td = document.createElement("TD");
var rownum = +i + 1;
tr.id = "bomrow" + rownum;
td.textContent = rownum;
tr.appendChild(td);
if (settings.bommode == "netlist") {
netname = bomentry;
td = document.createElement("TD");
td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
tr.appendChild(td);
var color = settings.netColors[netname] || defaultNetColor;
td = document.createElement("TD");
var colorBox = document.createElement("INPUT");
colorBox.type = "color";
colorBox.value = color;
colorBox.onchange = netColorChangeHandler(netname);
colorBox.onmouseup = netColorRightClick(netname);
colorBox.oncontextmenu = (e) => e.preventDefault();
td.appendChild(colorBox);
td.classList.add("color-column");
tr.appendChild(td);
} else {
if (reflookup) {
references = findRefInEntry(bomentry);
if (references.length == 0) {
continue;
}
} else {
references = bomentry;
}
// Filter hidden columns
var columns = settings.columnOrder.filter(e => !settings.hiddenColumns.includes(e));
columns.forEach((column) => {
if (column === placeholderColumn) {
var n = 1;
if (column === "checkboxes")
n = settings.checkboxes.length;
for (i = 0; i < n; i++) {
td = placeHolderElements.shift();
tr.appendChild(td);
}
return;
} else if (column === "checkboxes") {
for (var checkbox of settings.checkboxes) {
if (checkbox) {
td = document.createElement("TD");
var input = document.createElement("input");
input.type = "checkbox";
input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
setBomCheckboxState(checkbox, input, references);
if (input.checked && settings.markWhenChecked == checkbox) {
tr.classList.add("checked");
}
td.appendChild(input);
tr.appendChild(td);
}
}
} else if (column === "References") {
td = document.createElement("TD");
td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
tr.appendChild(td);
} else if (column === "Quantity" && settings.bommode == "grouped") {
// Quantity
td = document.createElement("TD");
td.textContent = references.length;
tr.appendChild(td);
} else {
// All the other fields
var field_index = config.fields.indexOf(column)
if (field_index < 0)
return;
var valueSet = new Set();
references.map(r => r[1]).forEach((id) => valueSet.add(pcbdata.bom.fields[id][field_index]));
td = document.createElement("TD");
var output = new Array();
for (let item of valueSet) {
const visible = highlightFilter(String(item));
if (typeof item === 'string' && item.match(urlRegex)) {
output.push(`<a href="${item}" target="_blank">${visible}</a>`);
} else {
output.push(visible);
}
}
td.innerHTML = output.join(", ");
tr.appendChild(td);
}
});
}
bom.appendChild(tr);
var handler = createRowHighlightHandler(tr.id, references, netname);
tr.onmousemove = handler;
highlightHandlers.push({
id: tr.id,
handler: handler,
});
if (references !== null) {
for (var refIndex of references.map(r => r[1])) {
footprintIndexToHandler[refIndex] = handler;
}
}
if (netname !== null) {
netsToHandler[netname] = handler;
}
if ((filter || reflookup) && first) {
handler();
first = false;
}
}
EventHandler.emitEvent(
IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, {
filter: filter,
reflookup: reflookup,
checkboxes: settings.checkboxes,
bommode: settings.bommode,
});
}
function highlightPreviousRow() {
if (!currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[0].id == currentHighlightedRowId) {
highlightHandlers[highlightHandlers.length - 1].handler();
} else {
for (var i = 0; i < highlightHandlers.length - 1; i++) {
if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function highlightNextRow() {
if (!currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
if (highlightHandlers.length > 1 &&
highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
highlightHandlers[0].handler();
} else {
for (var i = 1; i < highlightHandlers.length; i++) {
if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
highlightHandlers[i].handler();
break;
}
}
}
}
smoothScrollToRow(currentHighlightedRowId);
}
function populateBomTable() {
populateBomHeader();
populateBomBody();
setBomHandlers();
resizableGrid(bomhead);
}
function footprintsClicked(footprintIndexes) {
var lastClickedIndex = footprintIndexes.indexOf(lastClicked);
for (var i = 1; i <= footprintIndexes.length; i++) {
var refIndex = footprintIndexes[(lastClickedIndex + i) % footprintIndexes.length];
if (refIndex in footprintIndexToHandler) {
lastClicked = refIndex;
footprintIndexToHandler[refIndex]();
smoothScrollToRow(currentHighlightedRowId);
break;
}
}
}
function netClicked(net) {
if (net in netsToHandler) {
netsToHandler[net]();
smoothScrollToRow(currentHighlightedRowId);
} else {
clearHighlightedFootprints();
highlightedNet = net;
drawHighlights();
}
}
function updateFilter(input) {
filter = input.toLowerCase();
populateBomTable();
}
function updateRefLookup(input) {
reflookup = input.toLowerCase();
populateBomTable();
}
function changeCanvasLayout(layout) {
document.getElementById("fl-btn").classList.remove("depressed");
document.getElementById("fb-btn").classList.remove("depressed");
document.getElementById("bl-btn").classList.remove("depressed");
switch (layout) {
case 'F':
document.getElementById("fl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(1);
}
break;
case 'B':
document.getElementById("bl-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.collapse(0);
}
break;
default:
document.getElementById("fb-btn").classList.add("depressed");
if (settings.bomlayout != "bom-only") {
canvassplit.setSizes([50, 50]);
}
}
settings.canvaslayout = layout;
writeStorage("canvaslayout", layout);
resizeAll();
changeBomMode(settings.bommode);
}
function populateMetadata() {
document.getElementById("title").innerHTML = pcbdata.metadata.title;
document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
document.getElementById("company").innerHTML = pcbdata.metadata.company;
document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
if (pcbdata.metadata.title != "") {
document.title = pcbdata.metadata.title + " BOM";
}
// Calculate board stats
var fp_f = 0,
fp_b = 0,
pads_f = 0,
pads_b = 0,
pads_th = 0;
for (var i = 0; i < pcbdata.footprints.length; i++) {
if (pcbdata.bom.skipped.includes(i)) continue;
var mod = pcbdata.footprints[i];
if (mod.layer == "F") {
fp_f++;
} else {
fp_b++;
}
for (var pad of mod.pads) {
if (pad.type == "th") {
pads_th++;
} else {
if (pad.layers.includes("F")) {
pads_f++;
}
if (pad.layers.includes("B")) {
pads_b++;
}
}
}
}
document.getElementById("stats-components-front").innerHTML = fp_f;
document.getElementById("stats-components-back").innerHTML = fp_b;
document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
document.getElementById("stats-th-pads").innerHTML = pads_th;
// Update version string
document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
/^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}
function changeBomLayout(layout) {
document.getElementById("bom-btn").classList.remove("depressed");
document.getElementById("lr-btn").classList.remove("depressed");
document.getElementById("tb-btn").classList.remove("depressed");
switch (layout) {
case 'bom-only':
document.getElementById("bom-btn").classList.add("depressed");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
document.getElementById("frontcanvas").style.display = "none";
document.getElementById("backcanvas").style.display = "none";
document.getElementById("topmostdiv").style.height = "";
document.getElementById("topmostdiv").style.display = "block";
break;
case 'top-bottom':
document.getElementById("tb-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("topmostdiv").style.height = "100%";
document.getElementById("topmostdiv").style.display = "flex";
document.getElementById("bomdiv").classList.remove("split-horizontal");
document.getElementById("canvasdiv").classList.remove("split-horizontal");
document.getElementById("frontcanvas").classList.add("split-horizontal");
document.getElementById("backcanvas").classList.add("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
direction: "vertical",
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
onDragEnd: resizeAll
});
break;
case 'left-right':
document.getElementById("lr-btn").classList.add("depressed");
document.getElementById("frontcanvas").style.display = "";
document.getElementById("backcanvas").style.display = "";
document.getElementById("topmostdiv").style.height = "100%";
document.getElementById("topmostdiv").style.display = "flex";
document.getElementById("bomdiv").classList.add("split-horizontal");
document.getElementById("canvasdiv").classList.add("split-horizontal");
document.getElementById("frontcanvas").classList.remove("split-horizontal");
document.getElementById("backcanvas").classList.remove("split-horizontal");
if (bomsplit) {
bomsplit.destroy();
bomsplit = null;
canvassplit.destroy();
canvassplit = null;
}
bomsplit = Split(['#bomdiv', '#canvasdiv'], {
sizes: [50, 50],
onDragEnd: resizeAll,
gutterSize: 5
});
canvassplit = Split(['#frontcanvas', '#backcanvas'], {
sizes: [50, 50],
gutterSize: 5,
direction: "vertical",
onDragEnd: resizeAll
});
}
settings.bomlayout = layout;
writeStorage("bomlayout", layout);
changeCanvasLayout(settings.canvaslayout);
}
function changeBomMode(mode) {
document.getElementById("bom-grouped-btn").classList.remove("depressed");
document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
document.getElementById("bom-netlist-btn").classList.remove("depressed");
var chkbxs = document.getElementsByClassName("visibility_checkbox");
switch (mode) {
case 'grouped':
document.getElementById("bom-grouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'ungrouped':
document.getElementById("bom-ungrouped-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = false;
}
break;
case 'netlist':
document.getElementById("bom-netlist-btn").classList.add("depressed");
for (var i = 0; i < chkbxs.length; i++) {
chkbxs[i].disabled = true;
}
}
writeStorage("bommode", mode);
if (mode != settings.bommode) {
settings.bommode = mode;
bomSortFunction = null;
currentSortColumn = null;
currentSortOrder = null;
clearHighlightedFootprints();
}
populateBomTable();
}
function focusFilterField() {
focusInputField(document.getElementById("filter"));
}
function focusRefLookupField() {
focusInputField(document.getElementById("reflookup"));
}
function toggleBomCheckbox(bomrowid, checkboxnum) {
if (!bomrowid || checkboxnum > settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
checkbox.checked = !checkbox.checked;
checkbox.indeterminate = false;
checkbox.onchange();
}
function checkBomCheckbox(bomrowid, checkboxname) {
var checkboxnum = 0;
while (checkboxnum < settings.checkboxes.length &&
settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
checkboxnum++;
}
if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
return;
}
var bomrow = document.getElementById(bomrowid);
var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
checkbox.checked = true;
checkbox.indeterminate = false;
checkbox.onchange();
}
function setBomCheckboxes(value) {
writeStorage("bomCheckboxes", value);
settings.checkboxes = value.split(",").map((e) => e.trim()).filter((e) => e);
prepCheckboxes();
populateMarkWhenCheckedOptions();
setMarkWhenChecked(settings.markWhenChecked);
}
function setMarkWhenChecked(value) {
writeStorage("markWhenChecked", value);
settings.markWhenChecked = value;
markedFootprints.clear();
for (var ref of (value ? getStoredCheckboxRefs(value) : [])) {
markedFootprints.add(ref);
}
populateBomTable();
drawHighlights();
}
function prepCheckboxes() {
var table = document.getElementById("checkbox-stats");
while (table.childElementCount > 1) {
table.removeChild(table.lastChild);
}
if (settings.checkboxes.length) {
table.style.display = "";
} else {
table.style.display = "none";
}
for (var checkbox of settings.checkboxes) {
var tr = document.createElement("TR");
var td = document.createElement("TD");
td.innerHTML = checkbox;
tr.appendChild(td);
td = document.createElement("TD");
td.id = "checkbox-stats-" + checkbox;
var progressbar = document.createElement("div");
progressbar.classList.add("bar");
td.appendChild(progressbar);
var text = document.createElement("div");
text.classList.add("text");
td.appendChild(text);
tr.appendChild(td);
table.appendChild(tr);
updateCheckboxStats(checkbox);
}
}
function populateMarkWhenCheckedOptions() {
var container = document.getElementById("markWhenCheckedContainer");
if (settings.checkboxes.length == 0) {
container.parentElement.style.display = "none";
return;
}
container.innerHTML = '';
container.parentElement.style.display = "inline-block";
function createOption(name, displayName) {
var id = "markWhenChecked-" + name;
var div = document.createElement("div");
div.classList.add("radio-container");
var input = document.createElement("input");
input.type = "radio";
input.name = "markWhenChecked";
input.value = name;
input.id = id;
input.onchange = () => setMarkWhenChecked(name);
div.appendChild(input);
// Preserve the selected element when the checkboxes change
if (name == settings.markWhenChecked) {
input.checked = true;
}
var label = document.createElement("label");
label.innerHTML = displayName;
label.htmlFor = id;
div.appendChild(label);
container.appendChild(div);
}
createOption("", "None");
for (var checkbox of settings.checkboxes) {
createOption(checkbox, checkbox);
}
}
function updateCheckboxStats(checkbox) {
var checked = getStoredCheckboxRefs(checkbox).size;
var total = pcbdata.footprints.length - pcbdata.bom.skipped.length;
var percent = checked * 100.0 / total;
var td = document.getElementById("checkbox-stats-" + checkbox);
td.firstChild.style.width = percent + "%";
td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}
function constrain(number, min, max) {
return Math.min(Math.max(parseInt(number), min), max);
}
document.onkeydown = function (e) {
switch (e.key) {
case "n":
if (document.activeElement.type == "text") {
return;
}
if (currentHighlightedRowId !== null) {
checkBomCheckbox(currentHighlightedRowId, "placed");
highlightNextRow();
e.preventDefault();
}
break;
case "ArrowUp":
highlightPreviousRow();
e.preventDefault();
break;
case "ArrowDown":
highlightNextRow();
e.preventDefault();
break;
case "ArrowLeft":
case "ArrowRight":
if (document.activeElement.type != "text") {
e.preventDefault();
let boardRotationElement = document.getElementById("boardRotation")
settings.boardRotation = parseInt(boardRotationElement.value); // degrees / 5
if (e.key == "ArrowLeft") {
settings.boardRotation += 3; // 15 degrees
}
else {
settings.boardRotation -= 3;
}
settings.boardRotation = constrain(settings.boardRotation, boardRotationElement.min, boardRotationElement.max);
boardRotationElement.value = settings.boardRotation
setBoardRotation(settings.boardRotation);
}
break;
default:
break;
}
if (e.altKey) {
switch (e.key) {
case "f":
focusFilterField();
e.preventDefault();
break;
case "r":
focusRefLookupField();
e.preventDefault();
break;
case "z":
changeBomLayout("bom-only");
e.preventDefault();
break;
case "x":
changeBomLayout("left-right");
e.preventDefault();
break;
case "c":
changeBomLayout("top-bottom");
e.preventDefault();
break;
case "v":
changeCanvasLayout("F");
e.preventDefault();
break;
case "b":
changeCanvasLayout("FB");
e.preventDefault();
break;
case "n":
changeCanvasLayout("B");
e.preventDefault();
break;
default:
break;
}
if (e.key >= '1' && e.key <= '9') {
toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
e.preventDefault();
}
}
}
function hideNetlistButton() {
document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
document.getElementById("bom-netlist-btn").style.display = "none";
}
function topToggle() {
var top = document.getElementById("top");
var toptoggle = document.getElementById("toptoggle");
if (top.style.display === "none") {
top.style.display = "flex";
toptoggle.classList.remove("flipped");
} else {
top.style.display = "none";
toptoggle.classList.add("flipped");
}
}
window.onload = function (e) {
initUtils();
initRender();
initStorage();
initDefaults();
cleanGutters();
populateMetadata();
dbgdiv = document.getElementById("dbg");
bom = document.getElementById("bombody");
bomhead = document.getElementById("bomhead");
filter = "";
reflookup = "";
if (!("nets" in pcbdata)) {
hideNetlistButton();
}
initDone = true;
setBomCheckboxes(document.getElementById("bomCheckboxes").value);
// Triggers render
changeBomLayout(settings.bomlayout);
// Users may leave fullscreen without touching the checkbox. Uncheck.
document.addEventListener('fullscreenchange', () => {
if (!document.fullscreenElement)
document.getElementById('fullscreenCheckbox').checked = false;
});
}
window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);
///////////////////////////////////////////////
///////////////////////////////////////////////
// EventHandler.registerCallback(IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT, () => {
// for(var tr of bom.childNodes) {
// tr.onclick = tr.onmousemove;
// tr.onmousemove = null;
// };
// });
///////////////////////////////////////////////
</script>
</head>
<body>
<div id="topmostdiv" class="topmostdiv">
<div id="top">
<div id="fileinfodiv">
<table class="fileinfo">
<tbody>
<tr>
<td id="title" class="title" style="width: 70%">
Title
</td>
<td id="revision" class="title" style="width: 30%">
Revision
</td>
</tr>
<tr>
<td id="company">
Company
</td>
<td id="filedate">
Date
</td>
</tr>
</tbody>
</table>
</div>
<div id="bomcontrols">
<div class="hideonprint menu">
<button class="menubtn"></button>
<div class="menu-content">
<label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
<input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
Dark mode
</label><!-- This comment eats space! All of it!
--><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
<input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
Full Screen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
Fab layer
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
Silkscreen
</label>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
References
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
Values
</label>
<div id="tracksAndZonesCheckboxes">
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
Tracks
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
Zones
</label>
</div>
<label class="menu-label" style="width: calc(50% - 18px)">
<input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
Pads
</label><!-- This comment eats space! All of it!
--><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
<input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
DNP outlined
</label>
<label class="menu-label">
<input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
Continuous redraw on drag
</label>
<label class="menu-label">
Highlight first pin
<form id="highlightpin1">
<div class="flexbox">
<label>
<input type="radio" name="highlightpin1" value="none" onchange="setHighlightPin1('none')">
None
</label>
<label>
<input type="radio" name="highlightpin1" value="all" onchange="setHighlightPin1('all')">
All
</label>
<label>
<input type="radio" name="highlightpin1" value="selected" onchange="setHighlightPin1('selected')">
Selected
</label>
</div>
</form>
</label>
<label class="menu-label">
<span>Board rotation</span>
<span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
<input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
</label>
<label class="menu-label">
<input id="offsetBackRotationCheckbox" type="checkbox" onchange="setOffsetBackRotation(this.checked)">
Offset back rotation
</label>
<label class="menu-label">
<div style="margin-left: 5px">Bom checkboxes</div>
<input id="bomCheckboxes" class="menu-textbox" type=text
oninput="setBomCheckboxes(this.value)">
</label>
<label class="menu-label">
<div style="margin-left: 5px">Mark when checked</div>
<div id="markWhenCheckedContainer"></div>
</label>
<label class="menu-label">
<span class="shameless-plug">
<span>Created using</span>
<a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
<a target="blank" title="Mouse and keyboard help" href="https://github.com/openscopeproject/InteractiveHtmlBom/wiki/Usage#bom-page-mouse-actions" style="text-decoration: none;"><label class="help-link">?</label></a>
</span>
</label>
</div>
</div>
<div class="button-container hideonprint">
<button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
title="Front only">F
</button>
<button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
title="Front and Back">FB
</button>
<button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
title="Back only">B
</button>
</div>
<div class="button-container hideonprint">
<button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
title="BOM only"></button>
<button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
title="BOM left, drawings right"></button>
<button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
title="BOM top, drawings bot"></button>
</div>
<div class="button-container hideonprint">
<button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
title="Grouped BOM"></button>
<button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
title="Ungrouped BOM"></button>
<button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
title="Netlist"></button>
</div>
<div class="hideonprint menu">
<button class="statsbtn"></button>
<div class="menu-content">
<table class="stats">
<tbody>
<tr>
<td width="40%">Board stats</td>
<td>Front</td>
<td>Back</td>
<td>Total</td>
</tr>
<tr>
<td>Components</td>
<td id="stats-components-front">~</td>
<td id="stats-components-back">~</td>
<td id="stats-components-total">~</td>
</tr>
<tr>
<td>Groups</td>
<td id="stats-groups-front">~</td>
<td id="stats-groups-back">~</td>
<td id="stats-groups-total">~</td>
</tr>
<tr>
<td>SMD pads</td>
<td id="stats-smd-pads-front">~</td>
<td id="stats-smd-pads-back">~</td>
<td id="stats-smd-pads-total">~</td>
</tr>
<tr>
<td>TH pads</td>
<td colspan=3 id="stats-th-pads">~</td>
</tr>
</tbody>
</table>
<table class="stats">
<col width="40%"/><col />
<tbody id="checkbox-stats">
<tr>
<td colspan=2 style="border-top: 0">Checkboxes</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="hideonprint menu">
<button class="iobtn"></button>
<div class="menu-content">
<div class="menu-label menu-label-top">
<div style="margin-left: 5px;">Save board image</div>
<div class="flexbox">
<input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
<span>X</span>
<input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
</div>
<label>
<input id="render-save-transparent" type="checkbox">
Transparent background
</label>
<div class="flexbox">
<button class="savebtn" onclick="saveImage('F')">Front</button>
<button class="savebtn" onclick="saveImage('B')">Back</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Config and checkbox state</span>
<div class="flexbox">
<button class="savebtn" onclick="saveSettings()">Export</button>
<button class="savebtn" onclick="loadSettings()">Import</button>
<button class="savebtn" onclick="resetSettings()">Reset</button>
</div>
</div>
<div class="menu-label">
<span style="margin-left: 5px;">Save bom table as</span>
<div class="flexbox">
<button class="savebtn" onclick="saveBomTable('csv')">csv</button>
<button class="savebtn" onclick="saveBomTable('txt')">txt</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="topdivider">
<div class="hideonprint">
<div id="toptoggle" onclick="topToggle()"></div>
</div>
</div>
<div id="bot" class="split" style="flex: 1 1">
<div id="bomdiv" class="split split-horizontal">
<div style="width: 100%">
<input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
oninput="updateRefLookup(this.value)">
<input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
oninput="updateFilter(this.value)">
<div class="button-container hideonprint" style="float: left; margin: 0;">
<button id="copy" title="Copy bom table to clipboard"
onclick="saveBomTable('clipboard')"></button>
</div>
</div>
<div id="dbg"></div>
<table class="bom" id="bomtable">
<thead id="bomhead">
</thead>
<tbody id="bombody">
</tbody>
</table>
</div>
<div id="canvasdiv" class="split split-horizontal">
<div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
<div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
<div style="position: relative; width: 100%; height: 100%;">
<canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
<canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
<canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
<canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
</div>
</div>
</div>
</div>
</div>
</body>
</html>