Compare commits
49 Commits
main
..
877e801bd0
| Author | SHA1 | Date | |
|---|---|---|---|
| 877e801bd0 | |||
| 411bcb592b | |||
| 41f54481ff | |||
| bc09ab26dd | |||
| 143795c47b | |||
| 4318d94060 | |||
| 4b5a6a2d09 | |||
| d4182a9118 | |||
| df5e04a463 | |||
| 3d48426b1f | |||
| d082f0f3d4 | |||
| 1a727e5e8a | |||
| 8b0266b21b | |||
| 2f8a1b9869 | |||
| 8db1654c3d | |||
| 779b20e217 | |||
| d5b00da42c | |||
| 621f7d84bc | |||
| 8602fd6a10 | |||
| 12b243df56 | |||
| cea109440e | |||
| bee1240b7e | |||
| 730e6e204a | |||
| f5cf91707d | |||
| f545a5f217 | |||
| 832f727e84 | |||
| 71d3dd0ffb | |||
| acd5ff8524 | |||
| 71e6913cd8 | |||
| 18040356d0 | |||
| 5caa450e69 | |||
| 4c0c81234f | |||
| 999aa87807 | |||
| c1e0c16472 | |||
| 6a0f1050fe | |||
| c00f1ce352 | |||
| 8e94e7b580 | |||
| b752ffdc56 | |||
| 0e4308be37 | |||
| 6dadcf0b05 | |||
| 02b8af50a7 | |||
| 370d5c1ac6 | |||
| 4e6ec4d2fe | |||
| 31a5eb676f | |||
| 1fa3de130e | |||
| fc4a488534 | |||
| 3dcb32765f | |||
| de7ed20a5f | |||
| 35b4f6d342 |
@@ -0,0 +1,7 @@
|
||||
*.csv filter=bom_csv
|
||||
*.html filter=bom_html
|
||||
*.gbr filter=gerber
|
||||
*.gbrjob filter=gbrjob
|
||||
*.xml filter=xml
|
||||
*.kicad_pcb filter=kicad_pcb_f
|
||||
*.net filter=net_filter
|
||||
@@ -0,0 +1,20 @@
|
||||
[filter "bom_csv"]
|
||||
clean = sed -E 's/^BoM Date:.*$/BoM Date:Date/'
|
||||
smudge = sed -E \"s/BoM Date:Date/BoM Date:,`date +\\\"%a %d %b %Y %X %:::z\\\"`/\"
|
||||
[filter "bom_html"]
|
||||
clean = sed -E 's/^<tr><td>BoM Date<\\/td><td>.*$/<tr><td>BoM Date<\\/td><td>Date<\\/td><\\/tr>/'
|
||||
smudge = sed -E \"s/<tr><td>BoM Date<\\/td><td>Date<\\/td><\\/tr>/<tr><td>BoM Date<\\/td><td>`date +\\\"%a %d %b %Y %X %:::z\\\"`<\\/td><\\/tr>/\"
|
||||
[filter "gerber"]
|
||||
clean = sed -E -e 's/^%TF.CreationDate,.*$/%TF.CreationDate,Date%/' -e 's/^G04 Created by KiCad.*$/G04 Created by KiCad*/'
|
||||
smudge = sed -E \"s/%TF.CreationDate,Date%/%TF.CreationDate,`date +%Y-%m-%dT%H:%M:%S%:z`/\"
|
||||
[filter "gbrjob"]
|
||||
clean = sed -E 's/\"CreationDate\":.*/\"CreationDate\": \"Date\"/'
|
||||
smudge = sed -E \"s/\\\"CreationDate\\\": \\\"Date\\\"/\\\"CreationDate\\\": \\\"`date +%Y-%m-%dT%H:%M:%S%:z`\\\"/\"
|
||||
[filter "xml"]
|
||||
clean = sed -E -e 's/^ <date>.*<\\/date>/ <date>Date2<\\/date>/' -e 's/^ <date>.*<\\/date>/ <date>Date1<\\/date>/'
|
||||
smudge = sed -E -e \"s/<date>Date1<\\/date>/<date>`date +\\\"%a %d %b %Y %X %:::z\\\"`<\\/date>/\" -e \"s/<date>Date2<\\/date>/<date>`date +\\\"%Y-%m-%d\\\"`<\\/date>/\"
|
||||
[filter "kicad_pcb_f"]
|
||||
clean = sed -E 's/\\(host pcbnew ([[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+).*/\\(host pcbnew \\1\\)/'
|
||||
[filter "net_filter"]
|
||||
clean = sed -E -e 's/\\(date \\\".*\\\"\\)/\\(date \\\"Date\\\"\\)/'
|
||||
smudge = sed -E -e \"s/\\(date \\\"Date\\\"\\)/\\(date \\\"`date +\\\"%a %d %b %Y %X %:::z\\\"`\\\"\\)/\"
|
||||
@@ -19,13 +19,12 @@ env:
|
||||
|
||||
# Update these to correspond to the KiCad version
|
||||
kibot_group: "all_group"
|
||||
kibot_tag: "v2_k9"
|
||||
kicad_image: "kicad9_auto_full"
|
||||
kibot_tag: "v2_dk9"
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
container: ghcr.io/inti-cmnb/${{ env.kicad_image }}
|
||||
container: ghcr.io/inti-cmnb/kicad9_auto_full:dev
|
||||
if: ${{ github.ref_type == 'tag' || !startsWith(github.event.head_commit.message, 'Merge pull request') }}
|
||||
|
||||
steps:
|
||||
@@ -96,7 +95,7 @@ jobs:
|
||||
additional_args="--skip-pre draw_fancy_stackup,erc,drc ${version_arg} --log ${{ env.kibot_log }} draft_group"
|
||||
;;
|
||||
"WORKING")
|
||||
additional_args="--skip-pre erc,drc ${version_arg} --log ${{ env.kibot_log }} ${{ env.kibot_group }}"
|
||||
additional_args="--skip-pre erc,drc ${version_arg} -E BLENDER_SAMPLES=2 --log ${{ env.kibot_log }} ${{ env.kibot_group }}"
|
||||
;;
|
||||
"REVIEW"|"RELEASE")
|
||||
additional_args="${version_arg} --log ${{ env.kibot_log }} ${{ env.kibot_group }}"
|
||||
@@ -121,6 +120,17 @@ jobs:
|
||||
path: ~/3d_models
|
||||
key: 3d_models
|
||||
|
||||
- name: Run KiBot (Update XML)
|
||||
uses: inti-cmnb/kibot@${{ env.kibot_tag }}
|
||||
with:
|
||||
config: kibot/yaml/kibot_pre_update_xml.yaml
|
||||
|
||||
- name: Run KiBot (Preprocessing)
|
||||
uses: inti-cmnb/kibot@${{ env.kibot_tag }}
|
||||
with:
|
||||
additional_args: --skip-pre all ${{ env.version_arg }} preprocess_group
|
||||
config: ${{ env.kibot_config }}
|
||||
|
||||
- name: Run KiBot (Outputs)
|
||||
uses: inti-cmnb/kibot@${{ env.kibot_tag }}
|
||||
env:
|
||||
|
||||
@@ -16,6 +16,8 @@ kibot_*.kicad_dru
|
||||
kibot_*.kicad_prl
|
||||
kibot_*.kicad_pro
|
||||
kibot_run.log
|
||||
pcbnew.kicad_wks
|
||||
schematic.kicad_wks
|
||||
|
||||
# ---> KiCad
|
||||
# For PCBs designed using KiCad: https://www.kicad.org/
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
"other_text_thickness": 0.15,
|
||||
"other_text_upright": false,
|
||||
"pads": {
|
||||
"drill": 0.8,
|
||||
"height": 1.27,
|
||||
"width": 2.54
|
||||
"drill": 0.0,
|
||||
"height": 0.245,
|
||||
"width": 0.245
|
||||
},
|
||||
"silk_line_width": 0.1,
|
||||
"silk_text_italic": false,
|
||||
@@ -187,7 +187,8 @@
|
||||
}
|
||||
],
|
||||
"track_widths": [
|
||||
0.0
|
||||
0.0,
|
||||
0.09
|
||||
],
|
||||
"tuning_pattern_settings": {
|
||||
"diff_pair_defaults": {
|
||||
@@ -231,7 +232,151 @@
|
||||
"mpn": ""
|
||||
},
|
||||
"layer_pairs": [],
|
||||
"layer_presets": [],
|
||||
"layer_presets": [
|
||||
{
|
||||
"activeLayer": -2,
|
||||
"flipBoard": false,
|
||||
"layers": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9,
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
13,
|
||||
14,
|
||||
15,
|
||||
16,
|
||||
18,
|
||||
19,
|
||||
20,
|
||||
22,
|
||||
24,
|
||||
25,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
30,
|
||||
31,
|
||||
32,
|
||||
34,
|
||||
36,
|
||||
37,
|
||||
38,
|
||||
40,
|
||||
42,
|
||||
44,
|
||||
46,
|
||||
48,
|
||||
50,
|
||||
52,
|
||||
54,
|
||||
56,
|
||||
57,
|
||||
58,
|
||||
59,
|
||||
60,
|
||||
61,
|
||||
62,
|
||||
63,
|
||||
64,
|
||||
65,
|
||||
66,
|
||||
67,
|
||||
68,
|
||||
69,
|
||||
70,
|
||||
71,
|
||||
72,
|
||||
73,
|
||||
74,
|
||||
75,
|
||||
76,
|
||||
77,
|
||||
78,
|
||||
79,
|
||||
80,
|
||||
81,
|
||||
82,
|
||||
83,
|
||||
84,
|
||||
85,
|
||||
86,
|
||||
87,
|
||||
88,
|
||||
89,
|
||||
90,
|
||||
91,
|
||||
92,
|
||||
93,
|
||||
94,
|
||||
95,
|
||||
96,
|
||||
97,
|
||||
98,
|
||||
99,
|
||||
100,
|
||||
101,
|
||||
102,
|
||||
103,
|
||||
104,
|
||||
105,
|
||||
106,
|
||||
107,
|
||||
108,
|
||||
109,
|
||||
110,
|
||||
111,
|
||||
112,
|
||||
113,
|
||||
114,
|
||||
115,
|
||||
116,
|
||||
117,
|
||||
118,
|
||||
119,
|
||||
120,
|
||||
121,
|
||||
122,
|
||||
123,
|
||||
124,
|
||||
125,
|
||||
126,
|
||||
127
|
||||
],
|
||||
"name": "Routing Layers",
|
||||
"renderLayers": [
|
||||
"vias",
|
||||
"footprint_text",
|
||||
"footprint_anchors",
|
||||
"ratsnest",
|
||||
"grid",
|
||||
"footprints_front",
|
||||
"footprints_back",
|
||||
"footprint_values",
|
||||
"footprint_references",
|
||||
"tracks",
|
||||
"drc_errors",
|
||||
"drawing_sheet",
|
||||
"bitmaps",
|
||||
"pads",
|
||||
"zones",
|
||||
"drc_warnings",
|
||||
"drc_exclusions",
|
||||
"locked_item_shadows",
|
||||
"conflict_shadows",
|
||||
"shapes"
|
||||
]
|
||||
}
|
||||
],
|
||||
"viewports": []
|
||||
},
|
||||
"boards": [],
|
||||
@@ -464,7 +609,7 @@
|
||||
"pinned_symbol_libs": []
|
||||
},
|
||||
"meta": {
|
||||
"filename": "Asymworks_Template.kicad_pro",
|
||||
"filename": "Test_5.kicad_pro",
|
||||
"version": 3
|
||||
},
|
||||
"net_settings": {
|
||||
@@ -507,7 +652,7 @@
|
||||
"svg": "",
|
||||
"vrml": ""
|
||||
},
|
||||
"page_layout_descr_file": "kicad-embed://Asymworks_PCB.kicad_wks"
|
||||
"page_layout_descr_file": "${KIPRJMOD}/templates/Asymworks_PCB.kicad_wks"
|
||||
},
|
||||
"schematic": {
|
||||
"annotate_start_num": 0,
|
||||
@@ -548,19 +693,19 @@
|
||||
"group_by": true,
|
||||
"label": "DNP",
|
||||
"name": "${DNP}",
|
||||
"show": true
|
||||
"show": false
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
"label": "Exclude from BOM",
|
||||
"name": "${EXCLUDE_FROM_BOM}",
|
||||
"show": true
|
||||
"show": false
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
"label": "Exclude from Board",
|
||||
"name": "${EXCLUDE_FROM_BOARD}",
|
||||
"show": true
|
||||
"show": false
|
||||
},
|
||||
{
|
||||
"group_by": true,
|
||||
@@ -573,14 +718,50 @@
|
||||
"label": "Datasheet",
|
||||
"name": "Datasheet",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "LCSC",
|
||||
"name": "LCSC",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Asymworks IPN",
|
||||
"name": "Asymworks IPN",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Description",
|
||||
"name": "Description",
|
||||
"show": false
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "#",
|
||||
"name": "${ITEM_NUMBER}",
|
||||
"show": false
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Manufacturer",
|
||||
"name": "Manufacturer",
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"group_by": false,
|
||||
"label": "Manufacturer PN",
|
||||
"name": "Manufacturer PN",
|
||||
"show": true
|
||||
}
|
||||
],
|
||||
"filter_string": "",
|
||||
"group_symbols": true,
|
||||
"include_excluded_from_bom": true,
|
||||
"name": "Default Editing",
|
||||
"name": "",
|
||||
"sort_asc": true,
|
||||
"sort_field": "Reference"
|
||||
"sort_field": "Asymworks IPN"
|
||||
},
|
||||
"connection_grid_size": 50.0,
|
||||
"drawing": {
|
||||
@@ -591,7 +772,7 @@
|
||||
"field_names": [],
|
||||
"intersheets_ref_own_page": false,
|
||||
"intersheets_ref_prefix": "",
|
||||
"intersheets_ref_short": true,
|
||||
"intersheets_ref_short": false,
|
||||
"intersheets_ref_show": false,
|
||||
"intersheets_ref_suffix": "",
|
||||
"junction_size_choice": 3,
|
||||
@@ -637,15 +818,15 @@
|
||||
],
|
||||
[
|
||||
"a5aa3c11-5084-4ea5-9da5-c9ff4a86f01f",
|
||||
"Circuit 1"
|
||||
"Load Cell Amp"
|
||||
],
|
||||
[
|
||||
"9da43fd7-7a0a-403c-bf2c-ba67cd8fa669",
|
||||
"Circuit 2"
|
||||
"BLE Controller"
|
||||
],
|
||||
[
|
||||
"6c8ce547-8e28-496a-9003-0e7dbfd93e8c",
|
||||
"Circuit 3"
|
||||
"Power and Interface"
|
||||
],
|
||||
[
|
||||
"20edd200-9383-4d87-bd58-f882adb4f112",
|
||||
@@ -653,31 +834,34 @@
|
||||
]
|
||||
],
|
||||
"text_variables": {
|
||||
"ASSEMBLY_NAME": "",
|
||||
"ASSEMBLY_NUMBER": "",
|
||||
"ASSEMBLY_SCALE": "",
|
||||
"ASSEMBLY_NAME": "Assembly Name",
|
||||
"ASSEMBLY_NOTES": "",
|
||||
"ASSEMBLY_NUMBER": "A99-9000",
|
||||
"ASSEMBLY_SCALE": "1",
|
||||
"COMPANY": "Asymworks, LLC",
|
||||
"DESIGNER": "JPK",
|
||||
"DWG_NUMBER_PCB": "",
|
||||
"DWG_NUMBER_SCH": "",
|
||||
"DWG_TITLE_ASSY": "",
|
||||
"DWG_TITLE_PCB": "",
|
||||
"DWG_TITLE_SCH": "",
|
||||
"GIT_HASH": "",
|
||||
"GIT_HASH_PCB": "",
|
||||
"GIT_HASH_SCH": "",
|
||||
"GIT_URL": "",
|
||||
"PROJECT_CODE": "",
|
||||
"RELEASE_DATE": "",
|
||||
"RELEASE_STATE": "",
|
||||
"REVISION": "${REVISION}",
|
||||
"SCALE": "1:1",
|
||||
"DWG_NUMBER_PCB": "P99-9000",
|
||||
"DWG_NUMBER_SCH": "S99-9000",
|
||||
"DWG_TITLE_ASSY": "PCB Assembly, Assembly Name",
|
||||
"DWG_TITLE_PCB": "PCB, Assembly Name",
|
||||
"DWG_TITLE_SCH": "Schematic, Assembly Name",
|
||||
"FABRICATION_NOTES": "FABRICATION NOTES (UNLESS OTHERWISE SPECIFIED)\n\n1)\tFABRICATE PER IPC-6012A CLASS 2.\n\n2)\tOUTLINE DEFINED IN SEPARATE GERBER FILE WITH\n\t\"Edge_Cuts.GBR\" SUFFIX.\n\n3)\tSEE SEPARATE DRILL FILES WITH \".DRL\" SUFFIX \n\tFOR HOLE LOCATIONS.\n\n\tSELECTED HOLE LOCATIONS SHOWN ON THIS DRAWING \n\tFOR REFERENCE ONLY.\n\n4)\tSURFACE FINISH: HAL SNPB\n\n5)\tSOLDERMASK ON BOTH SIDES OF THE BOARD SHALL \n\tBE LPI, COLOR GREEN.\n\n6)\tSILK SCREEN LEGEND TO BE APPLIED PER LAYER \n\tSTACKUP USING WHITE NON-CONDUCTIVE EPOXY INK.\n\n7)\tALL VIAS ARE TENTED ON BOTH SIDES UNLESS \n\tSOLDERMASK OPENED IN GERBER.\n\n8)\tRESERVED\n\n9)\tPCB MATERIAL REQUIREMENTS:\n\n\tA.\tFLAMMABILITY RATING MUST MEET OR EXCEED \n\t\tUL94V-0 REQUIREMENTS.\n\tB.\tTg 135 C OR EQUIVALENT.\n\n10)\tDESIGN GEOMETRY MINIMUM FEATURE SIZES:\n\n\tBOARD SIZE\t\t\t\t46.000 \u00d7 27.500 mm\n\tBOARD THICKNESS\t\t1.647 mm\n\tTRACE WIDTH\t\t\t0.100 mm\n\tTRACE TO TRACE\t\t0.200 mm\n\tMIN. HOLE (PTH)\t\t\t0.300 mm\n\tMIN. HOLE (NPTH)\t\t2.200 mm\n\tANNULAR RING\t\t\t0.150 mm\n\tCOPPER TO HOLE\t\t0.250 mm\n\tCOPPER TO EDGE\t\t0.500 mm\n\tHOLE TO HOLE\t\t\t0.250 mm\n\n11)\tALL DIMENSIONS ARE IN MILLIMETERS UNLESS OTHERWISE\n\tSPECIFIED.\n\n12)\tFOR REFERENCE ONLY THE STACKUP CORRESPONDS TO JLCPCB\n\tSTACKUP JLC04161H-7628.\n\tFOR REFERENCE ONLY. IMPEDANCE IS THE CONTROLLING PARAMETER\n\tOVER LAYER STACKUP. GERBER DATA MAY NOT BE ALTERED EXCEPT\n\tFOR STANDARD FABRICATION ALLOWANCES.\n\n\tTHE SUPPLIED ARTWORK MAY OR MAY NOT CONTAIN THE SPECIFIED\n\tTRACE GEOMETRIES ON EVERY LAYERS SPECIFIED.",
|
||||
"GIT_HASH": "bc09ab2",
|
||||
"GIT_HASH_PCB": "d4182a9",
|
||||
"GIT_HASH_SCH": "5caa450",
|
||||
"GIT_URL": "/jkrauss/Test_4",
|
||||
"PROJECT_CODE": "P99",
|
||||
"RELEASE_DATE": "2026-03-09",
|
||||
"RELEASE_STATE": "WORKING",
|
||||
"REVISION": "NO_TAG+ (Unreleased)",
|
||||
"SCALE": "2:1",
|
||||
"SCHEMATIC_NOTES": "Unless otherwise specified, components Values are in ohms, \u00b5F, and \u00b5H.",
|
||||
"SHEET_NAME_01": "Cover Page",
|
||||
"SHEET_NAME_02": "Block Diagram",
|
||||
"SHEET_NAME_03": "Project Architecture",
|
||||
"SHEET_NAME_04": "Circuit 1",
|
||||
"SHEET_NAME_05": "Circuit 2",
|
||||
"SHEET_NAME_06": "Circuit 3",
|
||||
"SHEET_NAME_04": "Load Cell Amp",
|
||||
"SHEET_NAME_05": "BLE Controller",
|
||||
"SHEET_NAME_06": "Power and Interface",
|
||||
"SHEET_NAME_07": "Parts List",
|
||||
"SHEET_NAME_08": "......................................",
|
||||
"SHEET_NAME_09": "......................................",
|
||||
@@ -695,4 +879,4 @@
|
||||
"STATE": "TEMPLATE",
|
||||
"VARIANT": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,971 @@
|
||||
(kicad_sch
|
||||
(version 20250114)
|
||||
(generator "eeschema")
|
||||
(generator_version "9.0")
|
||||
(uuid "8bfb0b6c-9e3a-4761-bc1e-4eb40915aa0b")
|
||||
(paper "A4")
|
||||
(title_block
|
||||
(title "Title Page")
|
||||
(date "${RELEASE_DATE}")
|
||||
(rev "${REVISION}")
|
||||
(company "${COMPANY}")
|
||||
)
|
||||
(lib_symbols)
|
||||
(text "${SHEET_NAME_11}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 44.45 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#11")
|
||||
)
|
||||
(uuid "07b17941-5203-45fd-9bf5-869029f2918b")
|
||||
)
|
||||
(text "Sheet 20"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 78.74 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#20")
|
||||
)
|
||||
(uuid "14b92651-4c98-49cc-b701-061efd650be6")
|
||||
)
|
||||
(text "${SHEET_NAME_10}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 78.74 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#10")
|
||||
)
|
||||
(uuid "16a2336d-90de-4e2f-93d8-21e2703f0a5e")
|
||||
)
|
||||
(text "Sheet 4"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 55.88 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#4")
|
||||
)
|
||||
(uuid "1a1df999-6f42-488d-9515-537e1d9ec823")
|
||||
)
|
||||
(text "DESIGN NOTES"
|
||||
(exclude_from_sim no)
|
||||
(at 13.97 184.15 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.54 2.54)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
)
|
||||
(uuid "1d4a31e9-3e9d-49f9-ab05-35cee528d5af")
|
||||
)
|
||||
(text "Sheet 18"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 71.12 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#18")
|
||||
)
|
||||
(uuid "22d7f7b5-df2c-4cdd-8b4a-5b989d21376c")
|
||||
)
|
||||
(text "${SHEET_NAME_18}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 71.12 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#18")
|
||||
)
|
||||
(uuid "25659fbe-5282-4a29-815e-3ef2e27bcd58")
|
||||
)
|
||||
(text "${SHEET_NAME_08}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 71.12 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#8")
|
||||
)
|
||||
(uuid "2bf644fa-1f52-4c60-863e-29b18d4919ec")
|
||||
)
|
||||
(text "${SHEET_NAME_17}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 67.31 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#17")
|
||||
)
|
||||
(uuid "34d21295-3fbb-4e3d-97b2-14e1ffce8dd2")
|
||||
)
|
||||
(text "Sheet 19"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 74.93 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#19")
|
||||
)
|
||||
(uuid "4787629f-351c-47c8-840d-4ba3fdfe9b9a")
|
||||
)
|
||||
(text "Sheet 16"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 63.5 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#16")
|
||||
)
|
||||
(uuid "4d9bda3e-709f-4d72-9628-687c72e84a07")
|
||||
)
|
||||
(text "${SHEET_NAME_14}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 55.88 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#14")
|
||||
)
|
||||
(uuid "5daeb444-87e9-4c99-984f-34b2d16949ee")
|
||||
)
|
||||
(text "TABLE OF CONTENTS"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 37.846 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.54 2.54)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
)
|
||||
(uuid "64e82ea8-c833-47b2-952c-20433a984005")
|
||||
)
|
||||
(text "Sheet 11"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 44.45 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#11")
|
||||
)
|
||||
(uuid "69ffe358-203f-447c-bb7a-dfd8b5952bb2")
|
||||
)
|
||||
(text "SCHEMATIC NOTES"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 88.9 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.54 2.54)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
)
|
||||
(uuid "6b4c1c9c-5583-4506-a856-7585e964a9aa")
|
||||
)
|
||||
(text "Sheet 9"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 74.93 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#9")
|
||||
)
|
||||
(uuid "6caf5434-4a54-43a2-ba2e-6f2d9dc3d48c")
|
||||
)
|
||||
(text "${SHEET_NAME_05}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 59.69 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#5")
|
||||
)
|
||||
(uuid "771adef3-abde-471a-b781-f095d5eb34c9")
|
||||
)
|
||||
(text "${SHEET_NAME_15}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 59.69 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#15")
|
||||
)
|
||||
(uuid "788e141e-7d17-49b0-9da0-ef00b74f2c7d")
|
||||
)
|
||||
(text "${SHEET_NAME_20}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 78.74 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#20")
|
||||
)
|
||||
(uuid "7fca47ab-c5ff-471a-9cc1-7c585b8ebb88")
|
||||
)
|
||||
(text "Sheet 17"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 67.31 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#17")
|
||||
)
|
||||
(uuid "8142fe45-a43b-47f1-bd73-436da691ebb3")
|
||||
)
|
||||
(text "${SHEET_NAME_12}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 48.26 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#12")
|
||||
)
|
||||
(uuid "82c1cb62-b337-4c34-abc1-d317a89265b1")
|
||||
)
|
||||
(text "${SHEET_NAME_02}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 48.26 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#2")
|
||||
)
|
||||
(uuid "848876e8-0ba0-4894-9878-40959698a72e")
|
||||
)
|
||||
(text "${SHEET_NAME_13}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 52.07 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#13")
|
||||
)
|
||||
(uuid "857f2374-4c93-4669-8525-a7317b1686c6")
|
||||
)
|
||||
(text "${SHEET_NAME_04}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 55.88 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#4")
|
||||
)
|
||||
(uuid "8db3ec72-d092-4102-a408-0032fcd7d392")
|
||||
)
|
||||
(text "Sheet 3"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 52.07 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#3")
|
||||
)
|
||||
(uuid "9312db9f-86cf-46f5-a5d1-9cc6a82364a9")
|
||||
)
|
||||
(text "Sheet 8"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 71.12 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#8")
|
||||
)
|
||||
(uuid "9fb2f352-41fa-4938-9dd5-8313ea8f61da")
|
||||
)
|
||||
(text "${SHEET_NAME_16}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 63.5 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#16")
|
||||
)
|
||||
(uuid "a020e46d-8225-4e01-bb22-f18e0b2294b1")
|
||||
)
|
||||
(text "Sheet 10"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 78.74 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#10")
|
||||
)
|
||||
(uuid "a4b2c8fb-8ce6-4c96-8e0c-ac777ef0bf65")
|
||||
)
|
||||
(text "Sheet 13"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 52.07 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#13")
|
||||
)
|
||||
(uuid "b7f57fe6-a570-4b9d-8437-17c782ced604")
|
||||
)
|
||||
(text "Sheet 12"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 48.26 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#12")
|
||||
)
|
||||
(uuid "b9321e4f-7dfa-4600-9dd7-c7ced232f433")
|
||||
)
|
||||
(text "${SHEET_NAME_01}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 44.45 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#1")
|
||||
)
|
||||
(uuid "c4fe9a96-20bc-4df3-8d76-4ccf5c21d47c")
|
||||
)
|
||||
(text "${SHEET_NAME_19}"
|
||||
(exclude_from_sim no)
|
||||
(at 86.36 74.93 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#19")
|
||||
)
|
||||
(uuid "c6a94c62-f060-4037-84c7-29538e6dd3f1")
|
||||
)
|
||||
(text "Sheet 5"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 59.69 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#5")
|
||||
)
|
||||
(uuid "c7bd7eba-ff68-43dd-bb8c-04c1fbc87c75")
|
||||
)
|
||||
(text "Sheet 14"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 55.88 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#14")
|
||||
)
|
||||
(uuid "cd1581af-43a2-4cd2-bf9a-455991f26447")
|
||||
)
|
||||
(text "${SHEET_NAME_03}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 52.07 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#3")
|
||||
)
|
||||
(uuid "d10cf4e6-afe0-43c1-97c0-c5acca355fbe")
|
||||
)
|
||||
(text "${SHEET_NAME_09}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 74.93 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#9")
|
||||
)
|
||||
(uuid "d3790e5a-7038-4264-8273-f5956b92270a")
|
||||
)
|
||||
(text "PCBA RENDERS"
|
||||
(exclude_from_sim no)
|
||||
(at 190.5 38.1 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.54 2.54)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
)
|
||||
(uuid "dc47b26e-b684-4cdc-9da4-1d2f6961c536")
|
||||
)
|
||||
(text "Sheet 7"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 67.31 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#7")
|
||||
)
|
||||
(uuid "e03f3108-e6c3-4dbc-8263-8eec0b861390")
|
||||
)
|
||||
(text "Sheet 2"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 48.26 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#2")
|
||||
)
|
||||
(uuid "e5f9b89b-997c-4b41-87eb-506c6f57ff2a")
|
||||
)
|
||||
(text "${SHEET_NAME_06}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 63.5 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#6")
|
||||
)
|
||||
(uuid "e8343913-ebb3-4168-b13e-0b5990f1b749")
|
||||
)
|
||||
(text "Sheet 1"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 44.45 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#1")
|
||||
)
|
||||
(uuid "e838d875-06da-4fe1-92a6-f67318693045")
|
||||
)
|
||||
(text "Sheet 15"
|
||||
(exclude_from_sim no)
|
||||
(at 76.2 59.69 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#15")
|
||||
)
|
||||
(uuid "ea3886dc-5d3c-4468-855f-a2cb6b276128")
|
||||
)
|
||||
(text "Sheet 6"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 63.5 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#6")
|
||||
)
|
||||
(uuid "f94e26f5-5181-4526-932c-fef33ad3dbf5")
|
||||
)
|
||||
(text "${SHEET_NAME_07}"
|
||||
(exclude_from_sim no)
|
||||
(at 35.56 67.31 0)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial Narrow")
|
||||
(size 2.032 2.032)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left bottom)
|
||||
(href "#7")
|
||||
)
|
||||
(uuid "fd9fe035-5933-4166-bdf5-daf42a1a401a")
|
||||
)
|
||||
(text_box "Replace this with \"kibot_image_blender_3d_angled_top\" to invoke the Blender 3D Rendering output."
|
||||
(exclude_from_sim no)
|
||||
(at 190.5 39.37 0)
|
||||
(size 74.93 50.8)
|
||||
(margins 0.9525 0.9525 0.9525 0.9525)
|
||||
(stroke
|
||||
(width 0)
|
||||
(type solid)
|
||||
)
|
||||
(fill
|
||||
(type none)
|
||||
)
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
(uuid "5767a21c-ea5b-42e0-9141-921c37492c0d")
|
||||
)
|
||||
(text_box "DESIGN NOTE:\nExample text for debug notes."
|
||||
(exclude_from_sim no)
|
||||
(at 67.31 185.42 0)
|
||||
(size 25.4 10.16)
|
||||
(margins 1.27 1.27 1.27 1.27)
|
||||
(stroke
|
||||
(width 0.635)
|
||||
(type solid)
|
||||
(color 255 165 0 1)
|
||||
)
|
||||
(fill
|
||||
(type none)
|
||||
)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial")
|
||||
(size 1.27 1.27)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
(uuid "7804ab3d-3354-43de-a859-68cd8b155d7d")
|
||||
)
|
||||
(text_box "${SCHEMATIC_NOTES}"
|
||||
(exclude_from_sim no)
|
||||
(at 25.4 90.17 0)
|
||||
(size 101.6 74.93)
|
||||
(margins 0 0 0 0)
|
||||
(stroke
|
||||
(width -0.0001)
|
||||
(type solid)
|
||||
)
|
||||
(fill
|
||||
(type none)
|
||||
)
|
||||
(effects
|
||||
(font
|
||||
(face "Inconsolata")
|
||||
(size 2.032 2.032)
|
||||
(thickness 0.254)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
(uuid "7adab115-8568-4a73-9aed-e42ca8b4873b")
|
||||
)
|
||||
(text_box "DESIGN NOTE:\nExample text for critical design notes."
|
||||
(exclude_from_sim no)
|
||||
(at 120.65 185.42 0)
|
||||
(size 25.4 10.16)
|
||||
(margins 1.27 1.27 1.27 1.27)
|
||||
(stroke
|
||||
(width 0.635)
|
||||
(type solid)
|
||||
(color 255 0 0 1)
|
||||
)
|
||||
(fill
|
||||
(type none)
|
||||
)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial")
|
||||
(size 1.27 1.27)
|
||||
(thickness 0.4)
|
||||
(bold yes)
|
||||
(color 255 0 0 1)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
(uuid "93934827-2fe7-456a-aaa9-350926ccc3cf")
|
||||
)
|
||||
(text_box "DESIGN NOTE:\nExample text for cautionary design notes."
|
||||
(exclude_from_sim no)
|
||||
(at 40.64 185.42 0)
|
||||
(size 25.4 10.16)
|
||||
(margins 1.27 1.27 1.27 1.27)
|
||||
(stroke
|
||||
(width 0.508)
|
||||
(type solid)
|
||||
(color 250 236 0 1)
|
||||
)
|
||||
(fill
|
||||
(type none)
|
||||
)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial")
|
||||
(size 1.27 1.27)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
(uuid "b25ebab3-7089-45e6-b13e-efd73a0ad216")
|
||||
)
|
||||
(text_box "Replace this with \"kibot_image_blender_3d_angled_bottom\" to invoke the Blender 3D Rendering output."
|
||||
(exclude_from_sim no)
|
||||
(at 190.5 101.6 0)
|
||||
(size 74.93 50.8)
|
||||
(margins 0.9525 0.9525 0.9525 0.9525)
|
||||
(stroke
|
||||
(width 0)
|
||||
(type solid)
|
||||
)
|
||||
(fill
|
||||
(type none)
|
||||
)
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
(uuid "b9b2a7ca-498c-4ac1-9922-a80432e07c54")
|
||||
)
|
||||
(text_box "DESIGN NOTE:\nExample text for informational design notes."
|
||||
(exclude_from_sim no)
|
||||
(at 13.97 185.42 0)
|
||||
(size 25.4 10.16)
|
||||
(margins 1.27 1.27 1.27 1.27)
|
||||
(stroke
|
||||
(width 0.508)
|
||||
(type solid)
|
||||
(color 200 200 200 1)
|
||||
)
|
||||
(fill
|
||||
(type none)
|
||||
)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial")
|
||||
(size 1.27 1.27)
|
||||
(color 0 0 0 1)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
(uuid "da2d92ef-76df-4dc4-be35-0543aefd4b3d")
|
||||
)
|
||||
(text_box "LAYOUT NOTE:\nExample text for critical layout guidelines."
|
||||
(exclude_from_sim no)
|
||||
(at 93.98 185.42 0)
|
||||
(size 25.4 10.16)
|
||||
(margins 1.27 1.27 1.27 1.27)
|
||||
(stroke
|
||||
(width 0.635)
|
||||
(type solid)
|
||||
(color 0 0 255 1)
|
||||
)
|
||||
(fill
|
||||
(type none)
|
||||
)
|
||||
(effects
|
||||
(font
|
||||
(face "Arial")
|
||||
(size 1.27 1.27)
|
||||
(thickness 0.4)
|
||||
(bold yes)
|
||||
(color 0 0 255 1)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
(uuid "e540faed-aec1-4b43-a76c-3bd1fdf6daac")
|
||||
)
|
||||
(sheet
|
||||
(at 364.49 307.34)
|
||||
(size 27.94 7.62)
|
||||
(exclude_from_sim no)
|
||||
(in_bom yes)
|
||||
(on_board yes)
|
||||
(dnp no)
|
||||
(fields_autoplaced yes)
|
||||
(stroke
|
||||
(width 0.1524)
|
||||
(type solid)
|
||||
)
|
||||
(fill
|
||||
(color 0 0 0 0.0000)
|
||||
)
|
||||
(uuid "20edd200-9383-4d87-bd58-f882adb4f112")
|
||||
(property "Sheetname" "Parts List"
|
||||
(at 364.49 306.6284 0)
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
)
|
||||
(justify left bottom)
|
||||
)
|
||||
)
|
||||
(property "Sheetfile" "sheets/Parts_List.kicad_sch"
|
||||
(at 364.49 315.5446 0)
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
)
|
||||
(instances
|
||||
(project "Test_5"
|
||||
(path "/8bfb0b6c-9e3a-4761-bc1e-4eb40915aa0b"
|
||||
(page "7")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(sheet
|
||||
(at 280.67 307.34)
|
||||
(size 27.94 7.62)
|
||||
(exclude_from_sim no)
|
||||
(in_bom yes)
|
||||
(on_board yes)
|
||||
(dnp no)
|
||||
(fields_autoplaced yes)
|
||||
(stroke
|
||||
(width 0.1524)
|
||||
(type solid)
|
||||
)
|
||||
(fill
|
||||
(color 0 0 0 0.0000)
|
||||
)
|
||||
(uuid "28ad8293-baaf-4ee1-8056-ad34096542a0")
|
||||
(property "Sheetname" "Block Diagram"
|
||||
(at 280.67 306.6284 0)
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
)
|
||||
(justify left bottom)
|
||||
)
|
||||
)
|
||||
(property "Sheetfile" "sheets/Block_Diagram.kicad_sch"
|
||||
(at 280.67 315.5446 0)
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
)
|
||||
(instances
|
||||
(project "Test_5"
|
||||
(path "/8bfb0b6c-9e3a-4761-bc1e-4eb40915aa0b"
|
||||
(page "2")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(sheet
|
||||
(at 322.58 307.34)
|
||||
(size 27.94 7.62)
|
||||
(exclude_from_sim no)
|
||||
(in_bom yes)
|
||||
(on_board yes)
|
||||
(dnp no)
|
||||
(fields_autoplaced yes)
|
||||
(stroke
|
||||
(width 0.1524)
|
||||
(type solid)
|
||||
)
|
||||
(fill
|
||||
(color 0 0 0 0.0000)
|
||||
)
|
||||
(uuid "f6afef58-d841-4ad6-baf9-746b0a35f011")
|
||||
(property "Sheetname" "Project Architecture"
|
||||
(at 322.58 306.6284 0)
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
)
|
||||
(justify left bottom)
|
||||
)
|
||||
)
|
||||
(property "Sheetfile" "sheets/Architecture.kicad_sch"
|
||||
(at 322.58 315.5446 0)
|
||||
(effects
|
||||
(font
|
||||
(size 1.27 1.27)
|
||||
)
|
||||
(justify left top)
|
||||
)
|
||||
)
|
||||
(instances
|
||||
(project "Test_5"
|
||||
(path "/8bfb0b6c-9e3a-4761-bc1e-4eb40915aa0b"
|
||||
(page "3")
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(sheet_instances
|
||||
(path "/"
|
||||
(page "1")
|
||||
)
|
||||
)
|
||||
(embedded_fonts no)
|
||||
(embedded_files
|
||||
(file
|
||||
(name "Asymworks_SCH.kicad_wks")
|
||||
(type worksheet)
|
||||
(data |KLUv/WDBHEUnAGZwkyfwsOgB+FDFmiD3lqIi+C74plZ6LHe96wNcyhfCWNApSrPAM1BuoSGIAIQA
|
||||
igA1929yYyzFxVc/ne1zOPeCgdn7XnN1cue2N8a+O9c8No1ok7QzvnL2PP2cy+bLY87N+Vo6N280
|
||||
FbvXtmrwxbFy5rEB+ZrrTcZUi7cVG5Dt9WfULF98fjgcAB2K/Jlr9LEefHPFvIV1nsY3X/jtax4O
|
||||
gIHovQfdedtbM/wVDwdANmFhYa5LnXgEkWuxn7t88RWCB0FZqFRUpCcLVEU5TJT4JgRFslEqaRSb
|
||||
fBJ6Dl+7O9dc5O10vq0SgsfRfBYdbNRl8zefa/TJJjHGGPiz/UtjZGrOKCSk95MwXLazWCzuwYfD
|
||||
3sxr6Z3dzvOezhefLVk6KL2dxLjAF1vz9Z3H+C2+l4y1a/dMXC5m6cdykUqKWBUKYZNdkc4VwfmM
|
||||
HhuVEGtqqCrKTYhXpEplTZU0SSYKhd5mvnLVn12PPcVfNEkkg4pG+th1gWZsUaRMDhZEMqASnHZ8
|
||||
M5ozwglfgxsBnbm9EaAh4DCCGuwJ8/+moi2CpslCxIPeYIwVBopiUE0QaE5/Hd3xxe5FOgotLsbX
|
||||
pLGrYunpv1yZAANUPnefzjXotcdG/dmFxnzWACEpUJiqSqLO+ZsgUNUUwdfi82c1NfsozuZgtDdf
|
||||
6062KMaovUlSoSoQatFzrdDIG+QOncoHTcpUoNAwsRAeIA5dcxm1uEGZGCSGOe2tWa14CoTfwqGY
|
||||
tMZWiwtDoITazKgV55r0Y/UggqDmnlSQJpOEOogYVFaBGKCBsUKoSEYKCpJkmAPxCDGMUOmY9b9Y
|
||||
BGh7r2hMnqK242fOaqINra6qJ0D6qdcqw+/0Sw7Xkhc4osYQvBojsdtEp3BzzCETEbaXTtfv+la7
|
||||
dHleONlTKomTqlljV9NFR+2VYLbIjHkhZOxmbSAssUToJCjLELGifUFwagqUXd4roKxn4RnWHYoO
|
||||
jnvJgSRGYuN0rBmWYHD8vjYHZ+MCIRBgCtq/cKobeWmeaFZUwncirtp9fcI6oKWiCReDrD9NZgzh
|
||||
v9HvScdIL/WXJoYPsw0vs4GI7elhFx1+yw7kQ2S6et5Ga3dITIQnF3I+eQT/TqJijMMOmqctfPAz
|
||||
JY9TxooS+WLnSRqfZGAu8JyqECfQqQB21HVL9iTZOR3iMkeHOR2edUgNyJOnLTfUA5vOKPeRGiKP
|
||||
v4RwCn3gOpUQ+Kj3uCQIRAxaBuyG5jW19sb4UIlFDNMAzjeyxnKivKIPN6mHFw1U4gT5tdrBCQJS
|
||||
K8P5KOi3KbN4VBBrnm8dwezosxvArI6BCaRhSRwDDYwphFIYqnQzeOcSKK+LXLdDCRygJN8q1K0D
|
||||
DpHhXWq7YSYSR6sSj9c8edkmFkLHGgo2wIq1Qo0HxIg0wB5Ad9L2UIAY2Qdu3IkT0qsi35+ItQPE
|
||||
XENBk3NSANPYlndRZG30mlMKN6zJ13IYj7iWQ2G6/kZH35sWw8x1IoEbFr4kn/qNwSNBDQL0DBNc
|
||||
QUwsSBxPn6D0QaAkHOCUqRm/Yh6aLI0g/omcqRzFv047+yLJla/2tdW/vHBZDbJ8okLNIenWJlZE
|
||||
OBAX4RVCU5EXA427n3lEKTd8YXtfFB6jZr4ktMh4Bfwd6BpHua5DdNvEevjDVHR9jKP5qnFyV5PR
|
||||
iO6N7/FVNzEbH0YV|
|
||||
)
|
||||
(checksum "B1BB6376E1D9DA80DB045BB70219177D")
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,579 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Main page</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" disabled style="font-size:44px; color: gray; cursor: not-allowed; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="items-container">
|
||||
<div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_reports.html'">
|
||||
<p class="category-title">reports</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_schematic.html'">
|
||||
<p class="category-title">schematic</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_mfg.html'">
|
||||
<p class="category-title">mfg</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_kiri.html'">
|
||||
<p class="category-title">kiri</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_renders.html'">
|
||||
<p class="category-title">renders</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_models.html'">
|
||||
<p class="category-title">models</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_test.html'">
|
||||
<p class="category-title">test</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_panels.html'">
|
||||
<p class="category-title">panels</p>
|
||||
</div>
|
||||
</div></div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,567 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/kiri</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_kiri.html" style="text-decoration:none;color:inherit;">kiri</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="html_kiri">
|
||||
<div class="output-comment">KiRI webpage</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../kiri/index.html'">
|
||||
<img src="images/icon.svg_64.png" alt="index.html" width="64" height="64">
|
||||
<p class="filename">index.html</p>
|
||||
<p class="output-name">html_kiri</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,570 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/mfg</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="items-container">
|
||||
<div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_assembly.html'">
|
||||
<p class="category-title">assembly</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_fab.html'">
|
||||
<p class="category-title">fab</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_jlcpcb.html'">
|
||||
<p class="category-title">jlcpcb</p>
|
||||
</div>
|
||||
</div></div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,633 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/mfg/assembly</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate_mfg.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_assembly.html" style="text-decoration:none;color:inherit;">assembly</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="csv_bom">
|
||||
<div class="output-comment">Bill of Materials in CSV format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-bom.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-bom.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-bom.csv</p>
|
||||
<p class="output-name">csv_bom</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="html_bom">
|
||||
<div class="output-comment">Bill of Materials in HTML format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-bom.html'">
|
||||
<img src="images/file_html_64.png" alt="Test_5-bom.html" width="64" height="64">
|
||||
<p class="filename">Test_5-bom.html</p>
|
||||
<p class="output-name">html_bom</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="html_bom_interactive">
|
||||
<div class="output-comment">Bill of Materials in HTML format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-ibom.html'">
|
||||
<img src="images/ibom_64.png" alt="Test_5-ibom.html" width="64" height="64">
|
||||
<p class="filename">Test_5-ibom.html</p>
|
||||
<p class="output-name">html_bom_interactive</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="csv_position">
|
||||
<div class="output-comment">Position file in CSV format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-CPL.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-CPL.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-CPL.csv</p>
|
||||
<p class="output-name">csv_position</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="pdf_assembly">
|
||||
<div class="output-comment">Assembly document in PDF format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../mfg/assembly/Test_5-assembly.pdf'">
|
||||
<img src="images/cat_pdf_assembly_Test_5-assembly.png" alt="Test_5-assembly.pdf" width="512" height="362">
|
||||
<p class="filename">Test_5-assembly.pdf</p>
|
||||
<p class="output-name">pdf_assembly</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="csv_comp_count">
|
||||
<div class="output-comment">Component report (count) in CSV format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-components_count.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-components_count.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-components_count.csv</p>
|
||||
<p class="output-name">csv_comp_count</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="txt_assembly_notes">
|
||||
<div class="output-comment">Assembly notes in TXT format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/assembly/Test_5-fabrication_notes.txt'">
|
||||
<img src="images/file_txt_64.png" alt="Test_5-fabrication_notes.txt" width="64" height="64">
|
||||
<p class="filename">Test_5-fabrication_notes.txt</p>
|
||||
<p class="output-name">txt_assembly_notes</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,621 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/mfg/fab</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate_mfg.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_fab.html" style="text-decoration:none;color:inherit;">fab</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="items-container">
|
||||
<div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_fab_gerbers.html'">
|
||||
<p class="category-title">gerbers</p>
|
||||
</div>
|
||||
</div><div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_fab_drill-tables.html'">
|
||||
<p class="category-title">drill-tables</p>
|
||||
</div>
|
||||
</div></div>
|
||||
<div class="output-virtual-box" id="zip_odb">
|
||||
<div class="output-comment">ODB++ in ZIP format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/Test_5-odb.zip'">
|
||||
<img src="images/file_zip_64.png" alt="Test_5-odb.zip" width="64" height="64">
|
||||
<p class="filename">Test_5-odb.zip</p>
|
||||
<p class="output-name">zip_odb</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="pdf_fabrication">
|
||||
<div class="output-comment">Fabrication document in PDF format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../mfg/fab/Test_5-fabrication.pdf'">
|
||||
<img src="images/cat_pdf_fabrication_Test_5-fabrication.png" alt="Test_5-fabrication.pdf" width="512" height="362">
|
||||
<p class="filename">Test_5-fabrication.pdf</p>
|
||||
<p class="output-name">pdf_fabrication</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="zip_compress_fab">
|
||||
<div class="output-comment">Generates a ZIP file with gerbers, drill and fabrication document</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/Test_5-GERBERS.zip'">
|
||||
<img src="images/file_zip_64.png" alt="Test_5-GERBERS.zip" width="64" height="64">
|
||||
<p class="filename">Test_5-GERBERS.zip</p>
|
||||
<p class="output-name">zip_compress_fab</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="csv_impedance_table">
|
||||
<div class="output-comment">Impedance table in CSV format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/Test_5-impedance_table.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-impedance_table.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-impedance_table.csv</p>
|
||||
<p class="output-name">csv_impedance_table</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="txt_fabrication_notes">
|
||||
<div class="output-comment">Fabrication notes in TXT format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/Test_5-fabrication_notes.txt'">
|
||||
<img src="images/file_txt_64.png" alt="Test_5-fabrication_notes.txt" width="64" height="64">
|
||||
<p class="filename">Test_5-fabrication_notes.txt</p>
|
||||
<p class="output-name">txt_fabrication_notes</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,573 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/mfg/fab/drill-tables</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate_mfg_fab.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_fab.html" style="text-decoration:none;color:inherit;">fab</a>/<wbr><a href="Test_5-navigate_mfg_fab_drill-tables.html" style="text-decoration:none;color:inherit;">drill-tables</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="csv_drill_table">
|
||||
<div class="output-comment">Drill Table in CSV format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/drill-tables/Test_5-(L1-L4)_drill_table.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-(L1-L4)_drill_table.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-(L1-L4)_drill_table.csv</p>
|
||||
<p class="output-name">csv_drill_table</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/drill-tables/Test_5-(L1-L4)_NPTH_drill_table.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-(L1-L4)_NPTH_drill_table.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-(L1-L4)_NPTH_drill_table.csv</p>
|
||||
<p class="output-name">csv_drill_table</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,661 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/mfg/fab/gerbers</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate_mfg_fab.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_fab.html" style="text-decoration:none;color:inherit;">fab</a>/<wbr><a href="Test_5-navigate_mfg_fab_gerbers.html" style="text-decoration:none;color:inherit;">gerbers</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="gbr_gerbers">
|
||||
<div class="output-comment">Gerbers in GBR format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Cu.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-F_Cu.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-F_Cu.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-In1_Cu.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-In1_Cu.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-In1_Cu.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-In2_Cu.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-In2_Cu.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-In2_Cu.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Cu.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-B_Cu.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-B_Cu.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-Edge_Cuts.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-Edge_Cuts.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-Edge_Cuts.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Silkscreen.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-F_Silkscreen.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-F_Silkscreen.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Mask.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-F_Mask.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-F_Mask.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-F_Paste.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-F_Paste.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-F_Paste.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Silkscreen.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-B_Silkscreen.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-B_Silkscreen.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Mask.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-B_Mask.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-B_Mask.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5-B_Paste.gbr'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-B_Paste.gbr" width="64" height="64">
|
||||
<p class="filename">Test_5-B_Paste.gbr</p>
|
||||
<p class="output-name">gbr_gerbers</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="drl_excellon">
|
||||
<div class="output-comment">Drill in Excellon format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5--pth.drl'">
|
||||
<img src="images/file_drl_64.png" alt="Test_5--pth.drl" width="64" height="64">
|
||||
<p class="filename">Test_5--pth.drl</p>
|
||||
<p class="output-name">drl_excellon</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/fab/gerbers/Test_5--npth.drl'">
|
||||
<img src="images/file_drl_64.png" alt="Test_5--npth.drl" width="64" height="64">
|
||||
<p class="filename">Test_5--npth.drl</p>
|
||||
<p class="output-name">drl_excellon</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="pdf_drill_map">
|
||||
<div class="output-comment">Drill Map in PDF format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../mfg/fab/gerbers/Test_5--pth_map.pdf'">
|
||||
<img src="images/cat_pdf_drill_map_Test_5--pth_map.png" alt="Test_5--pth_map.pdf" width="512" height="362">
|
||||
<p class="filename">Test_5--pth_map.pdf</p>
|
||||
<p class="output-name">pdf_drill_map</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../mfg/fab/gerbers/Test_5--npth_map.pdf'">
|
||||
<img src="images/cat_pdf_drill_map_Test_5--npth_map.png" alt="Test_5--npth_map.pdf" width="512" height="362">
|
||||
<p class="filename">Test_5--npth_map.pdf</p>
|
||||
<p class="output-name">pdf_drill_map</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,595 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/mfg/jlcpcb</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate_mfg.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_jlcpcb.html" style="text-decoration:none;color:inherit;">jlcpcb</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="items-container">
|
||||
<div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_mfg_jlcpcb_gerbers.html'">
|
||||
<p class="category-title">gerbers</p>
|
||||
</div>
|
||||
</div></div>
|
||||
<div class="output-virtual-box" id="jlcpcb_fabpack">
|
||||
<div class="output-comment">Zipped Fabpack for JLCPCB</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/Test_5-Fabpack.zip'">
|
||||
<img src="images/file_zip_64.png" alt="Test_5-Fabpack.zip" width="64" height="64">
|
||||
<p class="filename">Test_5-Fabpack.zip</p>
|
||||
<p class="output-name">jlcpcb_fabpack</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="jlcpcb_bom">
|
||||
<div class="output-comment">Bill of Materials for JLCPCB</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/Test_5-bom.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-bom.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-bom.csv</p>
|
||||
<p class="output-name">jlcpcb_bom</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="jlcpcb_cpl">
|
||||
<div class="output-comment">Component Placement File for JLCPCB</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/Test_5-cpl.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-cpl.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-cpl.csv</p>
|
||||
<p class="output-name">jlcpcb_cpl</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,627 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/mfg/jlcpcb/gerbers</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate_mfg_jlcpcb.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_mfg.html" style="text-decoration:none;color:inherit;">mfg</a>/<wbr><a href="Test_5-navigate_mfg_jlcpcb.html" style="text-decoration:none;color:inherit;">jlcpcb</a>/<wbr><a href="Test_5-navigate_mfg_jlcpcb_gerbers.html" style="text-decoration:none;color:inherit;">gerbers</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="jlcpcb_gerbers">
|
||||
<div class="output-comment">Gerbers in GBR format for JLCPCB</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Cu.gtl'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-F_Cu.gtl" width="64" height="64">
|
||||
<p class="filename">Test_5-F_Cu.gtl</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-In1_Cu.g1'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-In1_Cu.g1" width="64" height="64">
|
||||
<p class="filename">Test_5-In1_Cu.g1</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-In2_Cu.g2'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-In2_Cu.g2" width="64" height="64">
|
||||
<p class="filename">Test_5-In2_Cu.g2</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Cu.gbl'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-B_Cu.gbl" width="64" height="64">
|
||||
<p class="filename">Test_5-B_Cu.gbl</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-Edge_Cuts.gm1'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-Edge_Cuts.gm1" width="64" height="64">
|
||||
<p class="filename">Test_5-Edge_Cuts.gm1</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Silkscreen.gto'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-F_Silkscreen.gto" width="64" height="64">
|
||||
<p class="filename">Test_5-F_Silkscreen.gto</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Mask.gts'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-F_Mask.gts" width="64" height="64">
|
||||
<p class="filename">Test_5-F_Mask.gts</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-F_Paste.gtp'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-F_Paste.gtp" width="64" height="64">
|
||||
<p class="filename">Test_5-F_Paste.gtp</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Silkscreen.gbo'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-B_Silkscreen.gbo" width="64" height="64">
|
||||
<p class="filename">Test_5-B_Silkscreen.gbo</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Mask.gbs'">
|
||||
<img src="images/file_gbr_64.png" alt="Test_5-B_Mask.gbs" width="64" height="64">
|
||||
<p class="filename">Test_5-B_Mask.gbs</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../mfg/jlcpcb/gerbers/Test_5-B_Paste.gbp'">
|
||||
<img src="images/unknown_64.png" alt="Test_5-B_Paste.gbp" width="64" height="64">
|
||||
<p class="filename">Test_5-B_Paste.gbp</p>
|
||||
<p class="output-name">jlcpcb_gerbers</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,578 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/models</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_models.html" style="text-decoration:none;color:inherit;">models</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="step">
|
||||
<div class="output-comment">PCB 3D model in STEP format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../models/Test_5-step.step'">
|
||||
<img src="images/file_stp_64.png" alt="Test_5-step.step" width="64" height="64">
|
||||
<p class="filename">Test_5-step.step</p>
|
||||
<p class="output-name">step</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="glb">
|
||||
<div class="output-comment">PCB 3D model in GLB/gITF format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../models/Test_5-glb.glb'">
|
||||
<img src="images/file_glb_64.png" alt="Test_5-glb.glb" width="64" height="64">
|
||||
<p class="filename">Test_5-glb.glb</p>
|
||||
<p class="output-name">glb</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,562 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/panels</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_panels.html" style="text-decoration:none;color:inherit;">panels</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="items-container">
|
||||
<div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_panels_panel-800.html'">
|
||||
<p class="category-title">panel-800</p>
|
||||
</div>
|
||||
</div></div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,573 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/panels/panel-800</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate_panels.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_panels.html" style="text-decoration:none;color:inherit;">panels</a>/<wbr><a href="Test_5-navigate_panels_panel-800.html" style="text-decoration:none;color:inherit;">panel-800</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="panel_801">
|
||||
<div class="output-comment">@COMMENT@</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../panels/panel-800/Test_5-panel_801.kicad_pcb'">
|
||||
<img src="images/pcbnew_64.png" alt="Test_5-panel_801.kicad_pcb" width="64" height="64">
|
||||
<p class="filename">Test_5-panel_801.kicad_pcb</p>
|
||||
<p class="output-name">panel_801</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../panels/panel-800/Test_5-panel_801.png'">
|
||||
<img src="images/cat_panel_801_Test_5-panel_801.png" alt="Test_5-panel_801.png" width="512" height="317">
|
||||
<p class="filename">Test_5-panel_801.png</p>
|
||||
<p class="output-name">panel_801</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,690 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/renders</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_renders.html" style="text-decoration:none;color:inherit;">renders</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="pcbdraw_top">
|
||||
<div class="output-comment">PCB 2D Render (Top)</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-pcbdraw_top.svg'">
|
||||
<img src="images/cat_pcbdraw_top_Test_5-pcbdraw_top.png" alt="Test_5-pcbdraw_top.svg" width="512" height="307">
|
||||
<p class="filename">Test_5-pcbdraw_top.svg</p>
|
||||
<p class="output-name">pcbdraw_top</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="pcbdraw_bottom">
|
||||
<div class="output-comment">PCB 2D Render (Bottom)</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-pcbdraw_bottom.svg'">
|
||||
<img src="images/cat_pcbdraw_bottom_Test_5-pcbdraw_bottom.png" alt="Test_5-pcbdraw_bottom.svg" width="512" height="307">
|
||||
<p class="filename">Test_5-pcbdraw_bottom.svg</p>
|
||||
<p class="output-name">pcbdraw_bottom</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="png_3d_viewer_top">
|
||||
<div class="output-comment">Top 3D viewer PCB render in PNG format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-top.png'">
|
||||
<img src="images/cat_png_3d_viewer_top_Test_5-top.png" alt="Test_5-top.png" width="512" height="302">
|
||||
<p class="filename">Test_5-top.png</p>
|
||||
<p class="output-name">png_3d_viewer_top</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="png_3d_viewer_bottom">
|
||||
<div class="output-comment">Bottom 3D viewer PCB render in PNG format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-bottom.png'">
|
||||
<img src="images/cat_png_3d_viewer_bottom_Test_5-bottom.png" alt="Test_5-bottom.png" width="512" height="302">
|
||||
<p class="filename">Test_5-bottom.png</p>
|
||||
<p class="output-name">png_3d_viewer_bottom</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="png_3d_viewer_angled_top">
|
||||
<div class="output-comment">Top (angled) 3D viewer PCB render in PNG format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-angled_top.png'">
|
||||
<img src="images/cat_png_3d_viewer_angled_top_Test_5-angled_top.png" alt="Test_5-angled_top.png" width="512" height="323">
|
||||
<p class="filename">Test_5-angled_top.png</p>
|
||||
<p class="output-name">png_3d_viewer_angled_top</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="png_3d_viewer_angled_bottom">
|
||||
<div class="output-comment">Bottom (angled) 3D viewer PCB render in PNG format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-angled_bottom.png'">
|
||||
<img src="images/cat_png_3d_viewer_angled_bottom_Test_5-angled_bottom.png" alt="Test_5-angled_bottom.png" width="512" height="310">
|
||||
<p class="filename">Test_5-angled_bottom.png</p>
|
||||
<p class="output-name">png_3d_viewer_angled_bottom</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="blender_3d_top">
|
||||
<div class="output-comment">High Quality 3D Render (Top)</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../renders/Test_5-blender_exportblender_3d_top.pcb3d'">
|
||||
<img src="images/file_pcb3d_64.png" alt="Test_5-blender_exportblender_3d_top.pcb3d" width="64" height="64">
|
||||
<p class="filename">Test_5-blender_exportblender_3d_top.pcb3d</p>
|
||||
<p class="output-name">blender_3d_top</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-blender_3d_top.png'">
|
||||
<img src="images/cat_blender_3d_top_Test_5-blender_3d_top.png" alt="Test_5-blender_3d_top.png" width="512" height="306">
|
||||
<p class="filename">Test_5-blender_3d_top.png</p>
|
||||
<p class="output-name">blender_3d_top</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="blender_3d_bottom">
|
||||
<div class="output-comment">High Quality 3D Render (Bottom)</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../renders/Test_5-blender_exportblender_3d_bottom.pcb3d'">
|
||||
<img src="images/file_pcb3d_64.png" alt="Test_5-blender_exportblender_3d_bottom.pcb3d" width="64" height="64">
|
||||
<p class="filename">Test_5-blender_exportblender_3d_bottom.pcb3d</p>
|
||||
<p class="output-name">blender_3d_bottom</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-blender_3d_bottom.png'">
|
||||
<img src="images/cat_blender_3d_bottom_Test_5-blender_3d_bottom.png" alt="Test_5-blender_3d_bottom.png" width="512" height="302">
|
||||
<p class="filename">Test_5-blender_3d_bottom.png</p>
|
||||
<p class="output-name">blender_3d_bottom</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="blender_3d_angled_top">
|
||||
<div class="output-comment">High Quality 3D Render (Angled Top)</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../renders/Test_5-blender_exportblender_3d_angled_top.pcb3d'">
|
||||
<img src="images/file_pcb3d_64.png" alt="Test_5-blender_exportblender_3d_angled_top.pcb3d" width="64" height="64">
|
||||
<p class="filename">Test_5-blender_exportblender_3d_angled_top.pcb3d</p>
|
||||
<p class="output-name">blender_3d_angled_top</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-blender_3d_angled_top.png'">
|
||||
<img src="images/cat_blender_3d_angled_top_Test_5-blender_3d_angled_top.png" alt="Test_5-blender_3d_angled_top.png" width="512" height="309">
|
||||
<p class="filename">Test_5-blender_3d_angled_top.png</p>
|
||||
<p class="output-name">blender_3d_angled_top</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="blender_3d_angled_bottom">
|
||||
<div class="output-comment">High Quality 3D Render (Angled Bottom)</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../renders/Test_5-blender_exportblender_3d_angled_bottom.pcb3d'">
|
||||
<img src="images/file_pcb3d_64.png" alt="Test_5-blender_exportblender_3d_angled_bottom.pcb3d" width="64" height="64">
|
||||
<p class="filename">Test_5-blender_exportblender_3d_angled_bottom.pcb3d</p>
|
||||
<p class="output-name">blender_3d_angled_bottom</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../renders/Test_5-blender_3d_angled_bottom.png'">
|
||||
<img src="images/cat_blender_3d_angled_bottom_Test_5-blender_3d_angled_bottom.png" alt="Test_5-blender_3d_angled_bottom.png" width="512" height="290">
|
||||
<p class="filename">Test_5-blender_3d_angled_bottom.png</p>
|
||||
<p class="output-name">blender_3d_angled_bottom</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,590 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/reports</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_reports.html" style="text-decoration:none;color:inherit;">reports</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="erc">
|
||||
<div class="output-comment">erc</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../reports/report_Test_5-erc.html'">
|
||||
<img src="images/erc.svg_64.png" alt="report_Test_5-erc.html" width="64" height="64">
|
||||
<p class="filename">report_Test_5-erc.html</p>
|
||||
<p class="output-name">erc</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../reports/report_Test_5-erc.rpt'">
|
||||
<img src="images/erc.svg_64.png" alt="report_Test_5-erc.rpt" width="64" height="64">
|
||||
<p class="filename">report_Test_5-erc.rpt</p>
|
||||
<p class="output-name">erc</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="drc">
|
||||
<div class="output-comment">drc</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../reports/report_Test_5-drc.html'">
|
||||
<img src="images/drc.svg_64.png" alt="report_Test_5-drc.html" width="64" height="64">
|
||||
<p class="filename">report_Test_5-drc.html</p>
|
||||
<p class="output-name">drc</p>
|
||||
</div>
|
||||
|
||||
<div class="output-box " onclick="location.href='../reports/report_Test_5-drc.rpt'">
|
||||
<img src="images/drc.svg_64.png" alt="report_Test_5-drc.rpt" width="64" height="64">
|
||||
<p class="filename">report_Test_5-drc.rpt</p>
|
||||
<p class="output-name">drc</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,578 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/schematic</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_schematic.html" style="text-decoration:none;color:inherit;">schematic</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="pdf_schematic">
|
||||
<div class="output-comment">Schematic in PDF format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box wide" onclick="location.href='../schematic/Test_5-schematic.pdf'">
|
||||
<img src="images/cat_pdf_schematic_Test_5-schematic.png" alt="Test_5-schematic.pdf" width="512" height="362">
|
||||
<p class="filename">Test_5-schematic.pdf</p>
|
||||
<p class="output-name">pdf_schematic</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="txt_schematic_notes">
|
||||
<div class="output-comment">Schematic notes in TXT format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../schematic/Test_5-schematic_notes.txt'">
|
||||
<img src="images/file_txt_64.png" alt="Test_5-schematic_notes.txt" width="64" height="64">
|
||||
<p class="filename">Test_5-schematic_notes.txt</p>
|
||||
<p class="output-name">txt_schematic_notes</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,562 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/test</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_test.html" style="text-decoration:none;color:inherit;">test</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="items-container">
|
||||
<div>
|
||||
<div class="category-box" onclick="location.href='Test_5-navigate_test_testpoints.html'">
|
||||
<p class="category-title">testpoints</p>
|
||||
</div>
|
||||
</div></div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,589 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>/test/testpoints</title>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
<link rel="icon" href="favicon.ico">
|
||||
<script src="markdown-it.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="theSideNav" class="navbar">
|
||||
<!-- Search bar container -->
|
||||
<div id="search-container">
|
||||
<input type="text" id="search-bar" placeholder="Search outputs..." autocomplete="off">
|
||||
<ul id="autocomplete-list"></ul>
|
||||
</div>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> reports</span>
|
||||
<ul id='folder-test_5-navigate-reports' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_reports.html#erc' class='navbar-output'>erc</a></li>
|
||||
<li><a href='Test_5-navigate_reports.html#drc' class='navbar-output'>drc</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> schematic</span>
|
||||
<ul id='folder-test_5-navigate-schematic' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_schematic.html#pdf_schematic' class='navbar-output'>pdf_schematic</a></li>
|
||||
<li><a href='Test_5-navigate_schematic.html#txt_schematic_notes' class='navbar-output'>txt_schematic_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> mfg</span>
|
||||
<ul id='folder-test_5-navigate-mfg' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> assembly</span>
|
||||
<ul id='folder-test_5-navigate_mfg-assembly' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_bom' class='navbar-output'>csv_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom' class='navbar-output'>html_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#html_bom_interactive' class='navbar-output'>html_bom_interactive</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_position' class='navbar-output'>csv_position</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#pdf_assembly' class='navbar-output'>pdf_assembly</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#csv_comp_count' class='navbar-output'>csv_comp_count</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_assembly.html#txt_assembly_notes' class='navbar-output'>txt_assembly_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> fab</span>
|
||||
<ul id='folder-test_5-navigate_mfg-fab' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#gbr_gerbers' class='navbar-output'>gbr_gerbers</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#drl_excellon' class='navbar-output'>drl_excellon</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab_gerbers.html#pdf_drill_map' class='navbar-output'>pdf_drill_map</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_odb' class='navbar-output'>zip_odb</a></li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> drill-tables</span>
|
||||
<ul id='folder-test_5-navigate_mfg_fab-drill-tables' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_fab_drill-tables.html#csv_drill_table' class='navbar-output'>csv_drill_table</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#pdf_fabrication' class='navbar-output'>pdf_fabrication</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#zip_compress_fab' class='navbar-output'>zip_compress_fab</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#csv_impedance_table' class='navbar-output'>csv_impedance_table</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_fab.html#txt_fabrication_notes' class='navbar-output'>txt_fabrication_notes</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> jlcpcb</span>
|
||||
<ul id='folder-test_5-navigate_mfg-jlcpcb' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> gerbers</span>
|
||||
<ul id='folder-test_5-navigate_mfg_jlcpcb-gerbers' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb_gerbers.html#jlcpcb_gerbers' class='navbar-output'>jlcpcb_gerbers</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_fabpack' class='navbar-output'>jlcpcb_fabpack</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_bom' class='navbar-output'>jlcpcb_bom</a></li>
|
||||
<li><a href='Test_5-navigate_mfg_jlcpcb.html#jlcpcb_cpl' class='navbar-output'>jlcpcb_cpl</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> kiri</span>
|
||||
<ul id='folder-test_5-navigate-kiri' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_kiri.html#html_kiri' class='navbar-output'>html_kiri</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> renders</span>
|
||||
<ul id='folder-test_5-navigate-renders' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_top' class='navbar-output'>pcbdraw_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#pcbdraw_bottom' class='navbar-output'>pcbdraw_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_top' class='navbar-output'>png_3d_viewer_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_bottom' class='navbar-output'>png_3d_viewer_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_top' class='navbar-output'>png_3d_viewer_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#png_3d_viewer_angled_bottom' class='navbar-output'>png_3d_viewer_angled_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_top' class='navbar-output'>blender_3d_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_bottom' class='navbar-output'>blender_3d_bottom</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_top' class='navbar-output'>blender_3d_angled_top</a></li>
|
||||
<li><a href='Test_5-navigate_renders.html#blender_3d_angled_bottom' class='navbar-output'>blender_3d_angled_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> models</span>
|
||||
<ul id='folder-test_5-navigate-models' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_models.html#step' class='navbar-output'>step</a></li>
|
||||
<li><a href='Test_5-navigate_models.html#glb' class='navbar-output'>glb</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> test</span>
|
||||
<ul id='folder-test_5-navigate-test' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> testpoints</span>
|
||||
<ul id='folder-test_5-navigate_test-testpoints' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints' class='navbar-output'>csv_testpoints</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_top' class='navbar-output'>csv_testpoints_top</a></li>
|
||||
<li><a href='Test_5-navigate_test_testpoints.html#csv_testpoints_bottom' class='navbar-output'>csv_testpoints_bottom</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panels</span>
|
||||
<ul id='folder-test_5-navigate-panels' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li class='folder'><span onclick='toggleFolder(this)'><span class='chevron'></span> panel-800</span>
|
||||
<ul id='folder-test_5-navigate_panels-panel-800' class='folder-contents' style='display:none;'>
|
||||
<ul class='navbar-category'>
|
||||
<li><a href='Test_5-navigate_panels_panel-800.html#panel_801' class='navbar-output'>panel_801</a></li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="topmenu" class="topmenu">
|
||||
<div style="display: flex; align-items: center; flex: 1; min-width: 0; gap: 10px;">
|
||||
<span id="open-navbar" style="font-size:30px;cursor:pointer;" onclick="openNav()">☰</span>
|
||||
<span id="close-navbar" style="font-size:30px;cursor:pointer;display:none;" onclick="closeNav()">⨉</span>
|
||||
<button id="back-button" onclick="history.back()" style="font-size:30px;">↩</button>
|
||||
<button id="forward-button" onclick="history.forward()" style="font-size:30px;">↪</button>
|
||||
<button id="up-button" onclick="location.href='Test_5-navigate_test.html'" style="font-size:44px; position: relative; top: -3px;">⌅</button>
|
||||
<button id="home-button" onclick="location.href='Test_5-navigate.html'" style="font-size:25px; position: relative; top: -2px;">🏠︎</button>
|
||||
|
||||
<span style="
|
||||
font-size:18px;
|
||||
color: var(--text-color-accent);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
flex: 1;
|
||||
">
|
||||
<a href="Test_5-navigate_test.html" style="text-decoration:none;color:inherit;">test</a>/<wbr><a href="Test_5-navigate_test_testpoints.html" style="text-decoration:none;color:inherit;">testpoints</a>
|
||||
</span>
|
||||
</div>
|
||||
<div style="text-align: center; flex: 1; min-width: 200px;">
|
||||
<a href="https://git.asymworks.com/jkrauss/Test_5" style="text-decoration: none; color: inherit;">
|
||||
<span style="font-size:30px;">A99-9000 (Assembly Name)</span>
|
||||
</a>
|
||||
|
||||
<div style="
|
||||
font-size:14px;
|
||||
color: var(--text-color-accent);
|
||||
margin-top: 5px;">
|
||||
Asymworks, LLC
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; flex: 1; justify-content: flex-end; min-width: 0; gap: 10px; padding-right: 10px;">
|
||||
|
||||
<div style="
|
||||
text-align: left;
|
||||
font-size:14px;
|
||||
margin-right: 10px;
|
||||
color: var(--text-color-accent);">
|
||||
<div style="margin-bottom: 5px;">Rev. NO_TAG+ (Unreleased)</div>
|
||||
<div>Variant: </div>
|
||||
</div>
|
||||
<img src="images/logo.png" alt="Logo" style="max-height: 40px; max-width: 74.0px;">
|
||||
|
||||
<label class="theme-switch" style="
|
||||
position: relative;
|
||||
margin-right: 10px; /* Move toggle slightly left */
|
||||
max-width: 100%; /* Prevent overflow */
|
||||
">
|
||||
<input type="checkbox" id="themeToggle" onchange="toggleTheme()">
|
||||
<span></span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div class="output-virtual-box" id="csv_testpoints">
|
||||
<div class="output-comment">Testpoint report in CSV format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../test/testpoints/Test_5-testpoints.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-testpoints.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-testpoints.csv</p>
|
||||
<p class="output-name">csv_testpoints</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="csv_testpoints_top">
|
||||
<div class="output-comment">Top testpoint report in CSV format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../test/testpoints/Test_5-testpoints-top.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-testpoints-top.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-testpoints-top.csv</p>
|
||||
<p class="output-name">csv_testpoints_top</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="output-virtual-box" id="csv_testpoints_bottom">
|
||||
<div class="output-comment">Bottom testpoint report in CSV format</div>
|
||||
<div class="items-container">
|
||||
|
||||
<div class="output-box " onclick="location.href='../test/testpoints/Test_5-testpoints-bottom.csv'">
|
||||
<img src="images/file_csv_64.png" alt="Test_5-testpoints-bottom.csv" width="64" height="64">
|
||||
<p class="filename">Test_5-testpoints-bottom.csv</p>
|
||||
<p class="output-name">csv_testpoints_bottom</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
// Side Navigation functions ===================================================
|
||||
|
||||
function openNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "360px";
|
||||
navbar.style.paddingLeft = "20px";
|
||||
main.style.marginLeft = "360px";
|
||||
document.getElementById("open-navbar").style.display = "none";
|
||||
document.getElementById("close-navbar").style.display = "inline-block";
|
||||
}
|
||||
|
||||
function closeNav() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
navbar.style.width = "0"; // Close the navbar
|
||||
navbar.style.paddingLeft = "0"; // Reset padding
|
||||
main.style.marginLeft = "0"; // Reset page content position
|
||||
document.getElementById("open-navbar").style.display = "inline-block";
|
||||
document.getElementById("close-navbar").style.display = "none";
|
||||
}
|
||||
|
||||
function toggleFolder(folderHeader) {
|
||||
const folder = folderHeader.parentElement;
|
||||
const folderContents = folderHeader.nextElementSibling;
|
||||
|
||||
if (folder.classList.contains("open")) {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
} else {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
}
|
||||
|
||||
// Save the updated state
|
||||
saveSideNavState();
|
||||
}
|
||||
|
||||
function saveSideNavState() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const isOpen = navbar.style.width !== "0px"; // Check if navbar is open
|
||||
|
||||
// Save the state of each folder
|
||||
const folderStates = Array.from(document.querySelectorAll(".folder")).map(folder => ({
|
||||
id: folder.querySelector("span").textContent.trim(), // Use folder name as identifier
|
||||
isOpen: folder.classList.contains("open") // Check if folder is open
|
||||
}));
|
||||
|
||||
// Save the navbar and folder states to localStorage
|
||||
localStorage.setItem("navbarState", JSON.stringify({ isOpen, folderStates }));
|
||||
}
|
||||
|
||||
function restorenavbarState() {
|
||||
const savedState = localStorage.getItem("navbarState");
|
||||
if (savedState) {
|
||||
const { isOpen, folderStates } = JSON.parse(savedState);
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const main = document.getElementById("main");
|
||||
|
||||
// Temporarily disable animations on page load so elements don't move
|
||||
navbar.style.transition = "none";
|
||||
main.style.transition = "none";
|
||||
const chevrons = document.querySelectorAll(".chevron");
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "none";
|
||||
});
|
||||
|
||||
// Restore side navigation state
|
||||
if (isOpen) {
|
||||
openNav()
|
||||
} else {
|
||||
closeNav()
|
||||
}
|
||||
|
||||
// Restore folder open/closed states
|
||||
folderStates.forEach(({ id, isOpen }) => {
|
||||
const folder = Array.from(document.querySelectorAll(".folder"))
|
||||
.find(folder => folder.querySelector("span").textContent.trim() === id);
|
||||
|
||||
if (folder) {
|
||||
const folderContents = folder.querySelector(".folder-contents");
|
||||
if (isOpen) {
|
||||
folder.classList.add("open");
|
||||
folderContents.style.display = "block";
|
||||
} else {
|
||||
folder.classList.remove("open");
|
||||
folderContents.style.display = "none";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Re-enable animation
|
||||
setTimeout(() => {
|
||||
navbar.style.transition = "";
|
||||
main.style.transition = "";
|
||||
chevrons.forEach(chevron => {
|
||||
chevron.style.transition = "";
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function saveSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const scrollPosition = navbar.scrollTop;
|
||||
localStorage.setItem("navbarScrollPosition", scrollPosition);
|
||||
}
|
||||
|
||||
function restoreSidenavScrollPosition() {
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
const savedPosition = localStorage.getItem("navbarScrollPosition");
|
||||
if (savedPosition !== null) {
|
||||
navbar.scrollTop = parseInt(savedPosition, 10);
|
||||
}
|
||||
}
|
||||
|
||||
function adjustSidenavOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const navbar = document.getElementById("theSideNav");
|
||||
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
adjustSidenavOffset();
|
||||
window.addEventListener("resize", adjustSidenavOffset);
|
||||
|
||||
/* This is the scrolling offset when we click on an output in the side navigation bar
|
||||
It should take into account the top menu height */
|
||||
function adjustOutputOffset() {
|
||||
const topMenu = document.getElementById("topmenu"); // Replace with your top menu's ID
|
||||
if (topMenu) {
|
||||
const topMenuHeight = topMenu.offsetHeight; // Dynamically get the top menu height
|
||||
document.documentElement.style.setProperty('--top-menu-height', `${topMenuHeight}px`);
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("DOMContentLoaded", adjustOutputOffset);
|
||||
window.addEventListener("resize", adjustOutputOffset);
|
||||
|
||||
// Prevent flickering on page navigation
|
||||
window.addEventListener("beforeunload", () => {
|
||||
saveSideNavState();
|
||||
saveSidenavScrollPosition();
|
||||
});
|
||||
|
||||
window.addEventListener("load", restoreSidenavScrollPosition);
|
||||
document.addEventListener("DOMContentLoaded", restorenavbarState);
|
||||
|
||||
function initializeSearchBar(searchContainerId, outputSelector) {
|
||||
const searchContainer = document.getElementById(searchContainerId);
|
||||
if (!searchContainer) return; // Exit if container is not found
|
||||
|
||||
const searchBar = searchContainer.querySelector('#search-bar');
|
||||
const autocompleteList = searchContainer.querySelector('#autocomplete-list');
|
||||
const outputLinks = document.querySelectorAll(outputSelector);
|
||||
|
||||
// Collect output names and their hrefs
|
||||
const outputs = Array.from(outputLinks).map(link => ({
|
||||
name: link.textContent.trim(),
|
||||
href: link.getAttribute("href"),
|
||||
}));
|
||||
|
||||
let highlightedIndex = -1; // Index of the currently highlighted item
|
||||
|
||||
function adjustAutocompleteWidth() {
|
||||
const searchBarWidth = searchBar.offsetWidth;
|
||||
autocompleteList.style.width = `${searchBarWidth}px`;
|
||||
}
|
||||
|
||||
function updateAutocomplete(query) {
|
||||
autocompleteList.innerHTML = ""; // Clear suggestions
|
||||
highlightedIndex = -1; // Reset highlighting
|
||||
|
||||
const matches = outputs.filter(output =>
|
||||
output.name.toLowerCase().includes(query.toLowerCase())
|
||||
);
|
||||
|
||||
matches.forEach(match => {
|
||||
const listItem = document.createElement("li");
|
||||
listItem.textContent = match.name;
|
||||
listItem.addEventListener("click", () => {
|
||||
window.location.href = match.href;
|
||||
});
|
||||
autocompleteList.appendChild(listItem);
|
||||
});
|
||||
|
||||
autocompleteList.style.display = matches.length ? "block" : "none";
|
||||
}
|
||||
|
||||
function highlightItem(index) {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
items.forEach((item, i) => {
|
||||
if (i === index) {
|
||||
item.classList.add("highlighted");
|
||||
item.scrollIntoView({ block: "nearest" });
|
||||
} else {
|
||||
item.classList.remove("highlighted");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listeners for search bar input and keydown
|
||||
searchBar.addEventListener("input", () => {
|
||||
const query = searchBar.value.trim();
|
||||
if (query) updateAutocomplete(query);
|
||||
else {
|
||||
autocompleteList.innerHTML = "";
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
searchBar.addEventListener("keydown", (event) => {
|
||||
const items = autocompleteList.querySelectorAll("li");
|
||||
if (!items.length) return;
|
||||
|
||||
if (event.key === "ArrowDown") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex + 1) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "ArrowUp") {
|
||||
event.preventDefault();
|
||||
highlightedIndex = (highlightedIndex - 1 + items.length) % items.length;
|
||||
highlightItem(highlightedIndex);
|
||||
} else if (event.key === "Enter" && highlightedIndex >= 0) {
|
||||
event.preventDefault();
|
||||
items[highlightedIndex].click();
|
||||
}
|
||||
});
|
||||
|
||||
// Hide suggestions when clicking outside
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!searchBar.contains(event.target) && !autocompleteList.contains(event.target)) {
|
||||
autocompleteList.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Adjust width on window resize
|
||||
adjustAutocompleteWidth();
|
||||
window.addEventListener("resize", adjustAutocompleteWidth);
|
||||
}
|
||||
|
||||
// Initialize search functionality
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
initializeSearchBar("search-container", ".navbar-output");
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const md = window.markdownit({
|
||||
html: true,
|
||||
linkify: true,
|
||||
typographer: true
|
||||
});
|
||||
|
||||
// Find all markdown containers and render them
|
||||
document.querySelectorAll('.markdown-content').forEach(container => {
|
||||
const rawMarkdown = container.innerHTML;
|
||||
container.style.display = 'block';
|
||||
container.innerHTML = md.render(rawMarkdown);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// Theme toggle ================================================================
|
||||
|
||||
function toggleTheme() {
|
||||
const body = document.body;
|
||||
|
||||
// Check if the current theme is dark
|
||||
const isDark = body.classList.contains('dark-mode');
|
||||
|
||||
// Toggle between dark and light themes
|
||||
if (isDark) {
|
||||
body.classList.remove('dark-mode');
|
||||
body.classList.add('light-mode');
|
||||
} else {
|
||||
body.classList.remove('light-mode');
|
||||
body.classList.add('dark-mode');
|
||||
}
|
||||
|
||||
// Save the selected theme to localStorage
|
||||
localStorage.setItem('theme', isDark ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Do not animate theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const themeToggle = document.getElementById('themeToggle');
|
||||
const toggleSpan = themeToggle.nextElementSibling; // The <span> element
|
||||
|
||||
// Prevent animation on page load
|
||||
const savedTheme = localStorage.getItem('theme') || 'dark';
|
||||
document.body.classList.add(savedTheme === 'dark' ? 'dark-mode' : 'light-mode');
|
||||
themeToggle.checked = savedTheme === 'dark';
|
||||
|
||||
// Add the "animate" class on user interaction
|
||||
themeToggle.addEventListener('change', () => {
|
||||
toggleSpan.classList.add('animate');
|
||||
setTimeout(() => {
|
||||
toggleSpan.classList.remove('animate'); // Remove the animation class after completion
|
||||
}, 400); // Match the CSS transition duration (0.4s)
|
||||
});
|
||||
});
|
||||
|
||||
// Avoid flickering of theme toggle on page load
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const body = document.body;
|
||||
|
||||
// Temporarily disable transitions during page load
|
||||
body.classList.add('no-transition');
|
||||
|
||||
// Remove the no-transition class after the page is fully loaded
|
||||
setTimeout(() => {
|
||||
body.classList.remove('no-transition');
|
||||
}, 50); // Allow rendering to complete before enabling transitions
|
||||
});
|
||||
|
||||
function adjustMainBodyOffset() {
|
||||
const topMenu = document.getElementById("topmenu");
|
||||
const mainBody = document.getElementById("main");
|
||||
|
||||
if (topMenu && mainBody) {
|
||||
const topMenuHeight = topMenu.offsetHeight;
|
||||
mainBody.style.marginTop = `${topMenuHeight}px`;
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the adjustment on page load and window resize
|
||||
window.addEventListener("DOMContentLoaded", adjustMainBodyOffset);
|
||||
window.addEventListener("resize", adjustMainBodyOffset);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 148 KiB |
|
After Width: | Height: | Size: 151 KiB |
|
After Width: | Height: | Size: 195 KiB |
|
After Width: | Height: | Size: 164 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 69 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 168 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,981 @@
|
||||
|
||||
|
||||
/* Colors =================================================================== */
|
||||
|
||||
:root {
|
||||
--light-bg-color: #ffffff;
|
||||
--dark-bg-color: #1e1e2f;
|
||||
--light-bg-color-banner: #dfdfdf;
|
||||
--dark-bg-color-banner: #27293d;
|
||||
--light-text-color: #444444;
|
||||
--dark-text-color: #e5e5e5;
|
||||
--light-hover-color: #902ec9;
|
||||
--light-hover-color-act: #652f85;
|
||||
--dark-hover-color: #ffa500;
|
||||
--dark-hover-color-act: #cc8400;
|
||||
--dark-text-color-accent: #a3a3c2;
|
||||
--light-text-color-accent: #444444;
|
||||
--light-banner-hover: #b0b0b0;
|
||||
--dark-banner-hover: #383b4b;
|
||||
--text-color-accent: #a3a3c2;
|
||||
}
|
||||
|
||||
/* Main body ================================================================ */
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
background-color: var(--dark-bg-color);
|
||||
color: var(--dark-text-color);
|
||||
transition:
|
||||
background-color 0.4s ease,
|
||||
color 0.4s ease,
|
||||
transition: scrollbar-color 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
body.dark-mode {
|
||||
--text-color-accent: var(--dark-text-color-accent);
|
||||
background-color: var(--dark-bg-color);
|
||||
color: var(--dark-text-color);
|
||||
}
|
||||
|
||||
body.light-mode {
|
||||
--text-color-accent: var(--light-text-color-accent);
|
||||
background-color: var(--light-bg-color);
|
||||
color: var(--light-text-color);
|
||||
}
|
||||
|
||||
/* Top Menu ================================================================= */
|
||||
|
||||
/* Layout is as follows */
|
||||
/* [X/☰] [↩] [↪] <Category Path> <Title> (Logo) [☾/☀] [🏠︎] */
|
||||
|
||||
#topmenu {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
z-index: 1000;
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
padding: 10px 0;
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
transition: background-color 0.2s ease, color 0.2s ease;
|
||||
}
|
||||
|
||||
body.light-mode #topmenu {
|
||||
background-color: var(--light-bg-color-banner);
|
||||
}
|
||||
|
||||
body.dark-mode #topmenu {
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
}
|
||||
|
||||
/* Buttons ================================================================== */
|
||||
|
||||
/* button corresponds to the navigation buttons (forward, backward, home) */
|
||||
|
||||
button, #open-navbar, #close-navbar {
|
||||
background: none;
|
||||
border: none;
|
||||
color: var(--dark-text-color);
|
||||
cursor: pointer;
|
||||
transition: color 0.3s ease;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
body.light-mode #topmenu button,
|
||||
body.light-mode #topmenu #open-navbar,
|
||||
body.light-mode #topmenu #close-navbar {
|
||||
color: var(--light-text-color);
|
||||
}
|
||||
|
||||
body.dark-mode #topmenu button,
|
||||
body.dark-mode #topmenu #open-navbar,
|
||||
body.dark-mode #topmenu #close-navbar {
|
||||
color: var(--dark-text-color);
|
||||
}
|
||||
|
||||
button {
|
||||
font-size: 20px;
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
#open-navbar, #close-navbar {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
line-height: 36px;
|
||||
text-align: center;
|
||||
font-size: 28px;
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
/* Hover effects */
|
||||
|
||||
button:hover, #open-navbar:hover, #close-navbar:hover {
|
||||
color: var(--dark-hover-color);
|
||||
}
|
||||
|
||||
body.dark-mode #topmenu button:hover,
|
||||
body.dark-mode #topmenu #open-navbar:hover,
|
||||
body.dark-mode #topmenu #close-navbar:hover {
|
||||
color: var(--dark-hover-color);
|
||||
}
|
||||
|
||||
body.light-mode #topmenu button:hover,
|
||||
body.light-mode #topmenu #open-navbar:hover,
|
||||
body.light-mode #topmenu #close-navbar:hover {
|
||||
color: var(--light-hover-color);
|
||||
}
|
||||
|
||||
/* Active effects */
|
||||
|
||||
button:active, #open-navbar:active, #close-navbar:active {
|
||||
color: var(--dark-hover-color-act);
|
||||
transition: none;
|
||||
}
|
||||
|
||||
body.dark-mode #topmenu button:active,
|
||||
body.dark-mode #topmenu #open-navbar:active,
|
||||
body.dark-mode #topmenu #close-navbar:active {
|
||||
color: var(--dark-hover-color-act);
|
||||
}
|
||||
|
||||
body.light-mode #topmenu button:active,
|
||||
body.light-mode #topmenu #open-navbar:active,
|
||||
body.light-mode #topmenu #close-navbar:active {
|
||||
color: var(--light-hover-color-act);
|
||||
}
|
||||
|
||||
/* Sidebar Navigation ======================================================= */
|
||||
|
||||
.navbar {
|
||||
position: fixed;
|
||||
width: 0; /* Initially collapsed */
|
||||
height: calc(100% - var(--top-menu-height, 60px));
|
||||
top: var(--top-menu-height, 60px);
|
||||
left: 0;
|
||||
background-color: #27293d;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
transition:
|
||||
width 0.5s ease,
|
||||
padding-left 0.5s ease,
|
||||
scrollbar-color 0.2s ease-in-out,
|
||||
background-color 0.2s ease-in-out;
|
||||
box-sizing: border-box;
|
||||
padding-top: 0;
|
||||
padding-bottom: 40px;
|
||||
}
|
||||
|
||||
|
||||
body.dark-mode .navbar {
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
}
|
||||
|
||||
body.light-mode .navbar {
|
||||
background-color: var(--light-bg-color-banner);
|
||||
}
|
||||
|
||||
.navbar > ul:first-child {
|
||||
margin-top: 20px; /* Padding between top menu and first element of navbar */
|
||||
}
|
||||
|
||||
/* Side Navigation Outputs -------------------------------------------------- */
|
||||
|
||||
.navbar-output {
|
||||
padding: 8px 30px;
|
||||
text-decoration: none;
|
||||
font-size: 16px;
|
||||
color: var(--dark-text-color);
|
||||
display: block;
|
||||
transition: color 0.3s ease;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
body.light-mode .navbar-output {
|
||||
color: var(--light-text-color);
|
||||
}
|
||||
|
||||
body.dark-mode .navbar-output {
|
||||
color: var(--dark-text-color);
|
||||
}
|
||||
|
||||
/* Hover effects */
|
||||
|
||||
.navbar-output:hover {
|
||||
color: var(--dark-hover-color);
|
||||
background-color: var(--dark-banner-hover);
|
||||
}
|
||||
|
||||
body.dark-mode .navbar-output:hover {
|
||||
color: var(--dark-hover-color);
|
||||
background-color: var(--dark-banner-hover);
|
||||
}
|
||||
|
||||
body.light-mode .navbar-output:hover {
|
||||
color: var(--light-hover-color);
|
||||
background-color: var(--light-banner-hover);
|
||||
}
|
||||
|
||||
/* Active effects */
|
||||
|
||||
.navbar-output:active {
|
||||
color: var(--dark-hover-color-act);
|
||||
}
|
||||
|
||||
body.dark-mode .navbar-output:active {
|
||||
color: var(--dark-hover-color-act);
|
||||
}
|
||||
|
||||
body.light-mode .navbar-output:active {
|
||||
color: var(--light-hover-color-act);
|
||||
}
|
||||
|
||||
/* Side Navigation Categories ----------------------------------------------- */
|
||||
|
||||
.navbar-category {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
user-select: none; /* Prevent text selection */
|
||||
}
|
||||
|
||||
.navbar-category .folder > span {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
color: var(--dark-text-color-accent);
|
||||
padding: 10px 20px;
|
||||
margin-bottom: 0px;
|
||||
width: 100%;
|
||||
transition: background-color 0.3s, color 0.3s;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.navbar-category .folder-contents {
|
||||
list-style: none;
|
||||
margin-left: 20px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body.dark-mode .navbar-category .folder > span {
|
||||
color: var(--dark-text-color-accent);
|
||||
}
|
||||
|
||||
body.light-mode .navbar-category .folder > span {
|
||||
color: var(--light-text-color);
|
||||
}
|
||||
|
||||
/* Hover effects */
|
||||
|
||||
.navbar-category .folder > span:hover {
|
||||
background-color: var(--dark-banner-hover);
|
||||
color: var(--dark-hover-color);
|
||||
}
|
||||
|
||||
body.dark-mode .navbar-category .folder > span:hover {
|
||||
color: var(--dark-hover-color);
|
||||
background-color: var(--dark-banner-hover);
|
||||
}
|
||||
|
||||
body.light-mode .navbar-category .folder > span:hover {
|
||||
color: var(--light-hover-color);
|
||||
background-color: var(--light-banner-hover);
|
||||
}
|
||||
|
||||
/* Active effects */
|
||||
|
||||
.navbar-category .folder > span:active {
|
||||
color: var(--dark-hover-color);
|
||||
transition: none;
|
||||
}
|
||||
|
||||
body.dark-mode .navbar-category .folder > span:active {
|
||||
color: var(--dark-hover-color-act);
|
||||
}
|
||||
|
||||
body.light-mode .navbar-category .folder > span:active {
|
||||
color: var(--light-hover-color-act);
|
||||
}
|
||||
|
||||
/* Chevron (arrow) styling -------------------------------------------------- */
|
||||
|
||||
.chevron {
|
||||
display: block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border: 8px solid transparent;
|
||||
border-left-color: #606077;
|
||||
margin-right: 8px;
|
||||
transform-origin: 25% 50%;
|
||||
transition: transform 0.3s ease, border-left-color 0.3s ease;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
body.dark-mode .chevron {
|
||||
border-left-color: #606077;
|
||||
}
|
||||
|
||||
body.light-mode .chevron {
|
||||
border-left-color: #909090;
|
||||
}
|
||||
|
||||
/* We change styles for when the chevron is pointing down */
|
||||
|
||||
.folder.open > span .chevron {
|
||||
border-left-color: var(--dark-text-color-accent);
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
body.dark-mode .folder.open > span .chevron {
|
||||
border-left-color: var(--dark-text-color-accent);
|
||||
}
|
||||
|
||||
body.light-mode .folder.open > span .chevron {
|
||||
border-left-color: var(--light-text-color-accent);
|
||||
}
|
||||
|
||||
/* Hover effects */
|
||||
|
||||
body.dark-mode .folder > span:hover .chevron {
|
||||
border-left-color: var(--dark-hover-color)
|
||||
}
|
||||
|
||||
body.light-mode .folder > span:hover .chevron {
|
||||
border-left-color: var(--light-hover-color)
|
||||
}
|
||||
|
||||
/* Active effects */
|
||||
|
||||
body.dark-mode .folder > span:active .chevron {
|
||||
border-left-color: var(--dark-hover-color-act)
|
||||
}
|
||||
|
||||
|
||||
body.light-mode .folder > span:active .chevron {
|
||||
border-left-color: var(--light-hover-color-act)
|
||||
}
|
||||
|
||||
/* Main content ============================================================= */
|
||||
|
||||
#main {
|
||||
transition: margin-left 0.5s;
|
||||
padding: 16px;
|
||||
margin-top: 80px;
|
||||
}
|
||||
|
||||
/* Comment field of output is used as a title for each output */
|
||||
|
||||
.output-comment {
|
||||
font-size: 1.4em;
|
||||
font-weight: 500;
|
||||
color: var(--dark-text-color);
|
||||
margin: 20px 0 10px 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
body.light-mode .output-comment {
|
||||
color: var(--light-text-color);
|
||||
}
|
||||
|
||||
body.dark-mode .output-comment {
|
||||
color: var(--dark-text-color);
|
||||
}
|
||||
|
||||
/* Kibot version ------------------------------------------------------------ */
|
||||
|
||||
.generator {
|
||||
text-align: right;
|
||||
font-size: 0.6em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.generator a {
|
||||
text-decoration: none; /* Removes the underline */
|
||||
}
|
||||
|
||||
/* Dark Mode: Regular Text */
|
||||
body.dark-mode .generator {
|
||||
color: var(--dark-text-color-accent);
|
||||
}
|
||||
|
||||
/* Dark Mode: Hyperlinks */
|
||||
body.dark-mode .generator a {
|
||||
color: var(--dark-hover-color); /* Hyperlink */
|
||||
}
|
||||
|
||||
/* Light Mode: Regular Text */
|
||||
body.light-mode .generator {
|
||||
color: var(--light-text-color-accent);
|
||||
}
|
||||
|
||||
/* Light Mode: Hyperlinks */
|
||||
body.light-mode .generator a {
|
||||
color: var(--light-hover-color); /* Hyperlink */
|
||||
}
|
||||
|
||||
/* Category boxes (folder) -------------------------------------------------- */
|
||||
|
||||
.category-box {
|
||||
z-index: 1000;
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
border: 1px solid var(--dark-bg-color-banner);
|
||||
border-radius: 8px;
|
||||
padding: 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 400px;
|
||||
height: 140;
|
||||
text-decoration: none;
|
||||
transition: background-color 0.3s ease, transform 0.2s ease;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
body.light-mode .category-box {
|
||||
color: var(--light-text-color);
|
||||
background-color: var(--light-bg-color-banner);
|
||||
border: var(--light-bg-color-banner);
|
||||
}
|
||||
|
||||
|
||||
body.dark-mode .category-box {
|
||||
color: var(--dark-text-color);
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
border: var(--dark-bg-color-banner);
|
||||
}
|
||||
|
||||
.category-box img {
|
||||
margin-top: 10px;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
height: auto;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.category-title {
|
||||
font-size: 1.4em;
|
||||
font-weight: 500;
|
||||
text-align: center;
|
||||
color: #e5e5e5;
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
body.light-mode .category-title {
|
||||
color: var(--light-text-color);
|
||||
}
|
||||
|
||||
body.dark-mode .category-title {
|
||||
color: var(--dark-text-color);
|
||||
}
|
||||
|
||||
/* Hover effects */
|
||||
|
||||
.category-box:hover {
|
||||
background-color: var(--dark-banner-hover);
|
||||
transform: scale(1.05); /* Slight zoom effect */
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
body.light-mode .category-box:hover {
|
||||
background-color: var(--light-banner-hover);
|
||||
}
|
||||
|
||||
body.dark-mode .category-box:hover {
|
||||
background-color: var(--dark-banner-hover);
|
||||
}
|
||||
|
||||
/* Output boxes (files) ----------------------------------------------------- */
|
||||
|
||||
.output-box {
|
||||
z-index: 999;
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
border: 1px solid var(--dark-bg-color-banner);
|
||||
border-radius: 8px;
|
||||
padding: 16px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 300px;
|
||||
height: 140px;
|
||||
text-decoration: none;
|
||||
transition: background-color 0.3s ease, transform 0.2s ease;
|
||||
}
|
||||
|
||||
/* Offset the scroll position */
|
||||
.output-virtual-box {
|
||||
position: relative;
|
||||
padding-top: var(--top-menu-height, 80px);
|
||||
margin-top: calc(-1 * var(--top-menu-height, 80px));
|
||||
pointer-events: none; /* Make it non-interactive */
|
||||
}
|
||||
|
||||
.output-virtual-box > * {
|
||||
pointer-events: auto; /* Allow its children to remain interactive */
|
||||
}
|
||||
|
||||
/* Some files (e.g. PDF, PNG) have wider output boxes */
|
||||
|
||||
.output-box.wide {
|
||||
width: 400px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.output-box img {
|
||||
margin-top: 10px;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
height: auto;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
/* The output boxes are centered and wrap around */
|
||||
|
||||
.items-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
body.light-mode .output-box {
|
||||
color: var(--light-text-color);
|
||||
background-color: var(--light-bg-color-banner);
|
||||
border: var(--light-bg-color-banner);
|
||||
}
|
||||
|
||||
body.dark-mode .output-box {
|
||||
color: var(--dark-text-color);
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
border: var(--dark-bg-color-banner);
|
||||
}
|
||||
|
||||
/* Hover effects */
|
||||
|
||||
.output-box:hover {
|
||||
background-color: var(--dark-banner-hover);
|
||||
transform: scale(1.05);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
body.light-mode .output-box:hover {
|
||||
background-color: var(--light-banner-hover);
|
||||
}
|
||||
|
||||
body.dark-mode .output-box:hover {
|
||||
background-color: var(--dark-banner-hover);
|
||||
}
|
||||
|
||||
/* Name of the output below the icon */
|
||||
|
||||
.output-box .output-name {
|
||||
color: #8997c6;
|
||||
font-size: 14px;
|
||||
margin-top: 0px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
body.light-mode .output-box .output-name {
|
||||
color: var(--light-text-color-accent);
|
||||
}
|
||||
|
||||
body.dark-mode .output-box .output-name {
|
||||
color: #8997c6;
|
||||
}
|
||||
|
||||
/* Filename below the icon */
|
||||
|
||||
.output-box .filename {
|
||||
text-decoration: none;
|
||||
color: var(--dark-text-color);
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
margin-bottom: 7px;
|
||||
}
|
||||
|
||||
body.light-mode .output-box .filename {
|
||||
color: var(--light-text-color);
|
||||
}
|
||||
|
||||
body.dark-mode .output-box .filename {
|
||||
color: var(--dark-text-color);
|
||||
}
|
||||
|
||||
/* Theme Toggle Switch ====================================================== */
|
||||
|
||||
.theme-switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 50px;
|
||||
height: 25px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
/* Hide the default checkbox button */
|
||||
|
||||
.theme-switch input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.theme-switch span {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
background-color: var(--light-banner-hover);
|
||||
border-radius: 25px;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
transition: 0.4s;
|
||||
}
|
||||
|
||||
.theme-switch span::before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
left: 4px;
|
||||
bottom: 3px;
|
||||
background-color: var(--light-bg-color);
|
||||
border-radius: 50%;
|
||||
transition: none; /* Disable animation by default */
|
||||
}
|
||||
|
||||
.theme-switch span.animate::before {
|
||||
transition: transform 0.4s ease, background-color 0.4s ease;
|
||||
}
|
||||
|
||||
.theme-switch input:checked + span {
|
||||
background-color: var(--dark-bg-color);
|
||||
}
|
||||
|
||||
.theme-switch input:checked + span::before {
|
||||
transform: translateX(25px);
|
||||
background-color: var(--dark-text-color);
|
||||
}
|
||||
|
||||
/* Scrollbar ================================================================ */
|
||||
|
||||
body, html {
|
||||
scroll-behavior: smooth;
|
||||
scrollbar-width: auto;
|
||||
}
|
||||
|
||||
body.dark-mode .navbar {
|
||||
scrollbar-color: var(--dark-banner-hover) var(--dark-bg-color);
|
||||
}
|
||||
|
||||
body.light-mode .navbar {
|
||||
scrollbar-color: var(--light-banner-hover) var(--light-bg-color);
|
||||
}
|
||||
|
||||
/* WebKit Scrollbar Styles */
|
||||
body::-webkit-scrollbar, .navbar::-webkit-scrollbar {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
}
|
||||
|
||||
body::-webkit-scrollbar-thumb, .navbar::-webkit-scrollbar-thumb {
|
||||
border-radius: 6px;
|
||||
background: var(--dark-banner-hover);
|
||||
border: 2px solid var(--dark-bg-color);
|
||||
}
|
||||
|
||||
body::-webkit-scrollbar-track, .navbar::-webkit-scrollbar-track {
|
||||
border-radius: 6px;
|
||||
background: var(--dark-bg-color);
|
||||
}
|
||||
|
||||
body.dark-mode::-webkit-scrollbar-thumb:hover, .navbar.dark-mode::-webkit-scrollbar-thumb:hover {
|
||||
background: #44475a !important;
|
||||
}
|
||||
|
||||
body.light-mode::-webkit-scrollbar-thumb, .navbar.light-mode::-webkit-scrollbar-thumb {
|
||||
background: var(--light-banner-hover);
|
||||
border: 2px solid var(--light-bg-color);
|
||||
}
|
||||
|
||||
body.light-mode::-webkit-scrollbar-track, .navbar.light-mode::-webkit-scrollbar-track {
|
||||
background: var(--light-bg-color);
|
||||
}
|
||||
|
||||
body.light-mode::-webkit-scrollbar-thumb:hover, .navbar.light-mode::-webkit-scrollbar-thumb:hover {
|
||||
background: #909090 !important;
|
||||
}
|
||||
|
||||
body::-webkit-scrollbar-corner, .navbar::-webkit-scrollbar-corner {
|
||||
background: var(--dark-bg-color);
|
||||
}
|
||||
|
||||
/* Markdown ================================================================= */
|
||||
|
||||
.markdown-content {
|
||||
font-family: Roboto, sans-serif;
|
||||
line-height: 1.6;
|
||||
padding: 15px;
|
||||
border-radius: 5px;
|
||||
max-width: calc(100% - 180px);
|
||||
white-space: pre-wrap; /* Handle preformatted text */
|
||||
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
|
||||
}
|
||||
|
||||
body.light-mode .markdown-content {
|
||||
background-color: #f9f9f9;
|
||||
border: 1px solid #ddd;
|
||||
color: #444444;
|
||||
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
|
||||
}
|
||||
|
||||
body.dark-mode .markdown-content {
|
||||
background-color: #1e1e2f;
|
||||
border: 1px solid #44475a;
|
||||
color: #e5e5e5;
|
||||
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
|
||||
}
|
||||
|
||||
/* Tables */
|
||||
.markdown-content table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-bottom: 20px;
|
||||
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
|
||||
}
|
||||
|
||||
body.light-mode .markdown-content table th,
|
||||
body.light-mode .markdown-content table td {
|
||||
border: 1px solid #ddd;
|
||||
padding: 8px;
|
||||
text-align: left;
|
||||
background-color: #ffffff;
|
||||
color: #444444;
|
||||
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
|
||||
}
|
||||
|
||||
body.dark-mode .markdown-content table th,
|
||||
body.dark-mode .markdown-content table td {
|
||||
border: 1px solid #44475a;
|
||||
padding: 8px;
|
||||
text-align: left;
|
||||
background-color: #27293d;
|
||||
color: #e5e5e5;
|
||||
transition: background-color 0.4s ease, color 0.4s ease, border-color 0.4s ease;
|
||||
}
|
||||
|
||||
/* Code Blocks */
|
||||
.markdown-content pre {
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
color: var(--dark-text-color); /* Matches dark theme text */
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
overflow-x: auto;
|
||||
transition: background-color 0.4s ease, color 0.4s ease;
|
||||
}
|
||||
|
||||
body.light-mode .markdown-content pre {
|
||||
background-color: var(--light-bg-color-banner);
|
||||
color: var(--light-text-color);
|
||||
transition: background-color 0.4s ease, color 0.4s ease;
|
||||
}
|
||||
|
||||
body.dark-mode .markdown-content pre {
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
color: var(--dark-text-color);
|
||||
transition: background-color 0.4s ease, color 0.4s ease;
|
||||
}
|
||||
|
||||
/* Inline Code */
|
||||
.markdown-content code {
|
||||
background-color: var(--light-bg-color-banner);
|
||||
padding: 2px 5px;
|
||||
border-radius: 3px;
|
||||
font-family: 'Courier New', Courier, monospace;
|
||||
transition: background-color 0.4s ease, color 0.4s ease;
|
||||
}
|
||||
|
||||
body.light-mode .markdown-content code {
|
||||
background-color: var(--light-bg-color-banner);
|
||||
color: var(--light-text-color);
|
||||
transition: background-color 0.4s ease, color 0.4s ease;
|
||||
}
|
||||
|
||||
body.dark-mode .markdown-content code {
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
color: var(--dark-text-color);
|
||||
transition: background-color 0.4s ease, color 0.4s ease;
|
||||
}
|
||||
|
||||
/* Links */
|
||||
body.light-mode .markdown-content a {
|
||||
color: var(--light-hover-color);
|
||||
text-decoration: none;
|
||||
transition: color 0.4s ease;
|
||||
}
|
||||
|
||||
body.dark-mode .markdown-content a {
|
||||
color: var(--dark-hover-color);
|
||||
text-decoration: none;
|
||||
transition: color 0.4s ease;
|
||||
}
|
||||
|
||||
.markdown-content a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Images */
|
||||
.markdown-content img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
margin: 10px auto;
|
||||
transition: opacity 0.4s ease;
|
||||
}
|
||||
|
||||
.markdown-content pre::-webkit-scrollbar {
|
||||
height: 12px; /* Horizontal scrollbar height */
|
||||
}
|
||||
|
||||
.markdown-content pre::-webkit-scrollbar-thumb {
|
||||
background: var(--dark-banner-hover); /* Match other scrollbar thumb color */
|
||||
border-radius: 6px; /* Round edges */
|
||||
border: 2px solid var(--dark-bg-color); /* Outer border matches background */
|
||||
}
|
||||
|
||||
.markdown-content pre::-webkit-scrollbar-track {
|
||||
background: var(--dark-bg-color); /* Match the background color */
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
body.light-mode .markdown-content pre::-webkit-scrollbar-thumb {
|
||||
background: var(--light-banner-hover); /* Light mode thumb color */
|
||||
border: 2px solid var(--light-bg-color); /* Light mode border */
|
||||
}
|
||||
|
||||
body.light-mode .markdown-content pre::-webkit-scrollbar-track {
|
||||
background: var(--light-bg-color); /* Light mode track background */
|
||||
}
|
||||
|
||||
|
||||
/* Search bar =============================================================== */
|
||||
|
||||
#search-container,
|
||||
#search-bar,
|
||||
#autocomplete-list,
|
||||
#autocomplete-list li {
|
||||
transition: background-color 0.3s, color 0.3s, border-color 0.3s;
|
||||
}
|
||||
|
||||
#search-container {
|
||||
padding: 10px;
|
||||
background-color: transparent;
|
||||
margin-top: 10px;
|
||||
top: 0;
|
||||
z-index: 1001;
|
||||
width: calc(100% - 10px);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#search-bar {
|
||||
width: 100%; /* Match the width of the container */
|
||||
padding: 8px;
|
||||
border: 1px solid var(--light-text-color-accent);
|
||||
border-radius: 4px;
|
||||
outline: none;
|
||||
background-color: transparent;
|
||||
color: var(--light-text-color);
|
||||
box-sizing: border-box; /* Ensure padding is included in width */
|
||||
}
|
||||
|
||||
#search-bar::placeholder {
|
||||
color: var(--light-text-color-accent);
|
||||
}
|
||||
|
||||
#autocomplete-list {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
margin: 5px 0 0;
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
background-color: var(--light-bg-color-banner);
|
||||
border: 1px solid var(--light-text-color-accent);
|
||||
border-radius: 4px;
|
||||
position: absolute;
|
||||
z-index: 1001;
|
||||
width: auto; /* Width will be dynamically calculated */
|
||||
box-sizing: border-box;
|
||||
display: none; /* Hidden by default */
|
||||
}
|
||||
|
||||
#autocomplete-list li {
|
||||
padding: 8px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.2s;
|
||||
color: var(--light-text-color);
|
||||
}
|
||||
|
||||
#autocomplete-list li:hover {
|
||||
background-color: var(--light-banner-hover);
|
||||
color: var(--light-hover-color);
|
||||
}
|
||||
|
||||
.dark-mode #search-bar {
|
||||
color: var(--dark-text-color);
|
||||
border-color: var(--dark-text-color-accent);
|
||||
}
|
||||
|
||||
.dark-mode #search-bar::placeholder {
|
||||
color: var(--dark-text-color-accent);
|
||||
}
|
||||
|
||||
.dark-mode #autocomplete-list {
|
||||
background-color: var(--dark-bg-color-banner);
|
||||
border-color: var(--dark-text-color-accent);
|
||||
}
|
||||
|
||||
.dark-mode #autocomplete-list li {
|
||||
color: var(--dark-text-color);
|
||||
}
|
||||
|
||||
.dark-mode #autocomplete-list li:hover {
|
||||
background-color: var(--dark-banner-hover);
|
||||
color: var(--dark-hover-color);
|
||||
}
|
||||
|
||||
.highlighted {
|
||||
background-color: var(--light-banner-hover); /* Same as hover background */
|
||||
color: var(--light-hover-color); /* Same as hover text color */
|
||||
}
|
||||
|
||||
body.dark-mode .highlighted {
|
||||
background-color: var(--dark-banner-hover); /* Same as hover background */
|
||||
color: var(--dark-hover-color); /* Same as hover text color */
|
||||
}
|
||||
|
||||
/* New classes to remove transitions on page load =========================== */
|
||||
|
||||
body.no-transition,
|
||||
.no-transition .output-box,
|
||||
body.no-transition .theme-switch span,
|
||||
body.no-transition button,
|
||||
body.no-transition #close-navbar,
|
||||
body.no-transition #home-button,
|
||||
body.no-transition #back-button,
|
||||
body.no-transition #forward-button,
|
||||
body.no-transition #topmenu,
|
||||
body.no-transition .navbar-category .folder > span,
|
||||
body.no-transition .navbar-output,
|
||||
body.no-transition .category-box,
|
||||
#search-bar {
|
||||
transition: none !important; /* Disable transition during page load */
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0; html/Test_5-navigate.html"/></head>
|
||||
</html>
|
||||
@@ -20,6 +20,7 @@ groups:
|
||||
- @TXT_SCH_NOTES_OUTPUT@
|
||||
- @TXT_FAB_NOTES_OUTPUT@
|
||||
- @TXT_ASSY_NOTES_OUTPUT@
|
||||
- tables
|
||||
|
||||
# Draft Outputs Group (used in DRAFT state only) ---------------------------
|
||||
- name: draft_group
|
||||
@@ -77,8 +78,8 @@ groups:
|
||||
- @PCBDRAW_2D_BOT_PCB_OUTPUT@
|
||||
- @PNG_3D_VIEWER_TOP@
|
||||
- @PNG_3D_VIEWER_BOT@
|
||||
- @PNG_3D_VIEWER_ANGLED_TOP@
|
||||
- @PNG_3D_VIEWER_ANGLED_BOT@
|
||||
# - @PNG_3D_VIEWER_ANGLED_TOP@
|
||||
# - @PNG_3D_VIEWER_ANGLED_BOT@
|
||||
- @BLENDER_3D_TOP@
|
||||
- @BLENDER_3D_BOT@
|
||||
- @BLENDER_3D_ANGLED_TOP@
|
||||
@@ -93,7 +94,6 @@ groups:
|
||||
# Fabrication Outputs ------------------------------------------------------
|
||||
- name: fab
|
||||
outputs:
|
||||
- tables
|
||||
- @GERBER_OUTPUT@
|
||||
- @EXCELLON_DRILL_OUTPUT@
|
||||
- @ODB_OUTPUT@
|
||||
@@ -311,6 +311,7 @@ import:
|
||||
SUFFIX: top
|
||||
VIEW: top
|
||||
KEY_COLOR: '@KEY_COLOR@'
|
||||
RAYTRACING: false
|
||||
|
||||
- file: kibot_out_png_3d_viewer.yaml
|
||||
definitions:
|
||||
@@ -320,6 +321,7 @@ import:
|
||||
SUFFIX: bottom
|
||||
VIEW: bottom
|
||||
KEY_COLOR: '@KEY_COLOR@'
|
||||
RAYTRACING: false
|
||||
|
||||
- file: kibot_out_png_3d_viewer.yaml
|
||||
definitions:
|
||||
@@ -333,6 +335,7 @@ import:
|
||||
ROTATE_Z: @3D_VIEWER_ROT_Z@
|
||||
ZOOM: @3D_VIEWER_ZOOM@
|
||||
KEY_COLOR: '@KEY_COLOR@'
|
||||
RAYTRACING: false
|
||||
|
||||
- file: kibot_out_png_3d_viewer.yaml
|
||||
definitions:
|
||||
@@ -346,6 +349,7 @@ import:
|
||||
ROTATE_Z: -@3D_VIEWER_ROT_Z@
|
||||
ZOOM: @3D_VIEWER_ZOOM@
|
||||
KEY_COLOR: '@KEY_COLOR@'
|
||||
RAYTRACING: false
|
||||
|
||||
# PCBA 3D Renders (Populated Board; Blender) -------------------------------
|
||||
- file: kibot_out_blender.yaml
|
||||
@@ -362,8 +366,11 @@ import:
|
||||
RESOLUTION_Y: @BLENDER_RESOLUTION_Y@
|
||||
TEXTURE_DPI: @BLENDER_TEXTURE_DPI@
|
||||
DNF_FILTER: @RENDER_DNF_FILTER@
|
||||
BACK_LIGHT: 0
|
||||
POINT_LIGHT: 0.001
|
||||
DIFFUSE_RADIUS: @BLENDER_DIFFUSE_RADIUS@
|
||||
DIFFUSE_HEIGHT: @BLENDER_DIFFUSE_HEIGHT@
|
||||
DIFFUSE_LIGHT: 0.7
|
||||
ACCENT_LIGHT: 0.1
|
||||
SPOT_LIGHT: 0.1
|
||||
|
||||
- file: kibot_out_blender.yaml
|
||||
definitions:
|
||||
@@ -379,8 +386,11 @@ import:
|
||||
RESOLUTION_Y: @BLENDER_RESOLUTION_Y@
|
||||
TEXTURE_DPI: @BLENDER_TEXTURE_DPI@
|
||||
DNF_FILTER: @RENDER_DNF_FILTER@
|
||||
BACK_LIGHT: 0
|
||||
POINT_LIGHT: 0.001
|
||||
DIFFUSE_RADIUS: @BLENDER_DIFFUSE_RADIUS@
|
||||
DIFFUSE_HEIGHT: @BLENDER_DIFFUSE_HEIGHT@
|
||||
DIFFUSE_LIGHT: 0.7
|
||||
ACCENT_LIGHT: 0.1
|
||||
SPOT_LIGHT: 0.1
|
||||
|
||||
- file: kibot_out_blender.yaml
|
||||
definitions:
|
||||
@@ -396,8 +406,11 @@ import:
|
||||
RESOLUTION_Y: @BLENDER_RESOLUTION_Y@
|
||||
TEXTURE_DPI: @BLENDER_TEXTURE_DPI@
|
||||
DNF_FILTER: @RENDER_DNF_FILTER@
|
||||
BACK_LIGHT: 1
|
||||
POINT_LIGHT: 0
|
||||
DIFFUSE_RADIUS: @BLENDER_DIFFUSE_RADIUS@
|
||||
DIFFUSE_HEIGHT: @BLENDER_DIFFUSE_HEIGHT@
|
||||
DIFFUSE_LIGHT: 0.4
|
||||
ACCENT_LIGHT: 0.1
|
||||
SPOT_LIGHT: 2.0
|
||||
|
||||
- file: kibot_out_blender.yaml
|
||||
definitions:
|
||||
@@ -413,8 +426,11 @@ import:
|
||||
RESOLUTION_Y: @BLENDER_RESOLUTION_Y@
|
||||
TEXTURE_DPI: @BLENDER_TEXTURE_DPI@
|
||||
DNF_FILTER: @RENDER_DNF_FILTER@
|
||||
BACK_LIGHT: 1
|
||||
POINT_LIGHT: 0
|
||||
DIFFUSE_RADIUS: @BLENDER_DIFFUSE_RADIUS@
|
||||
DIFFUSE_HEIGHT: @BLENDER_DIFFUSE_HEIGHT@
|
||||
DIFFUSE_LIGHT: 0.4
|
||||
ACCENT_LIGHT: 0.1
|
||||
SPOT_LIGHT: 2.0
|
||||
|
||||
# STEP File ----------------------------------------------------------------
|
||||
- file: kibot_out_3d_model.yaml
|
||||
@@ -607,7 +623,7 @@ import:
|
||||
COMMENT: Impedance table in CSV format
|
||||
DIR: @FABRICATION_DIR@
|
||||
OUTPUT_ID: impedance_table
|
||||
TEMPLATE: @REPORT_TEMPLATE_DIR@/impedance_table.txt
|
||||
TEMPLATE: @NOTES_DIR@/impedance_table.txt
|
||||
|
||||
- file: kibot_out_txt_report.yaml
|
||||
definitions:
|
||||
@@ -615,7 +631,7 @@ import:
|
||||
COMMENT: Schematic notes in TXT format
|
||||
DIR: @SCHEMATIC_DIR@
|
||||
OUTPUT_ID: schematic_notes
|
||||
TEMPLATE: @REPORT_TEMPLATE_DIR@/schematic_notes.txt
|
||||
TEMPLATE: @NOTES_DIR@/schematic_notes.txt
|
||||
|
||||
- file: kibot_out_txt_report.yaml
|
||||
definitions:
|
||||
@@ -623,7 +639,7 @@ import:
|
||||
COMMENT: Fabrication notes in TXT format
|
||||
DIR: @FABRICATION_DIR@
|
||||
OUTPUT_ID: fabrication_notes
|
||||
TEMPLATE: @REPORT_TEMPLATE_DIR@/fabrication_notes.txt
|
||||
TEMPLATE: @NOTES_DIR@/fabrication_notes.txt
|
||||
|
||||
- file: kibot_out_txt_report.yaml
|
||||
definitions:
|
||||
@@ -631,7 +647,7 @@ import:
|
||||
COMMENT: Assembly notes in TXT format
|
||||
DIR: @ASSEMBLY_DIR@
|
||||
OUTPUT_ID: fabrication_notes
|
||||
TEMPLATE: @REPORT_TEMPLATE_DIR@/assembly_notes.txt
|
||||
TEMPLATE: @NOTES_DIR@/assembly_notes.txt
|
||||
|
||||
# Panelization Outputs -----------------------------------------------------
|
||||
- file: kibot_out_panelize.yaml
|
||||
@@ -699,8 +715,8 @@ definitions:
|
||||
|
||||
COLOR_THEME: Altium_Theme
|
||||
SHEET_WKS_SCH: templates/Asymworks_SCH.kicad_wks
|
||||
SHEET_WKS_PCB: KIPRJMOD/templates/Asymworks_PCB.kicad_wks
|
||||
SHEET_WKS_ASSY: KIPRJMOD/templates/Asymworks_PCBA.kicad_wks
|
||||
SHEET_WKS_PCB: templates/Asymworks_PCB.kicad_wks
|
||||
SHEET_WKS_ASSY: templates/Asymworks_PCBA.kicad_wks
|
||||
FAB_SCALING: 1
|
||||
ASSEMBLY_SCALING: 1
|
||||
|
||||
@@ -712,7 +728,7 @@ definitions:
|
||||
3D_VIEWER_ROT_Y: -1
|
||||
3D_VIEWER_ROT_Z: 1
|
||||
3D_VIEWER_ZOOM: -1
|
||||
KEY_COLOR: '#00FF00' # Background color to remove. Use a color different from your PCB
|
||||
KEY_COLOR: '#FF00FF' # Background color to remove. Use a color different from your PCB
|
||||
|
||||
BLENDER_SAMPLES: 20 # Overridden to 2 samples for WORKING state by CI Script
|
||||
BLENDER_ROT_X: 30
|
||||
@@ -723,6 +739,9 @@ definitions:
|
||||
BLENDER_RESOLUTION_Y: 1500
|
||||
BLENDER_TEXTURE_DPI: 1031.0
|
||||
|
||||
BLENDER_DIFFUSE_HEIGHT: 10.0
|
||||
BLENDER_DIFFUSE_RADIUS: 6.0
|
||||
|
||||
# Directories ==============================================================
|
||||
|
||||
# Root
|
||||
@@ -740,6 +759,7 @@ definitions:
|
||||
TESTPOINTS_DIR: '@TESTING_DIR@/testpoints'
|
||||
RESOURCES_DIR: kibot
|
||||
MODELS_DIR: models
|
||||
NOTES_DIR: notes
|
||||
RENDER_DIR: renders
|
||||
REPORT_TEMPLATE_DIR: '@RESOURCES_DIR@/templates'
|
||||
SCRIPTS_DIR: '@RESOURCES_DIR@/scripts'
|
||||
|
||||
@@ -1,6 +1,17 @@
|
||||
# KiBot output for generating PCB 3D model PCB3D Blender format
|
||||
# https://kibot.readthedocs.io/en/latest/configuration/outputs/PCB2Blender_ToolsOptions.html
|
||||
|
||||
# The lighting setup allows for even, diffuse background lighting as well as
|
||||
# a focused light for shadows/depth. The eight area lights form a ring around
|
||||
# the top of the board, while the spot light illuminates from behind and to the
|
||||
# right of the camera. The accent lights illuminate from behind the board at a
|
||||
# low angle to help light up solder pads.
|
||||
#
|
||||
# For top/bottom renders that look directly down at the board, set @SPOT_LIGHT@
|
||||
# to 0.1 and @ADIFFUSE_LIGHT@ to 0.7. For angle renders, start with @SPOT_LIGHT@
|
||||
# set to 2.0 and @DIFFUSE_LIGHT@ at 0.4. Some experimentation, including with
|
||||
# the ring radius and height, may be required to get good results.
|
||||
|
||||
kibot:
|
||||
version: 1
|
||||
|
||||
@@ -41,40 +52,99 @@ outputs:
|
||||
output: '%f-%I%v.%x'
|
||||
|
||||
light:
|
||||
- name: sun
|
||||
energy: 0
|
||||
pos_x: 0
|
||||
pos_y: 0
|
||||
pos_z: size*20
|
||||
type: SUN
|
||||
|
||||
- name: kibot_light
|
||||
energy: @POINT_LIGHT@
|
||||
- name: spot
|
||||
energy: @SPOT_LIGHT@
|
||||
pos_x: -size*3.33
|
||||
pos_y: size*3.33
|
||||
pos_z: size*5
|
||||
type: POINT
|
||||
|
||||
- name: kibot_back_light
|
||||
energy: @BACK_LIGHT@
|
||||
- name: accent_1
|
||||
energy: @ACCENT_LIGHT@
|
||||
pos_x: -size*2
|
||||
pos_y: size*6
|
||||
pos_z: size*3
|
||||
type: AREA
|
||||
|
||||
- name: accent_2
|
||||
energy: @ACCENT_LIGHT@
|
||||
pos_x: size*2
|
||||
pos_y: size*6
|
||||
pos_z: size*3
|
||||
type: AREA
|
||||
|
||||
- name: ring_1
|
||||
energy: @DIFFUSE_LIGHT@
|
||||
pos_x: size*@DIFFUSE_RADIUS@
|
||||
pos_y: 0
|
||||
pos_z: size*@DIFFUSE_HEIGHT@
|
||||
type: AREA
|
||||
|
||||
- name: ring_2
|
||||
energy: @DIFFUSE_LIGHT@
|
||||
pos_x: -size*@DIFFUSE_RADIUS@
|
||||
pos_y: 0
|
||||
pos_z: size*@DIFFUSE_HEIGHT@
|
||||
type: AREA
|
||||
|
||||
- name: ring_3
|
||||
energy: @DIFFUSE_LIGHT@
|
||||
pos_x: 0
|
||||
pos_y: size*8
|
||||
pos_z: size*12
|
||||
type: POINT
|
||||
pos_y: size*@DIFFUSE_RADIUS@
|
||||
pos_z: size*@DIFFUSE_HEIGHT@
|
||||
type: AREA
|
||||
|
||||
- name: ring_4
|
||||
energy: @DIFFUSE_LIGHT@
|
||||
pos_x: 0
|
||||
pos_y: -size*@DIFFUSE_RADIUS@
|
||||
pos_z: size*@DIFFUSE_HEIGHT@
|
||||
type: AREA
|
||||
|
||||
- name: ring_5
|
||||
energy: @DIFFUSE_LIGHT@
|
||||
pos_x: size*0.71*@DIFFUSE_RADIUS@
|
||||
pos_y: size*0.71*@DIFFUSE_RADIUS@
|
||||
pos_z: size*@DIFFUSE_HEIGHT@
|
||||
type: AREA
|
||||
|
||||
- name: ring_6
|
||||
energy: @DIFFUSE_LIGHT@
|
||||
pos_x: -size*0.71*@DIFFUSE_RADIUS@
|
||||
pos_y: size*0.71*@DIFFUSE_RADIUS@
|
||||
pos_z: size*@DIFFUSE_HEIGHT@
|
||||
type: AREA
|
||||
|
||||
- name: ring_7
|
||||
energy: @DIFFUSE_LIGHT@
|
||||
pos_x: size*0.71*@DIFFUSE_RADIUS@
|
||||
pos_y: -size*0.71*@DIFFUSE_RADIUS@
|
||||
pos_z: size*@DIFFUSE_HEIGHT@
|
||||
type: AREA
|
||||
|
||||
- name: ring_8
|
||||
energy: @DIFFUSE_LIGHT@
|
||||
pos_x: -size*0.71*@DIFFUSE_RADIUS@
|
||||
pos_y: -size*0.71*@DIFFUSE_RADIUS@
|
||||
pos_z: size*@DIFFUSE_HEIGHT@
|
||||
type: AREA
|
||||
|
||||
...
|
||||
definitions:
|
||||
NAME: blender
|
||||
NAME: blender_3d_angled_top
|
||||
COMMENT: PCB 3D model in PCB3D Blender format
|
||||
DIR: renders
|
||||
DNF_FILTER: _kibom_dnf_Config
|
||||
SAMPLES: 5
|
||||
RESOLUTION_X: 1280
|
||||
RESOLUTION_Y: 1280
|
||||
TEXTURE_DPI: 1031.0
|
||||
BACK_LIGHT: 0
|
||||
POINT_LIGHT: 0.001
|
||||
ROTATE_X: 0
|
||||
ROTATE_Y: 0
|
||||
ROTATE_Z: 0
|
||||
SAMPLES: 5
|
||||
ROTATE_X: 30
|
||||
ROTATE_Y: 10
|
||||
ROTATE_Z: 10
|
||||
VIEW: top
|
||||
DIFFUSE_RADIUS: 6.0
|
||||
DIFFUSE_HEIGHT: 10.0
|
||||
DIFFUSE_LIGHT: 0.4
|
||||
ACCENT_LIGHT: 0.1
|
||||
SPOT_LIGHT: 2.0
|
||||
|
||||
@@ -21,7 +21,6 @@ outputs:
|
||||
height: @HEIGHT@
|
||||
width: @WIDTH@
|
||||
view: '@VIEW@'
|
||||
ray_tracing: @RAYTRACING@
|
||||
force_stackup_colors: true
|
||||
orthographic: true
|
||||
transparent_background: true
|
||||
@@ -35,7 +34,6 @@ definitions:
|
||||
DIR: renders
|
||||
SUFFIX: ""
|
||||
VIEW: top
|
||||
RAYTRACING: true
|
||||
ROTATE_X: 0
|
||||
ROTATE_Y: 0
|
||||
ROTATE_Z: 0
|
||||
|
||||
@@ -24,4 +24,4 @@ definitions:
|
||||
COMMENT: Report
|
||||
DIR: mfg
|
||||
OUTPUT_ID: _notes
|
||||
TEMPLATE: kibot/templates/fabrication_notes.txt
|
||||
TEMPLATE: notes/fabrication_notes.txt
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
# KiBot preflight for updating the Schematic XML
|
||||
# https://kibot.readthedocs.io/en/latest/configuration/preflights/update_xml.html
|
||||
|
||||
kibot:
|
||||
version: 1
|
||||
|
||||
preflight:
|
||||
update_xml: true
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
# KiCad Temporary Files
|
||||
*.bak
|
||||