Files

copied
Last update 4 years 1 week by Malcolm Churn
Filesbom
..
qUarkMini_Wing_V4.html
qUarkMini_Wing_V4.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-color-highlight: #D04040; --pin1-outline-color: #ffb629; --pin1-outline-color-highlight: #b4ff03; --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: 10px 10px 10px 0px; } .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: 5px; } .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; } .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 { transition: background-color 0.2s; } .bom .numCol { width: 25px; } .bom .Description { width: 10%; } .bom .Part { width: 10%; } .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; } .dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn { 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: 10px 10px 10px 0px; } .menu-content { 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; } .topmostdiv { width: 100%; height: 100%; background-color: white; transition: background-color 0.3s; } #top { height: 78px; border-bottom: 2px solid black; } .dark #top { border-bottom: 2px solid #ccc; } #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; } </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 = {"show_fabrication": false, "redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": true, "bom_view": "left-right", "board_rotation": 0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "show_pads": true, "layer_view": "FB"} /////////////////////////////////////////////// /////////////////////////////////////////////// var pcbdata = JSON.parse(LZString.decompressFromBase64("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")) /////////////////////////////////////////////// /////////////////////////////////////////////// /* 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 copyToClipboard() { var text = ''; for (var node of bomhead.childNodes[0].childNodes) { if (node.firstChild) { text = text + node.firstChild.nodeValue; } if (node != bomhead.childNodes[0].lastChild) { text += '\t'; } } text += '\n'; for (var row of bombody.childNodes) { for (var cell of row.childNodes) { for (var node of cell.childNodes) { if (node.nodeName == "INPUT") { if (node.checked) { text = text + '✓'; } } else if (node.nodeName == "MARK") { text = text + node.firstChild.nodeValue; } else { text = text + node.nodeValue; } } if (cell != row.lastChild) { text += '\t'; } } text += '\n'; } 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 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.*)?$", ""); for (var bom_type of ["both", "F", "B"]) { for (var row of pcbdata.bom[bom_type]) { row.push(parseValue(row[1], row[3][0][0])); } } } 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 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]); } 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.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1; writeStorage("boardRotation", settings.boardRotation); document.getElementById("boardRotation").value = settings.boardRotation / 5; document.getElementById("rotationDegree").textContent = settings.boardRotation; 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: "default", bomlayout: "default", bommode: "grouped", checkboxes: [], checkboxStoredRefs: {}, darkMode: false, highlightpin1: false, redrawOnDrag: true, boardRotation: 0, renderPads: true, renderReferences: true, renderValues: true, renderSilkscreen: true, renderFabrication: true, renderDnpOutline: false, renderTracks: true, renderZones: true, } 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 (!["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; 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); initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1); 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; } /////////////////////////////////////////////// /////////////////////////////////////////////// /* 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 ]; // Adding half a line height here is technically a bug // but pcbnew currently does the same, text is slightly shifted. point[0] -= (point[1] + text.height * 0.5) * tilt; return point; } function drawtext(ctx, text, color, flip) { 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 (text.svgpath) { ctx.stroke(new Path2D(text.svgpath)); ctx.restore(); return; } ctx.translate(...text.pos); 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) / 2; var txt = text.text.split("\n"); // KiCad ignores last empty line. if (txt[txt.length - 1] == '') txt.pop(); ctx.rotate(deg2rad(angle)); for (var i in txt) { var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2; var lineWidth = 0; for (var c of txt[i]) { if (c == '\t') { var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width; lineWidth += fourSpaces - lineWidth % fourSpaces; } else { lineWidth += pcbdata.font_data[c].w * text.width; } } var offsetx = 0; switch (text.horiz_justify) { case -1: // Justify left, do nothing break; case 0: // Justify center offsetx -= lineWidth / 2; break; case 1: // Justify right offsetx -= lineWidth; break; } for (var c of txt[i]) { if (c == '\t') { var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width; offsetx += fourSpaces - offsetx % fourSpaces; continue; } for (var line of pcbdata.font_data[c].l) { ctx.beginPath(); ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt)); for (var i = 1; i < line.length; i++) { ctx.lineTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt)); } ctx.stroke(); } offsetx += pcbdata.font_data[c].w * text.width; } } ctx.restore(); } function drawedge(ctx, scalefactor, edge, color) { ctx.strokeStyle = color; ctx.lineWidth = Math.max(1 / scalefactor, edge.width); ctx.lineCap = "round"; if (edge.svgpath) { ctx.stroke(new Path2D(edge.svgpath)); } else { ctx.beginPath(); if (edge.type == "segment") { ctx.moveTo(...edge.start); ctx.lineTo(...edge.end); } 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); } 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 (shape.svgpath) { 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, shape, color) { ctx.save(); ctx.fillStyle = color; if (!shape.svgpath) { ctx.translate(...shape.pos); ctx.rotate(deg2rad(-shape.angle)); } ctx.fill(getPolygonsPath(shape)); ctx.restore(); } function drawDrawing(ctx, layer, scalefactor, drawing, color) { if (["segment", "arc", "circle", "curve"].includes(drawing.type)) { drawedge(ctx, scalefactor, drawing, color); } else if (drawing.type == "polygon") { drawPolygonShape(ctx, drawing, color); } else { drawtext(ctx, drawing, color, layer == "B"); } } 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, hole) { 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); } if (pad.type == "th" && hole) { if (pad.offset) { ctx.translate(-pad.offset[0], -pad.offset[1]); } ctx.fillStyle = "#CCCCCC"; if (pad.drillshape == "oblong") { ctx.fill(getOblongPath(pad.drillsize)); } else { ctx.fill(getCirclePath(pad.drillsize[0] / 2)); } } ctx.restore(); } function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) { if (highlight) { // draw bounding box if (module.layer == layer) { ctx.save(); ctx.globalAlpha = 0.2; ctx.translate(...module.bbox.pos); ctx.rotate(deg2rad(-module.bbox.angle)); ctx.translate(...module.bbox.relpos); ctx.fillStyle = padcolor; ctx.fillRect(0, 0, ...module.bbox.size); ctx.globalAlpha = 1; ctx.strokeStyle = padcolor; ctx.strokeRect(0, 0, ...module.bbox.size); ctx.restore(); } } // draw drawings for (var drawing of module.drawings) { if (drawing.layer == layer) { drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor); } } // draw pads if (settings.renderPads) { for (var pad of module.pads) { if (pad.layers.includes(layer)) { drawPad(ctx, pad, padcolor, outline, true); if (pad.pin1 && settings.highlightpin1) { drawPad(ctx, pad, outlinecolor, true, false); } } } } } function drawEdgeCuts(canvas, scalefactor) { var ctx = canvas.getContext("2d"); var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color'); for (var edge of pcbdata.edges) { drawedge(ctx, scalefactor, edge, edgecolor); } } function drawModules(canvas, layer, scalefactor, highlight) { var ctx = canvas.getContext("2d"); ctx.lineWidth = 3 / scalefactor; var style = getComputedStyle(topmostdiv); var padcolor = style.getPropertyValue('--pad-color'); var outlinecolor = style.getPropertyValue('--pin1-outline-color'); if (highlight) { padcolor = style.getPropertyValue('--pad-color-highlight'); outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight'); } for (var i = 0; i < pcbdata.modules.length; i++) { var mod = pcbdata.modules[i]; var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i); if (!highlight || highlightedModules.includes(i)) { drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline); } } } function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) { var ctx = canvas.getContext("2d"); for (var d of pcbdata[layername][layer]) { if (["segment", "arc", "circle", "curve"].includes(d.type)) { drawedge(ctx, scalefactor, d, edgeColor); } else if (d.type == "polygon") { drawPolygonShape(ctx, d, polygonColor); } else { drawtext(ctx, d, textColor, layer == "B"); } } } function drawTracks(canvas, layer, color, highlight) { ctx = canvas.getContext("2d"); ctx.strokeStyle = color; ctx.lineCap = "round"; for(var track of pcbdata.tracks[layer]) { if (highlight && highlightedNet != track.net) continue; ctx.lineWidth = track.width; ctx.beginPath(); ctx.moveTo(...track.start); ctx.lineTo(...track.end); ctx.stroke(); } } function drawZones(canvas, layer, color, highlight) { ctx = canvas.getContext("2d"); ctx.strokeStyle = color; ctx.fillStyle = color; ctx.lineJoin = "round"; for(var zone of pcbdata.zones[layer]) { if (!zone.path2d) { zone.path2d = getPolygonsPath(zone); } if (highlight && highlightedNet != zone.net) continue; ctx.lineWidth = zone.width ? zone.width : 0; ctx.fill(zone.path2d); 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 { ctx.clearRect(0, 0, canvas.width, canvas.height); } ctx.restore(); } function drawNets(canvas, layer, highlight) { var style = getComputedStyle(topmostdiv); if (settings.renderTracks) { var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color'); drawTracks(canvas, layer, trackColor, highlight); } if (settings.renderZones) { var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color'); drawZones(canvas, layer, zoneColor, highlight); } if (highlight && settings.renderPads) { var padColor = style.getPropertyValue('--pad-color-highlight'); var ctx = canvas.getContext("2d"); for (var mod of pcbdata.modules) { // draw pads for (var pad of mod.pads) { if (highlightedNet != pad.net) continue; if (pad.layers.includes(layer)) { drawPad(ctx, pad, padColor, false, true); } } } } } function drawHighlightsOnLayer(canvasdict, clear = true) { if (clear) { clearCanvas(canvasdict.highlight); } if (highlightedModules.length > 0) { drawModules(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); drawModules(canvasdict.bg, canvasdict.layer, canvasdict.transform.s * canvasdict.transform.zoom, false); drawEdgeCuts(canvasdict.bg, canvasdict.transform.s); 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); var fontsize = 1.55; 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)); 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) { 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)); 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 bbox = applyRotation(pcbdata.edges_bbox); 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; var flip = (layerdict.layer == "B"); 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 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 (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) { return track.net; } } } // Check pads if (settings.renderPads) { for (var mod of pcbdata.modules) { for(var pad of mod.pads) { if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) { return pad.net; } } } } return null; } function pointWithinModuleBbox(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.modules.length; i++) { var module = pcbdata.modules[i]; if (module.layer == layer) { if (pointWithinModuleBbox(x, y, module.bbox)) { result.push(i); } } } return result; } function handlePointerDown(e, layerdict) { if (e.button != 0) { 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; if (layerdict.layer == "B") { 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); if ("nets" in pcbdata) { var net = netHitScan(layerdict.layer, ...v); if (net !== highlightedNet) { netClicked(net); } } if (highlightedNet === null) { var modules = bboxHitScan(layerdict.layer, ...v); if (modules.length > 0) { modulesClicked(modules); } } } 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 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); } /////////////////////////////////////////////// /////////////////////////////////////////////// /* 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 moduleIndexToHandler = {}; var netsToHandler = {}; var highlightedModules = []; 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(); } 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.modules.length; i++) { if (pcbdata.modules[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) { return function() { refsSet = getStoredCheckboxRefs(checkbox); if (this.checked) { // checkbox ticked for (var ref of references) { refsSet.add(ref[1]); } } else { // checkbox unticked for (var ref of references) { refsSet.delete(ref[1]); } } settings.checkboxStoredRefs[checkbox] = [...refsSet].join(","); writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]); updateCheckboxStats(checkbox); } } function clearHighlightedModules() { if (currentHighlightedRowId) { document.getElementById(currentHighlightedRowId).classList.remove("highlighted"); currentHighlightedRowId = null; highlightedModules = []; 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; highlightedModules = refs ? refs.map(r => r[1]) : []; highlightedNet = net; drawHighlights(); } } function entryMatches(entry) { if (settings.bommode == "netlist") { // entry is just a net name return entry.toLowerCase().indexOf(filter) >= 0; } // check refs for (var ref of entry[3]) { if (ref[0].toLowerCase().indexOf(filter) >= 0) { return true; } } // check extra fields for (var i in config.extra_fields) { if (entry[4][i].toLowerCase().indexOf(filter) >= 0) { return true; } } // check value if (entry[1].toLowerCase().indexOf(filter) >= 0) { return true; } // check footprint if (entry[2].toLowerCase().indexOf(filter) >= 0) { return true; } return false; } function findRefInEntry(entry) { return entry[3].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) { var th = document.createElement("TH"); th.innerHTML = name; th.classList.add(cls); th.style.cursor = "pointer"; var span = document.createElement("SPAN"); span.classList.add("sortmark"); span.classList.add("none"); th.appendChild(span); th.onclick = function() { if (currentSortColumn && this !== currentSortColumn) { // Currently sorted by another column currentSortColumn.childNodes[1].classList.remove(currentSortOrder); currentSortColumn.childNodes[1].classList.add("none"); currentSortColumn = null; currentSortOrder = null; } if (currentSortColumn && this === 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 = this; currentSortColumn.childNodes[1].classList.remove("none"); currentSortColumn.childNodes[1].classList.add("asc"); currentSortOrder = "asc"; } populateBomBody(); } return th; } function populateBomHeader() { while (bomhead.firstChild) { bomhead.removeChild(bomhead.firstChild); } var tr = document.createElement("TR"); var th = document.createElement("TH"); th.classList.add("numCol"); tr.appendChild(th); var checkboxCompareClosure = function(checkbox) { return (a, b) => { var stateA = getCheckboxState(checkbox, a[3]); var stateB = getCheckboxState(checkbox, b[3]); if (stateA > stateB) return -1; if (stateA < stateB) return 1; return 0; } } if (settings.bommode == "netlist") { th = createColumnHeader("Net name", "bom-netname", (a, b) => { if (a > b) return -1; if (a < b) return 1; return 0; }); tr.appendChild(th); } else { for (var checkbox of settings.checkboxes) { th = createColumnHeader( checkbox, "bom-checkbox", checkboxCompareClosure(checkbox)); th.onclick = fancyDblClickHandler( th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox)); tr.appendChild(th); } tr.appendChild(createColumnHeader("References", "References", (a, b) => { var i = 0; while (i < a[3].length && i < b[3].length) { if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1; i++; } return a[3].length - b[3].length; })); // Extra fields if (config.extra_fields.length > 0) { var extraFieldCompareClosure = function(fieldIndex) { return (a, b) => { var fa = a[4][fieldIndex]; var fb = b[4][fieldIndex]; if (fa != fb) return fa > fb ? 1 : -1; else return 0; } } for (var i in config.extra_fields) { tr.appendChild(createColumnHeader( config.extra_fields[i], "extra", extraFieldCompareClosure(i))); } } tr.appendChild(createColumnHeader("Value", "Value", (a, b) => { return valueCompare(a[5], b[5], a[1], b[1]); })); tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => { if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1; else return 0; })); if (settings.bommode == "grouped") { tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => { return a[3].length - b[3].length; })); } } bomhead.appendChild(tr); } function populateBomBody() { while (bom.firstChild) { bom.removeChild(bom.firstChild); } highlightHandlers = []; moduleIndexToHandler = {}; netsToHandler = {}; currentHighlightedRowId = null; var first = true; 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[3]) { expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]); } } 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); } else { if (reflookup) { references = findRefInEntry(bomentry); if (references.length == 0) { continue; } } else { references = bomentry[3]; } // 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); setBomCheckboxState(checkbox, input, references); td.appendChild(input); tr.appendChild(td); } } // References td = document.createElement("TD"); td.innerHTML = highlightFilter(references.map(r => r[0]).join(", ")); tr.appendChild(td); // Extra fields for (var i in config.extra_fields) { td = document.createElement("TD"); td.innerHTML = highlightFilter(bomentry[4][i]); tr.appendChild(td); } // Value td = document.createElement("TD"); td.innerHTML = highlightFilter(bomentry[1]); tr.appendChild(td); // Footprint td = document.createElement("TD"); td.innerHTML = highlightFilter(bomentry[2]); tr.appendChild(td); if (settings.bommode == "grouped") { // Quantity td = document.createElement("TD"); td.textContent = bomentry[3].length; 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])) { moduleIndexToHandler[refIndex] = handler; } } if (netname !== null) { netsToHandler[netname] = handler; } if ((filter || reflookup) && first) { handler(); first = false; } } } 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(); } function modulesClicked(moduleIndexes) { var lastClickedIndex = moduleIndexes.indexOf(lastClicked); for (var i = 1; i <= moduleIndexes.length; i++) { var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length]; if (refIndex in moduleIndexToHandler) { lastClicked = refIndex; moduleIndexToHandler[refIndex](); smoothScrollToRow(currentHighlightedRowId); break; } } } function netClicked(net) { if (net in netsToHandler) { netsToHandler[net](); smoothScrollToRow(currentHighlightedRowId); } else { clearHighlightedModules(); 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.modules.length; i++) { if (pcbdata.bom.skipped.includes(i)) continue; var mod = pcbdata.modules[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("bot").style.height = ""; break; case 'top-bottom': document.getElementById("tb-btn").classList.add("depressed"); document.getElementById("frontcanvas").style.display = ""; document.getElementById("backcanvas").style.display = ""; document.getElementById("bot").style.height = "calc(100% - 80px)"; 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("bot").style.height = "calc(100% - 80px)"; 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"); switch (mode) { case 'grouped': document.getElementById("bom-grouped-btn").classList.add("depressed"); break; case 'ungrouped': document.getElementById("bom-ungrouped-btn").classList.add("depressed"); break; case 'netlist': document.getElementById("bom-netlist-btn").classList.add("depressed"); } writeStorage("bommode", mode); if (mode != settings.bommode) { settings.bommode = mode; bomSortFunction = null; currentSortColumn = null; currentSortOrder = null; clearHighlightedModules(); } 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(",").filter((e) => e); prepCheckboxes(); populateBomTable(); } 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 updateCheckboxStats(checkbox) { var checked = getStoredCheckboxRefs(checkbox).size; var total = pcbdata.modules.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) + "%)"; } 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; 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)); } } } 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"; } 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; prepCheckboxes(); // Triggers render changeBomLayout(settings.bomlayout); } window.onresize = resizeAll; window.matchMedia("print").addListener(resizeAll); /////////////////////////////////////////////// </script> </head> <body> <div id="topmostdiv" class="topmostdiv"> <div id="top"> <div style="float: right; height: 100%;"> <div class="hideonprint menu" style="float: right; top: 8px;"> <button class="menubtn"></button> <div class="menu-content"> <label class="menu-label menu-label-top"> <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)"> Dark mode </label> <label class="menu-label"> <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)"> Show footprint pads </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"> <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)"> DNP components outlined </label> <label class="menu-label"> <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)"> Highlight first pin </label> <label class="menu-label"> <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)"> Continuous redraw on drag </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"> <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"> <span class="shameless-plug"> <span>Created using</span> <a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a> </span> </label> </div> </div> <div class="button-container hideonprint" style="float: right; position: relative; top: 8px"> <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" style="float: right; position: relative; top: 8px"> <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" style="float: right; position: relative; top: 8px"> <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" style="float: right; top: 8px;"> <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" style="float: right; top: 8px;"> <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> </div> </div> </div> </div> </div> <div id="fileinfodiv" style="overflow: auto;"> <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> <div id="bot" class="split" style="height: calc(100% - 80px)"> <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="copyToClipboard()"></button> </div> </div> <div id="dbg"></div> <table class="bom"> <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>
Report a bug